@code-yeongyu/senpi 2026.5.19 → 2026.5.20-2

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 (580) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/bun/cli.d.ts.map +1 -1
  3. package/dist/bun/cli.js.map +1 -1
  4. package/dist/cli/args.d.ts +1 -1
  5. package/dist/cli/args.d.ts.map +1 -1
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/config-selector.d.ts +2 -2
  8. package/dist/cli/config-selector.d.ts.map +1 -1
  9. package/dist/cli/config-selector.js.map +1 -1
  10. package/dist/cli/file-processor.d.ts.map +1 -1
  11. package/dist/cli/file-processor.js.map +1 -1
  12. package/dist/cli/initial-message.d.ts +1 -1
  13. package/dist/cli/initial-message.d.ts.map +1 -1
  14. package/dist/cli/initial-message.js.map +1 -1
  15. package/dist/cli/list-models.d.ts +1 -1
  16. package/dist/cli/list-models.d.ts.map +1 -1
  17. package/dist/cli/list-models.js.map +1 -1
  18. package/dist/cli/session-picker.d.ts +1 -1
  19. package/dist/cli/session-picker.d.ts.map +1 -1
  20. package/dist/cli/session-picker.js.map +1 -1
  21. package/dist/cli.d.ts.map +1 -1
  22. package/dist/cli.js.map +1 -1
  23. package/dist/config.d.ts.map +1 -1
  24. package/dist/config.js.map +1 -1
  25. package/dist/core/agent-session-runtime.d.ts +9 -9
  26. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  27. package/dist/core/agent-session-runtime.js +2 -2
  28. package/dist/core/agent-session-runtime.js.map +1 -1
  29. package/dist/core/agent-session-services.d.ts +8 -8
  30. package/dist/core/agent-session-services.d.ts.map +1 -1
  31. package/dist/core/agent-session-services.js.map +1 -1
  32. package/dist/core/agent-session.d.ts +23 -14
  33. package/dist/core/agent-session.d.ts.map +1 -1
  34. package/dist/core/agent-session.js +36 -6
  35. package/dist/core/agent-session.js.map +1 -1
  36. package/dist/core/auth-guidance.d.ts.map +1 -1
  37. package/dist/core/auth-guidance.js.map +1 -1
  38. package/dist/core/auth-storage.d.ts +1 -1
  39. package/dist/core/auth-storage.d.ts.map +1 -1
  40. package/dist/core/auth-storage.js +1 -1
  41. package/dist/core/auth-storage.js.map +1 -1
  42. package/dist/core/bash-executor.d.ts +1 -1
  43. package/dist/core/bash-executor.d.ts.map +1 -1
  44. package/dist/core/bash-executor.js.map +1 -1
  45. package/dist/core/compaction/branch-summarization.d.ts +4 -4
  46. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  47. package/dist/core/compaction/branch-summarization.js.map +1 -1
  48. package/dist/core/compaction/compaction.d.ts +2 -2
  49. package/dist/core/compaction/compaction.d.ts.map +1 -1
  50. package/dist/core/compaction/compaction.js.map +1 -1
  51. package/dist/core/compaction/index.d.ts +3 -3
  52. package/dist/core/compaction/index.d.ts.map +1 -1
  53. package/dist/core/compaction/index.js.map +1 -1
  54. package/dist/core/compaction/utils.d.ts.map +1 -1
  55. package/dist/core/compaction/utils.js.map +1 -1
  56. package/dist/core/dynamic-prompt/build.d.ts +1 -1
  57. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  58. package/dist/core/dynamic-prompt/build.js.map +1 -1
  59. package/dist/core/dynamic-prompt/index.d.ts +12 -12
  60. package/dist/core/dynamic-prompt/index.d.ts.map +1 -1
  61. package/dist/core/dynamic-prompt/index.js.map +1 -1
  62. package/dist/core/dynamic-prompt/intent-gate.d.ts +1 -1
  63. package/dist/core/dynamic-prompt/intent-gate.d.ts.map +1 -1
  64. package/dist/core/dynamic-prompt/intent-gate.js.map +1 -1
  65. package/dist/core/dynamic-prompt/tool-categorization.d.ts +1 -1
  66. package/dist/core/dynamic-prompt/tool-categorization.d.ts.map +1 -1
  67. package/dist/core/dynamic-prompt/tool-categorization.js.map +1 -1
  68. package/dist/core/dynamic-prompt/tool-section.d.ts +1 -1
  69. package/dist/core/dynamic-prompt/tool-section.d.ts.map +1 -1
  70. package/dist/core/dynamic-prompt/tool-section.js.map +1 -1
  71. package/dist/core/exec.d.ts.map +1 -1
  72. package/dist/core/exec.js.map +1 -1
  73. package/dist/core/export-html/index.d.ts +1 -1
  74. package/dist/core/export-html/index.d.ts.map +1 -1
  75. package/dist/core/export-html/index.js.map +1 -1
  76. package/dist/core/export-html/tool-renderer.d.ts +2 -2
  77. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  78. package/dist/core/export-html/tool-renderer.js.map +1 -1
  79. package/dist/core/extensions/builtin/anthropic-bash/index.d.ts +1 -1
  80. package/dist/core/extensions/builtin/anthropic-bash/index.d.ts.map +1 -1
  81. package/dist/core/extensions/builtin/anthropic-bash/index.js.map +1 -1
  82. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts +1 -1
  83. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
  84. package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
  85. package/dist/core/extensions/builtin/bash-timeout/index.d.ts +3 -3
  86. package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
  88. package/dist/core/extensions/builtin/compaction/checkpoint-state.d.ts +1 -1
  89. package/dist/core/extensions/builtin/compaction/checkpoint-state.d.ts.map +1 -1
  90. package/dist/core/extensions/builtin/compaction/checkpoint-state.js.map +1 -1
  91. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts +2 -2
  92. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts.map +1 -1
  93. package/dist/core/extensions/builtin/compaction/circuit-breaker.js.map +1 -1
  94. package/dist/core/extensions/builtin/compaction/index.d.ts +1 -1
  95. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  96. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  97. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +4 -3
  98. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  99. package/dist/core/extensions/builtin/compaction/openai-remote.js +88 -17
  100. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  101. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts +2 -2
  102. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/compaction/per-turn-cap.js.map +1 -1
  104. package/dist/core/extensions/builtin/compaction/policy.d.ts +2 -2
  105. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  106. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  107. package/dist/core/extensions/builtin/compaction/restoration-tracker.d.ts +1 -1
  108. package/dist/core/extensions/builtin/compaction/restoration-tracker.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/compaction/restoration-tracker.js.map +1 -1
  110. package/dist/core/extensions/builtin/compaction/speculative.d.ts +5 -5
  111. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  112. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  113. package/dist/core/extensions/builtin/compaction/state.d.ts +1 -1
  114. package/dist/core/extensions/builtin/compaction/state.d.ts.map +1 -1
  115. package/dist/core/extensions/builtin/compaction/state.js.map +1 -1
  116. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts +2 -2
  117. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
  118. package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
  119. package/dist/core/extensions/builtin/diff.d.ts +1 -1
  120. package/dist/core/extensions/builtin/diff.d.ts.map +1 -1
  121. package/dist/core/extensions/builtin/diff.js.map +1 -1
  122. package/dist/core/extensions/builtin/files.d.ts +1 -1
  123. package/dist/core/extensions/builtin/files.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/files.js.map +1 -1
  125. package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts +1 -1
  126. package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts.map +1 -1
  127. package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
  128. package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts +1 -1
  129. package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts.map +1 -1
  130. package/dist/core/extensions/builtin/gpt-apply-patch/errors.js.map +1 -1
  131. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts +1 -1
  132. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  133. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  134. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts +11 -11
  135. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts.map +1 -1
  136. package/dist/core/extensions/builtin/gpt-apply-patch/index.js.map +1 -1
  137. package/dist/core/extensions/builtin/gpt-apply-patch/params.d.ts +1 -1
  138. package/dist/core/extensions/builtin/gpt-apply-patch/params.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/gpt-apply-patch/params.js.map +1 -1
  140. package/dist/core/extensions/builtin/gpt-apply-patch/parser.d.ts +1 -1
  141. package/dist/core/extensions/builtin/gpt-apply-patch/parser.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/gpt-apply-patch/parser.js.map +1 -1
  143. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.d.ts +1 -1
  144. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.d.ts.map +1 -1
  145. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.js.map +1 -1
  146. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts +1 -1
  147. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts.map +1 -1
  148. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
  149. package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts +1 -1
  150. package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts.map +1 -1
  151. package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
  152. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts +1 -1
  153. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts.map +1 -1
  154. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js.map +1 -1
  155. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.d.ts +1 -1
  156. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.d.ts.map +1 -1
  157. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.js.map +1 -1
  158. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts +1 -1
  159. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
  160. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  161. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts +2 -2
  162. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
  163. package/dist/core/extensions/builtin/gpt-apply-patch/types.js.map +1 -1
  164. package/dist/core/extensions/builtin/index.d.ts +5 -5
  165. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  166. package/dist/core/extensions/builtin/index.js +2 -0
  167. package/dist/core/extensions/builtin/index.js.map +1 -1
  168. package/dist/core/extensions/builtin/kimi-web-search/index.d.ts +3 -0
  169. package/dist/core/extensions/builtin/kimi-web-search/index.d.ts.map +1 -0
  170. package/dist/core/extensions/builtin/kimi-web-search/index.js +208 -0
  171. package/dist/core/extensions/builtin/kimi-web-search/index.js.map +1 -0
  172. package/dist/core/extensions/builtin/openai-web-search/index.d.ts +1 -1
  173. package/dist/core/extensions/builtin/openai-web-search/index.d.ts.map +1 -1
  174. package/dist/core/extensions/builtin/openai-web-search/index.js.map +1 -1
  175. package/dist/core/extensions/builtin/permission-system/arity.d.ts +3 -3
  176. package/dist/core/extensions/builtin/permission-system/arity.d.ts.map +1 -1
  177. package/dist/core/extensions/builtin/permission-system/arity.js +155 -158
  178. package/dist/core/extensions/builtin/permission-system/arity.js.map +1 -1
  179. package/dist/core/extensions/builtin/permission-system/cli.d.ts +2 -2
  180. package/dist/core/extensions/builtin/permission-system/cli.d.ts.map +1 -1
  181. package/dist/core/extensions/builtin/permission-system/cli.js.map +1 -1
  182. package/dist/core/extensions/builtin/permission-system/config.d.ts +1 -1
  183. package/dist/core/extensions/builtin/permission-system/config.d.ts.map +1 -1
  184. package/dist/core/extensions/builtin/permission-system/config.js.map +1 -1
  185. package/dist/core/extensions/builtin/permission-system/evaluate.d.ts +1 -1
  186. package/dist/core/extensions/builtin/permission-system/evaluate.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/permission-system/evaluate.js.map +1 -1
  188. package/dist/core/extensions/builtin/permission-system/events.d.ts +2 -2
  189. package/dist/core/extensions/builtin/permission-system/events.d.ts.map +1 -1
  190. package/dist/core/extensions/builtin/permission-system/events.js.map +1 -1
  191. package/dist/core/extensions/builtin/permission-system/index.d.ts +1 -1
  192. package/dist/core/extensions/builtin/permission-system/index.d.ts.map +1 -1
  193. package/dist/core/extensions/builtin/permission-system/index.js.map +1 -1
  194. package/dist/core/extensions/builtin/permission-system/non-interactive.d.ts +1 -1
  195. package/dist/core/extensions/builtin/permission-system/non-interactive.d.ts.map +1 -1
  196. package/dist/core/extensions/builtin/permission-system/non-interactive.js.map +1 -1
  197. package/dist/core/extensions/builtin/permission-system/parsers.d.ts +1 -1
  198. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  199. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  200. package/dist/core/extensions/builtin/permission-system/prompt.d.ts +2 -2
  201. package/dist/core/extensions/builtin/permission-system/prompt.d.ts.map +1 -1
  202. package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
  203. package/dist/core/extensions/builtin/permission-system/service.d.ts +2 -2
  204. package/dist/core/extensions/builtin/permission-system/service.d.ts.map +1 -1
  205. package/dist/core/extensions/builtin/permission-system/service.js.map +1 -1
  206. package/dist/core/extensions/builtin/permission-system/settings.d.ts +2 -2
  207. package/dist/core/extensions/builtin/permission-system/settings.d.ts.map +1 -1
  208. package/dist/core/extensions/builtin/permission-system/settings.js.map +1 -1
  209. package/dist/core/extensions/builtin/permission-system/storage.d.ts +1 -1
  210. package/dist/core/extensions/builtin/permission-system/storage.d.ts.map +1 -1
  211. package/dist/core/extensions/builtin/permission-system/storage.js.map +1 -1
  212. package/dist/core/extensions/builtin/permission-system/types.d.ts +2 -2
  213. package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
  214. package/dist/core/extensions/builtin/permission-system/types.js +4 -4
  215. package/dist/core/extensions/builtin/permission-system/types.js.map +1 -1
  216. package/dist/core/extensions/builtin/permission-system/wildcard.d.ts +3 -3
  217. package/dist/core/extensions/builtin/permission-system/wildcard.d.ts.map +1 -1
  218. package/dist/core/extensions/builtin/permission-system/wildcard.js +4 -7
  219. package/dist/core/extensions/builtin/permission-system/wildcard.js.map +1 -1
  220. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts +1 -1
  221. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
  222. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
  223. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts +1 -1
  224. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
  225. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
  226. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts +1 -1
  227. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
  228. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
  229. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.d.ts +1 -1
  230. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.d.ts.map +1 -1
  231. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js.map +1 -1
  232. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.d.ts +1 -1
  233. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.d.ts.map +1 -1
  234. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js.map +1 -1
  235. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.d.ts +1 -1
  236. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.d.ts.map +1 -1
  237. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js.map +1 -1
  238. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts +1 -1
  239. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts.map +1 -1
  240. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
  241. package/dist/core/extensions/builtin/prompt-preset/gpt-5.d.ts +1 -1
  242. package/dist/core/extensions/builtin/prompt-preset/gpt-5.d.ts.map +1 -1
  243. package/dist/core/extensions/builtin/prompt-preset/gpt-5.js.map +1 -1
  244. package/dist/core/extensions/builtin/prompt-preset/index.d.ts +1 -1
  245. package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
  246. package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
  247. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.d.ts +1 -1
  248. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.d.ts.map +1 -1
  249. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
  250. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts +3 -3
  251. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  252. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  253. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  254. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  255. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  256. package/dist/core/extensions/builtin/prompt-url-widget.d.ts +1 -1
  257. package/dist/core/extensions/builtin/prompt-url-widget.d.ts.map +1 -1
  258. package/dist/core/extensions/builtin/prompt-url-widget.js.map +1 -1
  259. package/dist/core/extensions/builtin/redraws.d.ts +1 -1
  260. package/dist/core/extensions/builtin/redraws.d.ts.map +1 -1
  261. package/dist/core/extensions/builtin/redraws.js.map +1 -1
  262. package/dist/core/extensions/builtin/service-tier.d.ts +1 -1
  263. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  264. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  265. package/dist/core/extensions/builtin/system-messages.d.ts +2 -2
  266. package/dist/core/extensions/builtin/system-messages.d.ts.map +1 -1
  267. package/dist/core/extensions/builtin/system-messages.js.map +1 -1
  268. package/dist/core/extensions/builtin/todotools/continuation/index.d.ts +1 -1
  269. package/dist/core/extensions/builtin/todotools/continuation/index.d.ts.map +1 -1
  270. package/dist/core/extensions/builtin/todotools/continuation/index.js.map +1 -1
  271. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts +1 -1
  272. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts.map +1 -1
  273. package/dist/core/extensions/builtin/todotools/continuation/prompt.js.map +1 -1
  274. package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts +2 -2
  275. package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts.map +1 -1
  276. package/dist/core/extensions/builtin/todotools/continuation/runtime.js.map +1 -1
  277. package/dist/core/extensions/builtin/todotools/index.d.ts +3 -3
  278. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  279. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  280. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  281. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  282. package/dist/core/extensions/builtin/todotools/system-messages.d.ts +1 -1
  283. package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +1 -1
  284. package/dist/core/extensions/builtin/todotools/system-messages.js.map +1 -1
  285. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts +2 -2
  286. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts.map +1 -1
  287. package/dist/core/extensions/builtin/todotools/tools/todoread.js.map +1 -1
  288. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts +2 -2
  289. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
  290. package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
  291. package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts +1 -1
  292. package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts.map +1 -1
  293. package/dist/core/extensions/builtin/tool-pair-guard/index.js.map +1 -1
  294. package/dist/core/extensions/builtin/tps.d.ts +1 -1
  295. package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
  296. package/dist/core/extensions/builtin/tps.js.map +1 -1
  297. package/dist/core/extensions/index.d.ts +8 -8
  298. package/dist/core/extensions/index.d.ts.map +1 -1
  299. package/dist/core/extensions/index.js.map +1 -1
  300. package/dist/core/extensions/loader.d.ts +2 -2
  301. package/dist/core/extensions/loader.d.ts.map +1 -1
  302. package/dist/core/extensions/loader.js.map +1 -1
  303. package/dist/core/extensions/runner.d.ts +32 -6
  304. package/dist/core/extensions/runner.d.ts.map +1 -1
  305. package/dist/core/extensions/runner.js +109 -5
  306. package/dist/core/extensions/runner.js.map +1 -1
  307. package/dist/core/extensions/types.d.ts +19 -19
  308. package/dist/core/extensions/types.d.ts.map +1 -1
  309. package/dist/core/extensions/types.js.map +1 -1
  310. package/dist/core/extensions/wrapper.d.ts +2 -2
  311. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  312. package/dist/core/extensions/wrapper.js.map +1 -1
  313. package/dist/core/footer-data-provider.d.ts.map +1 -1
  314. package/dist/core/footer-data-provider.js.map +1 -1
  315. package/dist/core/index.d.ts +8 -8
  316. package/dist/core/index.d.ts.map +1 -1
  317. package/dist/core/index.js.map +1 -1
  318. package/dist/core/keybindings.d.ts.map +1 -1
  319. package/dist/core/keybindings.js.map +1 -1
  320. package/dist/core/model-registry.d.ts +4 -4
  321. package/dist/core/model-registry.d.ts.map +1 -1
  322. package/dist/core/model-registry.js +2 -2
  323. package/dist/core/model-registry.js.map +1 -1
  324. package/dist/core/model-resolver.d.ts +2 -2
  325. package/dist/core/model-resolver.d.ts.map +1 -1
  326. package/dist/core/model-resolver.js.map +1 -1
  327. package/dist/core/package-manager.d.ts +1 -1
  328. package/dist/core/package-manager.d.ts.map +1 -1
  329. package/dist/core/package-manager.js.map +1 -1
  330. package/dist/core/prompt-templates.d.ts +1 -1
  331. package/dist/core/prompt-templates.d.ts.map +1 -1
  332. package/dist/core/prompt-templates.js.map +1 -1
  333. package/dist/core/resolve-config-value.d.ts.map +1 -1
  334. package/dist/core/resolve-config-value.js.map +1 -1
  335. package/dist/core/resource-loader.d.ts +9 -9
  336. package/dist/core/resource-loader.d.ts.map +1 -1
  337. package/dist/core/resource-loader.js.map +1 -1
  338. package/dist/core/sdk.d.ts +14 -14
  339. package/dist/core/sdk.d.ts.map +1 -1
  340. package/dist/core/sdk.js +7 -5
  341. package/dist/core/sdk.js.map +1 -1
  342. package/dist/core/session-manager.d.ts +1 -1
  343. package/dist/core/session-manager.d.ts.map +1 -1
  344. package/dist/core/session-manager.js.map +1 -1
  345. package/dist/core/settings-manager.d.ts +1 -1
  346. package/dist/core/settings-manager.d.ts.map +1 -1
  347. package/dist/core/settings-manager.js +2 -1
  348. package/dist/core/settings-manager.js.map +1 -1
  349. package/dist/core/skills.d.ts +2 -2
  350. package/dist/core/skills.d.ts.map +1 -1
  351. package/dist/core/skills.js.map +1 -1
  352. package/dist/core/slash-commands.d.ts +1 -1
  353. package/dist/core/slash-commands.d.ts.map +1 -1
  354. package/dist/core/slash-commands.js.map +1 -1
  355. package/dist/core/source-info.d.ts +1 -1
  356. package/dist/core/source-info.d.ts.map +1 -1
  357. package/dist/core/source-info.js.map +1 -1
  358. package/dist/core/system-prompt.d.ts +1 -1
  359. package/dist/core/system-prompt.d.ts.map +1 -1
  360. package/dist/core/system-prompt.js +1 -0
  361. package/dist/core/system-prompt.js.map +1 -1
  362. package/dist/core/telemetry.d.ts +1 -1
  363. package/dist/core/telemetry.d.ts.map +1 -1
  364. package/dist/core/telemetry.js.map +1 -1
  365. package/dist/core/tools/bash.d.ts +2 -2
  366. package/dist/core/tools/bash.d.ts.map +1 -1
  367. package/dist/core/tools/bash.js.map +1 -1
  368. package/dist/core/tools/diff-render.d.ts.map +1 -1
  369. package/dist/core/tools/diff-render.js.map +1 -1
  370. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  371. package/dist/core/tools/edit-diff.js.map +1 -1
  372. package/dist/core/tools/edit.d.ts +2 -2
  373. package/dist/core/tools/edit.d.ts.map +1 -1
  374. package/dist/core/tools/edit.js.map +1 -1
  375. package/dist/core/tools/find.d.ts +2 -2
  376. package/dist/core/tools/find.d.ts.map +1 -1
  377. package/dist/core/tools/find.js.map +1 -1
  378. package/dist/core/tools/grep.d.ts +2 -2
  379. package/dist/core/tools/grep.d.ts.map +1 -1
  380. package/dist/core/tools/grep.js.map +1 -1
  381. package/dist/core/tools/index.d.ts +17 -17
  382. package/dist/core/tools/index.d.ts.map +1 -1
  383. package/dist/core/tools/index.js.map +1 -1
  384. package/dist/core/tools/ls.d.ts +2 -2
  385. package/dist/core/tools/ls.d.ts.map +1 -1
  386. package/dist/core/tools/ls.js.map +1 -1
  387. package/dist/core/tools/output-accumulator.d.ts +1 -1
  388. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  389. package/dist/core/tools/output-accumulator.js.map +1 -1
  390. package/dist/core/tools/read.d.ts +2 -2
  391. package/dist/core/tools/read.d.ts.map +1 -1
  392. package/dist/core/tools/read.js.map +1 -1
  393. package/dist/core/tools/render-utils.d.ts.map +1 -1
  394. package/dist/core/tools/render-utils.js.map +1 -1
  395. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  396. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  397. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  398. package/dist/core/tools/write.d.ts +1 -1
  399. package/dist/core/tools/write.d.ts.map +1 -1
  400. package/dist/core/tools/write.js.map +1 -1
  401. package/dist/index.d.ts +28 -27
  402. package/dist/index.d.ts.map +1 -1
  403. package/dist/index.js +1 -0
  404. package/dist/index.js.map +1 -1
  405. package/dist/main.d.ts +1 -1
  406. package/dist/main.d.ts.map +1 -1
  407. package/dist/main.js +1 -0
  408. package/dist/main.js.map +1 -1
  409. package/dist/migrations.d.ts.map +1 -1
  410. package/dist/migrations.js.map +1 -1
  411. package/dist/modes/index.d.ts +5 -5
  412. package/dist/modes/index.d.ts.map +1 -1
  413. package/dist/modes/index.js.map +1 -1
  414. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  415. package/dist/modes/interactive/components/armin.js.map +1 -1
  416. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  417. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  418. package/dist/modes/interactive/components/bash-execution.d.ts +1 -1
  419. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  420. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  421. package/dist/modes/interactive/components/bordered-loader.d.ts +1 -1
  422. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  423. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  424. package/dist/modes/interactive/components/branch-summary-message.d.ts +1 -1
  425. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  426. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  427. package/dist/modes/interactive/components/compaction-summary-message.d.ts +1 -1
  428. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  429. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  430. package/dist/modes/interactive/components/config-selector.d.ts +2 -2
  431. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  432. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  433. package/dist/modes/interactive/components/countdown-timer.d.ts +2 -2
  434. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  435. package/dist/modes/interactive/components/countdown-timer.js +2 -2
  436. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  437. package/dist/modes/interactive/components/custom-editor.d.ts +1 -1
  438. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  439. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  440. package/dist/modes/interactive/components/custom-message.d.ts +2 -2
  441. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  442. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  443. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  444. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  445. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  446. package/dist/modes/interactive/components/diff.js.map +1 -1
  447. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  448. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  449. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  450. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  451. package/dist/modes/interactive/components/extension-editor.d.ts +1 -1
  452. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  453. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  454. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  455. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  456. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  457. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  458. package/dist/modes/interactive/components/favorite-models-selector.d.ts +1 -1
  459. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  460. package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
  461. package/dist/modes/interactive/components/footer.d.ts +3 -2
  462. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  463. package/dist/modes/interactive/components/footer.js +42 -42
  464. package/dist/modes/interactive/components/footer.js.map +1 -1
  465. package/dist/modes/interactive/components/index.d.ts +31 -31
  466. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  467. package/dist/modes/interactive/components/index.js.map +1 -1
  468. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  469. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  470. package/dist/modes/interactive/components/login-dialog.d.ts +1 -1
  471. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  472. package/dist/modes/interactive/components/login-dialog.js +2 -2
  473. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  474. package/dist/modes/interactive/components/model-selector.d.ts +3 -3
  475. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  476. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  477. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  478. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  479. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  480. package/dist/modes/interactive/components/session-selector-search.d.ts +1 -1
  481. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  482. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  483. package/dist/modes/interactive/components/session-selector.d.ts +3 -3
  484. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  485. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  486. package/dist/modes/interactive/components/settings-selector.d.ts +1 -1
  487. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  488. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  489. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  490. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  491. package/dist/modes/interactive/components/skill-invocation-message.d.ts +1 -1
  492. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  493. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  494. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  495. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  496. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  497. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  498. package/dist/modes/interactive/components/tool-execution.d.ts +1 -1
  499. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  500. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  501. package/dist/modes/interactive/components/tree-selector.d.ts +1 -1
  502. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  503. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  504. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  505. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  506. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  507. package/dist/modes/interactive/components/user-message.js.map +1 -1
  508. package/dist/modes/interactive/interactive-mode.d.ts +10 -3
  509. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  510. package/dist/modes/interactive/interactive-mode.js +67 -7
  511. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  512. package/dist/modes/interactive/session-info-format.d.ts +1 -1
  513. package/dist/modes/interactive/session-info-format.d.ts.map +1 -1
  514. package/dist/modes/interactive/session-info-format.js.map +1 -1
  515. package/dist/modes/interactive/startup-tools.d.ts.map +1 -1
  516. package/dist/modes/interactive/startup-tools.js.map +1 -1
  517. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  518. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  519. package/dist/modes/interactive/theme/theme.js.map +1 -1
  520. package/dist/modes/interactive/working-status.d.ts +3 -0
  521. package/dist/modes/interactive/working-status.d.ts.map +1 -1
  522. package/dist/modes/interactive/working-status.js +10 -0
  523. package/dist/modes/interactive/working-status.js.map +1 -1
  524. package/dist/modes/neo-mode.d.ts +20 -1
  525. package/dist/modes/neo-mode.d.ts.map +1 -1
  526. package/dist/modes/neo-mode.js +30 -2
  527. package/dist/modes/neo-mode.js.map +1 -1
  528. package/dist/modes/print-mode.d.ts +1 -1
  529. package/dist/modes/print-mode.d.ts.map +1 -1
  530. package/dist/modes/print-mode.js.map +1 -1
  531. package/dist/modes/rpc/rpc-client.d.ts +5 -5
  532. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  533. package/dist/modes/rpc/rpc-client.js +1 -1
  534. package/dist/modes/rpc/rpc-client.js.map +1 -1
  535. package/dist/modes/rpc/rpc-mode.d.ts +2 -2
  536. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  537. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  538. package/dist/modes/rpc/rpc-types.d.ts +4 -4
  539. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  540. package/dist/modes/rpc/rpc-types.js.map +1 -1
  541. package/dist/neo-tui-bin/senpi-neo-tui-linux-x64 +0 -0
  542. package/dist/package-manager-cli.d.ts.map +1 -1
  543. package/dist/package-manager-cli.js +40 -1
  544. package/dist/package-manager-cli.js.map +1 -1
  545. package/dist/utils/changelog.d.ts +1 -1
  546. package/dist/utils/changelog.d.ts.map +1 -1
  547. package/dist/utils/changelog.js.map +1 -1
  548. package/dist/utils/clipboard-image.d.ts.map +1 -1
  549. package/dist/utils/clipboard-image.js.map +1 -1
  550. package/dist/utils/clipboard.d.ts.map +1 -1
  551. package/dist/utils/clipboard.js.map +1 -1
  552. package/dist/utils/exif-orientation.d.ts +1 -1
  553. package/dist/utils/exif-orientation.d.ts.map +1 -1
  554. package/dist/utils/exif-orientation.js.map +1 -1
  555. package/dist/utils/image-convert.d.ts.map +1 -1
  556. package/dist/utils/image-convert.js.map +1 -1
  557. package/dist/utils/image-resize.d.ts.map +1 -1
  558. package/dist/utils/image-resize.js.map +1 -1
  559. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  560. package/dist/utils/pi-user-agent.js.map +1 -1
  561. package/dist/utils/shell.d.ts.map +1 -1
  562. package/dist/utils/shell.js.map +1 -1
  563. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  564. package/dist/utils/syntax-highlight.js.map +1 -1
  565. package/dist/utils/tools-manager.d.ts.map +1 -1
  566. package/dist/utils/tools-manager.js.map +1 -1
  567. package/dist/utils/version-check.d.ts +2 -1
  568. package/dist/utils/version-check.d.ts.map +1 -1
  569. package/dist/utils/version-check.js +5 -4
  570. package/dist/utils/version-check.js.map +1 -1
  571. package/dist/utils/windows-self-update.d.ts.map +1 -1
  572. package/dist/utils/windows-self-update.js.map +1 -1
  573. package/docs/settings.md +1 -1
  574. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  575. package/examples/extensions/doom-overlay/doom-component.ts +2 -2
  576. package/examples/extensions/doom-overlay/index.ts +3 -3
  577. package/examples/extensions/overlay-qa-tests.ts +97 -66
  578. package/examples/extensions/overlay-test.ts +7 -4
  579. package/examples/extensions/plan-mode/index.ts +1 -1
  580. package/package.json +4 -3
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AAExE,MAAM,UAAU,MAAM,CAAC,IAAY,EAAU;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,UAAU,UAAU,CAAC,MAAwB,EAAW;IAC7D,MAAM,KAAK,GAAW,EAAE,CAAC;IAEzB,KAAK,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACP,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AAAA,CACb;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,QAAmB,EAAW;IACtD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,CACvB;AAED,MAAM,UAAU,QAAQ,CAAC,KAAe,EAAE,OAAgB,EAAe;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAE7D,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACvC,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAAA,CACnD,CAAC,CAAC;QAEH,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["import os from \"node:os\";\nimport type { PermissionConfig, Rule, Ruleset } from \"./types.js\";\nimport { Wildcard } from \"./wildcard.js\";\n\nexport const EDIT_TOOLS = [\"edit\", \"write\", \"apply_patch\", \"multiedit\"];\n\nexport function expand(path: string): string {\n\tif (path.startsWith(\"~/\")) {\n\t\treturn os.homedir() + path.slice(1);\n\t}\n\tif (path === \"~\") {\n\t\treturn os.homedir();\n\t}\n\tif (path.startsWith(\"$HOME/\")) {\n\t\treturn os.homedir() + path.slice(5);\n\t}\n\tif (path.startsWith(\"$HOME\")) {\n\t\treturn os.homedir() + path.slice(5);\n\t}\n\treturn path;\n}\n\nexport function fromConfig(config: PermissionConfig): Ruleset {\n\tconst rules: Rule[] = [];\n\n\tfor (const [permission, value] of Object.entries(config)) {\n\t\tif (typeof value === \"string\") {\n\t\t\trules.push({ permission, pattern: \"*\", action: value });\n\t\t} else {\n\t\t\tfor (const [pattern, action] of Object.entries(value)) {\n\t\t\t\trules.push({ permission, pattern: expand(pattern), action });\n\t\t\t}\n\t\t}\n\t}\n\n\treturn rules;\n}\n\nexport function merge(...rulesets: Ruleset[]): Ruleset {\n\treturn rulesets.flat();\n}\n\nexport function disabled(tools: string[], ruleset: Ruleset): Set<string> {\n\tconst result = new Set<string>();\n\n\tfor (const tool of tools) {\n\t\tconst permission = EDIT_TOOLS.includes(tool) ? \"edit\" : tool;\n\n\t\tconst rule = ruleset.findLast((rule) => {\n\t\t\treturn Wildcard.match(permission, rule.permission);\n\t\t});\n\n\t\tif (rule && rule.pattern === \"*\" && rule.action === \"deny\") {\n\t\t\tresult.add(tool);\n\t\t}\n\t}\n\n\treturn result;\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;AAExE,MAAM,UAAU,MAAM,CAAC,IAAY,EAAU;IAC5C,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QAClB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,UAAU,UAAU,CAAC,MAAwB,EAAW;IAC7D,MAAM,KAAK,GAAW,EAAE,CAAC;IAEzB,KAAK,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACP,KAAK,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9D,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC;AAAA,CACb;AAED,MAAM,UAAU,KAAK,CAAC,GAAG,QAAmB,EAAW;IACtD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,CACvB;AAED,MAAM,UAAU,QAAQ,CAAC,KAAe,EAAE,OAAgB,EAAe;IACxE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QAE7D,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACvC,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAAA,CACnD,CAAC,CAAC;QAEH,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC5D,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AAAA,CACd","sourcesContent":["import os from \"node:os\";\nimport type { PermissionConfig, Rule, Ruleset } from \"./types.ts\";\nimport { Wildcard } from \"./wildcard.ts\";\n\nexport const EDIT_TOOLS = [\"edit\", \"write\", \"apply_patch\", \"multiedit\"];\n\nexport function expand(path: string): string {\n\tif (path.startsWith(\"~/\")) {\n\t\treturn os.homedir() + path.slice(1);\n\t}\n\tif (path === \"~\") {\n\t\treturn os.homedir();\n\t}\n\tif (path.startsWith(\"$HOME/\")) {\n\t\treturn os.homedir() + path.slice(5);\n\t}\n\tif (path.startsWith(\"$HOME\")) {\n\t\treturn os.homedir() + path.slice(5);\n\t}\n\treturn path;\n}\n\nexport function fromConfig(config: PermissionConfig): Ruleset {\n\tconst rules: Rule[] = [];\n\n\tfor (const [permission, value] of Object.entries(config)) {\n\t\tif (typeof value === \"string\") {\n\t\t\trules.push({ permission, pattern: \"*\", action: value });\n\t\t} else {\n\t\t\tfor (const [pattern, action] of Object.entries(value)) {\n\t\t\t\trules.push({ permission, pattern: expand(pattern), action });\n\t\t\t}\n\t\t}\n\t}\n\n\treturn rules;\n}\n\nexport function merge(...rulesets: Ruleset[]): Ruleset {\n\treturn rulesets.flat();\n}\n\nexport function disabled(tools: string[], ruleset: Ruleset): Set<string> {\n\tconst result = new Set<string>();\n\n\tfor (const tool of tools) {\n\t\tconst permission = EDIT_TOOLS.includes(tool) ? \"edit\" : tool;\n\n\t\tconst rule = ruleset.findLast((rule) => {\n\t\t\treturn Wildcard.match(permission, rule.permission);\n\t\t});\n\n\t\tif (rule && rule.pattern === \"*\" && rule.action === \"deny\") {\n\t\t\tresult.add(tool);\n\t\t}\n\t}\n\n\treturn result;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Rule, Ruleset } from "../permission-system/types.js";
1
+ import type { Rule, Ruleset } from "../permission-system/types.ts";
2
2
  declare global {
3
3
  interface Array<T> {
4
4
  findLast<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: unknown): S | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,CAAC,MAAM,CAAC,CAAC;IACf,UAAU,KAAK,CAAC,CAAC;QAChB,QAAQ,CAAC,CAAC,SAAS,CAAC,EACnB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,EAC9D,OAAO,CAAC,EAAE,OAAO,GACf,CAAC,GAAG,SAAS,CAAC;QACjB,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC;KACxG;CACD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAU1F","sourcesContent":["import type { Rule, Ruleset } from \"../permission-system/types.js\";\nimport { Wildcard } from \"./wildcard.js\";\n\ndeclare global {\n\tinterface Array<T> {\n\t\tfindLast<S extends T>(\n\t\t\tpredicate: (value: T, index: number, array: T[]) => value is S,\n\t\t\tthisArg?: unknown,\n\t\t): S | undefined;\n\t\tfindLast(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: unknown): T | undefined;\n\t}\n}\n\nexport function evaluate(permission: string, pattern: string, ...rulesets: Ruleset[]): Rule {\n\tconst matchedRule = rulesets.flat().findLast((rule) => {\n\t\treturn Wildcard.match(permission, rule.permission) && matchesPattern(pattern, rule.pattern);\n\t});\n\n\tif (matchedRule) {\n\t\treturn matchedRule;\n\t}\n\n\treturn { action: \"ask\", permission, pattern: \"*\" };\n}\n\nfunction matchesPattern(value: string, pattern: string): boolean {\n\treturn Wildcard.match(value, pattern) || (pattern.endsWith(\" *\") && Wildcard.match(value, pattern.slice(0, -2)));\n}\n"]}
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAGnE,OAAO,CAAC,MAAM,CAAC,CAAC;IACf,UAAU,KAAK,CAAC,CAAC;QAChB,QAAQ,CAAC,CAAC,SAAS,CAAC,EACnB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,EAC9D,OAAO,CAAC,EAAE,OAAO,GACf,CAAC,GAAG,SAAS,CAAC;QACjB,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC;KACxG;CACD;AAED,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,CAU1F","sourcesContent":["import type { Rule, Ruleset } from \"../permission-system/types.ts\";\nimport { Wildcard } from \"./wildcard.ts\";\n\ndeclare global {\n\tinterface Array<T> {\n\t\tfindLast<S extends T>(\n\t\t\tpredicate: (value: T, index: number, array: T[]) => value is S,\n\t\t\tthisArg?: unknown,\n\t\t): S | undefined;\n\t\tfindLast(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: unknown): T | undefined;\n\t}\n}\n\nexport function evaluate(permission: string, pattern: string, ...rulesets: Ruleset[]): Rule {\n\tconst matchedRule = rulesets.flat().findLast((rule) => {\n\t\treturn Wildcard.match(permission, rule.permission) && matchesPattern(pattern, rule.pattern);\n\t});\n\n\tif (matchedRule) {\n\t\treturn matchedRule;\n\t}\n\n\treturn { action: \"ask\", permission, pattern: \"*\" };\n}\n\nfunction matchesPattern(value: string, pattern: string): boolean {\n\treturn Wildcard.match(value, pattern) || (pattern.endsWith(\" *\") && Wildcard.match(value, pattern.slice(0, -2)));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/evaluate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAYzC,MAAM,UAAU,QAAQ,CAAC,UAAkB,EAAE,OAAe,EAAE,GAAG,QAAmB,EAAQ;IAC3F,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACtD,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAAA,CAC5F,CAAC,CAAC;IAEH,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAAA,CACnD;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,OAAe,EAAW;IAChE,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,CACjH","sourcesContent":["import type { Rule, Ruleset } from \"../permission-system/types.js\";\nimport { Wildcard } from \"./wildcard.js\";\n\ndeclare global {\n\tinterface Array<T> {\n\t\tfindLast<S extends T>(\n\t\t\tpredicate: (value: T, index: number, array: T[]) => value is S,\n\t\t\tthisArg?: unknown,\n\t\t): S | undefined;\n\t\tfindLast(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: unknown): T | undefined;\n\t}\n}\n\nexport function evaluate(permission: string, pattern: string, ...rulesets: Ruleset[]): Rule {\n\tconst matchedRule = rulesets.flat().findLast((rule) => {\n\t\treturn Wildcard.match(permission, rule.permission) && matchesPattern(pattern, rule.pattern);\n\t});\n\n\tif (matchedRule) {\n\t\treturn matchedRule;\n\t}\n\n\treturn { action: \"ask\", permission, pattern: \"*\" };\n}\n\nfunction matchesPattern(value: string, pattern: string): boolean {\n\treturn Wildcard.match(value, pattern) || (pattern.endsWith(\" *\") && Wildcard.match(value, pattern.slice(0, -2)));\n}\n"]}
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/evaluate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAYzC,MAAM,UAAU,QAAQ,CAAC,UAAkB,EAAE,OAAe,EAAE,GAAG,QAAmB,EAAQ;IAC3F,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACtD,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IAAA,CAC5F,CAAC,CAAC;IAEH,IAAI,WAAW,EAAE,CAAC;QACjB,OAAO,WAAW,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAAA,CACnD;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,OAAe,EAAW;IAChE,OAAO,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAAA,CACjH","sourcesContent":["import type { Rule, Ruleset } from \"../permission-system/types.ts\";\nimport { Wildcard } from \"./wildcard.ts\";\n\ndeclare global {\n\tinterface Array<T> {\n\t\tfindLast<S extends T>(\n\t\t\tpredicate: (value: T, index: number, array: T[]) => value is S,\n\t\t\tthisArg?: unknown,\n\t\t): S | undefined;\n\t\tfindLast(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: unknown): T | undefined;\n\t}\n}\n\nexport function evaluate(permission: string, pattern: string, ...rulesets: Ruleset[]): Rule {\n\tconst matchedRule = rulesets.flat().findLast((rule) => {\n\t\treturn Wildcard.match(permission, rule.permission) && matchesPattern(pattern, rule.pattern);\n\t});\n\n\tif (matchedRule) {\n\t\treturn matchedRule;\n\t}\n\n\treturn { action: \"ask\", permission, pattern: \"*\" };\n}\n\nfunction matchesPattern(value: string, pattern: string): boolean {\n\treturn Wildcard.match(value, pattern) || (pattern.endsWith(\" *\") && Wildcard.match(value, pattern.slice(0, -2)));\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { ExtensionAPI } from "../../types.js";
2
- import type { PermissionDecision, Request } from "./types.js";
1
+ import type { ExtensionAPI } from "../../types.ts";
2
+ import type { PermissionDecision, Request } from "./types.ts";
3
3
  /**
4
4
  * Event type for when a permission is asked.
5
5
  * Contains the full request information.
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE3C;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;CAC1B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACtC;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAElC;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACnF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,sBAAsB,CAS3E;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,sBAAsB,GAAG;IACnE;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAEzD;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAExE;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACd,CAyCA","sourcesContent":["import type { ExtensionAPI } from \"../../types.js\";\nimport type { PermissionDecision, Request } from \"./types.js\";\n\n/**\n * Event type for when a permission is asked.\n * Contains the full request information.\n */\nexport type PermissionAskedEvent = Request;\n\n/**\n * Event type for when a permission is replied to.\n * Contains the reply and identifiers to correlate with the request.\n */\nexport type PermissionRepliedEvent = {\n\trequestID: string;\n\tsessionID: string;\n\treply: PermissionDecision;\n};\n\n/**\n * Event emitter interface for permission events.\n * Injectable into services for loose coupling.\n */\nexport interface PermissionEventEmitter {\n\t/**\n\t * Emit a permission_asked event.\n\t * @param request - The permission request being asked\n\t */\n\temitAsked(request: Request): void;\n\n\t/**\n\t * Emit a permission_replied event.\n\t * @param requestID - The ID of the request being replied to\n\t * @param sessionID - The session ID associated with the request\n\t * @param reply - The user's reply (once, always, or reject)\n\t */\n\temitReplied(requestID: string, sessionID: string, reply: PermissionDecision): void;\n}\n\n/**\n * Creates an event emitter that wraps pi.events for inter-extension communication.\n * Use this when running within the pi extension system.\n *\n * @param pi - The ExtensionAPI provided by the pi extension system\n * @returns PermissionEventEmitter that emits via pi.events\n */\nexport function createEventEmitter(pi: ExtensionAPI): PermissionEventEmitter {\n\treturn {\n\t\temitAsked: (request: Request) => {\n\t\t\tpi.events.emit(\"permission_asked\", request);\n\t\t},\n\t\temitReplied: (requestID: string, sessionID: string, reply: PermissionDecision) => {\n\t\t\tpi.events.emit(\"permission_replied\", { requestID, sessionID, reply });\n\t\t},\n\t};\n}\n\n/**\n * Local event emitter implementation for standalone or test usage.\n * Uses a simple callback registry when pi.events is not available.\n *\n * @returns PermissionEventEmitter with local event handling\n */\nexport function createLocalEventEmitter(): PermissionEventEmitter & {\n\t/**\n\t * Register a handler for permission_asked events.\n\t * @param handler - Callback invoked when a permission is asked\n\t * @returns Unsubscribe function\n\t */\n\tonAsked(handler: (request: Request) => void): () => void;\n\n\t/**\n\t * Register a handler for permission_replied events.\n\t * @param handler - Callback invoked when a permission is replied to\n\t * @returns Unsubscribe function\n\t */\n\tonReplied(handler: (event: PermissionRepliedEvent) => void): () => void;\n\n\t/**\n\t * Clear all registered handlers.\n\t */\n\tclear(): void;\n} {\n\tconst askedHandlers = new Set<(request: Request) => void>();\n\tconst repliedHandlers = new Set<(event: PermissionRepliedEvent) => void>();\n\n\treturn {\n\t\temitAsked: (request: Request) => {\n\t\t\tfor (const handler of askedHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\thandler(request);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Error in permission_asked handler:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\temitReplied: (requestID: string, sessionID: string, reply: PermissionDecision) => {\n\t\t\tconst event: PermissionRepliedEvent = { requestID, sessionID, reply };\n\t\t\tfor (const handler of repliedHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\thandler(event);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Error in permission_replied handler:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonAsked: (handler: (request: Request) => void): (() => void) => {\n\t\t\taskedHandlers.add(handler);\n\t\t\treturn () => askedHandlers.delete(handler);\n\t\t},\n\n\t\tonReplied: (handler: (event: PermissionRepliedEvent) => void): (() => void) => {\n\t\t\trepliedHandlers.add(handler);\n\t\t\treturn () => repliedHandlers.delete(handler);\n\t\t},\n\n\t\tclear: () => {\n\t\t\taskedHandlers.clear();\n\t\t\trepliedHandlers.clear();\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,OAAO,CAAC;AAE3C;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,kBAAkB,CAAC;CAC1B,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACtC;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAElC;;;;;OAKG;IACH,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACnF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,YAAY,GAAG,sBAAsB,CAS3E;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,sBAAsB,GAAG;IACnE;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAEzD;;;;OAIG;IACH,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAExE;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACd,CAyCA","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport type { PermissionDecision, Request } from \"./types.ts\";\n\n/**\n * Event type for when a permission is asked.\n * Contains the full request information.\n */\nexport type PermissionAskedEvent = Request;\n\n/**\n * Event type for when a permission is replied to.\n * Contains the reply and identifiers to correlate with the request.\n */\nexport type PermissionRepliedEvent = {\n\trequestID: string;\n\tsessionID: string;\n\treply: PermissionDecision;\n};\n\n/**\n * Event emitter interface for permission events.\n * Injectable into services for loose coupling.\n */\nexport interface PermissionEventEmitter {\n\t/**\n\t * Emit a permission_asked event.\n\t * @param request - The permission request being asked\n\t */\n\temitAsked(request: Request): void;\n\n\t/**\n\t * Emit a permission_replied event.\n\t * @param requestID - The ID of the request being replied to\n\t * @param sessionID - The session ID associated with the request\n\t * @param reply - The user's reply (once, always, or reject)\n\t */\n\temitReplied(requestID: string, sessionID: string, reply: PermissionDecision): void;\n}\n\n/**\n * Creates an event emitter that wraps pi.events for inter-extension communication.\n * Use this when running within the pi extension system.\n *\n * @param pi - The ExtensionAPI provided by the pi extension system\n * @returns PermissionEventEmitter that emits via pi.events\n */\nexport function createEventEmitter(pi: ExtensionAPI): PermissionEventEmitter {\n\treturn {\n\t\temitAsked: (request: Request) => {\n\t\t\tpi.events.emit(\"permission_asked\", request);\n\t\t},\n\t\temitReplied: (requestID: string, sessionID: string, reply: PermissionDecision) => {\n\t\t\tpi.events.emit(\"permission_replied\", { requestID, sessionID, reply });\n\t\t},\n\t};\n}\n\n/**\n * Local event emitter implementation for standalone or test usage.\n * Uses a simple callback registry when pi.events is not available.\n *\n * @returns PermissionEventEmitter with local event handling\n */\nexport function createLocalEventEmitter(): PermissionEventEmitter & {\n\t/**\n\t * Register a handler for permission_asked events.\n\t * @param handler - Callback invoked when a permission is asked\n\t * @returns Unsubscribe function\n\t */\n\tonAsked(handler: (request: Request) => void): () => void;\n\n\t/**\n\t * Register a handler for permission_replied events.\n\t * @param handler - Callback invoked when a permission is replied to\n\t * @returns Unsubscribe function\n\t */\n\tonReplied(handler: (event: PermissionRepliedEvent) => void): () => void;\n\n\t/**\n\t * Clear all registered handlers.\n\t */\n\tclear(): void;\n} {\n\tconst askedHandlers = new Set<(request: Request) => void>();\n\tconst repliedHandlers = new Set<(event: PermissionRepliedEvent) => void>();\n\n\treturn {\n\t\temitAsked: (request: Request) => {\n\t\t\tfor (const handler of askedHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\thandler(request);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Error in permission_asked handler:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\temitReplied: (requestID: string, sessionID: string, reply: PermissionDecision) => {\n\t\t\tconst event: PermissionRepliedEvent = { requestID, sessionID, reply };\n\t\t\tfor (const handler of repliedHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\thandler(event);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Error in permission_replied handler:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonAsked: (handler: (request: Request) => void): (() => void) => {\n\t\t\taskedHandlers.add(handler);\n\t\t\treturn () => askedHandlers.delete(handler);\n\t\t},\n\n\t\tonReplied: (handler: (event: PermissionRepliedEvent) => void): (() => void) => {\n\t\t\trepliedHandlers.add(handler);\n\t\t\treturn () => repliedHandlers.delete(handler);\n\t\t},\n\n\t\tclear: () => {\n\t\t\taskedHandlers.clear();\n\t\t\trepliedHandlers.clear();\n\t\t},\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/events.ts"],"names":[],"mappings":"AAuCA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAgB,EAA0B;IAC5E,OAAO;QACN,SAAS,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC;YAChC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAAA,CAC5C;QACD,WAAW,EAAE,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAyB,EAAE,EAAE,CAAC;YACjF,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAAA,CACtE;KACD,CAAC;AAAA,CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,GAmBrC;IACD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC5D,MAAM,eAAe,GAAG,IAAI,GAAG,EAA2C,CAAC;IAE3E,OAAO;QACN,SAAS,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC;YAChC,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACJ,OAAO,CAAC,OAAO,CAAC,CAAC;gBAClB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;gBAC1D,CAAC;YACF,CAAC;QAAA,CACD;QAED,WAAW,EAAE,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAyB,EAAE,EAAE,CAAC;YACjF,MAAM,KAAK,GAA2B,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACtE,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACJ,OAAO,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;gBAC5D,CAAC;YACF,CAAC;QAAA,CACD;QAED,OAAO,EAAE,CAAC,OAAmC,EAAgB,EAAE,CAAC;YAC/D,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAA,CAC3C;QAED,SAAS,EAAE,CAAC,OAAgD,EAAgB,EAAE,CAAC;YAC9E,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAA,CAC7C;QAED,KAAK,EAAE,GAAG,EAAE,CAAC;YACZ,aAAa,CAAC,KAAK,EAAE,CAAC;YACtB,eAAe,CAAC,KAAK,EAAE,CAAC;QAAA,CACxB;KACD,CAAC;AAAA,CACF","sourcesContent":["import type { ExtensionAPI } from \"../../types.js\";\nimport type { PermissionDecision, Request } from \"./types.js\";\n\n/**\n * Event type for when a permission is asked.\n * Contains the full request information.\n */\nexport type PermissionAskedEvent = Request;\n\n/**\n * Event type for when a permission is replied to.\n * Contains the reply and identifiers to correlate with the request.\n */\nexport type PermissionRepliedEvent = {\n\trequestID: string;\n\tsessionID: string;\n\treply: PermissionDecision;\n};\n\n/**\n * Event emitter interface for permission events.\n * Injectable into services for loose coupling.\n */\nexport interface PermissionEventEmitter {\n\t/**\n\t * Emit a permission_asked event.\n\t * @param request - The permission request being asked\n\t */\n\temitAsked(request: Request): void;\n\n\t/**\n\t * Emit a permission_replied event.\n\t * @param requestID - The ID of the request being replied to\n\t * @param sessionID - The session ID associated with the request\n\t * @param reply - The user's reply (once, always, or reject)\n\t */\n\temitReplied(requestID: string, sessionID: string, reply: PermissionDecision): void;\n}\n\n/**\n * Creates an event emitter that wraps pi.events for inter-extension communication.\n * Use this when running within the pi extension system.\n *\n * @param pi - The ExtensionAPI provided by the pi extension system\n * @returns PermissionEventEmitter that emits via pi.events\n */\nexport function createEventEmitter(pi: ExtensionAPI): PermissionEventEmitter {\n\treturn {\n\t\temitAsked: (request: Request) => {\n\t\t\tpi.events.emit(\"permission_asked\", request);\n\t\t},\n\t\temitReplied: (requestID: string, sessionID: string, reply: PermissionDecision) => {\n\t\t\tpi.events.emit(\"permission_replied\", { requestID, sessionID, reply });\n\t\t},\n\t};\n}\n\n/**\n * Local event emitter implementation for standalone or test usage.\n * Uses a simple callback registry when pi.events is not available.\n *\n * @returns PermissionEventEmitter with local event handling\n */\nexport function createLocalEventEmitter(): PermissionEventEmitter & {\n\t/**\n\t * Register a handler for permission_asked events.\n\t * @param handler - Callback invoked when a permission is asked\n\t * @returns Unsubscribe function\n\t */\n\tonAsked(handler: (request: Request) => void): () => void;\n\n\t/**\n\t * Register a handler for permission_replied events.\n\t * @param handler - Callback invoked when a permission is replied to\n\t * @returns Unsubscribe function\n\t */\n\tonReplied(handler: (event: PermissionRepliedEvent) => void): () => void;\n\n\t/**\n\t * Clear all registered handlers.\n\t */\n\tclear(): void;\n} {\n\tconst askedHandlers = new Set<(request: Request) => void>();\n\tconst repliedHandlers = new Set<(event: PermissionRepliedEvent) => void>();\n\n\treturn {\n\t\temitAsked: (request: Request) => {\n\t\t\tfor (const handler of askedHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\thandler(request);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Error in permission_asked handler:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\temitReplied: (requestID: string, sessionID: string, reply: PermissionDecision) => {\n\t\t\tconst event: PermissionRepliedEvent = { requestID, sessionID, reply };\n\t\t\tfor (const handler of repliedHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\thandler(event);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Error in permission_replied handler:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonAsked: (handler: (request: Request) => void): (() => void) => {\n\t\t\taskedHandlers.add(handler);\n\t\t\treturn () => askedHandlers.delete(handler);\n\t\t},\n\n\t\tonReplied: (handler: (event: PermissionRepliedEvent) => void): (() => void) => {\n\t\t\trepliedHandlers.add(handler);\n\t\t\treturn () => repliedHandlers.delete(handler);\n\t\t},\n\n\t\tclear: () => {\n\t\t\taskedHandlers.clear();\n\t\t\trepliedHandlers.clear();\n\t\t},\n\t};\n}\n"]}
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/events.ts"],"names":[],"mappings":"AAuCA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAgB,EAA0B;IAC5E,OAAO;QACN,SAAS,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC;YAChC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;QAAA,CAC5C;QACD,WAAW,EAAE,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAyB,EAAE,EAAE,CAAC;YACjF,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAAA,CACtE;KACD,CAAC;AAAA,CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,GAmBrC;IACD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC5D,MAAM,eAAe,GAAG,IAAI,GAAG,EAA2C,CAAC;IAE3E,OAAO;QACN,SAAS,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC;YAChC,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;gBACrC,IAAI,CAAC;oBACJ,OAAO,CAAC,OAAO,CAAC,CAAC;gBAClB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;gBAC1D,CAAC;YACF,CAAC;QAAA,CACD;QAED,WAAW,EAAE,CAAC,SAAiB,EAAE,SAAiB,EAAE,KAAyB,EAAE,EAAE,CAAC;YACjF,MAAM,KAAK,GAA2B,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACtE,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACJ,OAAO,CAAC,KAAK,CAAC,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;gBAC5D,CAAC;YACF,CAAC;QAAA,CACD;QAED,OAAO,EAAE,CAAC,OAAmC,EAAgB,EAAE,CAAC;YAC/D,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3B,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAA,CAC3C;QAED,SAAS,EAAE,CAAC,OAAgD,EAAgB,EAAE,CAAC;YAC9E,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC7B,OAAO,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAA,CAC7C;QAED,KAAK,EAAE,GAAG,EAAE,CAAC;YACZ,aAAa,CAAC,KAAK,EAAE,CAAC;YACtB,eAAe,CAAC,KAAK,EAAE,CAAC;QAAA,CACxB;KACD,CAAC;AAAA,CACF","sourcesContent":["import type { ExtensionAPI } from \"../../types.ts\";\nimport type { PermissionDecision, Request } from \"./types.ts\";\n\n/**\n * Event type for when a permission is asked.\n * Contains the full request information.\n */\nexport type PermissionAskedEvent = Request;\n\n/**\n * Event type for when a permission is replied to.\n * Contains the reply and identifiers to correlate with the request.\n */\nexport type PermissionRepliedEvent = {\n\trequestID: string;\n\tsessionID: string;\n\treply: PermissionDecision;\n};\n\n/**\n * Event emitter interface for permission events.\n * Injectable into services for loose coupling.\n */\nexport interface PermissionEventEmitter {\n\t/**\n\t * Emit a permission_asked event.\n\t * @param request - The permission request being asked\n\t */\n\temitAsked(request: Request): void;\n\n\t/**\n\t * Emit a permission_replied event.\n\t * @param requestID - The ID of the request being replied to\n\t * @param sessionID - The session ID associated with the request\n\t * @param reply - The user's reply (once, always, or reject)\n\t */\n\temitReplied(requestID: string, sessionID: string, reply: PermissionDecision): void;\n}\n\n/**\n * Creates an event emitter that wraps pi.events for inter-extension communication.\n * Use this when running within the pi extension system.\n *\n * @param pi - The ExtensionAPI provided by the pi extension system\n * @returns PermissionEventEmitter that emits via pi.events\n */\nexport function createEventEmitter(pi: ExtensionAPI): PermissionEventEmitter {\n\treturn {\n\t\temitAsked: (request: Request) => {\n\t\t\tpi.events.emit(\"permission_asked\", request);\n\t\t},\n\t\temitReplied: (requestID: string, sessionID: string, reply: PermissionDecision) => {\n\t\t\tpi.events.emit(\"permission_replied\", { requestID, sessionID, reply });\n\t\t},\n\t};\n}\n\n/**\n * Local event emitter implementation for standalone or test usage.\n * Uses a simple callback registry when pi.events is not available.\n *\n * @returns PermissionEventEmitter with local event handling\n */\nexport function createLocalEventEmitter(): PermissionEventEmitter & {\n\t/**\n\t * Register a handler for permission_asked events.\n\t * @param handler - Callback invoked when a permission is asked\n\t * @returns Unsubscribe function\n\t */\n\tonAsked(handler: (request: Request) => void): () => void;\n\n\t/**\n\t * Register a handler for permission_replied events.\n\t * @param handler - Callback invoked when a permission is replied to\n\t * @returns Unsubscribe function\n\t */\n\tonReplied(handler: (event: PermissionRepliedEvent) => void): () => void;\n\n\t/**\n\t * Clear all registered handlers.\n\t */\n\tclear(): void;\n} {\n\tconst askedHandlers = new Set<(request: Request) => void>();\n\tconst repliedHandlers = new Set<(event: PermissionRepliedEvent) => void>();\n\n\treturn {\n\t\temitAsked: (request: Request) => {\n\t\t\tfor (const handler of askedHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\thandler(request);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Error in permission_asked handler:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\temitReplied: (requestID: string, sessionID: string, reply: PermissionDecision) => {\n\t\t\tconst event: PermissionRepliedEvent = { requestID, sessionID, reply };\n\t\t\tfor (const handler of repliedHandlers) {\n\t\t\t\ttry {\n\t\t\t\t\thandler(event);\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Error in permission_replied handler:\", err);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tonAsked: (handler: (request: Request) => void): (() => void) => {\n\t\t\taskedHandlers.add(handler);\n\t\t\treturn () => askedHandlers.delete(handler);\n\t\t},\n\n\t\tonReplied: (handler: (event: PermissionRepliedEvent) => void): (() => void) => {\n\t\t\trepliedHandlers.add(handler);\n\t\t\treturn () => repliedHandlers.delete(handler);\n\t\t},\n\n\t\tclear: () => {\n\t\t\taskedHandlers.clear();\n\t\t\trepliedHandlers.clear();\n\t\t},\n\t};\n}\n"]}
@@ -1,3 +1,3 @@
1
- import type { ExtensionAPI } from "../../types.js";
1
+ import type { ExtensionAPI } from "../../types.ts";
2
2
  export default function permissionSystemExtension(pi: ExtensionAPI): void;
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAuDnD,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAsGxE","sourcesContent":["import { SettingsManager } from \"../../../settings-manager.js\";\nimport type { ExtensionAPI } from \"../../types.js\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.js\";\nimport { parsePermissionFlag } from \"./cli.js\";\nimport { disabled } from \"./config.js\";\nimport { createEventEmitter } from \"./events.js\";\nimport { handleNoUI } from \"./non-interactive.js\";\nimport { createBuiltinParserRegistry, type ParserRegistry } from \"./parsers.js\";\nimport { showPermissionPrompt } from \"./prompt.js\";\nimport { PermissionService } from \"./service.js\";\nimport { loadPermissionSettings } from \"./settings.js\";\nimport { appendApproved } from \"./storage.js\";\nimport { CorrectedError, DeniedError, RejectedError, type Request, type Ruleset } from \"./types.js\";\n\nfunction createRequestIDFactory(): () => string {\n\tlet counter = 0;\n\treturn () => {\n\t\tcounter += 1;\n\t\treturn `permission-${counter}`;\n\t};\n}\n\nfunction getReason(error: unknown): string {\n\tif (error instanceof DeniedError || error instanceof CorrectedError || error instanceof RejectedError) {\n\t\treturn error.message;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\n\treturn \"Permission request was rejected.\";\n}\n\nfunction createRequestMetadata(toolName: string, input: Record<string, unknown>): Record<string, unknown> {\n\tconst metadata: Record<string, unknown> = {\n\t\ttoolName,\n\t\t...input,\n\t};\n\n\tconst pathValue = typeof input.path === \"string\" ? input.path : undefined;\n\tconst filePathValue = typeof input.file_path === \"string\" ? input.file_path : undefined;\n\tconst patchTextValue =\n\t\ttypeof input.input === \"string\" ? input.input : typeof input.patchText === \"string\" ? input.patchText : undefined;\n\n\tif (toolName === \"edit\" || toolName === \"write\" || toolName === \"apply_patch\" || toolName === \"multiedit\") {\n\t\tmetadata.filepath = pathValue ?? filePathValue ?? extractPatchedPaths(patchTextValue ?? \"\")[0];\n\t}\n\n\tif (toolName === \"read\") {\n\t\tmetadata.filePath = pathValue ?? filePathValue;\n\t}\n\n\treturn metadata;\n}\n\nexport default function permissionSystemExtension(pi: ExtensionAPI): void {\n\tlet service: PermissionService | null = null;\n\tlet parserRegistry: ParserRegistry | null = null;\n\tlet cliRuleset: Ruleset = [];\n\tlet staticRuleset: Ruleset = [];\n\tlet initialApprovedCount = 0;\n\n\tconst nextRequestID = createRequestIDFactory();\n\n\tpi.registerFlag(\"permission\", {\n\t\tdescription: \"Set permission rules (format: tool=action or tool:pattern=action)\",\n\t\ttype: \"string\",\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tconst permissionFlag = pi.getFlag(\"permission\");\n\t\tcliRuleset = typeof permissionFlag === \"string\" ? parsePermissionFlag(permissionFlag) : [];\n\n\t\tconst loadedSettings = loadPermissionSettings(settingsManager, cliRuleset, ctx.cwd);\n\t\tstaticRuleset = loadedSettings.staticRuleset;\n\t\tconst approved = loadedSettings.approved;\n\t\tparserRegistry = createBuiltinParserRegistry();\n\t\tservice = new PermissionService(staticRuleset, approved, createEventEmitter(pi));\n\t\tinitialApprovedCount = approved.length;\n\n\t\tconst allTools = pi.getAllTools().map((tool) => tool.name);\n\t\tconst disabledTools = disabled(allTools, staticRuleset);\n\t\tconst activeTools = pi.getActiveTools().filter((toolName) => !disabledTools.has(toolName));\n\t\tpi.setActiveTools(activeTools);\n\t});\n\n\tpi.on(\"tool_call\", async (event, ctx) => {\n\t\tif (!service || !parserRegistry) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst permissionRequests = parserRegistry.parse(event.toolName, event.input, ctx.cwd);\n\t\tconst sessionID = ctx.sessionManager.getSessionId();\n\n\t\tfor (const permissionRequest of permissionRequests) {\n\t\t\tconst request: Request = {\n\t\t\t\tid: nextRequestID(),\n\t\t\t\tsessionID,\n\t\t\t\tpermission: permissionRequest.permission,\n\t\t\t\tpatterns: permissionRequest.patterns,\n\t\t\t\talways: permissionRequest.always,\n\t\t\t\tmetadata: createRequestMetadata(event.toolName, event.input),\n\t\t\t};\n\n\t\t\tconst askPromise = service.ask(request);\n\t\t\tconst isPending = service.list().some((pendingRequest) => pendingRequest.id === request.id);\n\n\t\t\tif (!isPending) {\n\t\t\t\ttry {\n\t\t\t\t\tawait askPromise;\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn { block: true, reason: getReason(error) };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tconst reply = await showPermissionPrompt(ctx, request);\n\t\t\t\tservice.reply(reply);\n\t\t\t} else {\n\t\t\t\tconst reply = handleNoUI(request, staticRuleset, cliRuleset, (eventName, data) => {\n\t\t\t\t\tif (eventName !== \"permission_asked\") {\n\t\t\t\t\t\tpi.events.emit(eventName, data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (reply) {\n\t\t\t\t\tservice.reply(reply);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait askPromise;\n\t\t\t} catch (error) {\n\t\t\t\treturn { block: true, reason: getReason(error) };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tvoid event;\n\n\t\tif (!service) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst approved = service.getApproved().slice(initialApprovedCount);\n\t\tif (approved.length > 0) {\n\t\t\tappendApproved(ctx.cwd, approved);\n\t\t}\n\n\t\tfor (const pendingRequest of service.list()) {\n\t\t\tservice.reply({ requestID: pendingRequest.id, reply: \"reject\" });\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAuDnD,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAsGxE","sourcesContent":["import { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI } from \"../../types.ts\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { parsePermissionFlag } from \"./cli.ts\";\nimport { disabled } from \"./config.ts\";\nimport { createEventEmitter } from \"./events.ts\";\nimport { handleNoUI } from \"./non-interactive.ts\";\nimport { createBuiltinParserRegistry, type ParserRegistry } from \"./parsers.ts\";\nimport { showPermissionPrompt } from \"./prompt.ts\";\nimport { PermissionService } from \"./service.ts\";\nimport { loadPermissionSettings } from \"./settings.ts\";\nimport { appendApproved } from \"./storage.ts\";\nimport { CorrectedError, DeniedError, RejectedError, type Request, type Ruleset } from \"./types.ts\";\n\nfunction createRequestIDFactory(): () => string {\n\tlet counter = 0;\n\treturn () => {\n\t\tcounter += 1;\n\t\treturn `permission-${counter}`;\n\t};\n}\n\nfunction getReason(error: unknown): string {\n\tif (error instanceof DeniedError || error instanceof CorrectedError || error instanceof RejectedError) {\n\t\treturn error.message;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\n\treturn \"Permission request was rejected.\";\n}\n\nfunction createRequestMetadata(toolName: string, input: Record<string, unknown>): Record<string, unknown> {\n\tconst metadata: Record<string, unknown> = {\n\t\ttoolName,\n\t\t...input,\n\t};\n\n\tconst pathValue = typeof input.path === \"string\" ? input.path : undefined;\n\tconst filePathValue = typeof input.file_path === \"string\" ? input.file_path : undefined;\n\tconst patchTextValue =\n\t\ttypeof input.input === \"string\" ? input.input : typeof input.patchText === \"string\" ? input.patchText : undefined;\n\n\tif (toolName === \"edit\" || toolName === \"write\" || toolName === \"apply_patch\" || toolName === \"multiedit\") {\n\t\tmetadata.filepath = pathValue ?? filePathValue ?? extractPatchedPaths(patchTextValue ?? \"\")[0];\n\t}\n\n\tif (toolName === \"read\") {\n\t\tmetadata.filePath = pathValue ?? filePathValue;\n\t}\n\n\treturn metadata;\n}\n\nexport default function permissionSystemExtension(pi: ExtensionAPI): void {\n\tlet service: PermissionService | null = null;\n\tlet parserRegistry: ParserRegistry | null = null;\n\tlet cliRuleset: Ruleset = [];\n\tlet staticRuleset: Ruleset = [];\n\tlet initialApprovedCount = 0;\n\n\tconst nextRequestID = createRequestIDFactory();\n\n\tpi.registerFlag(\"permission\", {\n\t\tdescription: \"Set permission rules (format: tool=action or tool:pattern=action)\",\n\t\ttype: \"string\",\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tconst permissionFlag = pi.getFlag(\"permission\");\n\t\tcliRuleset = typeof permissionFlag === \"string\" ? parsePermissionFlag(permissionFlag) : [];\n\n\t\tconst loadedSettings = loadPermissionSettings(settingsManager, cliRuleset, ctx.cwd);\n\t\tstaticRuleset = loadedSettings.staticRuleset;\n\t\tconst approved = loadedSettings.approved;\n\t\tparserRegistry = createBuiltinParserRegistry();\n\t\tservice = new PermissionService(staticRuleset, approved, createEventEmitter(pi));\n\t\tinitialApprovedCount = approved.length;\n\n\t\tconst allTools = pi.getAllTools().map((tool) => tool.name);\n\t\tconst disabledTools = disabled(allTools, staticRuleset);\n\t\tconst activeTools = pi.getActiveTools().filter((toolName) => !disabledTools.has(toolName));\n\t\tpi.setActiveTools(activeTools);\n\t});\n\n\tpi.on(\"tool_call\", async (event, ctx) => {\n\t\tif (!service || !parserRegistry) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst permissionRequests = parserRegistry.parse(event.toolName, event.input, ctx.cwd);\n\t\tconst sessionID = ctx.sessionManager.getSessionId();\n\n\t\tfor (const permissionRequest of permissionRequests) {\n\t\t\tconst request: Request = {\n\t\t\t\tid: nextRequestID(),\n\t\t\t\tsessionID,\n\t\t\t\tpermission: permissionRequest.permission,\n\t\t\t\tpatterns: permissionRequest.patterns,\n\t\t\t\talways: permissionRequest.always,\n\t\t\t\tmetadata: createRequestMetadata(event.toolName, event.input),\n\t\t\t};\n\n\t\t\tconst askPromise = service.ask(request);\n\t\t\tconst isPending = service.list().some((pendingRequest) => pendingRequest.id === request.id);\n\n\t\t\tif (!isPending) {\n\t\t\t\ttry {\n\t\t\t\t\tawait askPromise;\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn { block: true, reason: getReason(error) };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tconst reply = await showPermissionPrompt(ctx, request);\n\t\t\t\tservice.reply(reply);\n\t\t\t} else {\n\t\t\t\tconst reply = handleNoUI(request, staticRuleset, cliRuleset, (eventName, data) => {\n\t\t\t\t\tif (eventName !== \"permission_asked\") {\n\t\t\t\t\t\tpi.events.emit(eventName, data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (reply) {\n\t\t\t\t\tservice.reply(reply);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait askPromise;\n\t\t\t} catch (error) {\n\t\t\t\treturn { block: true, reason: getReason(error) };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tvoid event;\n\n\t\tif (!service) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst approved = service.getApproved().slice(initialApprovedCount);\n\t\tif (approved.length > 0) {\n\t\t\tappendApproved(ctx.cwd, approved);\n\t\t}\n\n\t\tfor (const pendingRequest of service.list()) {\n\t\t\tservice.reply({ requestID: pendingRequest.id, reply: \"reject\" });\n\t\t}\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { SettingsManager } from \"../../../settings-manager.js\";\nimport type { ExtensionAPI } from \"../../types.js\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.js\";\nimport { parsePermissionFlag } from \"./cli.js\";\nimport { disabled } from \"./config.js\";\nimport { createEventEmitter } from \"./events.js\";\nimport { handleNoUI } from \"./non-interactive.js\";\nimport { createBuiltinParserRegistry, type ParserRegistry } from \"./parsers.js\";\nimport { showPermissionPrompt } from \"./prompt.js\";\nimport { PermissionService } from \"./service.js\";\nimport { loadPermissionSettings } from \"./settings.js\";\nimport { appendApproved } from \"./storage.js\";\nimport { CorrectedError, DeniedError, RejectedError, type Request, type Ruleset } from \"./types.js\";\n\nfunction createRequestIDFactory(): () => string {\n\tlet counter = 0;\n\treturn () => {\n\t\tcounter += 1;\n\t\treturn `permission-${counter}`;\n\t};\n}\n\nfunction getReason(error: unknown): string {\n\tif (error instanceof DeniedError || error instanceof CorrectedError || error instanceof RejectedError) {\n\t\treturn error.message;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\n\treturn \"Permission request was rejected.\";\n}\n\nfunction createRequestMetadata(toolName: string, input: Record<string, unknown>): Record<string, unknown> {\n\tconst metadata: Record<string, unknown> = {\n\t\ttoolName,\n\t\t...input,\n\t};\n\n\tconst pathValue = typeof input.path === \"string\" ? input.path : undefined;\n\tconst filePathValue = typeof input.file_path === \"string\" ? input.file_path : undefined;\n\tconst patchTextValue =\n\t\ttypeof input.input === \"string\" ? input.input : typeof input.patchText === \"string\" ? input.patchText : undefined;\n\n\tif (toolName === \"edit\" || toolName === \"write\" || toolName === \"apply_patch\" || toolName === \"multiedit\") {\n\t\tmetadata.filepath = pathValue ?? filePathValue ?? extractPatchedPaths(patchTextValue ?? \"\")[0];\n\t}\n\n\tif (toolName === \"read\") {\n\t\tmetadata.filePath = pathValue ?? filePathValue;\n\t}\n\n\treturn metadata;\n}\n\nexport default function permissionSystemExtension(pi: ExtensionAPI): void {\n\tlet service: PermissionService | null = null;\n\tlet parserRegistry: ParserRegistry | null = null;\n\tlet cliRuleset: Ruleset = [];\n\tlet staticRuleset: Ruleset = [];\n\tlet initialApprovedCount = 0;\n\n\tconst nextRequestID = createRequestIDFactory();\n\n\tpi.registerFlag(\"permission\", {\n\t\tdescription: \"Set permission rules (format: tool=action or tool:pattern=action)\",\n\t\ttype: \"string\",\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tconst permissionFlag = pi.getFlag(\"permission\");\n\t\tcliRuleset = typeof permissionFlag === \"string\" ? parsePermissionFlag(permissionFlag) : [];\n\n\t\tconst loadedSettings = loadPermissionSettings(settingsManager, cliRuleset, ctx.cwd);\n\t\tstaticRuleset = loadedSettings.staticRuleset;\n\t\tconst approved = loadedSettings.approved;\n\t\tparserRegistry = createBuiltinParserRegistry();\n\t\tservice = new PermissionService(staticRuleset, approved, createEventEmitter(pi));\n\t\tinitialApprovedCount = approved.length;\n\n\t\tconst allTools = pi.getAllTools().map((tool) => tool.name);\n\t\tconst disabledTools = disabled(allTools, staticRuleset);\n\t\tconst activeTools = pi.getActiveTools().filter((toolName) => !disabledTools.has(toolName));\n\t\tpi.setActiveTools(activeTools);\n\t});\n\n\tpi.on(\"tool_call\", async (event, ctx) => {\n\t\tif (!service || !parserRegistry) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst permissionRequests = parserRegistry.parse(event.toolName, event.input, ctx.cwd);\n\t\tconst sessionID = ctx.sessionManager.getSessionId();\n\n\t\tfor (const permissionRequest of permissionRequests) {\n\t\t\tconst request: Request = {\n\t\t\t\tid: nextRequestID(),\n\t\t\t\tsessionID,\n\t\t\t\tpermission: permissionRequest.permission,\n\t\t\t\tpatterns: permissionRequest.patterns,\n\t\t\t\talways: permissionRequest.always,\n\t\t\t\tmetadata: createRequestMetadata(event.toolName, event.input),\n\t\t\t};\n\n\t\t\tconst askPromise = service.ask(request);\n\t\t\tconst isPending = service.list().some((pendingRequest) => pendingRequest.id === request.id);\n\n\t\t\tif (!isPending) {\n\t\t\t\ttry {\n\t\t\t\t\tawait askPromise;\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn { block: true, reason: getReason(error) };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tconst reply = await showPermissionPrompt(ctx, request);\n\t\t\t\tservice.reply(reply);\n\t\t\t} else {\n\t\t\t\tconst reply = handleNoUI(request, staticRuleset, cliRuleset, (eventName, data) => {\n\t\t\t\t\tif (eventName !== \"permission_asked\") {\n\t\t\t\t\t\tpi.events.emit(eventName, data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (reply) {\n\t\t\t\t\tservice.reply(reply);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait askPromise;\n\t\t\t} catch (error) {\n\t\t\t\treturn { block: true, reason: getReason(error) };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tvoid event;\n\n\t\tif (!service) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst approved = service.getApproved().slice(initialApprovedCount);\n\t\tif (approved.length > 0) {\n\t\t\tappendApproved(ctx.cwd, approved);\n\t\t}\n\n\t\tfor (const pendingRequest of service.list()) {\n\t\t\tservice.reply({ requestID: pendingRequest.id, reply: \"reject\" });\n\t\t}\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { SettingsManager } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI } from \"../../types.ts\";\nimport { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { parsePermissionFlag } from \"./cli.ts\";\nimport { disabled } from \"./config.ts\";\nimport { createEventEmitter } from \"./events.ts\";\nimport { handleNoUI } from \"./non-interactive.ts\";\nimport { createBuiltinParserRegistry, type ParserRegistry } from \"./parsers.ts\";\nimport { showPermissionPrompt } from \"./prompt.ts\";\nimport { PermissionService } from \"./service.ts\";\nimport { loadPermissionSettings } from \"./settings.ts\";\nimport { appendApproved } from \"./storage.ts\";\nimport { CorrectedError, DeniedError, RejectedError, type Request, type Ruleset } from \"./types.ts\";\n\nfunction createRequestIDFactory(): () => string {\n\tlet counter = 0;\n\treturn () => {\n\t\tcounter += 1;\n\t\treturn `permission-${counter}`;\n\t};\n}\n\nfunction getReason(error: unknown): string {\n\tif (error instanceof DeniedError || error instanceof CorrectedError || error instanceof RejectedError) {\n\t\treturn error.message;\n\t}\n\n\tif (error instanceof Error) {\n\t\treturn error.message;\n\t}\n\n\treturn \"Permission request was rejected.\";\n}\n\nfunction createRequestMetadata(toolName: string, input: Record<string, unknown>): Record<string, unknown> {\n\tconst metadata: Record<string, unknown> = {\n\t\ttoolName,\n\t\t...input,\n\t};\n\n\tconst pathValue = typeof input.path === \"string\" ? input.path : undefined;\n\tconst filePathValue = typeof input.file_path === \"string\" ? input.file_path : undefined;\n\tconst patchTextValue =\n\t\ttypeof input.input === \"string\" ? input.input : typeof input.patchText === \"string\" ? input.patchText : undefined;\n\n\tif (toolName === \"edit\" || toolName === \"write\" || toolName === \"apply_patch\" || toolName === \"multiedit\") {\n\t\tmetadata.filepath = pathValue ?? filePathValue ?? extractPatchedPaths(patchTextValue ?? \"\")[0];\n\t}\n\n\tif (toolName === \"read\") {\n\t\tmetadata.filePath = pathValue ?? filePathValue;\n\t}\n\n\treturn metadata;\n}\n\nexport default function permissionSystemExtension(pi: ExtensionAPI): void {\n\tlet service: PermissionService | null = null;\n\tlet parserRegistry: ParserRegistry | null = null;\n\tlet cliRuleset: Ruleset = [];\n\tlet staticRuleset: Ruleset = [];\n\tlet initialApprovedCount = 0;\n\n\tconst nextRequestID = createRequestIDFactory();\n\n\tpi.registerFlag(\"permission\", {\n\t\tdescription: \"Set permission rules (format: tool=action or tool:pattern=action)\",\n\t\ttype: \"string\",\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd);\n\t\tconst permissionFlag = pi.getFlag(\"permission\");\n\t\tcliRuleset = typeof permissionFlag === \"string\" ? parsePermissionFlag(permissionFlag) : [];\n\n\t\tconst loadedSettings = loadPermissionSettings(settingsManager, cliRuleset, ctx.cwd);\n\t\tstaticRuleset = loadedSettings.staticRuleset;\n\t\tconst approved = loadedSettings.approved;\n\t\tparserRegistry = createBuiltinParserRegistry();\n\t\tservice = new PermissionService(staticRuleset, approved, createEventEmitter(pi));\n\t\tinitialApprovedCount = approved.length;\n\n\t\tconst allTools = pi.getAllTools().map((tool) => tool.name);\n\t\tconst disabledTools = disabled(allTools, staticRuleset);\n\t\tconst activeTools = pi.getActiveTools().filter((toolName) => !disabledTools.has(toolName));\n\t\tpi.setActiveTools(activeTools);\n\t});\n\n\tpi.on(\"tool_call\", async (event, ctx) => {\n\t\tif (!service || !parserRegistry) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst permissionRequests = parserRegistry.parse(event.toolName, event.input, ctx.cwd);\n\t\tconst sessionID = ctx.sessionManager.getSessionId();\n\n\t\tfor (const permissionRequest of permissionRequests) {\n\t\t\tconst request: Request = {\n\t\t\t\tid: nextRequestID(),\n\t\t\t\tsessionID,\n\t\t\t\tpermission: permissionRequest.permission,\n\t\t\t\tpatterns: permissionRequest.patterns,\n\t\t\t\talways: permissionRequest.always,\n\t\t\t\tmetadata: createRequestMetadata(event.toolName, event.input),\n\t\t\t};\n\n\t\t\tconst askPromise = service.ask(request);\n\t\t\tconst isPending = service.list().some((pendingRequest) => pendingRequest.id === request.id);\n\n\t\t\tif (!isPending) {\n\t\t\t\ttry {\n\t\t\t\t\tawait askPromise;\n\t\t\t\t} catch (error) {\n\t\t\t\t\treturn { block: true, reason: getReason(error) };\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ctx.hasUI) {\n\t\t\t\tconst reply = await showPermissionPrompt(ctx, request);\n\t\t\t\tservice.reply(reply);\n\t\t\t} else {\n\t\t\t\tconst reply = handleNoUI(request, staticRuleset, cliRuleset, (eventName, data) => {\n\t\t\t\t\tif (eventName !== \"permission_asked\") {\n\t\t\t\t\t\tpi.events.emit(eventName, data);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (reply) {\n\t\t\t\t\tservice.reply(reply);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait askPromise;\n\t\t\t} catch (error) {\n\t\t\t\treturn { block: true, reason: getReason(error) };\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t});\n\n\tpi.on(\"session_shutdown\", async (event, ctx) => {\n\t\tvoid event;\n\n\t\tif (!service) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst approved = service.getApproved().slice(initialApprovedCount);\n\t\tif (approved.length > 0) {\n\t\t\tappendApproved(ctx.cwd, approved);\n\t\t}\n\n\t\tfor (const pendingRequest of service.list()) {\n\t\t\tservice.reply({ requestID: pendingRequest.id, reply: \"reject\" });\n\t\t}\n\t});\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { ReplyInput, Request, Ruleset } from "../permission-system/types.js";
1
+ import type { ReplyInput, Request, Ruleset } from "../permission-system/types.ts";
2
2
  /**
3
3
  * Handle permission request in no-UI mode (print mode, unbound SDK).
4
4
  * Returns ReplyInput to reject, or undefined to allow.
@@ -1 +1 @@
1
- {"version":3,"file":"non-interactive.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/non-interactive.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAElF;;;;;GAKG;AACH,wBAAgB,UAAU,CACzB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,OAAO,EACtB,WAAW,EAAE,OAAO,EACpB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,GAC/C,UAAU,GAAG,SAAS,CAqCxB","sourcesContent":["import { evaluate } from \"../permission-system/evaluate.js\";\nimport type { ReplyInput, Request, Ruleset } from \"../permission-system/types.js\";\n\n/**\n * Handle permission request in no-UI mode (print mode, unbound SDK).\n * Returns ReplyInput to reject, or undefined to allow.\n *\n * Precedence: CLI override > static ruleset > auto-deny\n */\nexport function handleNoUI(\n\trequest: Request,\n\tstaticRuleset: Ruleset,\n\tcliOverride: Ruleset,\n\temitEvent: (event: string, data: unknown) => void,\n): ReplyInput | undefined {\n\t// Emit permission_asked event for logging/telemetry\n\temitEvent(\"permission_asked\", request);\n\n\tconst cliRule = evaluate(request.permission, request.patterns[0], cliOverride);\n\tif (cliRule.action === \"allow\") {\n\t\temitEvent(\"permission_replied\", { requestID: request.id, sessionID: request.sessionID, reply: \"allow\" });\n\t\treturn undefined;\n\t}\n\tif (cliRule.action === \"deny\") {\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: `Permission denied by CLI flag: ${request.permission}`,\n\t\t};\n\t}\n\n\tconst staticRule = evaluate(request.permission, request.patterns[0], staticRuleset);\n\tif (staticRule.action === \"allow\") {\n\t\temitEvent(\"permission_replied\", { requestID: request.id, sessionID: request.sessionID, reply: \"allow\" });\n\t\treturn undefined;\n\t}\n\tif (staticRule.action === \"deny\") {\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: `Permission denied by config: ${request.permission}`,\n\t\t};\n\t}\n\n\t// Still \"ask\" - auto-deny with helpful message\n\tconst patternsStr = request.patterns.join(\", \");\n\treturn {\n\t\trequestID: request.id,\n\t\treply: \"reject\",\n\t\tmessage: `Permission required for ${request.permission} (${patternsStr}). Use --permission ${request.permission}=allow to override.`,\n\t};\n}\n"]}
1
+ {"version":3,"file":"non-interactive.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/non-interactive.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAElF;;;;;GAKG;AACH,wBAAgB,UAAU,CACzB,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,OAAO,EACtB,WAAW,EAAE,OAAO,EACpB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,GAC/C,UAAU,GAAG,SAAS,CAqCxB","sourcesContent":["import { evaluate } from \"../permission-system/evaluate.ts\";\nimport type { ReplyInput, Request, Ruleset } from \"../permission-system/types.ts\";\n\n/**\n * Handle permission request in no-UI mode (print mode, unbound SDK).\n * Returns ReplyInput to reject, or undefined to allow.\n *\n * Precedence: CLI override > static ruleset > auto-deny\n */\nexport function handleNoUI(\n\trequest: Request,\n\tstaticRuleset: Ruleset,\n\tcliOverride: Ruleset,\n\temitEvent: (event: string, data: unknown) => void,\n): ReplyInput | undefined {\n\t// Emit permission_asked event for logging/telemetry\n\temitEvent(\"permission_asked\", request);\n\n\tconst cliRule = evaluate(request.permission, request.patterns[0], cliOverride);\n\tif (cliRule.action === \"allow\") {\n\t\temitEvent(\"permission_replied\", { requestID: request.id, sessionID: request.sessionID, reply: \"allow\" });\n\t\treturn undefined;\n\t}\n\tif (cliRule.action === \"deny\") {\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: `Permission denied by CLI flag: ${request.permission}`,\n\t\t};\n\t}\n\n\tconst staticRule = evaluate(request.permission, request.patterns[0], staticRuleset);\n\tif (staticRule.action === \"allow\") {\n\t\temitEvent(\"permission_replied\", { requestID: request.id, sessionID: request.sessionID, reply: \"allow\" });\n\t\treturn undefined;\n\t}\n\tif (staticRule.action === \"deny\") {\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: `Permission denied by config: ${request.permission}`,\n\t\t};\n\t}\n\n\t// Still \"ask\" - auto-deny with helpful message\n\tconst patternsStr = request.patterns.join(\", \");\n\treturn {\n\t\trequestID: request.id,\n\t\treply: \"reject\",\n\t\tmessage: `Permission required for ${request.permission} (${patternsStr}). Use --permission ${request.permission}=allow to override.`,\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"non-interactive.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/non-interactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAG5D;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACzB,OAAgB,EAChB,aAAsB,EACtB,WAAoB,EACpB,SAAiD,EACxB;IACzB,oDAAoD;IACpD,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAEvC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAChC,SAAS,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACzG,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO;YACN,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,kCAAkC,OAAO,CAAC,UAAU,EAAE;SAC/D,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IACpF,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACnC,SAAS,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACzG,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAClC,OAAO;YACN,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,gCAAgC,OAAO,CAAC,UAAU,EAAE;SAC7D,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO;QACN,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,2BAA2B,OAAO,CAAC,UAAU,KAAK,WAAW,uBAAuB,OAAO,CAAC,UAAU,qBAAqB;KACpI,CAAC;AAAA,CACF","sourcesContent":["import { evaluate } from \"../permission-system/evaluate.js\";\nimport type { ReplyInput, Request, Ruleset } from \"../permission-system/types.js\";\n\n/**\n * Handle permission request in no-UI mode (print mode, unbound SDK).\n * Returns ReplyInput to reject, or undefined to allow.\n *\n * Precedence: CLI override > static ruleset > auto-deny\n */\nexport function handleNoUI(\n\trequest: Request,\n\tstaticRuleset: Ruleset,\n\tcliOverride: Ruleset,\n\temitEvent: (event: string, data: unknown) => void,\n): ReplyInput | undefined {\n\t// Emit permission_asked event for logging/telemetry\n\temitEvent(\"permission_asked\", request);\n\n\tconst cliRule = evaluate(request.permission, request.patterns[0], cliOverride);\n\tif (cliRule.action === \"allow\") {\n\t\temitEvent(\"permission_replied\", { requestID: request.id, sessionID: request.sessionID, reply: \"allow\" });\n\t\treturn undefined;\n\t}\n\tif (cliRule.action === \"deny\") {\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: `Permission denied by CLI flag: ${request.permission}`,\n\t\t};\n\t}\n\n\tconst staticRule = evaluate(request.permission, request.patterns[0], staticRuleset);\n\tif (staticRule.action === \"allow\") {\n\t\temitEvent(\"permission_replied\", { requestID: request.id, sessionID: request.sessionID, reply: \"allow\" });\n\t\treturn undefined;\n\t}\n\tif (staticRule.action === \"deny\") {\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: `Permission denied by config: ${request.permission}`,\n\t\t};\n\t}\n\n\t// Still \"ask\" - auto-deny with helpful message\n\tconst patternsStr = request.patterns.join(\", \");\n\treturn {\n\t\trequestID: request.id,\n\t\treply: \"reject\",\n\t\tmessage: `Permission required for ${request.permission} (${patternsStr}). Use --permission ${request.permission}=allow to override.`,\n\t};\n}\n"]}
1
+ {"version":3,"file":"non-interactive.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/non-interactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAG5D;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CACzB,OAAgB,EAChB,aAAsB,EACtB,WAAoB,EACpB,SAAiD,EACxB;IACzB,oDAAoD;IACpD,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAEvC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAChC,SAAS,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACzG,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,OAAO;YACN,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,kCAAkC,OAAO,CAAC,UAAU,EAAE;SAC/D,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IACpF,IAAI,UAAU,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QACnC,SAAS,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACzG,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAClC,OAAO;YACN,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,gCAAgC,OAAO,CAAC,UAAU,EAAE;SAC7D,CAAC;IACH,CAAC;IAED,+CAA+C;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,OAAO;QACN,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,2BAA2B,OAAO,CAAC,UAAU,KAAK,WAAW,uBAAuB,OAAO,CAAC,UAAU,qBAAqB;KACpI,CAAC;AAAA,CACF","sourcesContent":["import { evaluate } from \"../permission-system/evaluate.ts\";\nimport type { ReplyInput, Request, Ruleset } from \"../permission-system/types.ts\";\n\n/**\n * Handle permission request in no-UI mode (print mode, unbound SDK).\n * Returns ReplyInput to reject, or undefined to allow.\n *\n * Precedence: CLI override > static ruleset > auto-deny\n */\nexport function handleNoUI(\n\trequest: Request,\n\tstaticRuleset: Ruleset,\n\tcliOverride: Ruleset,\n\temitEvent: (event: string, data: unknown) => void,\n): ReplyInput | undefined {\n\t// Emit permission_asked event for logging/telemetry\n\temitEvent(\"permission_asked\", request);\n\n\tconst cliRule = evaluate(request.permission, request.patterns[0], cliOverride);\n\tif (cliRule.action === \"allow\") {\n\t\temitEvent(\"permission_replied\", { requestID: request.id, sessionID: request.sessionID, reply: \"allow\" });\n\t\treturn undefined;\n\t}\n\tif (cliRule.action === \"deny\") {\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: `Permission denied by CLI flag: ${request.permission}`,\n\t\t};\n\t}\n\n\tconst staticRule = evaluate(request.permission, request.patterns[0], staticRuleset);\n\tif (staticRule.action === \"allow\") {\n\t\temitEvent(\"permission_replied\", { requestID: request.id, sessionID: request.sessionID, reply: \"allow\" });\n\t\treturn undefined;\n\t}\n\tif (staticRule.action === \"deny\") {\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: `Permission denied by config: ${request.permission}`,\n\t\t};\n\t}\n\n\t// Still \"ask\" - auto-deny with helpful message\n\tconst patternsStr = request.patterns.join(\", \");\n\treturn {\n\t\trequestID: request.id,\n\t\treply: \"reject\",\n\t\tmessage: `Permission required for ${request.permission} (${patternsStr}). Use --permission ${request.permission}=allow to override.`,\n\t};\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Request } from "../permission-system/types.js";
1
+ import type { Request } from "../permission-system/types.ts";
2
2
  /** Simplified permission request without ID/session metadata */
3
3
  export type PermissionRequest = Pick<Request, "permission" | "patterns" | "always">;
4
4
  /** Parser function that extracts permission requests from tool input */
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAE7D,gEAAgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC;AAEpF,wEAAwE;AACxE,MAAM,MAAM,oBAAoB,GAAG,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,KACP,iBAAiB,EAAE,CAAC;AAoCzB,oDAAoD;AACpD,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAE7D;IAED,gDAAgD;IAChD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAMxF;CACD;AAED,+DAA+D;AAC/D,wBAAgB,2BAA2B,IAAI,cAAc,CAqH5D","sourcesContent":["import { extractPatchedPaths } from \"../gpt-apply-patch/index.js\";\nimport { BashArity } from \"../permission-system/arity.js\";\nimport { extractExternalPaths } from \"../permission-system/external-dir.js\";\nimport type { Request } from \"../permission-system/types.js\";\n\n/** Simplified permission request without ID/session metadata */\nexport type PermissionRequest = Pick<Request, \"permission\" | \"patterns\" | \"always\">;\n\n/** Parser function that extracts permission requests from tool input */\nexport type ToolPermissionParser = (\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n) => PermissionRequest[];\n\nfunction fallbackPermissionRequest(permission: string): PermissionRequest {\n\treturn {\n\t\tpermission,\n\t\tpatterns: [\"*\"],\n\t\talways: [\"*\"],\n\t};\n}\n\nfunction getString(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = input[key];\n\t\tif (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction toParentDirectoryPattern(inputPath: string): string {\n\tif (inputPath === \"~\" || inputPath === \"$HOME\") {\n\t\treturn `${inputPath}/*`;\n\t}\n\n\tif (inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\")) {\n\t\treturn `${inputPath}*`;\n\t}\n\n\treturn inputPath.replace(/[\\\\/][^\\\\/]+$/, \"/*\");\n}\n\nfunction parseFilePath(input: Record<string, unknown>): string | undefined {\n\treturn getString(input, \"path\", \"file_path\");\n}\n\n/** Registry for tool-specific permission parsers */\nexport class ParserRegistry {\n\tprivate readonly parsers = new Map<string, ToolPermissionParser>();\n\n\t/** Register a parser for a specific tool */\n\tregister(toolName: string, parser: ToolPermissionParser): void {\n\t\tthis.parsers.set(toolName, parser);\n\t}\n\n\t/** Parse tool input into permission requests */\n\tparse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] {\n\t\tconst parser = this.parsers.get(toolName);\n\t\tif (!parser) {\n\t\t\treturn [fallbackPermissionRequest(toolName)];\n\t\t}\n\t\treturn parser(toolName, input, cwd);\n\t}\n}\n\n/** Create registry with built-in parsers for standard tools */\nexport function createBuiltinParserRegistry(): ParserRegistry {\n\tconst registry = new ParserRegistry();\n\n\tregistry.register(\"bash\", (_toolName, input, cwd) => {\n\t\tconst command = getString(input, \"command\");\n\t\tif (!command) {\n\t\t\treturn [fallbackPermissionRequest(\"bash\")];\n\t\t}\n\n\t\tconst tokens = command.split(/\\s+/).filter(Boolean);\n\t\tconst prefix = BashArity.prefix(tokens).join(\" \");\n\t\tconst always = prefix ? [prefix, `${prefix} *`] : [\"*\"];\n\t\tconst requests: PermissionRequest[] = [\n\t\t\t{\n\t\t\t\tpermission: \"bash\",\n\t\t\t\tpatterns: [prefix || command],\n\t\t\t\talways,\n\t\t\t},\n\t\t];\n\n\t\tconst externalPaths = extractExternalPaths(command, cwd);\n\t\tif (externalPaths.length > 0) {\n\t\t\trequests.push({\n\t\t\t\tpermission: \"external_directory\",\n\t\t\t\tpatterns: externalPaths,\n\t\t\t\talways: externalPaths.map(toParentDirectoryPattern),\n\t\t\t});\n\t\t}\n\n\t\treturn requests;\n\t});\n\n\tconst editParser: ToolPermissionParser = () => {\n\t\treturn [fallbackPermissionRequest(\"edit\")];\n\t};\n\n\tconst parseEditPermission: ToolPermissionParser = (_toolName, input) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (filePath) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tpermission: \"edit\",\n\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\talways: [filePath],\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\n\t\tconst patchText = getString(input, \"input\", \"patchText\");\n\t\tif (!patchText) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst patchedPaths = extractPatchedPaths(patchText);\n\t\tif (patchedPaths.length === 0) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\treturn patchedPaths.map((patchedPath) => ({\n\t\t\tpermission: \"edit\",\n\t\t\tpatterns: [patchedPath],\n\t\t\talways: [patchedPath],\n\t\t}));\n\t};\n\n\tregistry.register(\"edit\", parseEditPermission);\n\tregistry.register(\"write\", parseEditPermission);\n\tregistry.register(\"apply_patch\", parseEditPermission);\n\tregistry.register(\"multiedit\", parseEditPermission);\n\n\tregistry.register(\"read\", (_toolName, input) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (!filePath) {\n\t\t\treturn [fallbackPermissionRequest(\"read\")];\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"read\",\n\t\t\t\tpatterns: [filePath],\n\t\t\t\talways: [filePath],\n\t\t\t},\n\t\t];\n\t});\n\n\tregistry.register(\"grep\", (_toolName, input) => {\n\t\tconst searchPath = getString(input, \"path\");\n\t\tconst pattern = getString(input, \"pattern\");\n\t\tconst permissionPattern = searchPath ?? pattern;\n\t\tif (!permissionPattern) {\n\t\t\treturn [fallbackPermissionRequest(\"grep\")];\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"grep\",\n\t\t\t\tpatterns: [permissionPattern],\n\t\t\t\talways: [\"*\"],\n\t\t\t},\n\t\t];\n\t});\n\n\tconst listParser: ToolPermissionParser = (_toolName, input) => {\n\t\tconst searchPath = getString(input, \"path\") ?? \".\";\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"list\",\n\t\t\t\tpatterns: [searchPath],\n\t\t\t\talways: [searchPath],\n\t\t\t},\n\t\t];\n\t};\n\n\tregistry.register(\"find\", listParser);\n\tregistry.register(\"ls\", listParser);\n\n\treturn registry;\n}\n"]}
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAE7D,gEAAgE;AAChE,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAC,CAAC;AAEpF,wEAAwE;AACxE,MAAM,MAAM,oBAAoB,GAAG,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,KACP,iBAAiB,EAAE,CAAC;AAoCzB,oDAAoD;AACpD,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;IAEnE,4CAA4C;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAE7D;IAED,gDAAgD;IAChD,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAMxF;CACD;AAED,+DAA+D;AAC/D,wBAAgB,2BAA2B,IAAI,cAAc,CAqH5D","sourcesContent":["import { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { BashArity } from \"../permission-system/arity.ts\";\nimport { extractExternalPaths } from \"../permission-system/external-dir.ts\";\nimport type { Request } from \"../permission-system/types.ts\";\n\n/** Simplified permission request without ID/session metadata */\nexport type PermissionRequest = Pick<Request, \"permission\" | \"patterns\" | \"always\">;\n\n/** Parser function that extracts permission requests from tool input */\nexport type ToolPermissionParser = (\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n) => PermissionRequest[];\n\nfunction fallbackPermissionRequest(permission: string): PermissionRequest {\n\treturn {\n\t\tpermission,\n\t\tpatterns: [\"*\"],\n\t\talways: [\"*\"],\n\t};\n}\n\nfunction getString(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = input[key];\n\t\tif (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction toParentDirectoryPattern(inputPath: string): string {\n\tif (inputPath === \"~\" || inputPath === \"$HOME\") {\n\t\treturn `${inputPath}/*`;\n\t}\n\n\tif (inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\")) {\n\t\treturn `${inputPath}*`;\n\t}\n\n\treturn inputPath.replace(/[\\\\/][^\\\\/]+$/, \"/*\");\n}\n\nfunction parseFilePath(input: Record<string, unknown>): string | undefined {\n\treturn getString(input, \"path\", \"file_path\");\n}\n\n/** Registry for tool-specific permission parsers */\nexport class ParserRegistry {\n\tprivate readonly parsers = new Map<string, ToolPermissionParser>();\n\n\t/** Register a parser for a specific tool */\n\tregister(toolName: string, parser: ToolPermissionParser): void {\n\t\tthis.parsers.set(toolName, parser);\n\t}\n\n\t/** Parse tool input into permission requests */\n\tparse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] {\n\t\tconst parser = this.parsers.get(toolName);\n\t\tif (!parser) {\n\t\t\treturn [fallbackPermissionRequest(toolName)];\n\t\t}\n\t\treturn parser(toolName, input, cwd);\n\t}\n}\n\n/** Create registry with built-in parsers for standard tools */\nexport function createBuiltinParserRegistry(): ParserRegistry {\n\tconst registry = new ParserRegistry();\n\n\tregistry.register(\"bash\", (_toolName, input, cwd) => {\n\t\tconst command = getString(input, \"command\");\n\t\tif (!command) {\n\t\t\treturn [fallbackPermissionRequest(\"bash\")];\n\t\t}\n\n\t\tconst tokens = command.split(/\\s+/).filter(Boolean);\n\t\tconst prefix = BashArity.prefix(tokens).join(\" \");\n\t\tconst always = prefix ? [prefix, `${prefix} *`] : [\"*\"];\n\t\tconst requests: PermissionRequest[] = [\n\t\t\t{\n\t\t\t\tpermission: \"bash\",\n\t\t\t\tpatterns: [prefix || command],\n\t\t\t\talways,\n\t\t\t},\n\t\t];\n\n\t\tconst externalPaths = extractExternalPaths(command, cwd);\n\t\tif (externalPaths.length > 0) {\n\t\t\trequests.push({\n\t\t\t\tpermission: \"external_directory\",\n\t\t\t\tpatterns: externalPaths,\n\t\t\t\talways: externalPaths.map(toParentDirectoryPattern),\n\t\t\t});\n\t\t}\n\n\t\treturn requests;\n\t});\n\n\tconst editParser: ToolPermissionParser = () => {\n\t\treturn [fallbackPermissionRequest(\"edit\")];\n\t};\n\n\tconst parseEditPermission: ToolPermissionParser = (_toolName, input) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (filePath) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tpermission: \"edit\",\n\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\talways: [filePath],\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\n\t\tconst patchText = getString(input, \"input\", \"patchText\");\n\t\tif (!patchText) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst patchedPaths = extractPatchedPaths(patchText);\n\t\tif (patchedPaths.length === 0) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\treturn patchedPaths.map((patchedPath) => ({\n\t\t\tpermission: \"edit\",\n\t\t\tpatterns: [patchedPath],\n\t\t\talways: [patchedPath],\n\t\t}));\n\t};\n\n\tregistry.register(\"edit\", parseEditPermission);\n\tregistry.register(\"write\", parseEditPermission);\n\tregistry.register(\"apply_patch\", parseEditPermission);\n\tregistry.register(\"multiedit\", parseEditPermission);\n\n\tregistry.register(\"read\", (_toolName, input) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (!filePath) {\n\t\t\treturn [fallbackPermissionRequest(\"read\")];\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"read\",\n\t\t\t\tpatterns: [filePath],\n\t\t\t\talways: [filePath],\n\t\t\t},\n\t\t];\n\t});\n\n\tregistry.register(\"grep\", (_toolName, input) => {\n\t\tconst searchPath = getString(input, \"path\");\n\t\tconst pattern = getString(input, \"pattern\");\n\t\tconst permissionPattern = searchPath ?? pattern;\n\t\tif (!permissionPattern) {\n\t\t\treturn [fallbackPermissionRequest(\"grep\")];\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"grep\",\n\t\t\t\tpatterns: [permissionPattern],\n\t\t\t\talways: [\"*\"],\n\t\t\t},\n\t\t];\n\t});\n\n\tconst listParser: ToolPermissionParser = (_toolName, input) => {\n\t\tconst searchPath = getString(input, \"path\") ?? \".\";\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"list\",\n\t\t\t\tpatterns: [searchPath],\n\t\t\t\talways: [searchPath],\n\t\t\t},\n\t\t];\n\t};\n\n\tregistry.register(\"find\", listParser);\n\tregistry.register(\"ls\", listParser);\n\n\treturn registry;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"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","sourcesContent":["import { extractPatchedPaths } from \"../gpt-apply-patch/index.js\";\nimport { BashArity } from \"../permission-system/arity.js\";\nimport { extractExternalPaths } from \"../permission-system/external-dir.js\";\nimport type { Request } from \"../permission-system/types.js\";\n\n/** Simplified permission request without ID/session metadata */\nexport type PermissionRequest = Pick<Request, \"permission\" | \"patterns\" | \"always\">;\n\n/** Parser function that extracts permission requests from tool input */\nexport type ToolPermissionParser = (\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n) => PermissionRequest[];\n\nfunction fallbackPermissionRequest(permission: string): PermissionRequest {\n\treturn {\n\t\tpermission,\n\t\tpatterns: [\"*\"],\n\t\talways: [\"*\"],\n\t};\n}\n\nfunction getString(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = input[key];\n\t\tif (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction toParentDirectoryPattern(inputPath: string): string {\n\tif (inputPath === \"~\" || inputPath === \"$HOME\") {\n\t\treturn `${inputPath}/*`;\n\t}\n\n\tif (inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\")) {\n\t\treturn `${inputPath}*`;\n\t}\n\n\treturn inputPath.replace(/[\\\\/][^\\\\/]+$/, \"/*\");\n}\n\nfunction parseFilePath(input: Record<string, unknown>): string | undefined {\n\treturn getString(input, \"path\", \"file_path\");\n}\n\n/** Registry for tool-specific permission parsers */\nexport class ParserRegistry {\n\tprivate readonly parsers = new Map<string, ToolPermissionParser>();\n\n\t/** Register a parser for a specific tool */\n\tregister(toolName: string, parser: ToolPermissionParser): void {\n\t\tthis.parsers.set(toolName, parser);\n\t}\n\n\t/** Parse tool input into permission requests */\n\tparse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] {\n\t\tconst parser = this.parsers.get(toolName);\n\t\tif (!parser) {\n\t\t\treturn [fallbackPermissionRequest(toolName)];\n\t\t}\n\t\treturn parser(toolName, input, cwd);\n\t}\n}\n\n/** Create registry with built-in parsers for standard tools */\nexport function createBuiltinParserRegistry(): ParserRegistry {\n\tconst registry = new ParserRegistry();\n\n\tregistry.register(\"bash\", (_toolName, input, cwd) => {\n\t\tconst command = getString(input, \"command\");\n\t\tif (!command) {\n\t\t\treturn [fallbackPermissionRequest(\"bash\")];\n\t\t}\n\n\t\tconst tokens = command.split(/\\s+/).filter(Boolean);\n\t\tconst prefix = BashArity.prefix(tokens).join(\" \");\n\t\tconst always = prefix ? [prefix, `${prefix} *`] : [\"*\"];\n\t\tconst requests: PermissionRequest[] = [\n\t\t\t{\n\t\t\t\tpermission: \"bash\",\n\t\t\t\tpatterns: [prefix || command],\n\t\t\t\talways,\n\t\t\t},\n\t\t];\n\n\t\tconst externalPaths = extractExternalPaths(command, cwd);\n\t\tif (externalPaths.length > 0) {\n\t\t\trequests.push({\n\t\t\t\tpermission: \"external_directory\",\n\t\t\t\tpatterns: externalPaths,\n\t\t\t\talways: externalPaths.map(toParentDirectoryPattern),\n\t\t\t});\n\t\t}\n\n\t\treturn requests;\n\t});\n\n\tconst editParser: ToolPermissionParser = () => {\n\t\treturn [fallbackPermissionRequest(\"edit\")];\n\t};\n\n\tconst parseEditPermission: ToolPermissionParser = (_toolName, input) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (filePath) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tpermission: \"edit\",\n\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\talways: [filePath],\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\n\t\tconst patchText = getString(input, \"input\", \"patchText\");\n\t\tif (!patchText) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst patchedPaths = extractPatchedPaths(patchText);\n\t\tif (patchedPaths.length === 0) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\treturn patchedPaths.map((patchedPath) => ({\n\t\t\tpermission: \"edit\",\n\t\t\tpatterns: [patchedPath],\n\t\t\talways: [patchedPath],\n\t\t}));\n\t};\n\n\tregistry.register(\"edit\", parseEditPermission);\n\tregistry.register(\"write\", parseEditPermission);\n\tregistry.register(\"apply_patch\", parseEditPermission);\n\tregistry.register(\"multiedit\", parseEditPermission);\n\n\tregistry.register(\"read\", (_toolName, input) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (!filePath) {\n\t\t\treturn [fallbackPermissionRequest(\"read\")];\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"read\",\n\t\t\t\tpatterns: [filePath],\n\t\t\t\talways: [filePath],\n\t\t\t},\n\t\t];\n\t});\n\n\tregistry.register(\"grep\", (_toolName, input) => {\n\t\tconst searchPath = getString(input, \"path\");\n\t\tconst pattern = getString(input, \"pattern\");\n\t\tconst permissionPattern = searchPath ?? pattern;\n\t\tif (!permissionPattern) {\n\t\t\treturn [fallbackPermissionRequest(\"grep\")];\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"grep\",\n\t\t\t\tpatterns: [permissionPattern],\n\t\t\t\talways: [\"*\"],\n\t\t\t},\n\t\t];\n\t});\n\n\tconst listParser: ToolPermissionParser = (_toolName, input) => {\n\t\tconst searchPath = getString(input, \"path\") ?? \".\";\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"list\",\n\t\t\t\tpatterns: [searchPath],\n\t\t\t\talways: [searchPath],\n\t\t\t},\n\t\t];\n\t};\n\n\tregistry.register(\"find\", listParser);\n\tregistry.register(\"ls\", listParser);\n\n\treturn registry;\n}\n"]}
1
+ {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/parsers.ts"],"names":[],"mappings":"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","sourcesContent":["import { extractPatchedPaths } from \"../gpt-apply-patch/index.ts\";\nimport { BashArity } from \"../permission-system/arity.ts\";\nimport { extractExternalPaths } from \"../permission-system/external-dir.ts\";\nimport type { Request } from \"../permission-system/types.ts\";\n\n/** Simplified permission request without ID/session metadata */\nexport type PermissionRequest = Pick<Request, \"permission\" | \"patterns\" | \"always\">;\n\n/** Parser function that extracts permission requests from tool input */\nexport type ToolPermissionParser = (\n\ttoolName: string,\n\tinput: Record<string, unknown>,\n\tcwd: string,\n) => PermissionRequest[];\n\nfunction fallbackPermissionRequest(permission: string): PermissionRequest {\n\treturn {\n\t\tpermission,\n\t\tpatterns: [\"*\"],\n\t\talways: [\"*\"],\n\t};\n}\n\nfunction getString(input: Record<string, unknown>, ...keys: string[]): string | undefined {\n\tfor (const key of keys) {\n\t\tconst value = input[key];\n\t\tif (typeof value === \"string\") {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction toParentDirectoryPattern(inputPath: string): string {\n\tif (inputPath === \"~\" || inputPath === \"$HOME\") {\n\t\treturn `${inputPath}/*`;\n\t}\n\n\tif (inputPath.endsWith(\"/\") || inputPath.endsWith(\"\\\\\")) {\n\t\treturn `${inputPath}*`;\n\t}\n\n\treturn inputPath.replace(/[\\\\/][^\\\\/]+$/, \"/*\");\n}\n\nfunction parseFilePath(input: Record<string, unknown>): string | undefined {\n\treturn getString(input, \"path\", \"file_path\");\n}\n\n/** Registry for tool-specific permission parsers */\nexport class ParserRegistry {\n\tprivate readonly parsers = new Map<string, ToolPermissionParser>();\n\n\t/** Register a parser for a specific tool */\n\tregister(toolName: string, parser: ToolPermissionParser): void {\n\t\tthis.parsers.set(toolName, parser);\n\t}\n\n\t/** Parse tool input into permission requests */\n\tparse(toolName: string, input: Record<string, unknown>, cwd: string): PermissionRequest[] {\n\t\tconst parser = this.parsers.get(toolName);\n\t\tif (!parser) {\n\t\t\treturn [fallbackPermissionRequest(toolName)];\n\t\t}\n\t\treturn parser(toolName, input, cwd);\n\t}\n}\n\n/** Create registry with built-in parsers for standard tools */\nexport function createBuiltinParserRegistry(): ParserRegistry {\n\tconst registry = new ParserRegistry();\n\n\tregistry.register(\"bash\", (_toolName, input, cwd) => {\n\t\tconst command = getString(input, \"command\");\n\t\tif (!command) {\n\t\t\treturn [fallbackPermissionRequest(\"bash\")];\n\t\t}\n\n\t\tconst tokens = command.split(/\\s+/).filter(Boolean);\n\t\tconst prefix = BashArity.prefix(tokens).join(\" \");\n\t\tconst always = prefix ? [prefix, `${prefix} *`] : [\"*\"];\n\t\tconst requests: PermissionRequest[] = [\n\t\t\t{\n\t\t\t\tpermission: \"bash\",\n\t\t\t\tpatterns: [prefix || command],\n\t\t\t\talways,\n\t\t\t},\n\t\t];\n\n\t\tconst externalPaths = extractExternalPaths(command, cwd);\n\t\tif (externalPaths.length > 0) {\n\t\t\trequests.push({\n\t\t\t\tpermission: \"external_directory\",\n\t\t\t\tpatterns: externalPaths,\n\t\t\t\talways: externalPaths.map(toParentDirectoryPattern),\n\t\t\t});\n\t\t}\n\n\t\treturn requests;\n\t});\n\n\tconst editParser: ToolPermissionParser = () => {\n\t\treturn [fallbackPermissionRequest(\"edit\")];\n\t};\n\n\tconst parseEditPermission: ToolPermissionParser = (_toolName, input) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (filePath) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tpermission: \"edit\",\n\t\t\t\t\tpatterns: [filePath],\n\t\t\t\t\talways: [filePath],\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\n\t\tconst patchText = getString(input, \"input\", \"patchText\");\n\t\tif (!patchText) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\tconst patchedPaths = extractPatchedPaths(patchText);\n\t\tif (patchedPaths.length === 0) {\n\t\t\treturn editParser(\"edit\", input, \"\");\n\t\t}\n\n\t\treturn patchedPaths.map((patchedPath) => ({\n\t\t\tpermission: \"edit\",\n\t\t\tpatterns: [patchedPath],\n\t\t\talways: [patchedPath],\n\t\t}));\n\t};\n\n\tregistry.register(\"edit\", parseEditPermission);\n\tregistry.register(\"write\", parseEditPermission);\n\tregistry.register(\"apply_patch\", parseEditPermission);\n\tregistry.register(\"multiedit\", parseEditPermission);\n\n\tregistry.register(\"read\", (_toolName, input) => {\n\t\tconst filePath = parseFilePath(input);\n\t\tif (!filePath) {\n\t\t\treturn [fallbackPermissionRequest(\"read\")];\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"read\",\n\t\t\t\tpatterns: [filePath],\n\t\t\t\talways: [filePath],\n\t\t\t},\n\t\t];\n\t});\n\n\tregistry.register(\"grep\", (_toolName, input) => {\n\t\tconst searchPath = getString(input, \"path\");\n\t\tconst pattern = getString(input, \"pattern\");\n\t\tconst permissionPattern = searchPath ?? pattern;\n\t\tif (!permissionPattern) {\n\t\t\treturn [fallbackPermissionRequest(\"grep\")];\n\t\t}\n\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"grep\",\n\t\t\t\tpatterns: [permissionPattern],\n\t\t\t\talways: [\"*\"],\n\t\t\t},\n\t\t];\n\t});\n\n\tconst listParser: ToolPermissionParser = (_toolName, input) => {\n\t\tconst searchPath = getString(input, \"path\") ?? \".\";\n\t\treturn [\n\t\t\t{\n\t\t\t\tpermission: \"list\",\n\t\t\t\tpatterns: [searchPath],\n\t\t\t\talways: [searchPath],\n\t\t\t},\n\t\t];\n\t};\n\n\tregistry.register(\"find\", listParser);\n\tregistry.register(\"ls\", listParser);\n\n\treturn registry;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { ExtensionContext } from "../../types.js";
2
- import type { ReplyInput, Request } from "./types.js";
1
+ import type { ExtensionContext } from "../../types.ts";
2
+ import type { ReplyInput, Request } from "./types.ts";
3
3
  export declare function showPermissionPrompt(ctx: ExtensionContext, request: Request): Promise<ReplyInput>;
4
4
  //# sourceMappingURL=prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAS,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE7D,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CA6BvG","sourcesContent":["import type { ExtensionContext } from \"../../types.js\";\nimport type { Reply, ReplyInput, Request } from \"./types.js\";\n\nexport async function showPermissionPrompt(ctx: ExtensionContext, request: Request): Promise<ReplyInput> {\n\tconst title = `Permission required: ${request.permission}`;\n\tconst message = formatRequestForDisplay(request);\n\n\tconst displayTitle = `${title}\\n\\n${message}`;\n\n\tconst options = [\"Allow once\", \"Allow always\", \"Deny\", \"Deny with feedback\"];\n\n\tconst choice = await ctx.ui.select(displayTitle, options);\n\n\tif (choice === \"Deny with feedback\") {\n\t\tconst feedback = await ctx.ui.input(\"Feedback\", \"Why are you denying this permission? (optional)\");\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: feedback || undefined,\n\t\t};\n\t}\n\n\tconst replyMap: Record<string, Reply> = {\n\t\t\"Allow once\": \"once\",\n\t\t\"Allow always\": \"always\",\n\t\tDeny: \"reject\",\n\t};\n\n\treturn {\n\t\trequestID: request.id,\n\t\treply: choice ? replyMap[choice] : \"reject\",\n\t};\n}\n\nfunction formatRequestForDisplay(request: Request): string {\n\tconst parts: string[] = [];\n\tconst meta = request.metadata || {};\n\n\tswitch (request.permission) {\n\t\tcase \"edit\":\n\t\t\tparts.push(`File: ${meta.filepath || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"read\":\n\t\t\tparts.push(`Path: ${meta.filePath || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"glob\":\n\t\tcase \"grep\":\n\t\t\tparts.push(`Pattern: ${meta.pattern || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"list\":\n\t\t\tparts.push(`Path: ${meta.path || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"bash\":\n\t\t\tif (meta.description) parts.push(`Description: ${meta.description}`);\n\t\t\tparts.push(`Command: $ ${meta.command || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"websearch\":\n\t\tcase \"codesearch\":\n\t\t\tparts.push(`Query: ${meta.query || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"external_directory\": {\n\t\t\tconst parent = typeof meta.parentDir === \"string\" ? meta.parentDir : undefined;\n\t\t\tconst filepath = typeof meta.filepath === \"string\" ? meta.filepath : undefined;\n\t\t\tconst pattern = request.patterns?.[0];\n\t\t\tconst derived =\n\t\t\t\ttypeof pattern === \"string\" ? (pattern.includes(\"*\") ? pattern.split(\"*\")[0] : pattern) : undefined;\n\t\t\tconst dir = parent ?? filepath ?? derived ?? \"Unknown\";\n\t\t\tparts.push(`Directory: ${dir}`);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tparts.push(`Tool: ${request.permission}`);\n\t\t\tbreak;\n\t}\n\n\tif (request.patterns && request.patterns.length > 0) {\n\t\tparts.push(`\\nPatterns:\\n${request.patterns.map((p) => ` - ${p}`).join(\"\\n\")}`);\n\t}\n\n\treturn parts.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAS,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE7D,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CA6BvG","sourcesContent":["import type { ExtensionContext } from \"../../types.ts\";\nimport type { Reply, ReplyInput, Request } from \"./types.ts\";\n\nexport async function showPermissionPrompt(ctx: ExtensionContext, request: Request): Promise<ReplyInput> {\n\tconst title = `Permission required: ${request.permission}`;\n\tconst message = formatRequestForDisplay(request);\n\n\tconst displayTitle = `${title}\\n\\n${message}`;\n\n\tconst options = [\"Allow once\", \"Allow always\", \"Deny\", \"Deny with feedback\"];\n\n\tconst choice = await ctx.ui.select(displayTitle, options);\n\n\tif (choice === \"Deny with feedback\") {\n\t\tconst feedback = await ctx.ui.input(\"Feedback\", \"Why are you denying this permission? (optional)\");\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: feedback || undefined,\n\t\t};\n\t}\n\n\tconst replyMap: Record<string, Reply> = {\n\t\t\"Allow once\": \"once\",\n\t\t\"Allow always\": \"always\",\n\t\tDeny: \"reject\",\n\t};\n\n\treturn {\n\t\trequestID: request.id,\n\t\treply: choice ? replyMap[choice] : \"reject\",\n\t};\n}\n\nfunction formatRequestForDisplay(request: Request): string {\n\tconst parts: string[] = [];\n\tconst meta = request.metadata || {};\n\n\tswitch (request.permission) {\n\t\tcase \"edit\":\n\t\t\tparts.push(`File: ${meta.filepath || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"read\":\n\t\t\tparts.push(`Path: ${meta.filePath || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"glob\":\n\t\tcase \"grep\":\n\t\t\tparts.push(`Pattern: ${meta.pattern || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"list\":\n\t\t\tparts.push(`Path: ${meta.path || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"bash\":\n\t\t\tif (meta.description) parts.push(`Description: ${meta.description}`);\n\t\t\tparts.push(`Command: $ ${meta.command || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"websearch\":\n\t\tcase \"codesearch\":\n\t\t\tparts.push(`Query: ${meta.query || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"external_directory\": {\n\t\t\tconst parent = typeof meta.parentDir === \"string\" ? meta.parentDir : undefined;\n\t\t\tconst filepath = typeof meta.filepath === \"string\" ? meta.filepath : undefined;\n\t\t\tconst pattern = request.patterns?.[0];\n\t\t\tconst derived =\n\t\t\t\ttypeof pattern === \"string\" ? (pattern.includes(\"*\") ? pattern.split(\"*\")[0] : pattern) : undefined;\n\t\t\tconst dir = parent ?? filepath ?? derived ?? \"Unknown\";\n\t\t\tparts.push(`Directory: ${dir}`);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tparts.push(`Tool: ${request.permission}`);\n\t\t\tbreak;\n\t}\n\n\tif (request.patterns && request.patterns.length > 0) {\n\t\tparts.push(`\\nPatterns:\\n${request.patterns.map((p) => ` - ${p}`).join(\"\\n\")}`);\n\t}\n\n\treturn parts.join(\"\\n\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/prompt.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionContext } from \"../../types.js\";\nimport type { Reply, ReplyInput, Request } from \"./types.js\";\n\nexport async function showPermissionPrompt(ctx: ExtensionContext, request: Request): Promise<ReplyInput> {\n\tconst title = `Permission required: ${request.permission}`;\n\tconst message = formatRequestForDisplay(request);\n\n\tconst displayTitle = `${title}\\n\\n${message}`;\n\n\tconst options = [\"Allow once\", \"Allow always\", \"Deny\", \"Deny with feedback\"];\n\n\tconst choice = await ctx.ui.select(displayTitle, options);\n\n\tif (choice === \"Deny with feedback\") {\n\t\tconst feedback = await ctx.ui.input(\"Feedback\", \"Why are you denying this permission? (optional)\");\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: feedback || undefined,\n\t\t};\n\t}\n\n\tconst replyMap: Record<string, Reply> = {\n\t\t\"Allow once\": \"once\",\n\t\t\"Allow always\": \"always\",\n\t\tDeny: \"reject\",\n\t};\n\n\treturn {\n\t\trequestID: request.id,\n\t\treply: choice ? replyMap[choice] : \"reject\",\n\t};\n}\n\nfunction formatRequestForDisplay(request: Request): string {\n\tconst parts: string[] = [];\n\tconst meta = request.metadata || {};\n\n\tswitch (request.permission) {\n\t\tcase \"edit\":\n\t\t\tparts.push(`File: ${meta.filepath || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"read\":\n\t\t\tparts.push(`Path: ${meta.filePath || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"glob\":\n\t\tcase \"grep\":\n\t\t\tparts.push(`Pattern: ${meta.pattern || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"list\":\n\t\t\tparts.push(`Path: ${meta.path || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"bash\":\n\t\t\tif (meta.description) parts.push(`Description: ${meta.description}`);\n\t\t\tparts.push(`Command: $ ${meta.command || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"websearch\":\n\t\tcase \"codesearch\":\n\t\t\tparts.push(`Query: ${meta.query || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"external_directory\": {\n\t\t\tconst parent = typeof meta.parentDir === \"string\" ? meta.parentDir : undefined;\n\t\t\tconst filepath = typeof meta.filepath === \"string\" ? meta.filepath : undefined;\n\t\t\tconst pattern = request.patterns?.[0];\n\t\t\tconst derived =\n\t\t\t\ttypeof pattern === \"string\" ? (pattern.includes(\"*\") ? pattern.split(\"*\")[0] : pattern) : undefined;\n\t\t\tconst dir = parent ?? filepath ?? derived ?? \"Unknown\";\n\t\t\tparts.push(`Directory: ${dir}`);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tparts.push(`Tool: ${request.permission}`);\n\t\t\tbreak;\n\t}\n\n\tif (request.patterns && request.patterns.length > 0) {\n\t\tparts.push(`\\nPatterns:\\n${request.patterns.map((p) => ` - ${p}`).join(\"\\n\")}`);\n\t}\n\n\treturn parts.join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/prompt.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAqB,EAAE,OAAgB,EAAuB;IACxG,MAAM,KAAK,GAAG,wBAAwB,OAAO,CAAC,UAAU,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAEjD,MAAM,YAAY,GAAG,GAAG,KAAK,OAAO,OAAO,EAAE,CAAC;IAE9C,MAAM,OAAO,GAAG,CAAC,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAE1D,IAAI,MAAM,KAAK,oBAAoB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,iDAAiD,CAAC,CAAC;QACnG,OAAO;YACN,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,QAAQ,IAAI,SAAS;SAC9B,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAA0B;QACvC,YAAY,EAAE,MAAM;QACpB,cAAc,EAAE,QAAQ;QACxB,IAAI,EAAE,QAAQ;KACd,CAAC;IAEF,OAAO;QACN,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ;KAC3C,CAAC;AAAA,CACF;AAED,SAAS,uBAAuB,CAAC,OAAgB,EAAU;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IAEpC,QAAQ,OAAO,CAAC,UAAU,EAAE,CAAC;QAC5B,KAAK,MAAM;YACV,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;YAClD,MAAM;QACP,KAAK,MAAM;YACV,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;YAClD,MAAM;QACP,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACV,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;YACpD,MAAM;QACP,KAAK,MAAM;YACV,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,CAAC;YAC9C,MAAM;QACP,KAAK,MAAM;YACV,IAAI,IAAI,CAAC,WAAW;gBAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC;YACtD,MAAM;QACP,KAAK,WAAW,CAAC;QACjB,KAAK,YAAY;YAChB,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC,CAAC;YAChD,MAAM;QACP,KAAK,oBAAoB,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/E,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/E,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,OAAO,GACZ,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACrG,MAAM,GAAG,GAAG,MAAM,IAAI,QAAQ,IAAI,OAAO,IAAI,SAAS,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;YAChC,MAAM;QACP,CAAC;QACD;YACC,KAAK,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1C,MAAM;IACR,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAA,CACxB","sourcesContent":["import type { ExtensionContext } from \"../../types.ts\";\nimport type { Reply, ReplyInput, Request } from \"./types.ts\";\n\nexport async function showPermissionPrompt(ctx: ExtensionContext, request: Request): Promise<ReplyInput> {\n\tconst title = `Permission required: ${request.permission}`;\n\tconst message = formatRequestForDisplay(request);\n\n\tconst displayTitle = `${title}\\n\\n${message}`;\n\n\tconst options = [\"Allow once\", \"Allow always\", \"Deny\", \"Deny with feedback\"];\n\n\tconst choice = await ctx.ui.select(displayTitle, options);\n\n\tif (choice === \"Deny with feedback\") {\n\t\tconst feedback = await ctx.ui.input(\"Feedback\", \"Why are you denying this permission? (optional)\");\n\t\treturn {\n\t\t\trequestID: request.id,\n\t\t\treply: \"reject\",\n\t\t\tmessage: feedback || undefined,\n\t\t};\n\t}\n\n\tconst replyMap: Record<string, Reply> = {\n\t\t\"Allow once\": \"once\",\n\t\t\"Allow always\": \"always\",\n\t\tDeny: \"reject\",\n\t};\n\n\treturn {\n\t\trequestID: request.id,\n\t\treply: choice ? replyMap[choice] : \"reject\",\n\t};\n}\n\nfunction formatRequestForDisplay(request: Request): string {\n\tconst parts: string[] = [];\n\tconst meta = request.metadata || {};\n\n\tswitch (request.permission) {\n\t\tcase \"edit\":\n\t\t\tparts.push(`File: ${meta.filepath || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"read\":\n\t\t\tparts.push(`Path: ${meta.filePath || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"glob\":\n\t\tcase \"grep\":\n\t\t\tparts.push(`Pattern: ${meta.pattern || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"list\":\n\t\t\tparts.push(`Path: ${meta.path || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"bash\":\n\t\t\tif (meta.description) parts.push(`Description: ${meta.description}`);\n\t\t\tparts.push(`Command: $ ${meta.command || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"websearch\":\n\t\tcase \"codesearch\":\n\t\t\tparts.push(`Query: ${meta.query || \"Unknown\"}`);\n\t\t\tbreak;\n\t\tcase \"external_directory\": {\n\t\t\tconst parent = typeof meta.parentDir === \"string\" ? meta.parentDir : undefined;\n\t\t\tconst filepath = typeof meta.filepath === \"string\" ? meta.filepath : undefined;\n\t\t\tconst pattern = request.patterns?.[0];\n\t\t\tconst derived =\n\t\t\t\ttypeof pattern === \"string\" ? (pattern.includes(\"*\") ? pattern.split(\"*\")[0] : pattern) : undefined;\n\t\t\tconst dir = parent ?? filepath ?? derived ?? \"Unknown\";\n\t\t\tparts.push(`Directory: ${dir}`);\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tparts.push(`Tool: ${request.permission}`);\n\t\t\tbreak;\n\t}\n\n\tif (request.patterns && request.patterns.length > 0) {\n\t\tparts.push(`\\nPatterns:\\n${request.patterns.map((p) => ` - ${p}`).join(\"\\n\")}`);\n\t}\n\n\treturn parts.join(\"\\n\");\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { type PermissionEventEmitter } from "./events.js";
2
- import { type ReplyInput, type Request, type Ruleset } from "./types.js";
1
+ import { type PermissionEventEmitter } from "./events.ts";
2
+ import { type ReplyInput, type Request, type Ruleset } from "./types.ts";
3
3
  type RequestInput = Omit<Request, "id"> & {
4
4
  id?: string;
5
5
  };
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/service.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAKN,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,MAAM,YAAY,CAAC;AAEpB,KAAK,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,wEAAwE;AACxE,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,SAAS,CAAK;IAEtB,YAAY,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAE,sBAAkD,EAIjH;IAED,iFAAiF;IAC3E,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9C;IAED,4CAA4C;IAC5C,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CA8B7B;IAED,2CAA2C;IAC3C,IAAI,IAAI,OAAO,EAAE,CAQhB;IAED,uCAAuC;IACvC,WAAW,IAAI,OAAO,CAErB;IAED,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,8BAA8B;CAmBtC","sourcesContent":["import { evaluate } from \"./evaluate.js\";\nimport { createLocalEventEmitter, type PermissionEventEmitter } from \"./events.js\";\nimport {\n\tCorrectedError,\n\tDeniedError,\n\ttype PendingEntry,\n\tRejectedError,\n\ttype ReplyInput,\n\ttype Request,\n\ttype Ruleset,\n} from \"./types.js\";\n\ntype RequestInput = Omit<Request, \"id\"> & { id?: string };\n\n/** Core service for managing permission requests and rule evaluation */\nexport class PermissionService {\n\tprivate pending = new Map<string, PendingEntry>();\n\tprivate approved: Ruleset;\n\tprivate staticRuleset: Ruleset;\n\tprivate emitter: PermissionEventEmitter;\n\tprivate idCounter = 0;\n\n\tconstructor(staticRuleset: Ruleset, approved: Ruleset, emitter: PermissionEventEmitter = createLocalEventEmitter()) {\n\t\tthis.staticRuleset = [...staticRuleset];\n\t\tthis.approved = [...approved];\n\t\tthis.emitter = emitter;\n\t}\n\n\t/** Request permission for a tool call. Resolves if allowed, throws on denial. */\n\tasync ask(request: RequestInput): Promise<void> {\n\t\tconst info: Request = {\n\t\t\t...request,\n\t\t\tid: request.id ?? this.nextRequestID(),\n\t\t};\n\n\t\tconst deniedPatterns: string[] = [];\n\t\tlet needsAsk = false;\n\n\t\tfor (const pattern of info.patterns) {\n\t\t\tconst rule = evaluate(info.permission, pattern, this.staticRuleset, this.approved);\n\n\t\t\tif (rule.action === \"deny\") {\n\t\t\t\tdeniedPatterns.push(pattern);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (rule.action === \"ask\") {\n\t\t\t\tneedsAsk = true;\n\t\t\t}\n\t\t}\n\n\t\tif (deniedPatterns.length > 0) {\n\t\t\tthrow new DeniedError(deniedPatterns);\n\t\t}\n\n\t\tif (!needsAsk) {\n\t\t\tthis.emitter.emitReplied(info.id, info.sessionID, \"allow\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst pendingPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconst pendingEntry: PendingEntry = {\n\t\t\t\tinfo,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.pending.delete(info.id);\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.pending.delete(info.id);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.pending.set(info.id, pendingEntry);\n\t\t});\n\n\t\tthis.emitter.emitAsked(info);\n\n\t\tawait pendingPromise;\n\t}\n\n\t/** Reply to a pending permission request */\n\treply(input: ReplyInput): void {\n\t\tconst existing = this.pending.get(input.requestID);\n\t\tif (!existing) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pending.delete(input.requestID);\n\t\tthis.emitter.emitReplied(existing.info.id, existing.info.sessionID, input.reply);\n\n\t\tif (input.reply === \"reject\") {\n\t\t\texisting.reject(input.message ? new CorrectedError(input.message) : new RejectedError());\n\t\t\tthis.rejectPendingInSession(existing.info.sessionID);\n\t\t\treturn;\n\t\t}\n\n\t\texisting.resolve();\n\n\t\tif (input.reply === \"once\") {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const pattern of existing.info.always) {\n\t\t\tthis.approved.push({\n\t\t\t\tpermission: existing.info.permission,\n\t\t\t\tpattern,\n\t\t\t\taction: \"allow\",\n\t\t\t});\n\t\t}\n\n\t\tthis.resolveCoveredPendingInSession(existing.info.sessionID);\n\t}\n\n\t/** List all pending permission requests */\n\tlist(): Request[] {\n\t\treturn Array.from(this.pending.values(), (entry) => ({\n\t\t\t...entry.info,\n\t\t\tpatterns: [...entry.info.patterns],\n\t\t\talways: [...entry.info.always],\n\t\t\tmetadata: { ...entry.info.metadata },\n\t\t\ttool: entry.info.tool ? { ...entry.info.tool } : undefined,\n\t\t}));\n\t}\n\n\t/** Get the current approved ruleset */\n\tgetApproved(): Ruleset {\n\t\treturn this.approved.map((rule) => ({ ...rule }));\n\t}\n\n\tprivate nextRequestID(): string {\n\t\tthis.idCounter += 1;\n\t\treturn `permission-${this.idCounter}`;\n\t}\n\n\tprivate rejectPendingInSession(sessionID: string): void {\n\t\tfor (const [requestID, entry] of Array.from(this.pending.entries())) {\n\t\t\tif (entry.info.sessionID !== sessionID) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.pending.delete(requestID);\n\t\t\tthis.emitter.emitReplied(entry.info.id, entry.info.sessionID, \"reject\");\n\t\t\tentry.reject(new RejectedError());\n\t\t}\n\t}\n\n\tprivate resolveCoveredPendingInSession(sessionID: string): void {\n\t\tfor (const [requestID, entry] of Array.from(this.pending.entries())) {\n\t\t\tif (entry.info.sessionID !== sessionID) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isAllowed = entry.info.patterns.every((pattern) => {\n\t\t\t\treturn evaluate(entry.info.permission, pattern, this.staticRuleset, this.approved).action === \"allow\";\n\t\t\t});\n\n\t\t\tif (!isAllowed) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.pending.delete(requestID);\n\t\t\tthis.emitter.emitReplied(entry.info.id, entry.info.sessionID, \"always\");\n\t\t\tentry.resolve();\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/service.ts"],"names":[],"mappings":"AACA,OAAO,EAA2B,KAAK,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACnF,OAAO,EAKN,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,MAAM,YAAY,CAAC;AAEpB,KAAK,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,wEAAwE;AACxE,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,OAAO,CAAmC;IAClD,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,SAAS,CAAK;IAEtB,YAAY,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,GAAE,sBAAkD,EAIjH;IAED,iFAAiF;IAC3E,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9C;IAED,4CAA4C;IAC5C,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CA8B7B;IAED,2CAA2C;IAC3C,IAAI,IAAI,OAAO,EAAE,CAQhB;IAED,uCAAuC;IACvC,WAAW,IAAI,OAAO,CAErB;IAED,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,8BAA8B;CAmBtC","sourcesContent":["import { evaluate } from \"./evaluate.ts\";\nimport { createLocalEventEmitter, type PermissionEventEmitter } from \"./events.ts\";\nimport {\n\tCorrectedError,\n\tDeniedError,\n\ttype PendingEntry,\n\tRejectedError,\n\ttype ReplyInput,\n\ttype Request,\n\ttype Ruleset,\n} from \"./types.ts\";\n\ntype RequestInput = Omit<Request, \"id\"> & { id?: string };\n\n/** Core service for managing permission requests and rule evaluation */\nexport class PermissionService {\n\tprivate pending = new Map<string, PendingEntry>();\n\tprivate approved: Ruleset;\n\tprivate staticRuleset: Ruleset;\n\tprivate emitter: PermissionEventEmitter;\n\tprivate idCounter = 0;\n\n\tconstructor(staticRuleset: Ruleset, approved: Ruleset, emitter: PermissionEventEmitter = createLocalEventEmitter()) {\n\t\tthis.staticRuleset = [...staticRuleset];\n\t\tthis.approved = [...approved];\n\t\tthis.emitter = emitter;\n\t}\n\n\t/** Request permission for a tool call. Resolves if allowed, throws on denial. */\n\tasync ask(request: RequestInput): Promise<void> {\n\t\tconst info: Request = {\n\t\t\t...request,\n\t\t\tid: request.id ?? this.nextRequestID(),\n\t\t};\n\n\t\tconst deniedPatterns: string[] = [];\n\t\tlet needsAsk = false;\n\n\t\tfor (const pattern of info.patterns) {\n\t\t\tconst rule = evaluate(info.permission, pattern, this.staticRuleset, this.approved);\n\n\t\t\tif (rule.action === \"deny\") {\n\t\t\t\tdeniedPatterns.push(pattern);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (rule.action === \"ask\") {\n\t\t\t\tneedsAsk = true;\n\t\t\t}\n\t\t}\n\n\t\tif (deniedPatterns.length > 0) {\n\t\t\tthrow new DeniedError(deniedPatterns);\n\t\t}\n\n\t\tif (!needsAsk) {\n\t\t\tthis.emitter.emitReplied(info.id, info.sessionID, \"allow\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst pendingPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconst pendingEntry: PendingEntry = {\n\t\t\t\tinfo,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.pending.delete(info.id);\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.pending.delete(info.id);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.pending.set(info.id, pendingEntry);\n\t\t});\n\n\t\tthis.emitter.emitAsked(info);\n\n\t\tawait pendingPromise;\n\t}\n\n\t/** Reply to a pending permission request */\n\treply(input: ReplyInput): void {\n\t\tconst existing = this.pending.get(input.requestID);\n\t\tif (!existing) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pending.delete(input.requestID);\n\t\tthis.emitter.emitReplied(existing.info.id, existing.info.sessionID, input.reply);\n\n\t\tif (input.reply === \"reject\") {\n\t\t\texisting.reject(input.message ? new CorrectedError(input.message) : new RejectedError());\n\t\t\tthis.rejectPendingInSession(existing.info.sessionID);\n\t\t\treturn;\n\t\t}\n\n\t\texisting.resolve();\n\n\t\tif (input.reply === \"once\") {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const pattern of existing.info.always) {\n\t\t\tthis.approved.push({\n\t\t\t\tpermission: existing.info.permission,\n\t\t\t\tpattern,\n\t\t\t\taction: \"allow\",\n\t\t\t});\n\t\t}\n\n\t\tthis.resolveCoveredPendingInSession(existing.info.sessionID);\n\t}\n\n\t/** List all pending permission requests */\n\tlist(): Request[] {\n\t\treturn Array.from(this.pending.values(), (entry) => ({\n\t\t\t...entry.info,\n\t\t\tpatterns: [...entry.info.patterns],\n\t\t\talways: [...entry.info.always],\n\t\t\tmetadata: { ...entry.info.metadata },\n\t\t\ttool: entry.info.tool ? { ...entry.info.tool } : undefined,\n\t\t}));\n\t}\n\n\t/** Get the current approved ruleset */\n\tgetApproved(): Ruleset {\n\t\treturn this.approved.map((rule) => ({ ...rule }));\n\t}\n\n\tprivate nextRequestID(): string {\n\t\tthis.idCounter += 1;\n\t\treturn `permission-${this.idCounter}`;\n\t}\n\n\tprivate rejectPendingInSession(sessionID: string): void {\n\t\tfor (const [requestID, entry] of Array.from(this.pending.entries())) {\n\t\t\tif (entry.info.sessionID !== sessionID) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.pending.delete(requestID);\n\t\t\tthis.emitter.emitReplied(entry.info.id, entry.info.sessionID, \"reject\");\n\t\t\tentry.reject(new RejectedError());\n\t\t}\n\t}\n\n\tprivate resolveCoveredPendingInSession(sessionID: string): void {\n\t\tfor (const [requestID, entry] of Array.from(this.pending.entries())) {\n\t\t\tif (entry.info.sessionID !== sessionID) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isAllowed = entry.info.patterns.every((pattern) => {\n\t\t\t\treturn evaluate(entry.info.permission, pattern, this.staticRuleset, this.approved).action === \"allow\";\n\t\t\t});\n\n\t\t\tif (!isAllowed) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.pending.delete(requestID);\n\t\t\tthis.emitter.emitReplied(entry.info.id, entry.info.sessionID, \"always\");\n\t\t\tentry.resolve();\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { evaluate } from \"./evaluate.js\";\nimport { createLocalEventEmitter, type PermissionEventEmitter } from \"./events.js\";\nimport {\n\tCorrectedError,\n\tDeniedError,\n\ttype PendingEntry,\n\tRejectedError,\n\ttype ReplyInput,\n\ttype Request,\n\ttype Ruleset,\n} from \"./types.js\";\n\ntype RequestInput = Omit<Request, \"id\"> & { id?: string };\n\n/** Core service for managing permission requests and rule evaluation */\nexport class PermissionService {\n\tprivate pending = new Map<string, PendingEntry>();\n\tprivate approved: Ruleset;\n\tprivate staticRuleset: Ruleset;\n\tprivate emitter: PermissionEventEmitter;\n\tprivate idCounter = 0;\n\n\tconstructor(staticRuleset: Ruleset, approved: Ruleset, emitter: PermissionEventEmitter = createLocalEventEmitter()) {\n\t\tthis.staticRuleset = [...staticRuleset];\n\t\tthis.approved = [...approved];\n\t\tthis.emitter = emitter;\n\t}\n\n\t/** Request permission for a tool call. Resolves if allowed, throws on denial. */\n\tasync ask(request: RequestInput): Promise<void> {\n\t\tconst info: Request = {\n\t\t\t...request,\n\t\t\tid: request.id ?? this.nextRequestID(),\n\t\t};\n\n\t\tconst deniedPatterns: string[] = [];\n\t\tlet needsAsk = false;\n\n\t\tfor (const pattern of info.patterns) {\n\t\t\tconst rule = evaluate(info.permission, pattern, this.staticRuleset, this.approved);\n\n\t\t\tif (rule.action === \"deny\") {\n\t\t\t\tdeniedPatterns.push(pattern);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (rule.action === \"ask\") {\n\t\t\t\tneedsAsk = true;\n\t\t\t}\n\t\t}\n\n\t\tif (deniedPatterns.length > 0) {\n\t\t\tthrow new DeniedError(deniedPatterns);\n\t\t}\n\n\t\tif (!needsAsk) {\n\t\t\tthis.emitter.emitReplied(info.id, info.sessionID, \"allow\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst pendingPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconst pendingEntry: PendingEntry = {\n\t\t\t\tinfo,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.pending.delete(info.id);\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.pending.delete(info.id);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.pending.set(info.id, pendingEntry);\n\t\t});\n\n\t\tthis.emitter.emitAsked(info);\n\n\t\tawait pendingPromise;\n\t}\n\n\t/** Reply to a pending permission request */\n\treply(input: ReplyInput): void {\n\t\tconst existing = this.pending.get(input.requestID);\n\t\tif (!existing) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pending.delete(input.requestID);\n\t\tthis.emitter.emitReplied(existing.info.id, existing.info.sessionID, input.reply);\n\n\t\tif (input.reply === \"reject\") {\n\t\t\texisting.reject(input.message ? new CorrectedError(input.message) : new RejectedError());\n\t\t\tthis.rejectPendingInSession(existing.info.sessionID);\n\t\t\treturn;\n\t\t}\n\n\t\texisting.resolve();\n\n\t\tif (input.reply === \"once\") {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const pattern of existing.info.always) {\n\t\t\tthis.approved.push({\n\t\t\t\tpermission: existing.info.permission,\n\t\t\t\tpattern,\n\t\t\t\taction: \"allow\",\n\t\t\t});\n\t\t}\n\n\t\tthis.resolveCoveredPendingInSession(existing.info.sessionID);\n\t}\n\n\t/** List all pending permission requests */\n\tlist(): Request[] {\n\t\treturn Array.from(this.pending.values(), (entry) => ({\n\t\t\t...entry.info,\n\t\t\tpatterns: [...entry.info.patterns],\n\t\t\talways: [...entry.info.always],\n\t\t\tmetadata: { ...entry.info.metadata },\n\t\t\ttool: entry.info.tool ? { ...entry.info.tool } : undefined,\n\t\t}));\n\t}\n\n\t/** Get the current approved ruleset */\n\tgetApproved(): Ruleset {\n\t\treturn this.approved.map((rule) => ({ ...rule }));\n\t}\n\n\tprivate nextRequestID(): string {\n\t\tthis.idCounter += 1;\n\t\treturn `permission-${this.idCounter}`;\n\t}\n\n\tprivate rejectPendingInSession(sessionID: string): void {\n\t\tfor (const [requestID, entry] of Array.from(this.pending.entries())) {\n\t\t\tif (entry.info.sessionID !== sessionID) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.pending.delete(requestID);\n\t\t\tthis.emitter.emitReplied(entry.info.id, entry.info.sessionID, \"reject\");\n\t\t\tentry.reject(new RejectedError());\n\t\t}\n\t}\n\n\tprivate resolveCoveredPendingInSession(sessionID: string): void {\n\t\tfor (const [requestID, entry] of Array.from(this.pending.entries())) {\n\t\t\tif (entry.info.sessionID !== sessionID) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isAllowed = entry.info.patterns.every((pattern) => {\n\t\t\t\treturn evaluate(entry.info.permission, pattern, this.staticRuleset, this.approved).action === \"allow\";\n\t\t\t});\n\n\t\t\tif (!isAllowed) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.pending.delete(requestID);\n\t\t\tthis.emitter.emitReplied(entry.info.id, entry.info.sessionID, \"always\");\n\t\t\tentry.resolve();\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAA+B,MAAM,aAAa,CAAC;AACnF,OAAO,EACN,cAAc,EACd,WAAW,EAEX,aAAa,GAIb,MAAM,YAAY,CAAC;AAIpB,wEAAwE;AACxE,MAAM,OAAO,iBAAiB;IACrB,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC1C,QAAQ,CAAU;IAClB,aAAa,CAAU;IACvB,OAAO,CAAyB;IAChC,SAAS,GAAG,CAAC,CAAC;IAEtB,YAAY,aAAsB,EAAE,QAAiB,EAAE,OAAO,GAA2B,uBAAuB,EAAE,EAAE;QACnH,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAAA,CACvB;IAED,iFAAiF;IACjF,KAAK,CAAC,GAAG,CAAC,OAAqB,EAAiB;QAC/C,MAAM,IAAI,GAAY;YACrB,GAAG,OAAO;YACV,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;SACtC,CAAC;QAEF,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEnF,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC5B,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC7B,SAAS;YACV,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC3B,QAAQ,GAAG,IAAI,CAAC;YACjB,CAAC;QACF,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,WAAW,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC3D,OAAO;QACR,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YAC7D,MAAM,YAAY,GAAiB;gBAClC,IAAI;gBACJ,OAAO,EAAE,GAAG,EAAE,CAAC;oBACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC7B,OAAO,EAAE,CAAC;gBAAA,CACV;gBACD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;oBAClB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBAC7B,MAAM,CAAC,KAAK,CAAC,CAAC;gBAAA,CACd;aACD,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QAAA,CACxC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAE7B,MAAM,cAAc,CAAC;IAAA,CACrB;IAED,4CAA4C;IAC5C,KAAK,CAAC,KAAiB,EAAQ;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,OAAO;QACR,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAEjF,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;YACzF,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrD,OAAO;QACR,CAAC;QAED,QAAQ,CAAC,OAAO,EAAE,CAAC;QAEnB,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC5B,OAAO;QACR,CAAC;QAED,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAClB,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU;gBACpC,OAAO;gBACP,MAAM,EAAE,OAAO;aACf,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAAA,CAC7D;IAED,2CAA2C;IAC3C,IAAI,GAAc;QACjB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACpD,GAAG,KAAK,CAAC,IAAI;YACb,QAAQ,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClC,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;YAC9B,QAAQ,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;YACpC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;SAC1D,CAAC,CAAC,CAAC;IAAA,CACJ;IAED,uCAAuC;IACvC,WAAW,GAAY;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IAAA,CAClD;IAEO,aAAa,GAAW;QAC/B,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACpB,OAAO,cAAc,IAAI,CAAC,SAAS,EAAE,CAAC;IAAA,CACtC;IAEO,sBAAsB,CAAC,SAAiB,EAAQ;QACvD,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACrE,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACxC,SAAS;YACV,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACxE,KAAK,CAAC,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QACnC,CAAC;IAAA,CACD;IAEO,8BAA8B,CAAC,SAAiB,EAAQ;QAC/D,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACrE,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACxC,SAAS;YACV,CAAC;YAED,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;gBACxD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC;YAAA,CACtG,CAAC,CAAC;YAEH,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChB,SAAS;YACV,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACxE,KAAK,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IAAA,CACD;CACD","sourcesContent":["import { evaluate } from \"./evaluate.ts\";\nimport { createLocalEventEmitter, type PermissionEventEmitter } from \"./events.ts\";\nimport {\n\tCorrectedError,\n\tDeniedError,\n\ttype PendingEntry,\n\tRejectedError,\n\ttype ReplyInput,\n\ttype Request,\n\ttype Ruleset,\n} from \"./types.ts\";\n\ntype RequestInput = Omit<Request, \"id\"> & { id?: string };\n\n/** Core service for managing permission requests and rule evaluation */\nexport class PermissionService {\n\tprivate pending = new Map<string, PendingEntry>();\n\tprivate approved: Ruleset;\n\tprivate staticRuleset: Ruleset;\n\tprivate emitter: PermissionEventEmitter;\n\tprivate idCounter = 0;\n\n\tconstructor(staticRuleset: Ruleset, approved: Ruleset, emitter: PermissionEventEmitter = createLocalEventEmitter()) {\n\t\tthis.staticRuleset = [...staticRuleset];\n\t\tthis.approved = [...approved];\n\t\tthis.emitter = emitter;\n\t}\n\n\t/** Request permission for a tool call. Resolves if allowed, throws on denial. */\n\tasync ask(request: RequestInput): Promise<void> {\n\t\tconst info: Request = {\n\t\t\t...request,\n\t\t\tid: request.id ?? this.nextRequestID(),\n\t\t};\n\n\t\tconst deniedPatterns: string[] = [];\n\t\tlet needsAsk = false;\n\n\t\tfor (const pattern of info.patterns) {\n\t\t\tconst rule = evaluate(info.permission, pattern, this.staticRuleset, this.approved);\n\n\t\t\tif (rule.action === \"deny\") {\n\t\t\t\tdeniedPatterns.push(pattern);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (rule.action === \"ask\") {\n\t\t\t\tneedsAsk = true;\n\t\t\t}\n\t\t}\n\n\t\tif (deniedPatterns.length > 0) {\n\t\t\tthrow new DeniedError(deniedPatterns);\n\t\t}\n\n\t\tif (!needsAsk) {\n\t\t\tthis.emitter.emitReplied(info.id, info.sessionID, \"allow\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst pendingPromise = new Promise<void>((resolve, reject) => {\n\t\t\tconst pendingEntry: PendingEntry = {\n\t\t\t\tinfo,\n\t\t\t\tresolve: () => {\n\t\t\t\t\tthis.pending.delete(info.id);\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t\treject: (error) => {\n\t\t\t\t\tthis.pending.delete(info.id);\n\t\t\t\t\treject(error);\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tthis.pending.set(info.id, pendingEntry);\n\t\t});\n\n\t\tthis.emitter.emitAsked(info);\n\n\t\tawait pendingPromise;\n\t}\n\n\t/** Reply to a pending permission request */\n\treply(input: ReplyInput): void {\n\t\tconst existing = this.pending.get(input.requestID);\n\t\tif (!existing) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.pending.delete(input.requestID);\n\t\tthis.emitter.emitReplied(existing.info.id, existing.info.sessionID, input.reply);\n\n\t\tif (input.reply === \"reject\") {\n\t\t\texisting.reject(input.message ? new CorrectedError(input.message) : new RejectedError());\n\t\t\tthis.rejectPendingInSession(existing.info.sessionID);\n\t\t\treturn;\n\t\t}\n\n\t\texisting.resolve();\n\n\t\tif (input.reply === \"once\") {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const pattern of existing.info.always) {\n\t\t\tthis.approved.push({\n\t\t\t\tpermission: existing.info.permission,\n\t\t\t\tpattern,\n\t\t\t\taction: \"allow\",\n\t\t\t});\n\t\t}\n\n\t\tthis.resolveCoveredPendingInSession(existing.info.sessionID);\n\t}\n\n\t/** List all pending permission requests */\n\tlist(): Request[] {\n\t\treturn Array.from(this.pending.values(), (entry) => ({\n\t\t\t...entry.info,\n\t\t\tpatterns: [...entry.info.patterns],\n\t\t\talways: [...entry.info.always],\n\t\t\tmetadata: { ...entry.info.metadata },\n\t\t\ttool: entry.info.tool ? { ...entry.info.tool } : undefined,\n\t\t}));\n\t}\n\n\t/** Get the current approved ruleset */\n\tgetApproved(): Ruleset {\n\t\treturn this.approved.map((rule) => ({ ...rule }));\n\t}\n\n\tprivate nextRequestID(): string {\n\t\tthis.idCounter += 1;\n\t\treturn `permission-${this.idCounter}`;\n\t}\n\n\tprivate rejectPendingInSession(sessionID: string): void {\n\t\tfor (const [requestID, entry] of Array.from(this.pending.entries())) {\n\t\t\tif (entry.info.sessionID !== sessionID) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.pending.delete(requestID);\n\t\t\tthis.emitter.emitReplied(entry.info.id, entry.info.sessionID, \"reject\");\n\t\t\tentry.reject(new RejectedError());\n\t\t}\n\t}\n\n\tprivate resolveCoveredPendingInSession(sessionID: string): void {\n\t\tfor (const [requestID, entry] of Array.from(this.pending.entries())) {\n\t\t\tif (entry.info.sessionID !== sessionID) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isAllowed = entry.info.patterns.every((pattern) => {\n\t\t\t\treturn evaluate(entry.info.permission, pattern, this.staticRuleset, this.approved).action === \"allow\";\n\t\t\t});\n\n\t\t\tif (!isAllowed) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.pending.delete(requestID);\n\t\t\tthis.emitter.emitReplied(entry.info.id, entry.info.sessionID, \"always\");\n\t\t\tentry.resolve();\n\t\t}\n\t}\n}\n"]}
@@ -1,5 +1,5 @@
1
- import type { SettingsManager } from "../../../settings-manager.js";
2
- import type { Ruleset } from "./types.js";
1
+ import type { SettingsManager } from "../../../settings-manager.ts";
2
+ import type { Ruleset } from "./types.ts";
3
3
  /**
4
4
  * Load permission settings from global and project settings.json files.
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG9E,OAAO,KAAK,EAAoB,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACrC,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,MAAM,GAChB;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAW/C","sourcesContent":["import type { Settings, SettingsManager } from \"../../../settings-manager.js\";\nimport { fromConfig, merge } from \"./config.js\";\nimport { loadApproved } from \"./storage.js\";\nimport type { PermissionConfig, Ruleset } from \"./types.js\";\n\n/**\n * Load permission settings from global and project settings.json files.\n *\n * Merge order (highest precedence last):\n * 1. Global settings (~/.senpi/agent/settings.json)\n * 2. Project settings (.senpi/settings.json)\n * 3. CLI override (passed directly to this function)\n *\n * Runtime approvals are stored separately in .senpi/permissions-approved.jsonl\n * and loaded via loadApproved() from storage.ts.\n */\nexport function loadPermissionSettings(\n\tsettingsManager: SettingsManager,\n\tcliOverride: Ruleset,\n\tprojectDir: string,\n): { staticRuleset: Ruleset; approved: Ruleset } {\n\tconst globalSettings = settingsManager.getGlobalSettings() as Settings & { permission?: PermissionConfig };\n\tconst globalRuleset = globalSettings.permission ? fromConfig(globalSettings.permission) : [];\n\n\tconst projectSettings = settingsManager.getProjectSettings() as Settings & { permission?: PermissionConfig };\n\tconst projectRuleset = projectSettings.permission ? fromConfig(projectSettings.permission) : [];\n\n\tconst staticRuleset = merge(globalRuleset, projectRuleset, cliOverride);\n\tconst approved = loadApproved(projectDir);\n\n\treturn { staticRuleset, approved };\n}\n"]}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAG9E,OAAO,KAAK,EAAoB,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CACrC,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,MAAM,GAChB;IAAE,aAAa,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAW/C","sourcesContent":["import type { Settings, SettingsManager } from \"../../../settings-manager.ts\";\nimport { fromConfig, merge } from \"./config.ts\";\nimport { loadApproved } from \"./storage.ts\";\nimport type { PermissionConfig, Ruleset } from \"./types.ts\";\n\n/**\n * Load permission settings from global and project settings.json files.\n *\n * Merge order (highest precedence last):\n * 1. Global settings (~/.senpi/agent/settings.json)\n * 2. Project settings (.senpi/settings.json)\n * 3. CLI override (passed directly to this function)\n *\n * Runtime approvals are stored separately in .senpi/permissions-approved.jsonl\n * and loaded via loadApproved() from storage.ts.\n */\nexport function loadPermissionSettings(\n\tsettingsManager: SettingsManager,\n\tcliOverride: Ruleset,\n\tprojectDir: string,\n): { staticRuleset: Ruleset; approved: Ruleset } {\n\tconst globalSettings = settingsManager.getGlobalSettings() as Settings & { permission?: PermissionConfig };\n\tconst globalRuleset = globalSettings.permission ? fromConfig(globalSettings.permission) : [];\n\n\tconst projectSettings = settingsManager.getProjectSettings() as Settings & { permission?: PermissionConfig };\n\tconst projectRuleset = projectSettings.permission ? fromConfig(projectSettings.permission) : [];\n\n\tconst staticRuleset = merge(globalRuleset, projectRuleset, cliOverride);\n\tconst approved = loadApproved(projectDir);\n\n\treturn { staticRuleset, approved };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/settings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CACrC,eAAgC,EAChC,WAAoB,EACpB,UAAkB,EAC8B;IAChD,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,EAAkD,CAAC;IAC3G,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7F,MAAM,eAAe,GAAG,eAAe,CAAC,kBAAkB,EAAkD,CAAC;IAC7G,MAAM,cAAc,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhG,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAE1C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AAAA,CACnC","sourcesContent":["import type { Settings, SettingsManager } from \"../../../settings-manager.js\";\nimport { fromConfig, merge } from \"./config.js\";\nimport { loadApproved } from \"./storage.js\";\nimport type { PermissionConfig, Ruleset } from \"./types.js\";\n\n/**\n * Load permission settings from global and project settings.json files.\n *\n * Merge order (highest precedence last):\n * 1. Global settings (~/.senpi/agent/settings.json)\n * 2. Project settings (.senpi/settings.json)\n * 3. CLI override (passed directly to this function)\n *\n * Runtime approvals are stored separately in .senpi/permissions-approved.jsonl\n * and loaded via loadApproved() from storage.ts.\n */\nexport function loadPermissionSettings(\n\tsettingsManager: SettingsManager,\n\tcliOverride: Ruleset,\n\tprojectDir: string,\n): { staticRuleset: Ruleset; approved: Ruleset } {\n\tconst globalSettings = settingsManager.getGlobalSettings() as Settings & { permission?: PermissionConfig };\n\tconst globalRuleset = globalSettings.permission ? fromConfig(globalSettings.permission) : [];\n\n\tconst projectSettings = settingsManager.getProjectSettings() as Settings & { permission?: PermissionConfig };\n\tconst projectRuleset = projectSettings.permission ? fromConfig(projectSettings.permission) : [];\n\n\tconst staticRuleset = merge(globalRuleset, projectRuleset, cliOverride);\n\tconst approved = loadApproved(projectDir);\n\n\treturn { staticRuleset, approved };\n}\n"]}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/settings.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAG5C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,sBAAsB,CACrC,eAAgC,EAChC,WAAoB,EACpB,UAAkB,EAC8B;IAChD,MAAM,cAAc,GAAG,eAAe,CAAC,iBAAiB,EAAkD,CAAC;IAC3G,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7F,MAAM,eAAe,GAAG,eAAe,CAAC,kBAAkB,EAAkD,CAAC;IAC7G,MAAM,cAAc,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhG,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAE1C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AAAA,CACnC","sourcesContent":["import type { Settings, SettingsManager } from \"../../../settings-manager.ts\";\nimport { fromConfig, merge } from \"./config.ts\";\nimport { loadApproved } from \"./storage.ts\";\nimport type { PermissionConfig, Ruleset } from \"./types.ts\";\n\n/**\n * Load permission settings from global and project settings.json files.\n *\n * Merge order (highest precedence last):\n * 1. Global settings (~/.senpi/agent/settings.json)\n * 2. Project settings (.senpi/settings.json)\n * 3. CLI override (passed directly to this function)\n *\n * Runtime approvals are stored separately in .senpi/permissions-approved.jsonl\n * and loaded via loadApproved() from storage.ts.\n */\nexport function loadPermissionSettings(\n\tsettingsManager: SettingsManager,\n\tcliOverride: Ruleset,\n\tprojectDir: string,\n): { staticRuleset: Ruleset; approved: Ruleset } {\n\tconst globalSettings = settingsManager.getGlobalSettings() as Settings & { permission?: PermissionConfig };\n\tconst globalRuleset = globalSettings.permission ? fromConfig(globalSettings.permission) : [];\n\n\tconst projectSettings = settingsManager.getProjectSettings() as Settings & { permission?: PermissionConfig };\n\tconst projectRuleset = projectSettings.permission ? fromConfig(projectSettings.permission) : [];\n\n\tconst staticRuleset = merge(globalRuleset, projectRuleset, cliOverride);\n\tconst approved = loadApproved(projectDir);\n\n\treturn { staticRuleset, approved };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { Rule, Ruleset } from "./types.js";
1
+ import type { Rule, Ruleset } from "./types.ts";
2
2
  export declare function loadApproved(projectDir: string): Ruleset;
3
3
  export declare function appendApproved(projectDir: string, rules: Rule[]): void;
4
4
  export declare function clearApproved(projectDir: string): void;
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAQhD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAmBxD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CActE;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAMtD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAkBxD","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { CONFIG_DIR_NAME } from \"../../../../config.js\";\nimport type { Rule, Ruleset } from \"./types.js\";\n\nconst PERMISSIONS_FILE = \"permissions-approved.jsonl\";\n\nfunction getPermissionsPath(projectDir: string): string {\n\treturn path.join(projectDir, CONFIG_DIR_NAME, PERMISSIONS_FILE);\n}\n\nexport function loadApproved(projectDir: string): Ruleset {\n\tconst filePath = getPermissionsPath(projectDir);\n\n\tif (!fs.existsSync(filePath)) {\n\t\treturn [];\n\t}\n\n\tconst content = fs.readFileSync(filePath, \"utf-8\");\n\tconst lines = content.split(\"\\n\").filter((line) => line.trim() !== \"\");\n\n\tconst rules: Rule[] = [];\n\tfor (const line of lines) {\n\t\ttry {\n\t\t\tconst rule = JSON.parse(line) as Rule;\n\t\t\trules.push(rule);\n\t\t} catch {}\n\t}\n\n\treturn rules;\n}\n\nexport function appendApproved(projectDir: string, rules: Rule[]): void {\n\tif (rules.length === 0) {\n\t\treturn;\n\t}\n\n\tconst filePath = getPermissionsPath(projectDir);\n\tconst dir = path.dirname(filePath);\n\n\tif (!fs.existsSync(dir)) {\n\t\tfs.mkdirSync(dir, { recursive: true });\n\t}\n\n\tconst lines = `${rules.map((rule) => JSON.stringify(rule)).join(\"\\n\")}\\n`;\n\tfs.appendFileSync(filePath, lines, { flag: \"a\" });\n}\n\nexport function clearApproved(projectDir: string): void {\n\tconst filePath = getPermissionsPath(projectDir);\n\n\tif (fs.existsSync(filePath)) {\n\t\tfs.unlinkSync(filePath);\n\t}\n}\n\nexport function compactApproved(projectDir: string): void {\n\tconst filePath = getPermissionsPath(projectDir);\n\n\tif (!fs.existsSync(filePath)) {\n\t\treturn;\n\t}\n\n\tconst rules = loadApproved(projectDir);\n\tconst seen = new Map<string, Rule>();\n\n\tfor (const rule of rules) {\n\t\tconst key = `${rule.permission}:${rule.pattern}`;\n\t\tseen.set(key, rule);\n\t}\n\n\tconst uniqueRules = Array.from(seen.values());\n\tconst lines = uniqueRules.map((rule) => JSON.stringify(rule)).join(\"\\n\");\n\tfs.writeFileSync(filePath, lines ? `${lines}\\n` : \"\", { flag: \"w\" });\n}\n"]}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/permission-system/storage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAQhD,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAmBxD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CActE;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAMtD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAkBxD","sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { CONFIG_DIR_NAME } from \"../../../../config.ts\";\nimport type { Rule, Ruleset } from \"./types.ts\";\n\nconst PERMISSIONS_FILE = \"permissions-approved.jsonl\";\n\nfunction getPermissionsPath(projectDir: string): string {\n\treturn path.join(projectDir, CONFIG_DIR_NAME, PERMISSIONS_FILE);\n}\n\nexport function loadApproved(projectDir: string): Ruleset {\n\tconst filePath = getPermissionsPath(projectDir);\n\n\tif (!fs.existsSync(filePath)) {\n\t\treturn [];\n\t}\n\n\tconst content = fs.readFileSync(filePath, \"utf-8\");\n\tconst lines = content.split(\"\\n\").filter((line) => line.trim() !== \"\");\n\n\tconst rules: Rule[] = [];\n\tfor (const line of lines) {\n\t\ttry {\n\t\t\tconst rule = JSON.parse(line) as Rule;\n\t\t\trules.push(rule);\n\t\t} catch {}\n\t}\n\n\treturn rules;\n}\n\nexport function appendApproved(projectDir: string, rules: Rule[]): void {\n\tif (rules.length === 0) {\n\t\treturn;\n\t}\n\n\tconst filePath = getPermissionsPath(projectDir);\n\tconst dir = path.dirname(filePath);\n\n\tif (!fs.existsSync(dir)) {\n\t\tfs.mkdirSync(dir, { recursive: true });\n\t}\n\n\tconst lines = `${rules.map((rule) => JSON.stringify(rule)).join(\"\\n\")}\\n`;\n\tfs.appendFileSync(filePath, lines, { flag: \"a\" });\n}\n\nexport function clearApproved(projectDir: string): void {\n\tconst filePath = getPermissionsPath(projectDir);\n\n\tif (fs.existsSync(filePath)) {\n\t\tfs.unlinkSync(filePath);\n\t}\n}\n\nexport function compactApproved(projectDir: string): void {\n\tconst filePath = getPermissionsPath(projectDir);\n\n\tif (!fs.existsSync(filePath)) {\n\t\treturn;\n\t}\n\n\tconst rules = loadApproved(projectDir);\n\tconst seen = new Map<string, Rule>();\n\n\tfor (const rule of rules) {\n\t\tconst key = `${rule.permission}:${rule.pattern}`;\n\t\tseen.set(key, rule);\n\t}\n\n\tconst uniqueRules = Array.from(seen.values());\n\tconst lines = uniqueRules.map((rule) => JSON.stringify(rule)).join(\"\\n\");\n\tfs.writeFileSync(filePath, lines ? `${lines}\\n` : \"\", { flag: \"w\" });\n}\n"]}