@code-yeongyu/senpi 2026.6.4 → 2026.6.6-3

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 (1050) hide show
  1. package/CHANGELOG.md +39 -1
  2. package/README.md +19 -4
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/bun/register-bedrock.d.ts.map +1 -1
  6. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  7. package/dist/bun/restore-sandbox-env.js.map +1 -1
  8. package/dist/cli/args.d.ts +1 -0
  9. package/dist/cli/args.d.ts.map +1 -1
  10. package/dist/cli/args.js +12 -2
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/config-selector.d.ts.map +1 -1
  13. package/dist/cli/config-selector.js.map +1 -1
  14. package/dist/cli/file-processor.d.ts.map +1 -1
  15. package/dist/cli/file-processor.js.map +1 -1
  16. package/dist/cli/initial-message.d.ts +1 -1
  17. package/dist/cli/initial-message.d.ts.map +1 -1
  18. package/dist/cli/initial-message.js.map +1 -1
  19. package/dist/cli/list-models.d.ts.map +1 -1
  20. package/dist/cli/list-models.js.map +1 -1
  21. package/dist/cli/session-picker.d.ts.map +1 -1
  22. package/dist/cli/session-picker.js.map +1 -1
  23. package/dist/cli-main.d.ts.map +1 -1
  24. package/dist/cli-main.js.map +1 -1
  25. package/dist/cli.d.ts.map +1 -1
  26. package/dist/cli.js.map +1 -1
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js.map +1 -1
  29. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  30. package/dist/core/agent-session-runtime.js +0 -8
  31. package/dist/core/agent-session-runtime.js.map +1 -1
  32. package/dist/core/agent-session-services.d.ts.map +1 -1
  33. package/dist/core/agent-session-services.js.map +1 -1
  34. package/dist/core/agent-session.d.ts +32 -0
  35. package/dist/core/agent-session.d.ts.map +1 -1
  36. package/dist/core/agent-session.js +51 -79
  37. package/dist/core/agent-session.js.map +1 -1
  38. package/dist/core/auth-guidance.d.ts.map +1 -1
  39. package/dist/core/auth-guidance.js.map +1 -1
  40. package/dist/core/auth-storage.d.ts +4 -0
  41. package/dist/core/auth-storage.d.ts.map +1 -1
  42. package/dist/core/auth-storage.js +4 -8
  43. package/dist/core/auth-storage.js.map +1 -1
  44. package/dist/core/bash-executor.d.ts.map +1 -1
  45. package/dist/core/bash-executor.js.map +1 -1
  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.map +1 -1
  49. package/dist/core/compaction/compaction.js.map +1 -1
  50. package/dist/core/compaction/index.d.ts.map +1 -1
  51. package/dist/core/compaction/utils.d.ts.map +1 -1
  52. package/dist/core/compaction/utils.js.map +1 -1
  53. package/dist/core/defaults.d.ts.map +1 -1
  54. package/dist/core/diagnostics.d.ts.map +1 -1
  55. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  56. package/dist/core/dynamic-prompt/build.js.map +1 -1
  57. package/dist/core/dynamic-prompt/exploration.d.ts.map +1 -1
  58. package/dist/core/dynamic-prompt/exploration.js.map +1 -1
  59. package/dist/core/dynamic-prompt/identity.d.ts.map +1 -1
  60. package/dist/core/dynamic-prompt/identity.js.map +1 -1
  61. package/dist/core/dynamic-prompt/index.d.ts.map +1 -1
  62. package/dist/core/dynamic-prompt/intent-gate.d.ts.map +1 -1
  63. package/dist/core/dynamic-prompt/intent-gate.js.map +1 -1
  64. package/dist/core/dynamic-prompt/parallel-tools.d.ts.map +1 -1
  65. package/dist/core/dynamic-prompt/parallel-tools.js.map +1 -1
  66. package/dist/core/dynamic-prompt/policies.d.ts.map +1 -1
  67. package/dist/core/dynamic-prompt/policies.js.map +1 -1
  68. package/dist/core/dynamic-prompt/style.d.ts.map +1 -1
  69. package/dist/core/dynamic-prompt/style.js.map +1 -1
  70. package/dist/core/dynamic-prompt/tool-categorization.d.ts.map +1 -1
  71. package/dist/core/dynamic-prompt/tool-categorization.js.map +1 -1
  72. package/dist/core/dynamic-prompt/tool-section.d.ts.map +1 -1
  73. package/dist/core/dynamic-prompt/tool-section.js.map +1 -1
  74. package/dist/core/dynamic-prompt/types.d.ts.map +1 -1
  75. package/dist/core/dynamic-prompt/verification.d.ts.map +1 -1
  76. package/dist/core/dynamic-prompt/verification.js.map +1 -1
  77. package/dist/core/event-bus.d.ts.map +1 -1
  78. package/dist/core/event-bus.js.map +1 -1
  79. package/dist/core/exec.d.ts.map +1 -1
  80. package/dist/core/exec.js.map +1 -1
  81. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  82. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  83. package/dist/core/export-html/index.d.ts.map +1 -1
  84. package/dist/core/export-html/index.js.map +1 -1
  85. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  86. package/dist/core/export-html/tool-renderer.js.map +1 -1
  87. package/dist/core/extensions/builtin/anthropic-bash/index.d.ts.map +1 -1
  88. package/dist/core/extensions/builtin/anthropic-bash/index.js.map +1 -1
  89. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
  90. package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
  91. package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
  92. package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
  93. package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
  94. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  95. package/dist/core/extensions/builtin/compaction/checkpoint-state.d.ts.map +1 -1
  96. package/dist/core/extensions/builtin/compaction/checkpoint-state.js.map +1 -1
  97. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/compaction/circuit-breaker.js.map +1 -1
  99. package/dist/core/extensions/builtin/compaction/context-reduction.d.ts.map +1 -1
  100. package/dist/core/extensions/builtin/compaction/context-reduction.js +1 -1
  101. package/dist/core/extensions/builtin/compaction/context-reduction.js.map +1 -1
  102. package/dist/core/extensions/builtin/compaction/degradation-monitor.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/compaction/degradation-monitor.js.map +1 -1
  104. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  105. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  106. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  107. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  108. package/dist/core/extensions/builtin/compaction/overflow-detection.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/compaction/overflow-detection.js.map +1 -1
  110. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts.map +1 -1
  111. package/dist/core/extensions/builtin/compaction/per-turn-cap.js.map +1 -1
  112. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  113. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  114. package/dist/core/extensions/builtin/compaction/prompts.d.ts.map +1 -1
  115. package/dist/core/extensions/builtin/compaction/prompts.js.map +1 -1
  116. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js.map +1 -1
  118. package/dist/core/extensions/builtin/compaction/restoration-tracker.d.ts.map +1 -1
  119. package/dist/core/extensions/builtin/compaction/restoration-tracker.js.map +1 -1
  120. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  121. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  122. package/dist/core/extensions/builtin/compaction/state.d.ts.map +1 -1
  123. package/dist/core/extensions/builtin/compaction/state.js.map +1 -1
  124. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
  125. package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
  126. package/dist/core/extensions/builtin/compaction/tool-truncation.d.ts.map +1 -1
  127. package/dist/core/extensions/builtin/compaction/tool-truncation.js.map +1 -1
  128. package/dist/core/extensions/builtin/diff.d.ts.map +1 -1
  129. package/dist/core/extensions/builtin/diff.js.map +1 -1
  130. package/dist/core/extensions/builtin/files.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/files.js.map +1 -1
  132. package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts.map +1 -1
  133. package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
  134. package/dist/core/extensions/builtin/gpt-apply-patch/constants.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/gpt-apply-patch/constants.js.map +1 -1
  136. package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts.map +1 -1
  137. package/dist/core/extensions/builtin/gpt-apply-patch/errors.js +0 -2
  138. package/dist/core/extensions/builtin/gpt-apply-patch/errors.js.map +1 -1
  139. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  140. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  141. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts.map +1 -1
  142. package/dist/core/extensions/builtin/gpt-apply-patch/params.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/gpt-apply-patch/params.js.map +1 -1
  144. package/dist/core/extensions/builtin/gpt-apply-patch/parser.d.ts.map +1 -1
  145. package/dist/core/extensions/builtin/gpt-apply-patch/parser.js.map +1 -1
  146. package/dist/core/extensions/builtin/gpt-apply-patch/patch-diff.d.ts.map +1 -1
  147. package/dist/core/extensions/builtin/gpt-apply-patch/patch-diff.js.map +1 -1
  148. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.d.ts.map +1 -1
  149. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.js.map +1 -1
  150. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts.map +1 -1
  151. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
  152. package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
  154. package/dist/core/extensions/builtin/gpt-apply-patch/seek-sequence.d.ts.map +1 -1
  155. package/dist/core/extensions/builtin/gpt-apply-patch/seek-sequence.js.map +1 -1
  156. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts.map +1 -1
  157. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js +7 -5
  158. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js.map +1 -1
  159. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.d.ts.map +1 -1
  160. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.js.map +1 -1
  161. package/dist/core/extensions/builtin/gpt-apply-patch/text.d.ts.map +1 -1
  162. package/dist/core/extensions/builtin/gpt-apply-patch/text.js.map +1 -1
  163. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
  164. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  165. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
  166. package/dist/core/extensions/builtin/gpt-apply-patch/workspace.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/gpt-apply-patch/workspace.js.map +1 -1
  168. package/dist/core/extensions/builtin/history-search/filter.d.ts.map +1 -1
  169. package/dist/core/extensions/builtin/history-search/filter.js.map +1 -1
  170. package/dist/core/extensions/builtin/history-search/index.d.ts.map +1 -1
  171. package/dist/core/extensions/builtin/history-search/index.js.map +1 -1
  172. package/dist/core/extensions/builtin/history-search/indexer.d.ts.map +1 -1
  173. package/dist/core/extensions/builtin/history-search/indexer.js.map +1 -1
  174. package/dist/core/extensions/builtin/history-search/overlay.d.ts.map +1 -1
  175. package/dist/core/extensions/builtin/history-search/overlay.js +3 -6
  176. package/dist/core/extensions/builtin/history-search/overlay.js.map +1 -1
  177. package/dist/core/extensions/builtin/history-search/types.d.ts.map +1 -1
  178. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  179. package/dist/core/extensions/builtin/kimi-web-search/index.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/kimi-web-search/index.js.map +1 -1
  181. package/dist/core/extensions/builtin/openai-web-search/index.d.ts.map +1 -1
  182. package/dist/core/extensions/builtin/openai-web-search/index.js.map +1 -1
  183. package/dist/core/extensions/builtin/permission-system/arity.d.ts.map +1 -1
  184. package/dist/core/extensions/builtin/permission-system/arity.js.map +1 -1
  185. package/dist/core/extensions/builtin/permission-system/cli.d.ts.map +1 -1
  186. package/dist/core/extensions/builtin/permission-system/cli.js.map +1 -1
  187. package/dist/core/extensions/builtin/permission-system/config.d.ts.map +1 -1
  188. package/dist/core/extensions/builtin/permission-system/config.js.map +1 -1
  189. package/dist/core/extensions/builtin/permission-system/evaluate.d.ts.map +1 -1
  190. package/dist/core/extensions/builtin/permission-system/evaluate.js.map +1 -1
  191. package/dist/core/extensions/builtin/permission-system/events.d.ts.map +1 -1
  192. package/dist/core/extensions/builtin/permission-system/events.js.map +1 -1
  193. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  194. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  195. package/dist/core/extensions/builtin/permission-system/index.d.ts.map +1 -1
  196. package/dist/core/extensions/builtin/permission-system/index.js.map +1 -1
  197. package/dist/core/extensions/builtin/permission-system/non-interactive.d.ts.map +1 -1
  198. package/dist/core/extensions/builtin/permission-system/non-interactive.js.map +1 -1
  199. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  200. package/dist/core/extensions/builtin/permission-system/parsers.js +3 -1
  201. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  202. package/dist/core/extensions/builtin/permission-system/prompt.d.ts.map +1 -1
  203. package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
  204. package/dist/core/extensions/builtin/permission-system/service.d.ts.map +1 -1
  205. package/dist/core/extensions/builtin/permission-system/service.js +2 -5
  206. package/dist/core/extensions/builtin/permission-system/service.js.map +1 -1
  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.map +1 -1
  210. package/dist/core/extensions/builtin/permission-system/storage.js.map +1 -1
  211. package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
  212. package/dist/core/extensions/builtin/permission-system/types.js +3 -5
  213. package/dist/core/extensions/builtin/permission-system/types.js.map +1 -1
  214. package/dist/core/extensions/builtin/permission-system/wildcard.d.ts.map +1 -1
  215. package/dist/core/extensions/builtin/permission-system/wildcard.js.map +1 -1
  216. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
  217. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
  218. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
  219. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
  220. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
  221. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
  222. package/dist/core/extensions/builtin/prompt-preset/file-operations.d.ts.map +1 -1
  223. package/dist/core/extensions/builtin/prompt-preset/file-operations.js.map +1 -1
  224. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.d.ts.map +1 -1
  225. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js.map +1 -1
  226. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.d.ts.map +1 -1
  227. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js.map +1 -1
  228. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.d.ts.map +1 -1
  229. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js.map +1 -1
  230. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts.map +1 -1
  231. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
  232. package/dist/core/extensions/builtin/prompt-preset/gpt-5.d.ts.map +1 -1
  233. package/dist/core/extensions/builtin/prompt-preset/gpt-5.js.map +1 -1
  234. package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
  235. package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
  236. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.d.ts.map +1 -1
  237. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
  238. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  239. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  240. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  241. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  242. package/dist/core/extensions/builtin/prompt-url-widget.d.ts.map +1 -1
  243. package/dist/core/extensions/builtin/prompt-url-widget.js.map +1 -1
  244. package/dist/core/extensions/builtin/redraws.d.ts.map +1 -1
  245. package/dist/core/extensions/builtin/redraws.js.map +1 -1
  246. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  247. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  248. package/dist/core/extensions/builtin/session-observer/index.d.ts.map +1 -1
  249. package/dist/core/extensions/builtin/session-observer/index.js.map +1 -1
  250. package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +1 -1
  251. package/dist/core/extensions/builtin/session-observer/loader.js.map +1 -1
  252. package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +1 -1
  253. package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +1 -1
  254. package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +1 -1
  255. package/dist/core/extensions/builtin/session-observer/overlay.js +13 -18
  256. package/dist/core/extensions/builtin/session-observer/overlay.js.map +1 -1
  257. package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +1 -1
  258. package/dist/core/extensions/builtin/session-observer/scanner.js.map +1 -1
  259. package/dist/core/extensions/builtin/session-observer/text.d.ts.map +1 -1
  260. package/dist/core/extensions/builtin/session-observer/text.js.map +1 -1
  261. package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +1 -1
  262. package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +1 -1
  263. package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +1 -1
  264. package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +1 -1
  265. package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +1 -1
  266. package/dist/core/extensions/builtin/session-observer/transcript.js.map +1 -1
  267. package/dist/core/extensions/builtin/session-observer/types.d.ts.map +1 -1
  268. package/dist/core/extensions/builtin/system-messages.d.ts.map +1 -1
  269. package/dist/core/extensions/builtin/system-messages.js.map +1 -1
  270. package/dist/core/extensions/builtin/todotools/continuation/config.d.ts +1 -1
  271. package/dist/core/extensions/builtin/todotools/continuation/config.d.ts.map +1 -1
  272. package/dist/core/extensions/builtin/todotools/continuation/config.js.map +1 -1
  273. package/dist/core/extensions/builtin/todotools/continuation/index.d.ts.map +1 -1
  274. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts.map +1 -1
  275. package/dist/core/extensions/builtin/todotools/continuation/prompt.js.map +1 -1
  276. package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts.map +1 -1
  277. package/dist/core/extensions/builtin/todotools/continuation/runtime.js.map +1 -1
  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/prompt.d.ts.map +1 -1
  281. package/dist/core/extensions/builtin/todotools/settings.d.ts.map +1 -1
  282. package/dist/core/extensions/builtin/todotools/settings.js.map +1 -1
  283. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  284. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  285. package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +1 -1
  286. package/dist/core/extensions/builtin/todotools/system-messages.js.map +1 -1
  287. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts.map +1 -1
  288. package/dist/core/extensions/builtin/todotools/tools/todoread.js.map +1 -1
  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.map +1 -1
  292. package/dist/core/extensions/builtin/tool-pair-guard/index.js.map +1 -1
  293. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts.map +1 -1
  294. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js.map +1 -1
  295. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.d.ts.map +1 -1
  296. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.js.map +1 -1
  297. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.d.ts.map +1 -1
  298. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.js.map +1 -1
  299. package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
  300. package/dist/core/extensions/builtin/tps.js.map +1 -1
  301. package/dist/core/extensions/index.d.ts.map +1 -1
  302. package/dist/core/extensions/loader.d.ts.map +1 -1
  303. package/dist/core/extensions/loader.js.map +1 -1
  304. package/dist/core/extensions/runner.d.ts.map +1 -1
  305. package/dist/core/extensions/runner.js +35 -43
  306. package/dist/core/extensions/runner.js.map +1 -1
  307. package/dist/core/extensions/types.d.ts +1 -1
  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.map +1 -1
  311. package/dist/core/extensions/wrapper.js.map +1 -1
  312. package/dist/core/footer-data-provider.d.ts.map +1 -1
  313. package/dist/core/footer-data-provider.js +17 -18
  314. package/dist/core/footer-data-provider.js.map +1 -1
  315. package/dist/core/http-dispatcher.d.ts.map +1 -1
  316. package/dist/core/http-dispatcher.js.map +1 -1
  317. package/dist/core/index.d.ts.map +1 -1
  318. package/dist/core/keybindings.d.ts +1 -1
  319. package/dist/core/keybindings.d.ts.map +1 -1
  320. package/dist/core/keybindings.js +0 -1
  321. package/dist/core/keybindings.js.map +1 -1
  322. package/dist/core/messages.d.ts.map +1 -1
  323. package/dist/core/messages.js.map +1 -1
  324. package/dist/core/model-registry.d.ts.map +1 -1
  325. package/dist/core/model-registry.js +8 -10
  326. package/dist/core/model-registry.js.map +1 -1
  327. package/dist/core/model-resolver.d.ts.map +1 -1
  328. package/dist/core/model-resolver.js.map +1 -1
  329. package/dist/core/output-guard.d.ts.map +1 -1
  330. package/dist/core/output-guard.js.map +1 -1
  331. package/dist/core/package-manager.d.ts +1 -0
  332. package/dist/core/package-manager.d.ts.map +1 -1
  333. package/dist/core/package-manager.js +25 -13
  334. package/dist/core/package-manager.js.map +1 -1
  335. package/dist/core/prompt-templates.d.ts.map +1 -1
  336. package/dist/core/prompt-templates.js.map +1 -1
  337. package/dist/core/provider-attribution.d.ts.map +1 -1
  338. package/dist/core/provider-attribution.js.map +1 -1
  339. package/dist/core/provider-display-names.d.ts.map +1 -1
  340. package/dist/core/resolve-config-value.d.ts.map +1 -1
  341. package/dist/core/resolve-config-value.js.map +1 -1
  342. package/dist/core/resource-loader.d.ts +1 -0
  343. package/dist/core/resource-loader.d.ts.map +1 -1
  344. package/dist/core/resource-loader.js +26 -53
  345. package/dist/core/resource-loader.js.map +1 -1
  346. package/dist/core/sdk.d.ts.map +1 -1
  347. package/dist/core/sdk.js.map +1 -1
  348. package/dist/core/session-cwd.d.ts.map +1 -1
  349. package/dist/core/session-cwd.js +0 -1
  350. package/dist/core/session-cwd.js.map +1 -1
  351. package/dist/core/session-manager.d.ts.map +1 -1
  352. package/dist/core/session-manager.js +7 -11
  353. package/dist/core/session-manager.js.map +1 -1
  354. package/dist/core/session-work-barrier.d.ts.map +1 -1
  355. package/dist/core/session-work-barrier.js +5 -3
  356. package/dist/core/session-work-barrier.js.map +1 -1
  357. package/dist/core/settings-manager.d.ts +10 -2
  358. package/dist/core/settings-manager.d.ts.map +1 -1
  359. package/dist/core/settings-manager.js +77 -46
  360. package/dist/core/settings-manager.js.map +1 -1
  361. package/dist/core/skills.d.ts.map +1 -1
  362. package/dist/core/skills.js.map +1 -1
  363. package/dist/core/slash-commands.d.ts.map +1 -1
  364. package/dist/core/slash-commands.js +1 -0
  365. package/dist/core/slash-commands.js.map +1 -1
  366. package/dist/core/source-info.d.ts.map +1 -1
  367. package/dist/core/source-info.js.map +1 -1
  368. package/dist/core/system-prompt.d.ts.map +1 -1
  369. package/dist/core/system-prompt.js.map +1 -1
  370. package/dist/core/telemetry.d.ts.map +1 -1
  371. package/dist/core/telemetry.js.map +1 -1
  372. package/dist/core/thinking-levels.d.ts.map +1 -1
  373. package/dist/core/thinking-levels.js.map +1 -1
  374. package/dist/core/timings.d.ts.map +1 -1
  375. package/dist/core/timings.js.map +1 -1
  376. package/dist/core/tools/bash.d.ts.map +1 -1
  377. package/dist/core/tools/bash.js +9 -6
  378. package/dist/core/tools/bash.js.map +1 -1
  379. package/dist/core/tools/diff-render.d.ts.map +1 -1
  380. package/dist/core/tools/diff-render.js.map +1 -1
  381. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  382. package/dist/core/tools/edit-diff.js.map +1 -1
  383. package/dist/core/tools/edit.d.ts.map +1 -1
  384. package/dist/core/tools/edit.js.map +1 -1
  385. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  386. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  387. package/dist/core/tools/find.d.ts.map +1 -1
  388. package/dist/core/tools/find.js +1 -1
  389. package/dist/core/tools/find.js.map +1 -1
  390. package/dist/core/tools/grep.d.ts.map +1 -1
  391. package/dist/core/tools/grep.js +1 -1
  392. package/dist/core/tools/grep.js.map +1 -1
  393. package/dist/core/tools/index.d.ts.map +1 -1
  394. package/dist/core/tools/index.js.map +1 -1
  395. package/dist/core/tools/ls.d.ts.map +1 -1
  396. package/dist/core/tools/ls.js +1 -1
  397. package/dist/core/tools/ls.js.map +1 -1
  398. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  399. package/dist/core/tools/output-accumulator.js +12 -18
  400. package/dist/core/tools/output-accumulator.js.map +1 -1
  401. package/dist/core/tools/path-utils.d.ts.map +1 -1
  402. package/dist/core/tools/path-utils.js.map +1 -1
  403. package/dist/core/tools/read.d.ts.map +1 -1
  404. package/dist/core/tools/read.js +1 -1
  405. package/dist/core/tools/read.js.map +1 -1
  406. package/dist/core/tools/render-utils.d.ts.map +1 -1
  407. package/dist/core/tools/render-utils.js.map +1 -1
  408. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  409. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  410. package/dist/core/tools/truncate.d.ts.map +1 -1
  411. package/dist/core/tools/truncate.js.map +1 -1
  412. package/dist/core/tools/write.d.ts.map +1 -1
  413. package/dist/core/tools/write.js +1 -2
  414. package/dist/core/tools/write.js.map +1 -1
  415. package/dist/core/trust-manager.d.ts +9 -0
  416. package/dist/core/trust-manager.d.ts.map +1 -0
  417. package/dist/core/trust-manager.js +133 -0
  418. package/dist/core/trust-manager.js.map +1 -0
  419. package/dist/index.d.ts +2 -1
  420. package/dist/index.d.ts.map +1 -1
  421. package/dist/index.js +1 -0
  422. package/dist/index.js.map +1 -1
  423. package/dist/main.d.ts.map +1 -1
  424. package/dist/main.js +54 -2
  425. package/dist/main.js.map +1 -1
  426. package/dist/migrations.d.ts.map +1 -1
  427. package/dist/migrations.js.map +1 -1
  428. package/dist/modes/index.d.ts.map +1 -1
  429. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  430. package/dist/modes/interactive/components/armin.js +6 -10
  431. package/dist/modes/interactive/components/armin.js.map +1 -1
  432. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  433. package/dist/modes/interactive/components/assistant-message.js +2 -11
  434. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  435. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  436. package/dist/modes/interactive/components/bash-execution.js +6 -11
  437. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  438. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  439. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  440. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  441. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  442. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  443. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  444. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  445. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  446. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  447. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  448. package/dist/modes/interactive/components/config-selector.js +5 -15
  449. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  450. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  451. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  452. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  453. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  454. package/dist/modes/interactive/components/custom-editor.js +1 -8
  455. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  456. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  457. package/dist/modes/interactive/components/custom-message.js +1 -6
  458. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  459. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  460. package/dist/modes/interactive/components/daxnuts.js +6 -8
  461. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  462. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  463. package/dist/modes/interactive/components/diff.js +2 -2
  464. package/dist/modes/interactive/components/diff.js.map +1 -1
  465. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  466. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  467. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  468. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  469. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  470. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/extension-editor.js +1 -6
  472. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  473. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/extension-input.js +2 -8
  475. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  476. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  477. package/dist/modes/interactive/components/extension-selector.js +1 -9
  478. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  479. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  480. package/dist/modes/interactive/components/favorite-models-selector.js +9 -15
  481. package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
  482. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  483. package/dist/modes/interactive/components/footer.js +10 -3
  484. package/dist/modes/interactive/components/footer.js.map +1 -1
  485. package/dist/modes/interactive/components/index.d.ts +1 -0
  486. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  487. package/dist/modes/interactive/components/index.js +1 -0
  488. package/dist/modes/interactive/components/index.js.map +1 -1
  489. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  490. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  491. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  492. package/dist/modes/interactive/components/login-dialog.js +3 -9
  493. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  494. package/dist/modes/interactive/components/model-favorites.d.ts.map +1 -1
  495. package/dist/modes/interactive/components/model-favorites.js.map +1 -1
  496. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  497. package/dist/modes/interactive/components/model-selector.js +9 -22
  498. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  499. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  500. package/dist/modes/interactive/components/oauth-selector.js +3 -12
  501. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  502. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  503. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  504. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  505. package/dist/modes/interactive/components/session-selector.js +33 -58
  506. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  507. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  508. package/dist/modes/interactive/components/settings-selector.js +0 -4
  509. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  510. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  511. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  512. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  513. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  514. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  515. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  516. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  517. package/dist/modes/interactive/components/theme-selector.js +0 -2
  518. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  519. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  520. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  521. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  522. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  523. package/dist/modes/interactive/components/tool-execution.js +9 -28
  524. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  525. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  526. package/dist/modes/interactive/components/tree-selector.js +18 -32
  527. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  528. package/dist/modes/interactive/components/trust-selector.d.ts +20 -0
  529. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  530. package/dist/modes/interactive/components/trust-selector.js +81 -0
  531. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  532. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  533. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  534. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  535. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  536. package/dist/modes/interactive/components/user-message.js +0 -1
  537. package/dist/modes/interactive/components/user-message.js.map +1 -1
  538. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  539. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  540. package/dist/modes/interactive/interactive-mode.d.ts +24 -0
  541. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  542. package/dist/modes/interactive/interactive-mode.js +112 -101
  543. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  544. package/dist/modes/interactive/session-info-format.d.ts.map +1 -1
  545. package/dist/modes/interactive/session-info-format.js.map +1 -1
  546. package/dist/modes/interactive/startup-tools.d.ts.map +1 -1
  547. package/dist/modes/interactive/startup-tools.js.map +1 -1
  548. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  549. package/dist/modes/interactive/theme/theme.js +0 -6
  550. package/dist/modes/interactive/theme/theme.js.map +1 -1
  551. package/dist/modes/interactive/working-status.d.ts.map +1 -1
  552. package/dist/modes/interactive/working-status.js.map +1 -1
  553. package/dist/modes/print-mode.d.ts.map +1 -1
  554. package/dist/modes/print-mode.js.map +1 -1
  555. package/dist/modes/provider-native-rendering.d.ts.map +1 -1
  556. package/dist/modes/provider-native-rendering.js.map +1 -1
  557. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  558. package/dist/modes/rpc/jsonl.js.map +1 -1
  559. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  560. package/dist/modes/rpc/rpc-client.js +7 -8
  561. package/dist/modes/rpc/rpc-client.js.map +1 -1
  562. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  563. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  564. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  565. package/dist/package-manager-cli.d.ts.map +1 -1
  566. package/dist/package-manager-cli.js +56 -9
  567. package/dist/package-manager-cli.js.map +1 -1
  568. package/dist/self-update-bootstrap.d.ts.map +1 -1
  569. package/dist/self-update-bootstrap.js.map +1 -1
  570. package/dist/utils/ansi.d.ts.map +1 -1
  571. package/dist/utils/ansi.js.map +1 -1
  572. package/dist/utils/changelog.d.ts.map +1 -1
  573. package/dist/utils/changelog.js.map +1 -1
  574. package/dist/utils/child-process.d.ts.map +1 -1
  575. package/dist/utils/child-process.js.map +1 -1
  576. package/dist/utils/clipboard-image.d.ts.map +1 -1
  577. package/dist/utils/clipboard-image.js.map +1 -1
  578. package/dist/utils/clipboard-native.d.ts.map +1 -1
  579. package/dist/utils/clipboard-native.js.map +1 -1
  580. package/dist/utils/clipboard.d.ts.map +1 -1
  581. package/dist/utils/clipboard.js.map +1 -1
  582. package/dist/utils/deprecation.d.ts.map +1 -1
  583. package/dist/utils/deprecation.js.map +1 -1
  584. package/dist/utils/exif-orientation.d.ts.map +1 -1
  585. package/dist/utils/exif-orientation.js.map +1 -1
  586. package/dist/utils/frontmatter.d.ts.map +1 -1
  587. package/dist/utils/frontmatter.js.map +1 -1
  588. package/dist/utils/fs-watch.d.ts.map +1 -1
  589. package/dist/utils/fs-watch.js.map +1 -1
  590. package/dist/utils/git.d.ts.map +1 -1
  591. package/dist/utils/git.js.map +1 -1
  592. package/dist/utils/html.d.ts.map +1 -1
  593. package/dist/utils/html.js.map +1 -1
  594. package/dist/utils/image-convert.d.ts.map +1 -1
  595. package/dist/utils/image-convert.js.map +1 -1
  596. package/dist/utils/image-resize-core.d.ts.map +1 -1
  597. package/dist/utils/image-resize-core.js.map +1 -1
  598. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  599. package/dist/utils/image-resize-worker.js.map +1 -1
  600. package/dist/utils/image-resize.d.ts.map +1 -1
  601. package/dist/utils/image-resize.js.map +1 -1
  602. package/dist/utils/json.d.ts.map +1 -1
  603. package/dist/utils/json.js.map +1 -1
  604. package/dist/utils/mime.d.ts.map +1 -1
  605. package/dist/utils/mime.js.map +1 -1
  606. package/dist/utils/open-browser.d.ts.map +1 -1
  607. package/dist/utils/open-browser.js.map +1 -1
  608. package/dist/utils/paths.d.ts.map +1 -1
  609. package/dist/utils/paths.js.map +1 -1
  610. package/dist/utils/photon.d.ts.map +1 -1
  611. package/dist/utils/photon.js.map +1 -1
  612. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  613. package/dist/utils/pi-user-agent.js.map +1 -1
  614. package/dist/utils/shell.d.ts.map +1 -1
  615. package/dist/utils/shell.js.map +1 -1
  616. package/dist/utils/sleep.d.ts.map +1 -1
  617. package/dist/utils/sleep.js.map +1 -1
  618. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  619. package/dist/utils/syntax-highlight.js.map +1 -1
  620. package/dist/utils/tools-manager.d.ts.map +1 -1
  621. package/dist/utils/tools-manager.js.map +1 -1
  622. package/dist/utils/version-check.d.ts.map +1 -1
  623. package/dist/utils/version-check.js.map +1 -1
  624. package/dist/utils/windows-self-update.d.ts.map +1 -1
  625. package/dist/utils/windows-self-update.js.map +1 -1
  626. package/docs/extensions.md +1 -1
  627. package/docs/packages.md +3 -1
  628. package/docs/prompt-templates.md +1 -1
  629. package/docs/settings.md +10 -0
  630. package/docs/skills.md +3 -3
  631. package/docs/themes.md +1 -1
  632. package/docs/usage.md +15 -3
  633. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  634. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  635. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  636. package/examples/extensions/gondolin/package-lock.json +2 -2
  637. package/examples/extensions/gondolin/package.json +1 -1
  638. package/examples/extensions/minimal-mode.ts +6 -6
  639. package/examples/extensions/sandbox/package-lock.json +2 -2
  640. package/examples/extensions/sandbox/package.json +1 -1
  641. package/examples/extensions/with-deps/package-lock.json +2 -2
  642. package/examples/extensions/with-deps/package.json +1 -1
  643. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  644. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  645. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +7 -0
  646. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  647. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -27
  648. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  649. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  650. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +7 -20
  651. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  652. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  653. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
  654. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
  655. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  656. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.d.ts.map +1 -1
  657. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.js.map +1 -1
  658. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  659. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +0 -3
  660. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  661. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.d.ts.map +1 -1
  662. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js.map +1 -1
  663. package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.d.ts.map +1 -1
  664. package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.js.map +1 -1
  665. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.d.ts.map +1 -1
  666. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js +0 -3
  667. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js.map +1 -1
  668. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.d.ts.map +1 -1
  669. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js +0 -7
  670. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js.map +1 -1
  671. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.d.ts.map +1 -1
  672. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.js +3 -1
  673. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.js.map +1 -1
  674. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.d.ts.map +1 -1
  675. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.js +0 -5
  676. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.js.map +1 -1
  677. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.d.ts.map +1 -1
  678. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.js.map +1 -1
  679. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  680. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +0 -1
  681. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  682. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.d.ts.map +1 -1
  683. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.js.map +1 -1
  684. package/node_modules/@earendil-works/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
  685. package/node_modules/@earendil-works/pi-agent-core/dist/harness/skills.js.map +1 -1
  686. package/node_modules/@earendil-works/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
  687. package/node_modules/@earendil-works/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
  688. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  689. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js +0 -16
  690. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  691. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
  692. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
  693. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.d.ts.map +1 -1
  694. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.js.map +1 -1
  695. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  696. package/node_modules/@earendil-works/pi-agent-core/dist/node.d.ts.map +1 -1
  697. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
  698. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
  699. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  700. package/node_modules/@earendil-works/pi-agent-core/package.json +6 -6
  701. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +1 -1
  702. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +1 -1
  703. package/node_modules/@earendil-works/pi-ai/dist/bedrock-provider.d.ts.map +1 -1
  704. package/node_modules/@earendil-works/pi-ai/dist/cli.d.ts.map +1 -1
  705. package/node_modules/@earendil-works/pi-ai/dist/cli.js.map +1 -1
  706. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  707. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  708. package/node_modules/@earendil-works/pi-ai/dist/image-models.d.ts.map +1 -1
  709. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +30 -0
  710. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  711. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +30 -0
  712. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  713. package/node_modules/@earendil-works/pi-ai/dist/image-models.js.map +1 -1
  714. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.d.ts.map +1 -1
  715. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.js.map +1 -1
  716. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
  717. package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
  718. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  719. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  720. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +174 -29
  721. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  722. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +178 -54
  723. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  724. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  725. package/node_modules/@earendil-works/pi-ai/dist/oauth.d.ts.map +1 -1
  726. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  727. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  728. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  729. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  730. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  731. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  732. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.d.ts.map +1 -1
  733. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.js.map +1 -1
  734. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
  735. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  736. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  737. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  738. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  739. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.js.map +1 -1
  740. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
  741. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
  742. package/node_modules/@earendil-works/pi-ai/dist/providers/google.d.ts.map +1 -1
  743. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js.map +1 -1
  744. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.d.ts.map +1 -1
  745. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js.map +1 -1
  746. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts.map +1 -1
  747. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -1
  748. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.d.ts.map +1 -1
  749. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js +3 -3
  750. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js.map +1 -1
  751. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  752. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +0 -7
  753. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  754. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  755. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +1 -1
  756. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
  757. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-prompt-cache.d.ts.map +1 -1
  758. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-prompt-cache.js.map +1 -1
  759. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  760. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  761. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  762. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
  763. package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  764. package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.js.map +1 -1
  765. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  766. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +1 -1
  767. package/node_modules/@earendil-works/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  768. package/node_modules/@earendil-works/pi-ai/dist/providers/transform-messages.js.map +1 -1
  769. package/node_modules/@earendil-works/pi-ai/dist/session-resources.d.ts.map +1 -1
  770. package/node_modules/@earendil-works/pi-ai/dist/session-resources.js.map +1 -1
  771. package/node_modules/@earendil-works/pi-ai/dist/stream.d.ts.map +1 -1
  772. package/node_modules/@earendil-works/pi-ai/dist/stream.js.map +1 -1
  773. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  774. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  775. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  776. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  777. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts.map +1 -1
  778. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js +10 -8
  779. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js.map +1 -1
  780. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/hermes.d.ts.map +1 -1
  781. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/hermes.js.map +1 -1
  782. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.d.ts.map +1 -1
  783. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.js.map +1 -1
  784. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.d.ts.map +1 -1
  785. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.js.map +1 -1
  786. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.d.ts.map +1 -1
  787. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.js.map +1 -1
  788. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.d.ts.map +1 -1
  789. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.js.map +1 -1
  790. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
  791. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
  792. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
  793. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +1 -1
  794. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  795. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  796. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.d.ts.map +1 -1
  797. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js.map +1 -1
  798. package/node_modules/@earendil-works/pi-ai/dist/utils/diagnostics.d.ts.map +1 -1
  799. package/node_modules/@earendil-works/pi-ai/dist/utils/diagnostics.js.map +1 -1
  800. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  801. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js +3 -7
  802. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js.map +1 -1
  803. package/node_modules/@earendil-works/pi-ai/dist/utils/hash.d.ts.map +1 -1
  804. package/node_modules/@earendil-works/pi-ai/dist/utils/hash.js.map +1 -1
  805. package/node_modules/@earendil-works/pi-ai/dist/utils/headers.d.ts.map +1 -1
  806. package/node_modules/@earendil-works/pi-ai/dist/utils/headers.js.map +1 -1
  807. package/node_modules/@earendil-works/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  808. package/node_modules/@earendil-works/pi-ai/dist/utils/json-parse.js.map +1 -1
  809. package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.d.ts.map +1 -1
  810. package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.js.map +1 -1
  811. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts.map +1 -1
  812. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.js.map +1 -1
  813. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts.map +1 -1
  814. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js.map +1 -1
  815. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  816. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  817. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  818. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
  819. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.d.ts.map +1 -1
  820. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.js.map +1 -1
  821. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  822. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  823. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.d.ts.map +1 -1
  824. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.js.map +1 -1
  825. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.d.ts.map +1 -1
  826. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  827. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  828. package/node_modules/@earendil-works/pi-ai/dist/utils/sanitize-unicode.d.ts.map +1 -1
  829. package/node_modules/@earendil-works/pi-ai/dist/utils/sanitize-unicode.js.map +1 -1
  830. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.d.ts.map +1 -1
  831. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.js.map +1 -1
  832. package/node_modules/@earendil-works/pi-ai/dist/utils/typebox-helpers.d.ts.map +1 -1
  833. package/node_modules/@earendil-works/pi-ai/dist/utils/typebox-helpers.js.map +1 -1
  834. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.d.ts.map +1 -1
  835. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
  836. package/node_modules/@earendil-works/pi-ai/package.json +5 -5
  837. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -1
  838. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
  839. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +0 -3
  840. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
  841. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +1 -1
  842. package/node_modules/@earendil-works/pi-tui/dist/components/box.js +1 -6
  843. package/node_modules/@earendil-works/pi-tui/dist/components/box.js.map +1 -1
  844. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -1
  845. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js +4 -3
  846. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js.map +1 -1
  847. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  848. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +43 -54
  849. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  850. package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
  851. package/node_modules/@earendil-works/pi-tui/dist/components/image.js +0 -8
  852. package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
  853. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
  854. package/node_modules/@earendil-works/pi-tui/dist/components/input.js +14 -14
  855. package/node_modules/@earendil-works/pi-tui/dist/components/input.js.map +1 -1
  856. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +1 -1
  857. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js +11 -13
  858. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +1 -1
  859. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  860. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +0 -11
  861. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  862. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
  863. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +4 -9
  864. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
  865. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts.map +1 -1
  866. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js +4 -12
  867. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js.map +1 -1
  868. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts.map +1 -1
  869. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js +0 -1
  870. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js.map +1 -1
  871. package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts.map +1 -1
  872. package/node_modules/@earendil-works/pi-tui/dist/components/text.js +0 -8
  873. package/node_modules/@earendil-works/pi-tui/dist/components/text.js.map +1 -1
  874. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts.map +1 -1
  875. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js +0 -3
  876. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js.map +1 -1
  877. package/node_modules/@earendil-works/pi-tui/dist/editor-component.d.ts.map +1 -1
  878. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts.map +1 -1
  879. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js.map +1 -1
  880. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  881. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
  882. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +2 -4
  883. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
  884. package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
  885. package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
  886. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts.map +1 -1
  887. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js +3 -1
  888. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js.map +1 -1
  889. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts.map +1 -1
  890. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -1
  891. package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.d.ts.map +1 -1
  892. package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.js.map +1 -1
  893. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  894. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js +4 -6
  895. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
  896. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
  897. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  898. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  899. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +24 -29
  900. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  901. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  902. package/node_modules/@earendil-works/pi-tui/dist/tui.js +25 -27
  903. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  904. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts.map +1 -1
  905. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js +3 -1
  906. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js.map +1 -1
  907. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
  908. package/node_modules/@earendil-works/pi-tui/dist/utils.js +14 -12
  909. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  910. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts.map +1 -1
  911. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js.map +1 -1
  912. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  913. package/node_modules/@types/node/README.md +3 -3
  914. package/node_modules/@types/node/assert/strict.d.ts +3 -55
  915. package/node_modules/@types/node/assert.d.ts +49 -177
  916. package/node_modules/@types/node/async_hooks.d.ts +151 -43
  917. package/node_modules/@types/node/buffer.buffer.d.ts +2 -8
  918. package/node_modules/@types/node/buffer.d.ts +43 -212
  919. package/node_modules/@types/node/child_process.d.ts +23 -133
  920. package/node_modules/@types/node/cluster.d.ts +238 -384
  921. package/node_modules/@types/node/compatibility/iterators.d.ts +1 -0
  922. package/node_modules/@types/node/console.d.ts +45 -404
  923. package/node_modules/@types/node/constants.d.ts +3 -10
  924. package/node_modules/@types/node/crypto.d.ts +640 -1127
  925. package/node_modules/@types/node/dgram.d.ts +14 -77
  926. package/node_modules/@types/node/diagnostics_channel.d.ts +3 -29
  927. package/node_modules/@types/node/dns/promises.d.ts +4 -10
  928. package/node_modules/@types/node/dns.d.ts +130 -177
  929. package/node_modules/@types/node/domain.d.ts +12 -32
  930. package/node_modules/@types/node/events.d.ts +872 -840
  931. package/node_modules/@types/node/fs/promises.d.ts +193 -20
  932. package/node_modules/@types/node/fs.d.ts +754 -435
  933. package/node_modules/@types/node/globals.d.ts +8 -30
  934. package/node_modules/@types/node/globals.typedarray.d.ts +63 -0
  935. package/node_modules/@types/node/http.d.ts +363 -305
  936. package/node_modules/@types/node/http2.d.ts +545 -781
  937. package/node_modules/@types/node/https.d.ts +64 -243
  938. package/node_modules/@types/node/index.d.ts +26 -6
  939. package/node_modules/@types/node/inspector/promises.d.ts +35 -0
  940. package/node_modules/@types/node/inspector.d.ts +68 -57
  941. package/node_modules/@types/node/inspector.generated.d.ts +764 -410
  942. package/node_modules/@types/node/module.d.ts +53 -189
  943. package/node_modules/@types/node/net.d.ts +101 -207
  944. package/node_modules/@types/node/os.d.ts +11 -19
  945. package/node_modules/@types/node/package.json +13 -3
  946. package/node_modules/@types/node/path/posix.d.ts +8 -0
  947. package/node_modules/@types/node/path/win32.d.ts +8 -0
  948. package/node_modules/@types/node/path.d.ts +119 -141
  949. package/node_modules/@types/node/perf_hooks.d.ts +317 -673
  950. package/node_modules/@types/node/process.d.ts +277 -157
  951. package/node_modules/@types/node/punycode.d.ts +3 -31
  952. package/node_modules/@types/node/querystring.d.ts +3 -16
  953. package/node_modules/@types/node/quic.d.ts +897 -0
  954. package/node_modules/@types/node/readline/promises.d.ts +3 -6
  955. package/node_modules/@types/node/readline.d.ts +65 -152
  956. package/node_modules/@types/node/repl.d.ts +101 -109
  957. package/node_modules/@types/node/sea.d.ts +9 -115
  958. package/node_modules/@types/node/sqlite.d.ts +415 -68
  959. package/node_modules/@types/node/stream/consumers.d.ts +91 -15
  960. package/node_modules/@types/node/stream/iter.d.ts +301 -0
  961. package/node_modules/@types/node/stream/promises.d.ts +136 -15
  962. package/node_modules/@types/node/stream/web.d.ts +179 -501
  963. package/node_modules/@types/node/stream.d.ts +577 -490
  964. package/node_modules/@types/node/string_decoder.d.ts +3 -43
  965. package/node_modules/@types/node/test/reporters.d.ts +59 -0
  966. package/node_modules/@types/node/test.d.ts +402 -286
  967. package/node_modules/@types/node/timers/promises.d.ts +3 -18
  968. package/node_modules/@types/node/timers.d.ts +3 -141
  969. package/node_modules/@types/node/tls.d.ts +115 -241
  970. package/node_modules/@types/node/trace_events.d.ts +3 -97
  971. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +2 -8
  972. package/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  973. package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +2 -0
  974. package/node_modules/@types/node/ts5.6/index.d.ts +28 -6
  975. package/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  976. package/node_modules/@types/node/ts5.7/index.d.ts +119 -0
  977. package/node_modules/@types/node/tty.d.ts +57 -40
  978. package/node_modules/@types/node/url.d.ts +156 -584
  979. package/node_modules/@types/node/util/types.d.ts +558 -0
  980. package/node_modules/@types/node/util.d.ts +167 -1096
  981. package/node_modules/@types/node/v8.d.ts +75 -15
  982. package/node_modules/@types/node/vm.d.ts +334 -198
  983. package/node_modules/@types/node/wasi.d.ts +24 -74
  984. package/node_modules/@types/node/web-globals/abortcontroller.d.ts +27 -2
  985. package/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  986. package/node_modules/@types/node/web-globals/console.d.ts +9 -0
  987. package/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  988. package/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  989. package/node_modules/@types/node/web-globals/events.d.ts +9 -0
  990. package/node_modules/@types/node/web-globals/fetch.d.ts +14 -0
  991. package/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  992. package/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  993. package/node_modules/@types/node/web-globals/navigator.d.ts +3 -0
  994. package/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  995. package/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  996. package/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  997. package/node_modules/@types/node/web-globals/url.d.ts +24 -0
  998. package/node_modules/@types/node/worker_threads.d.ts +280 -393
  999. package/node_modules/@types/node/zlib/iter.d.ts +131 -0
  1000. package/node_modules/@types/node/zlib.d.ts +7 -165
  1001. package/node_modules/undici-types/agent.d.ts +13 -12
  1002. package/node_modules/undici-types/api.d.ts +26 -26
  1003. package/node_modules/undici-types/balanced-pool.d.ts +13 -12
  1004. package/node_modules/undici-types/cache-interceptor.d.ts +179 -0
  1005. package/node_modules/undici-types/client-stats.d.ts +15 -0
  1006. package/node_modules/undici-types/client.d.ts +34 -19
  1007. package/node_modules/undici-types/connector.d.ts +4 -2
  1008. package/node_modules/undici-types/cookies.d.ts +2 -0
  1009. package/node_modules/undici-types/diagnostics-channel.d.ts +18 -10
  1010. package/node_modules/undici-types/dispatcher.d.ts +127 -104
  1011. package/node_modules/undici-types/env-http-proxy-agent.d.ts +4 -3
  1012. package/node_modules/undici-types/errors.d.ts +82 -54
  1013. package/node_modules/undici-types/eventsource.d.ts +9 -4
  1014. package/node_modules/undici-types/fetch.d.ts +22 -20
  1015. package/node_modules/undici-types/formdata.d.ts +7 -7
  1016. package/node_modules/undici-types/global-dispatcher.d.ts +4 -4
  1017. package/node_modules/undici-types/global-origin.d.ts +5 -5
  1018. package/node_modules/undici-types/h2c-client.d.ts +73 -0
  1019. package/node_modules/undici-types/handlers.d.ts +8 -8
  1020. package/node_modules/undici-types/header.d.ts +157 -1
  1021. package/node_modules/undici-types/index.d.ts +67 -47
  1022. package/node_modules/undici-types/interceptors.d.ts +71 -8
  1023. package/node_modules/undici-types/mock-agent.d.ts +36 -18
  1024. package/node_modules/undici-types/mock-call-history.d.ts +111 -0
  1025. package/node_modules/undici-types/mock-client.d.ts +6 -4
  1026. package/node_modules/undici-types/mock-errors.d.ts +3 -3
  1027. package/node_modules/undici-types/mock-interceptor.d.ts +21 -20
  1028. package/node_modules/undici-types/mock-pool.d.ts +6 -4
  1029. package/node_modules/undici-types/package.json +1 -1
  1030. package/node_modules/undici-types/patch.d.ts +0 -4
  1031. package/node_modules/undici-types/pool-stats.d.ts +8 -8
  1032. package/node_modules/undici-types/pool.d.ts +15 -13
  1033. package/node_modules/undici-types/proxy-agent.d.ts +5 -4
  1034. package/node_modules/undici-types/readable.d.ts +19 -16
  1035. package/node_modules/undici-types/retry-agent.d.ts +1 -1
  1036. package/node_modules/undici-types/retry-handler.d.ts +19 -10
  1037. package/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  1038. package/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  1039. package/node_modules/undici-types/socks5-proxy-agent.d.ts +25 -0
  1040. package/node_modules/undici-types/util.d.ts +3 -3
  1041. package/node_modules/undici-types/utility.d.ts +7 -0
  1042. package/node_modules/undici-types/webidl.d.ts +148 -29
  1043. package/node_modules/undici-types/websocket.d.ts +48 -10
  1044. package/npm-shrinkwrap.json +21 -21
  1045. package/package.json +13 -8
  1046. package/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
  1047. package/node_modules/@types/node/compatibility/index.d.ts +0 -9
  1048. package/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
  1049. package/node_modules/undici-types/file.d.ts +0 -39
  1050. package/node_modules/undici-types/filereader.d.ts +0 -54
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/text.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,SAAiB,EAAU;IAC7D,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAAA,CAC7D;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAU;IACnD,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACzF,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAY;IAChE,MAAM,UAAU,GAAG,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,yDAAyD,CAAC,CAAC;IAC/F,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,CACtD","sourcesContent":["export function normalizePatchText(patchText: string): string {\n\treturn patchText.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nexport function stripHeredoc(input: string): string {\n\tconst heredocMatch = input.match(/^(?:cat\\s+)?<<['\"]?(\\w+)['\"]?\\s*\\n([\\s\\S]*?)\\n\\1\\s*$/);\n\tif (heredocMatch) {\n\t\treturn heredocMatch[2] ?? input;\n\t}\n\treturn input;\n}\n\nexport function extractPatchedPaths(patchText: string): string[] {\n\tconst normalized = stripHeredoc(normalizePatchText(patchText));\n\tconst matches = normalized.matchAll(/^\\*\\*\\* (?:(?:Add|Delete|Update) File|Move to): (.+)$/gm);\n\treturn Array.from(matches, (match) => match[1] ?? \"\");\n}\n"]}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/text.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IACnD,OAAO,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACzC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACzF,IAAI,YAAY,EAAE,CAAC;QAClB,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACpD,MAAM,UAAU,GAAG,YAAY,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,yDAAyD,CAAC,CAAC;IAC/F,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC","sourcesContent":["export function normalizePatchText(patchText: string): string {\n\treturn patchText.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nexport function stripHeredoc(input: string): string {\n\tconst heredocMatch = input.match(/^(?:cat\\s+)?<<['\"]?(\\w+)['\"]?\\s*\\n([\\s\\S]*?)\\n\\1\\s*$/);\n\tif (heredocMatch) {\n\t\treturn heredocMatch[2] ?? input;\n\t}\n\treturn input;\n}\n\nexport function extractPatchedPaths(patchText: string): string[] {\n\tconst normalized = stripHeredoc(normalizePatchText(patchText));\n\tconst matches = normalized.matchAll(/^\\*\\*\\* (?:(?:Add|Delete|Update) File|Move to): (.+)$/gm);\n\treturn Array.from(matches, (match) => match[1] ?? \"\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/tool.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAGX,wBAAwB,EAGxB,MAAM,YAAY,CAAC;AAqCpB,wBAAgB,oBAAoB,IAAI,wBAAwB,CA2F/D","sourcesContent":["import { Box, Container, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext } from \"../../types.ts\";\nimport { defineTool } from \"../../types.ts\";\nimport { applyPatchDetailed, buildPartialFailureText } from \"./apply.ts\";\nimport { APPLY_PATCH_FREEFORM_DESCRIPTION, APPLY_PATCH_LARK_GRAMMAR, APPLY_PATCH_PARAMS } from \"./constants.ts\";\nimport { normalizeApplyPatchArguments } from \"./params.ts\";\nimport { parsePatch } from \"./parser.ts\";\nimport { createPendingPatchUpdate } from \"./preview.ts\";\nimport { getApplyPatchRenderState, renderPatchPreview } from \"./preview-format.ts\";\nimport { renderStreamingPatchCall } from \"./streaming-render.ts\";\nimport type {\n\tApplyPatchRenderState,\n\tApplyPatchTheme,\n\tApplyPatchToolDefinition,\n\tApplyPatchToolDetails,\n\tFreeformToolFormat,\n} from \"./types.ts\";\n\nfunction renderPreviewBox(\n\ttitle: string,\n\tdetails: ApplyPatchToolDetails,\n\tisPartial: boolean,\n\tcwd: string,\n\texpanded: boolean,\n\ttheme: ApplyPatchTheme,\n): Container {\n\tconst component = new Container();\n\tif (!details.preview) return component;\n\tconst bgName = isPartial ? \"toolPendingBg\" : \"toolSuccessBg\";\n\tconst progress = details.progress;\n\tconst renderedTitle = progress ? `Applying patch (${progress.applied + progress.failed}/${progress.total})` : title;\n\tconst box = new Box(1, 1, (text: string) => theme.bg(bgName, text));\n\tbox.addChild(new Text(theme.fg(\"toolTitle\", theme.bold(renderedTitle)), 0, 0));\n\tbox.addChild(new Spacer(1));\n\tbox.addChild(new Text(renderPatchPreview(details.preview, cwd, theme, expanded), 0, 0));\n\tcomponent.addChild(box);\n\treturn component;\n}\n\nfunction renderTextResult(\n\tresult: AgentToolResult<ApplyPatchToolDetails | undefined>,\n\ttheme: ApplyPatchTheme,\n): Container {\n\tconst component = new Container();\n\tconst text = result.content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.filter((value) => typeof value === \"string\" && value.length > 0)\n\t\t.join(\"\\n\");\n\tif (text) component.addChild(new Text(theme.fg(\"toolOutput\", text), 0, 0));\n\treturn component;\n}\n\nexport function createApplyPatchTool(): ApplyPatchToolDefinition {\n\tconst tool = defineTool<typeof APPLY_PATCH_PARAMS, ApplyPatchToolDetails | undefined, ApplyPatchRenderState>({\n\t\tname: \"apply_patch\",\n\t\tlabel: \"ApplyPatch\",\n\t\tdescription: APPLY_PATCH_FREEFORM_DESCRIPTION,\n\t\tparameters: APPLY_PATCH_PARAMS,\n\t\tprepareArguments: normalizeApplyPatchArguments,\n\t\tpromptSnippet: \"Apply Codex-format file patches with apply_patch\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use apply_patch for file edits instead of mutating files through bash, Python scripts, heredocs, or shell redirection.\",\n\t\t\t\"After apply_patch succeeds, do not re-read the edited files just to confirm the patch applied.\",\n\t\t],\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\tparams,\n\t\t\t_signal,\n\t\t\tonUpdate,\n\t\t\tctx,\n\t\t): Promise<AgentToolResult<ApplyPatchToolDetails | undefined>> {\n\t\t\tconst normalizedParams = normalizeApplyPatchArguments(params);\n\t\t\tif (!normalizedParams.input) throw new Error(\"input is required\");\n\t\t\tlet totalOperations = 0;\n\t\t\ttry {\n\t\t\t\ttotalOperations = parsePatch(normalizedParams.input).length;\n\t\t\t} catch {\n\t\t\t\t// createPendingPatchUpdate keeps incomplete or invalid patch text renderable.\n\t\t\t}\n\t\t\tconst initialProgress = totalOperations > 0 ? { applied: 0, failed: 0, total: totalOperations } : undefined;\n\t\t\tconst pendingUpdate = await createPendingPatchUpdate(ctx.cwd, normalizedParams.input, initialProgress);\n\t\t\tonUpdate?.({ content: [{ type: \"text\", text: pendingUpdate.text }], details: pendingUpdate.details });\n\t\t\tconst preview = pendingUpdate.details?.preview;\n\t\t\tconst result = await applyPatchDetailed(ctx.cwd, normalizedParams.input, async (progress) => {\n\t\t\t\tconst progressUpdate = await createPendingPatchUpdate(ctx.cwd, normalizedParams.input, progress, preview);\n\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: progressUpdate.text }], details: progressUpdate.details });\n\t\t\t});\n\t\t\tif (result.failures.length > 0) {\n\t\t\t\tif (result.appliedFiles.length === 0) {\n\t\t\t\t\tconst firstFailure = result.failures[0];\n\t\t\t\t\tif (firstFailure) throw new Error(firstFailure.message);\n\t\t\t\t}\n\t\t\t\treturn { content: [{ type: \"text\", text: buildPartialFailureText(result) }], details: { result } };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: result.summaries.join(\"\\n\") }],\n\t\t\t\tdetails: pendingUpdate.details?.preview ? { preview: pendingUpdate.details.preview, result } : { result },\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme, context: ToolRenderContext<ApplyPatchRenderState, { input: string }>) {\n\t\t\tif (!context.executionStarted) {\n\t\t\t\tconst streaming = renderStreamingPatchCall(normalizeApplyPatchArguments(args), theme, context.state);\n\t\t\t\tif (streaming) return streaming;\n\t\t\t}\n\t\t\tif (!context.argsComplete) return new Text(theme.fg(\"toolTitle\", theme.bold(\"apply_patch: Patching\")), 0, 0);\n\t\t\tconst normalizedArgs = normalizeApplyPatchArguments(args);\n\t\t\tconst renderState = getApplyPatchRenderState(context.toolCallId, context.cwd, normalizedArgs.input);\n\t\t\tconst text = renderState.callText?.length ? `apply_patch: ${renderState.callText}` : \"apply_patch\";\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(text)), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tif (result.details?.preview) {\n\t\t\t\tconst expanded = true;\n\t\t\t\treturn renderPreviewBox(\n\t\t\t\t\toptions.isPartial ? \"Applying patch\" : \"Applied patch\",\n\t\t\t\t\tresult.details,\n\t\t\t\t\toptions.isPartial,\n\t\t\t\t\tcontext.cwd,\n\t\t\t\t\texpanded,\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (result.details?.result) {\n\t\t\t\tconst component = new Container();\n\t\t\t\tconst box = new Box(1, 1, (text: string) =>\n\t\t\t\t\ttheme.bg(options.isPartial ? \"toolPendingBg\" : \"toolSuccessBg\", text),\n\t\t\t\t);\n\t\t\t\tbox.addChild(new Text(theme.fg(\"toolTitle\", theme.bold(\"Applying patch\")), 0, 0));\n\t\t\t\tbox.addChild(new Spacer(1));\n\t\t\t\tif (result.details.preview) {\n\t\t\t\t\tconst expanded = options.isPartial ? true : (options.expanded ?? true);\n\t\t\t\t\tbox.addChild(new Text(renderPatchPreview(result.details.preview, context.cwd, theme, expanded), 0, 0));\n\t\t\t\t}\n\t\t\t\tcomponent.addChild(box);\n\t\t\t\treturn component;\n\t\t\t}\n\t\t\treturn renderTextResult(result, theme);\n\t\t},\n\t});\n\n\treturn Object.assign(tool, {\n\t\tfreeform: { type: \"grammar\", syntax: \"lark\", definition: APPLY_PATCH_LARK_GRAMMAR } satisfies FreeformToolFormat,\n\t});\n}\n"]}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/tool.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAGX,wBAAwB,EAGxB,MAAM,YAAY,CAAC;AAqCpB,wBAAgB,oBAAoB,IAAI,wBAAwB,CA2F/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { Box, Container, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext } from \"../../types.ts\";\nimport { defineTool } from \"../../types.ts\";\nimport { applyPatchDetailed, buildPartialFailureText } from \"./apply.ts\";\nimport { APPLY_PATCH_FREEFORM_DESCRIPTION, APPLY_PATCH_LARK_GRAMMAR, APPLY_PATCH_PARAMS } from \"./constants.ts\";\nimport { normalizeApplyPatchArguments } from \"./params.ts\";\nimport { parsePatch } from \"./parser.ts\";\nimport { createPendingPatchUpdate } from \"./preview.ts\";\nimport { getApplyPatchRenderState, renderPatchPreview } from \"./preview-format.ts\";\nimport { renderStreamingPatchCall } from \"./streaming-render.ts\";\nimport type {\n\tApplyPatchRenderState,\n\tApplyPatchTheme,\n\tApplyPatchToolDefinition,\n\tApplyPatchToolDetails,\n\tFreeformToolFormat,\n} from \"./types.ts\";\n\nfunction renderPreviewBox(\n\ttitle: string,\n\tdetails: ApplyPatchToolDetails,\n\tisPartial: boolean,\n\tcwd: string,\n\texpanded: boolean,\n\ttheme: ApplyPatchTheme,\n): Container {\n\tconst component = new Container();\n\tif (!details.preview) return component;\n\tconst bgName = isPartial ? \"toolPendingBg\" : \"toolSuccessBg\";\n\tconst progress = details.progress;\n\tconst renderedTitle = progress ? `Applying patch (${progress.applied + progress.failed}/${progress.total})` : title;\n\tconst box = new Box(1, 1, (text: string) => theme.bg(bgName, text));\n\tbox.addChild(new Text(theme.fg(\"toolTitle\", theme.bold(renderedTitle)), 0, 0));\n\tbox.addChild(new Spacer(1));\n\tbox.addChild(new Text(renderPatchPreview(details.preview, cwd, theme, expanded), 0, 0));\n\tcomponent.addChild(box);\n\treturn component;\n}\n\nfunction renderTextResult(\n\tresult: AgentToolResult<ApplyPatchToolDetails | undefined>,\n\ttheme: ApplyPatchTheme,\n): Container {\n\tconst component = new Container();\n\tconst text = result.content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.filter((value) => typeof value === \"string\" && value.length > 0)\n\t\t.join(\"\\n\");\n\tif (text) component.addChild(new Text(theme.fg(\"toolOutput\", text), 0, 0));\n\treturn component;\n}\n\nexport function createApplyPatchTool(): ApplyPatchToolDefinition {\n\tconst tool = defineTool<typeof APPLY_PATCH_PARAMS, ApplyPatchToolDetails | undefined, ApplyPatchRenderState>({\n\t\tname: \"apply_patch\",\n\t\tlabel: \"ApplyPatch\",\n\t\tdescription: APPLY_PATCH_FREEFORM_DESCRIPTION,\n\t\tparameters: APPLY_PATCH_PARAMS,\n\t\tprepareArguments: normalizeApplyPatchArguments,\n\t\tpromptSnippet: \"Apply Codex-format file patches with apply_patch\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use apply_patch for file edits instead of mutating files through bash, Python scripts, heredocs, or shell redirection.\",\n\t\t\t\"After apply_patch succeeds, do not re-read the edited files just to confirm the patch applied.\",\n\t\t],\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\tparams,\n\t\t\t_signal,\n\t\t\tonUpdate,\n\t\t\tctx,\n\t\t): Promise<AgentToolResult<ApplyPatchToolDetails | undefined>> {\n\t\t\tconst normalizedParams = normalizeApplyPatchArguments(params);\n\t\t\tif (!normalizedParams.input) throw new Error(\"input is required\");\n\t\t\tlet totalOperations = 0;\n\t\t\ttry {\n\t\t\t\ttotalOperations = parsePatch(normalizedParams.input).length;\n\t\t\t} catch {\n\t\t\t\t// createPendingPatchUpdate keeps incomplete or invalid patch text renderable.\n\t\t\t}\n\t\t\tconst initialProgress = totalOperations > 0 ? { applied: 0, failed: 0, total: totalOperations } : undefined;\n\t\t\tconst pendingUpdate = await createPendingPatchUpdate(ctx.cwd, normalizedParams.input, initialProgress);\n\t\t\tonUpdate?.({ content: [{ type: \"text\", text: pendingUpdate.text }], details: pendingUpdate.details });\n\t\t\tconst preview = pendingUpdate.details?.preview;\n\t\t\tconst result = await applyPatchDetailed(ctx.cwd, normalizedParams.input, async (progress) => {\n\t\t\t\tconst progressUpdate = await createPendingPatchUpdate(ctx.cwd, normalizedParams.input, progress, preview);\n\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: progressUpdate.text }], details: progressUpdate.details });\n\t\t\t});\n\t\t\tif (result.failures.length > 0) {\n\t\t\t\tif (result.appliedFiles.length === 0) {\n\t\t\t\t\tconst firstFailure = result.failures[0];\n\t\t\t\t\tif (firstFailure) throw new Error(firstFailure.message);\n\t\t\t\t}\n\t\t\t\treturn { content: [{ type: \"text\", text: buildPartialFailureText(result) }], details: { result } };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: result.summaries.join(\"\\n\") }],\n\t\t\t\tdetails: pendingUpdate.details?.preview ? { preview: pendingUpdate.details.preview, result } : { result },\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme, context: ToolRenderContext<ApplyPatchRenderState, { input: string }>) {\n\t\t\tif (!context.executionStarted) {\n\t\t\t\tconst streaming = renderStreamingPatchCall(normalizeApplyPatchArguments(args), theme, context.state);\n\t\t\t\tif (streaming) return streaming;\n\t\t\t}\n\t\t\tif (!context.argsComplete) return new Text(theme.fg(\"toolTitle\", theme.bold(\"apply_patch: Patching\")), 0, 0);\n\t\t\tconst normalizedArgs = normalizeApplyPatchArguments(args);\n\t\t\tconst renderState = getApplyPatchRenderState(context.toolCallId, context.cwd, normalizedArgs.input);\n\t\t\tconst text = renderState.callText?.length ? `apply_patch: ${renderState.callText}` : \"apply_patch\";\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(text)), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tif (result.details?.preview) {\n\t\t\t\tconst expanded = true;\n\t\t\t\treturn renderPreviewBox(\n\t\t\t\t\toptions.isPartial ? \"Applying patch\" : \"Applied patch\",\n\t\t\t\t\tresult.details,\n\t\t\t\t\toptions.isPartial,\n\t\t\t\t\tcontext.cwd,\n\t\t\t\t\texpanded,\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (result.details?.result) {\n\t\t\t\tconst component = new Container();\n\t\t\t\tconst box = new Box(1, 1, (text: string) =>\n\t\t\t\t\ttheme.bg(options.isPartial ? \"toolPendingBg\" : \"toolSuccessBg\", text),\n\t\t\t\t);\n\t\t\t\tbox.addChild(new Text(theme.fg(\"toolTitle\", theme.bold(\"Applying patch\")), 0, 0));\n\t\t\t\tbox.addChild(new Spacer(1));\n\t\t\t\tif (result.details.preview) {\n\t\t\t\t\tconst expanded = options.isPartial ? true : (options.expanded ?? true);\n\t\t\t\t\tbox.addChild(new Text(renderPatchPreview(result.details.preview, context.cwd, theme, expanded), 0, 0));\n\t\t\t\t}\n\t\t\t\tcomponent.addChild(box);\n\t\t\t\treturn component;\n\t\t\t}\n\t\t\treturn renderTextResult(result, theme);\n\t\t},\n\t});\n\n\treturn Object.assign(tool, {\n\t\tfreeform: { type: \"grammar\", syntax: \"lark\", definition: APPLY_PATCH_LARK_GRAMMAR } satisfies FreeformToolFormat,\n\t});\n}\n"]}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { Box, Container, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { AgentToolResult, ToolRenderContext } from \"../../types.ts\";\nimport { defineTool } from \"../../types.ts\";\nimport { applyPatchDetailed, buildPartialFailureText } from \"./apply.ts\";\nimport { APPLY_PATCH_FREEFORM_DESCRIPTION, APPLY_PATCH_LARK_GRAMMAR, APPLY_PATCH_PARAMS } from \"./constants.ts\";\nimport { normalizeApplyPatchArguments } from \"./params.ts\";\nimport { parsePatch } from \"./parser.ts\";\nimport { createPendingPatchUpdate } from \"./preview.ts\";\nimport { getApplyPatchRenderState, renderPatchPreview } from \"./preview-format.ts\";\nimport { renderStreamingPatchCall } from \"./streaming-render.ts\";\nimport type {\n\tApplyPatchRenderState,\n\tApplyPatchTheme,\n\tApplyPatchToolDefinition,\n\tApplyPatchToolDetails,\n\tFreeformToolFormat,\n} from \"./types.ts\";\n\nfunction renderPreviewBox(\n\ttitle: string,\n\tdetails: ApplyPatchToolDetails,\n\tisPartial: boolean,\n\tcwd: string,\n\texpanded: boolean,\n\ttheme: ApplyPatchTheme,\n): Container {\n\tconst component = new Container();\n\tif (!details.preview) return component;\n\tconst bgName = isPartial ? \"toolPendingBg\" : \"toolSuccessBg\";\n\tconst progress = details.progress;\n\tconst renderedTitle = progress ? `Applying patch (${progress.applied + progress.failed}/${progress.total})` : title;\n\tconst box = new Box(1, 1, (text: string) => theme.bg(bgName, text));\n\tbox.addChild(new Text(theme.fg(\"toolTitle\", theme.bold(renderedTitle)), 0, 0));\n\tbox.addChild(new Spacer(1));\n\tbox.addChild(new Text(renderPatchPreview(details.preview, cwd, theme, expanded), 0, 0));\n\tcomponent.addChild(box);\n\treturn component;\n}\n\nfunction renderTextResult(\n\tresult: AgentToolResult<ApplyPatchToolDetails | undefined>,\n\ttheme: ApplyPatchTheme,\n): Container {\n\tconst component = new Container();\n\tconst text = result.content\n\t\t.filter((block) => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.filter((value) => typeof value === \"string\" && value.length > 0)\n\t\t.join(\"\\n\");\n\tif (text) component.addChild(new Text(theme.fg(\"toolOutput\", text), 0, 0));\n\treturn component;\n}\n\nexport function createApplyPatchTool(): ApplyPatchToolDefinition {\n\tconst tool = defineTool<typeof APPLY_PATCH_PARAMS, ApplyPatchToolDetails | undefined, ApplyPatchRenderState>({\n\t\tname: \"apply_patch\",\n\t\tlabel: \"ApplyPatch\",\n\t\tdescription: APPLY_PATCH_FREEFORM_DESCRIPTION,\n\t\tparameters: APPLY_PATCH_PARAMS,\n\t\tprepareArguments: normalizeApplyPatchArguments,\n\t\tpromptSnippet: \"Apply Codex-format file patches with apply_patch\",\n\t\tpromptGuidelines: [\n\t\t\t\"Use apply_patch for file edits instead of mutating files through bash, Python scripts, heredocs, or shell redirection.\",\n\t\t\t\"After apply_patch succeeds, do not re-read the edited files just to confirm the patch applied.\",\n\t\t],\n\t\tasync execute(\n\t\t\t_toolCallId,\n\t\t\tparams,\n\t\t\t_signal,\n\t\t\tonUpdate,\n\t\t\tctx,\n\t\t): Promise<AgentToolResult<ApplyPatchToolDetails | undefined>> {\n\t\t\tconst normalizedParams = normalizeApplyPatchArguments(params);\n\t\t\tif (!normalizedParams.input) throw new Error(\"input is required\");\n\t\t\tlet totalOperations = 0;\n\t\t\ttry {\n\t\t\t\ttotalOperations = parsePatch(normalizedParams.input).length;\n\t\t\t} catch {\n\t\t\t\t// createPendingPatchUpdate keeps incomplete or invalid patch text renderable.\n\t\t\t}\n\t\t\tconst initialProgress = totalOperations > 0 ? { applied: 0, failed: 0, total: totalOperations } : undefined;\n\t\t\tconst pendingUpdate = await createPendingPatchUpdate(ctx.cwd, normalizedParams.input, initialProgress);\n\t\t\tonUpdate?.({ content: [{ type: \"text\", text: pendingUpdate.text }], details: pendingUpdate.details });\n\t\t\tconst preview = pendingUpdate.details?.preview;\n\t\t\tconst result = await applyPatchDetailed(ctx.cwd, normalizedParams.input, async (progress) => {\n\t\t\t\tconst progressUpdate = await createPendingPatchUpdate(ctx.cwd, normalizedParams.input, progress, preview);\n\t\t\t\tonUpdate?.({ content: [{ type: \"text\", text: progressUpdate.text }], details: progressUpdate.details });\n\t\t\t});\n\t\t\tif (result.failures.length > 0) {\n\t\t\t\tif (result.appliedFiles.length === 0) {\n\t\t\t\t\tconst firstFailure = result.failures[0];\n\t\t\t\t\tif (firstFailure) throw new Error(firstFailure.message);\n\t\t\t\t}\n\t\t\t\treturn { content: [{ type: \"text\", text: buildPartialFailureText(result) }], details: { result } };\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: result.summaries.join(\"\\n\") }],\n\t\t\t\tdetails: pendingUpdate.details?.preview ? { preview: pendingUpdate.details.preview, result } : { result },\n\t\t\t};\n\t\t},\n\t\trenderCall(args, theme, context: ToolRenderContext<ApplyPatchRenderState, { input: string }>) {\n\t\t\tif (!context.executionStarted) {\n\t\t\t\tconst streaming = renderStreamingPatchCall(normalizeApplyPatchArguments(args), theme, context.state);\n\t\t\t\tif (streaming) return streaming;\n\t\t\t}\n\t\t\tif (!context.argsComplete) return new Text(theme.fg(\"toolTitle\", theme.bold(\"apply_patch: Patching\")), 0, 0);\n\t\t\tconst normalizedArgs = normalizeApplyPatchArguments(args);\n\t\t\tconst renderState = getApplyPatchRenderState(context.toolCallId, context.cwd, normalizedArgs.input);\n\t\t\tconst text = renderState.callText?.length ? `apply_patch: ${renderState.callText}` : \"apply_patch\";\n\t\t\treturn new Text(theme.fg(\"toolTitle\", theme.bold(text)), 0, 0);\n\t\t},\n\t\trenderResult(result, options, theme, context) {\n\t\t\tif (result.details?.preview) {\n\t\t\t\tconst expanded = true;\n\t\t\t\treturn renderPreviewBox(\n\t\t\t\t\toptions.isPartial ? \"Applying patch\" : \"Applied patch\",\n\t\t\t\t\tresult.details,\n\t\t\t\t\toptions.isPartial,\n\t\t\t\t\tcontext.cwd,\n\t\t\t\t\texpanded,\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (result.details?.result) {\n\t\t\t\tconst component = new Container();\n\t\t\t\tconst box = new Box(1, 1, (text: string) =>\n\t\t\t\t\ttheme.bg(options.isPartial ? \"toolPendingBg\" : \"toolSuccessBg\", text),\n\t\t\t\t);\n\t\t\t\tbox.addChild(new Text(theme.fg(\"toolTitle\", theme.bold(\"Applying patch\")), 0, 0));\n\t\t\t\tbox.addChild(new Spacer(1));\n\t\t\t\tif (result.details.preview) {\n\t\t\t\t\tconst expanded = options.isPartial ? true : (options.expanded ?? true);\n\t\t\t\t\tbox.addChild(new Text(renderPatchPreview(result.details.preview, context.cwd, theme, expanded), 0, 0));\n\t\t\t\t}\n\t\t\t\tcomponent.addChild(box);\n\t\t\t\treturn component;\n\t\t\t}\n\t\t\treturn renderTextResult(result, theme);\n\t\t},\n\t});\n\n\treturn Object.assign(tool, {\n\t\tfreeform: { type: \"grammar\", syntax: \"lark\", definition: APPLY_PATCH_LARK_GRAMMAR } satisfies FreeformToolFormat,\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExtensionAPI, ToolDefinition } from \"../../types.ts\";\nimport type { APPLY_PATCH_PARAMS } from \"./constants.ts\";\n\nexport type ParsedPatch =\n\t| { type: \"add\"; filePath: string; content: string }\n\t| { type: \"delete\"; filePath: string }\n\t| { type: \"update\"; filePath: string; movePath?: string; chunks: PatchChunk[] };\n\nexport type PatchChunk = {\n\tchangeContexts: string[];\n\toldLines: string[];\n\tnewLines: string[];\n\tisEndOfFile: boolean;\n};\n\nexport type BaselineState = {\n\tnonGptToolNames: string[];\n};\n\nexport type FreeformToolFormat = {\n\ttype: \"grammar\";\n\tsyntax: \"lark\";\n\tdefinition: string;\n};\n\nexport type ApplyPatchParams = {\n\tinput: string;\n};\n\nexport type ApplyPatchOperation = \"add\" | \"delete\" | \"update\";\n\nexport type ApplyPatchPreviewFile = {\n\tfilePath: string;\n\tmovePath?: string;\n\toperation: ApplyPatchOperation;\n\tdiff: string;\n\tadded: number;\n\tremoved: number;\n};\n\nexport type ApplyPatchPreview = {\n\tfiles: ApplyPatchPreviewFile[];\n\tadded: number;\n\tremoved: number;\n};\n\nexport type ApplyPatchToolDetails = {\n\tpreview?: ApplyPatchPreview;\n\tprogress?: ApplyPatchProgress;\n\tresult?: ApplyPatchResult;\n};\n\nexport type ApplyPatchProgress = {\n\tapplied: number;\n\tfailed: number;\n\ttotal: number;\n};\n\nexport type ApplyPatchProgressCallback = (progress: ApplyPatchProgress) => Promise<void> | void;\n\nexport type ApplyPatchFailure = {\n\tfilePath: string;\n\toperation: ApplyPatchOperation;\n\tmessage: string;\n};\n\nexport type ApplyPatchRecoveryInstructions = {\n\tmustReadFiles: string[];\n\tmustNotReadFiles: string[];\n};\n\nexport type ApplyPatchResult = {\n\tsummaries: string[];\n\tappliedFiles: string[];\n\tfailures: ApplyPatchFailure[];\n\thasPartialSuccess: boolean;\n\trecoveryInstructions: ApplyPatchRecoveryInstructions;\n\tdetails: {\n\t\tfuzz: number;\n\t};\n};\n\nexport type AtomicWriteOperations = {\n\twriteFile: (filePath: string, content: string, encoding: \"utf-8\") => Promise<void>;\n\trename: (fromPath: string, toPath: string) => Promise<void>;\n\tunlink: (filePath: string) => Promise<void>;\n};\n\nexport type ApplyPatchThemeColor =\n\t| \"accent\"\n\t| \"error\"\n\t| \"muted\"\n\t| \"toolDiffAdded\"\n\t| \"toolDiffContext\"\n\t| \"toolDiffRemoved\"\n\t| \"toolOutput\"\n\t| \"toolTitle\";\n\nexport type ApplyPatchThemeBg = \"toolErrorBg\" | \"toolPendingBg\" | \"toolSuccessBg\";\n\nexport type ApplyPatchTheme = {\n\tfg: (name: ApplyPatchThemeColor, text: string) => string;\n\tbg: (name: ApplyPatchThemeBg, text: string) => string;\n\tbold: (text: string) => string;\n\tinverse: (text: string) => string;\n};\n\nexport type ApplyPatchRenderState = {\n\tcwd?: string;\n\tpatchText?: string;\n\tcallText?: string;\n\tcollapsed?: string;\n\texpanded?: string;\n\tstreamingInput?: string;\n\tstreamingParser?: { pushDelta: (delta: string) => ParsedPatch[] };\n\tstreamingHunks?: ParsedPatch[];\n\tstreamingError?: string;\n};\n\nexport type ApplyPatchToolDefinition = ToolDefinition<\n\ttypeof APPLY_PATCH_PARAMS,\n\tApplyPatchToolDetails | undefined,\n\tApplyPatchRenderState\n> & { freeform: FreeformToolFormat };\n\nexport type ApplyPatchExtensionAPI = Pick<ExtensionAPI, \"on\" | \"getActiveTools\" | \"setActiveTools\"> & {\n\tregisterTool: (tool: ApplyPatchToolDefinition) => void;\n};\n"]}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,MAAM,MAAM,WAAW,GACpB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAEjF,MAAM,MAAM,UAAU,GAAG;IACxB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC3B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9D,MAAM,MAAM,qBAAqB,GAAG;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC/B,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEhG,MAAM,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC5C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC9B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,8BAA8B,CAAC;IACrD,OAAO,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;CACF,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAC7B,QAAQ,GACR,OAAO,GACP,OAAO,GACP,eAAe,GACf,iBAAiB,GACjB,iBAAiB,GACjB,YAAY,GACZ,WAAW,CAAC;AAEf,MAAM,MAAM,iBAAiB,GAAG,aAAa,GAAG,eAAe,GAAG,eAAe,CAAC;AAElF,MAAM,MAAM,eAAe,GAAG;IAC7B,EAAE,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACzD,EAAE,EAAE,CAAC,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE;QAAE,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,EAAE,CAAA;KAAE,CAAC;IAClE,cAAc,CAAC,EAAE,WAAW,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,cAAc,CACpD,OAAO,kBAAkB,EACzB,qBAAqB,GAAG,SAAS,EACjC,qBAAqB,CACrB,GAAG;IAAE,QAAQ,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAErC,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,gBAAgB,GAAG,gBAAgB,CAAC,GAAG;IACrG,YAAY,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAC;CACvD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/workspace.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE","sourcesContent":["import path from \"node:path\";\n\nexport function resolvePatchPath(cwd: string, filePath: string): string {\n\treturn path.resolve(cwd, filePath);\n}\n"]}
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/workspace.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtE"}
@@ -1 +1 @@
1
- {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAgB,EAAU;IACvE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,CACnC","sourcesContent":["import path from \"node:path\";\n\nexport function resolvePatchPath(cwd: string, filePath: string): string {\n\treturn path.resolve(cwd, filePath);\n}\n"]}
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/gpt-apply-patch/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,QAAgB;IAC7D,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC","sourcesContent":["import path from \"node:path\";\n\nexport function resolvePatchPath(cwd: string, filePath: string): string {\n\treturn path.resolve(cwd, filePath);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/filter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU/C,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE,CAiBtG","sourcesContent":["import { fuzzyMatch } from \"@earendil-works/pi-tui\";\nimport type { HistoryEntry } from \"./types.ts\";\n\nconst RECENCY_WEIGHT = 0.01;\nconst DAY_MS = 86_400_000;\n\ntype ScoredEntry = {\n\treadonly entry: HistoryEntry;\n\treadonly score: number;\n};\n\nexport function filterHistory(entries: readonly HistoryEntry[], query: string): readonly HistoryEntry[] {\n\tconst normalizedQuery = query.trim();\n\tif (!normalizedQuery) return [...entries];\n\n\tlet newest = 0;\n\tfor (const entry of entries) newest = Math.max(newest, entry.timestamp);\n\n\tconst scored: ScoredEntry[] = [];\n\tfor (const entry of entries) {\n\t\tconst match = fuzzyMatch(normalizedQuery, entry.text);\n\t\tif (!match.matches) continue;\n\t\tconst ageDays = Math.max(0, newest - entry.timestamp) / DAY_MS;\n\t\tscored.push({ entry, score: match.score + ageDays * RECENCY_WEIGHT });\n\t}\n\n\tscored.sort((left, right) => left.score - right.score || right.entry.timestamp - left.entry.timestamp);\n\treturn scored.map((scoredEntry) => scoredEntry.entry);\n}\n"]}
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/filter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAU/C,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,YAAY,EAAE,CAiBtG"}
@@ -1 +1 @@
1
- {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,MAAM,GAAG,UAAU,CAAC;AAO1B,MAAM,UAAU,aAAa,CAAC,OAAgC,EAAE,KAAa,EAA2B;IACvG,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,eAAe;QAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;IAE1C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,OAAO;QAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAExE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,SAAS;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO,GAAG,cAAc,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvG,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AAAA,CACtD","sourcesContent":["import { fuzzyMatch } from \"@earendil-works/pi-tui\";\nimport type { HistoryEntry } from \"./types.ts\";\n\nconst RECENCY_WEIGHT = 0.01;\nconst DAY_MS = 86_400_000;\n\ntype ScoredEntry = {\n\treadonly entry: HistoryEntry;\n\treadonly score: number;\n};\n\nexport function filterHistory(entries: readonly HistoryEntry[], query: string): readonly HistoryEntry[] {\n\tconst normalizedQuery = query.trim();\n\tif (!normalizedQuery) return [...entries];\n\n\tlet newest = 0;\n\tfor (const entry of entries) newest = Math.max(newest, entry.timestamp);\n\n\tconst scored: ScoredEntry[] = [];\n\tfor (const entry of entries) {\n\t\tconst match = fuzzyMatch(normalizedQuery, entry.text);\n\t\tif (!match.matches) continue;\n\t\tconst ageDays = Math.max(0, newest - entry.timestamp) / DAY_MS;\n\t\tscored.push({ entry, score: match.score + ageDays * RECENCY_WEIGHT });\n\t}\n\n\tscored.sort((left, right) => left.score - right.score || right.entry.timestamp - left.entry.timestamp);\n\treturn scored.map((scoredEntry) => scoredEntry.entry);\n}\n"]}
1
+ {"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,MAAM,GAAG,UAAU,CAAC;AAO1B,MAAM,UAAU,aAAa,CAAC,OAAgC,EAAE,KAAa;IAC5E,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,eAAe;QAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;IAE1C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,OAAO;QAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAExE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,UAAU,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,SAAS;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,OAAO,GAAG,cAAc,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvG,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACvD,CAAC","sourcesContent":["import { fuzzyMatch } from \"@earendil-works/pi-tui\";\nimport type { HistoryEntry } from \"./types.ts\";\n\nconst RECENCY_WEIGHT = 0.01;\nconst DAY_MS = 86_400_000;\n\ntype ScoredEntry = {\n\treadonly entry: HistoryEntry;\n\treadonly score: number;\n};\n\nexport function filterHistory(entries: readonly HistoryEntry[], query: string): readonly HistoryEntry[] {\n\tconst normalizedQuery = query.trim();\n\tif (!normalizedQuery) return [...entries];\n\n\tlet newest = 0;\n\tfor (const entry of entries) newest = Math.max(newest, entry.timestamp);\n\n\tconst scored: ScoredEntry[] = [];\n\tfor (const entry of entries) {\n\t\tconst match = fuzzyMatch(normalizedQuery, entry.text);\n\t\tif (!match.matches) continue;\n\t\tconst ageDays = Math.max(0, newest - entry.timestamp) / DAY_MS;\n\t\tscored.push({ entry, score: match.score + ageDays * RECENCY_WEIGHT });\n\t}\n\n\tscored.sort((left, right) => left.score - right.score || right.entry.timestamp - left.entry.timestamp);\n\treturn scored.map((scoredEntry) => scoredEntry.entry);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC,CAAC;AAEzE,wBAAgB,iBAAiB,CAChC,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,GAAE,MAAyB,EAC9C,QAAQ,GAAE,QAAe,GACvB,MAAM,CAQR;AAED,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAgCrE","sourcesContent":["import * as path from \"node:path\";\nimport { getSessionsDir } from \"../../../../config.ts\";\nimport type { ExtensionAPI } from \"../../types.ts\";\nimport { indexSessions } from \"./indexer.ts\";\nimport { HistorySearchOverlay } from \"./overlay.ts\";\nimport type { HistoryEntry } from \"./types.ts\";\n\ntype PathLike = Pick<typeof path, \"resolve\" | \"relative\" | \"isAbsolute\">;\n\nexport function resolveSearchRoot(\n\tcurrentSessionDir: string,\n\tdefaultSessionsRoot: string = getSessionsDir(),\n\tpathImpl: PathLike = path,\n): string {\n\tconst defaultRoot = pathImpl.resolve(defaultSessionsRoot);\n\tif (!currentSessionDir) return defaultRoot;\n\tconst current = pathImpl.resolve(currentSessionDir);\n\tif (current === defaultRoot) return defaultRoot;\n\tconst rel = pathImpl.relative(defaultRoot, current);\n\tif (rel && !rel.startsWith(\"..\") && !pathImpl.isAbsolute(rel)) return defaultRoot;\n\treturn current;\n}\n\nexport default function historySearchExtension(pi: ExtensionAPI): void {\n\tpi.registerCommand(\"history\", {\n\t\tdescription: \"Search prompt history across sessions\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"No UI available\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet entries: readonly HistoryEntry[];\n\t\t\ttry {\n\t\t\t\tconst searchRoot = resolveSearchRoot(ctx.sessionManager.getSessionDir());\n\t\t\t\tentries = await indexSessions(searchRoot);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tctx.ui.notify(`Failed to read prompt history: ${message}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (entries.length === 0) {\n\t\t\t\tctx.ui.notify(\"No prompt history found\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selected = await ctx.ui.custom<HistoryEntry | undefined>(\n\t\t\t\t(tui, theme, _keybindings, done) => new HistorySearchOverlay({ tui, entries, theme, done }),\n\t\t\t\t{ overlay: true, overlayOptions: { width: \"90%\", maxHeight: \"80%\", minWidth: 60, margin: 2 } },\n\t\t\t);\n\n\t\t\tif (selected) ctx.ui.setEditorText(selected.text);\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKnD,KAAK,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,SAAS,GAAG,UAAU,GAAG,YAAY,CAAC,CAAC;AAEzE,wBAAgB,iBAAiB,CAChC,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,GAAE,MAAyB,EAC9C,QAAQ,GAAE,QAAe,GACvB,MAAM,CAQR;AAED,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAgCrE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAKpD,MAAM,UAAU,iBAAiB,CAChC,iBAAyB,EACzB,mBAAmB,GAAW,cAAc,EAAE,EAC9C,QAAQ,GAAa,IAAI,EAChB;IACT,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC1D,IAAI,CAAC,iBAAiB;QAAE,OAAO,WAAW,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IAClF,OAAO,OAAO,CAAC;AAAA,CACf;AAED,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAgB,EAAQ;IACtE,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE;QAC7B,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;YAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBAChB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;gBACzC,OAAO;YACR,CAAC;YAED,IAAI,OAAgC,CAAC;YACrC,IAAI,CAAC;gBACJ,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC;gBACzE,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kCAAkC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;gBACpE,OAAO;YACR,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;gBACjD,OAAO;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,oBAAoB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAC3F,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAC9F,CAAC;YAEF,IAAI,QAAQ;gBAAE,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAAA,CAClD;KACD,CAAC,CAAC;AAAA,CACH","sourcesContent":["import * as path from \"node:path\";\nimport { getSessionsDir } from \"../../../../config.ts\";\nimport type { ExtensionAPI } from \"../../types.ts\";\nimport { indexSessions } from \"./indexer.ts\";\nimport { HistorySearchOverlay } from \"./overlay.ts\";\nimport type { HistoryEntry } from \"./types.ts\";\n\ntype PathLike = Pick<typeof path, \"resolve\" | \"relative\" | \"isAbsolute\">;\n\nexport function resolveSearchRoot(\n\tcurrentSessionDir: string,\n\tdefaultSessionsRoot: string = getSessionsDir(),\n\tpathImpl: PathLike = path,\n): string {\n\tconst defaultRoot = pathImpl.resolve(defaultSessionsRoot);\n\tif (!currentSessionDir) return defaultRoot;\n\tconst current = pathImpl.resolve(currentSessionDir);\n\tif (current === defaultRoot) return defaultRoot;\n\tconst rel = pathImpl.relative(defaultRoot, current);\n\tif (rel && !rel.startsWith(\"..\") && !pathImpl.isAbsolute(rel)) return defaultRoot;\n\treturn current;\n}\n\nexport default function historySearchExtension(pi: ExtensionAPI): void {\n\tpi.registerCommand(\"history\", {\n\t\tdescription: \"Search prompt history across sessions\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"No UI available\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet entries: readonly HistoryEntry[];\n\t\t\ttry {\n\t\t\t\tconst searchRoot = resolveSearchRoot(ctx.sessionManager.getSessionDir());\n\t\t\t\tentries = await indexSessions(searchRoot);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tctx.ui.notify(`Failed to read prompt history: ${message}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (entries.length === 0) {\n\t\t\t\tctx.ui.notify(\"No prompt history found\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selected = await ctx.ui.custom<HistoryEntry | undefined>(\n\t\t\t\t(tui, theme, _keybindings, done) => new HistorySearchOverlay({ tui, entries, theme, done }),\n\t\t\t\t{ overlay: true, overlayOptions: { width: \"90%\", maxHeight: \"80%\", minWidth: 60, margin: 2 } },\n\t\t\t);\n\n\t\t\tif (selected) ctx.ui.setEditorText(selected.text);\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAKpD,MAAM,UAAU,iBAAiB,CAChC,iBAAyB,EACzB,mBAAmB,GAAW,cAAc,EAAE,EAC9C,QAAQ,GAAa,IAAI;IAEzB,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC1D,IAAI,CAAC,iBAAiB;QAAE,OAAO,WAAW,CAAC;IAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACpD,IAAI,OAAO,KAAK,WAAW;QAAE,OAAO,WAAW,CAAC;IAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACpD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,WAAW,CAAC;IAClF,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAgB;IAC9D,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE;QAC7B,WAAW,EAAE,uCAAuC;QACpD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;gBAChB,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;gBACzC,OAAO;YACR,CAAC;YAED,IAAI,OAAgC,CAAC;YACrC,IAAI,CAAC;gBACJ,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC,CAAC;gBACzE,OAAO,GAAG,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kCAAkC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;gBACpE,OAAO;YACR,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;gBACjD,OAAO;YACR,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,oBAAoB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAC3F,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAC9F,CAAC;YAEF,IAAI,QAAQ;gBAAE,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;KACD,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import * as path from \"node:path\";\nimport { getSessionsDir } from \"../../../../config.ts\";\nimport type { ExtensionAPI } from \"../../types.ts\";\nimport { indexSessions } from \"./indexer.ts\";\nimport { HistorySearchOverlay } from \"./overlay.ts\";\nimport type { HistoryEntry } from \"./types.ts\";\n\ntype PathLike = Pick<typeof path, \"resolve\" | \"relative\" | \"isAbsolute\">;\n\nexport function resolveSearchRoot(\n\tcurrentSessionDir: string,\n\tdefaultSessionsRoot: string = getSessionsDir(),\n\tpathImpl: PathLike = path,\n): string {\n\tconst defaultRoot = pathImpl.resolve(defaultSessionsRoot);\n\tif (!currentSessionDir) return defaultRoot;\n\tconst current = pathImpl.resolve(currentSessionDir);\n\tif (current === defaultRoot) return defaultRoot;\n\tconst rel = pathImpl.relative(defaultRoot, current);\n\tif (rel && !rel.startsWith(\"..\") && !pathImpl.isAbsolute(rel)) return defaultRoot;\n\treturn current;\n}\n\nexport default function historySearchExtension(pi: ExtensionAPI): void {\n\tpi.registerCommand(\"history\", {\n\t\tdescription: \"Search prompt history across sessions\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tif (!ctx.hasUI) {\n\t\t\t\tctx.ui.notify(\"No UI available\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet entries: readonly HistoryEntry[];\n\t\t\ttry {\n\t\t\t\tconst searchRoot = resolveSearchRoot(ctx.sessionManager.getSessionDir());\n\t\t\t\tentries = await indexSessions(searchRoot);\n\t\t\t} catch (error) {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\tctx.ui.notify(`Failed to read prompt history: ${message}`, \"error\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (entries.length === 0) {\n\t\t\t\tctx.ui.notify(\"No prompt history found\", \"info\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst selected = await ctx.ui.custom<HistoryEntry | undefined>(\n\t\t\t\t(tui, theme, _keybindings, done) => new HistorySearchOverlay({ tui, entries, theme, done }),\n\t\t\t\t{ overlay: true, overlayOptions: { width: \"90%\", maxHeight: \"80%\", minWidth: 60, margin: 2 } },\n\t\t\t);\n\n\t\t\tif (selected) ctx.ui.setEditorText(selected.text);\n\t\t},\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/indexer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4J/C,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAQrF","sourcesContent":["import type { Stats } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport type { HistoryEntry } from \"./types.ts\";\n\nconst MAX_HISTORY_ENTRIES = 10_000;\nconst SYSTEM_PREFIXES: readonly string[] = [\"[SYSTEM DIRECTIVE\", \"[system:\", \"[SYSTEM\"];\n\ntype SessionHeader = {\n\treadonly id: string;\n\treadonly cwd: string;\n};\n\nfunction isReadonlyArray(value: unknown): value is readonly unknown[] {\n\treturn Array.isArray(value);\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n\treturn typeof value === \"object\" && value !== null && !isReadonlyArray(value);\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n\treturn error instanceof Error && \"code\" in error && error.code === code;\n}\n\nasync function statIfExists(path: string): Promise<Stats | undefined> {\n\ttry {\n\t\treturn await stat(path);\n\t} catch (error) {\n\t\tif (hasErrorCode(error, \"ENOENT\")) return undefined;\n\t\tthrow error;\n\t}\n}\n\nasync function readDirIfExists(path: string): Promise<readonly string[]> {\n\ttry {\n\t\treturn await readdir(path);\n\t} catch (error) {\n\t\tif (hasErrorCode(error, \"ENOENT\")) return [];\n\t\tthrow error;\n\t}\n}\n\nfunction parseJsonLine(line: string): unknown | undefined {\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(line);\n\t\treturn parsed;\n\t} catch (error) {\n\t\tif (error instanceof SyntaxError) return undefined;\n\t\tthrow error;\n\t}\n}\n\nfunction parseHeader(line: string, sessionFile: string): SessionHeader {\n\tconst parsed = parseJsonLine(line);\n\tif (!isRecord(parsed) || parsed.type !== \"session\") {\n\t\treturn { id: basename(sessionFile, \".jsonl\"), cwd: \"\" };\n\t}\n\n\tconst id = typeof parsed.id === \"string\" ? parsed.id : basename(sessionFile, \".jsonl\");\n\tconst cwd = typeof parsed.cwd === \"string\" ? parsed.cwd : \"\";\n\treturn { id, cwd };\n}\n\nfunction getTextParts(content: readonly unknown[]): readonly string[] {\n\tconst texts: string[] = [];\n\tfor (const part of content) {\n\t\tif (!isRecord(part)) continue;\n\t\tif (part.type !== \"text\") continue;\n\t\tif (typeof part.text === \"string\") texts.push(part.text);\n\t}\n\treturn texts;\n}\n\nfunction isSystemInjectedPrompt(text: string): boolean {\n\tconst trimmedStart = text.trimStart();\n\treturn SYSTEM_PREFIXES.some((prefix) => trimmedStart.startsWith(prefix));\n}\n\nfunction extractUserText(content: unknown): string | undefined {\n\tif (typeof content === \"string\") return content;\n\tif (isReadonlyArray(content)) return getTextParts(content).join(\"\\n\");\n\treturn undefined;\n}\n\nfunction parseMessage(line: string, sessionFile: string, header: SessionHeader): HistoryEntry | undefined {\n\tconst parsed = parseJsonLine(line);\n\tif (!isRecord(parsed) || parsed.type !== \"message\") return undefined;\n\n\tconst message = parsed.message;\n\tif (!isRecord(message) || message.role !== \"user\") return undefined;\n\tconst text = extractUserText(message.content);\n\tif (text === undefined || !text.trim() || isSystemInjectedPrompt(text)) return undefined;\n\n\tconst rawTimestamp = parsed.timestamp;\n\tif (typeof rawTimestamp !== \"string\") return undefined;\n\tconst timestamp = Date.parse(rawTimestamp);\n\tif (!Number.isFinite(timestamp)) return undefined;\n\n\treturn { text, sessionId: header.id, sessionFile, cwd: header.cwd, timestamp };\n}\n\nfunction dedupeNewest(entries: readonly HistoryEntry[]): readonly HistoryEntry[] {\n\tconst newestByText = new Map<string, HistoryEntry>();\n\tfor (const entry of entries) {\n\t\tconst existing = newestByText.get(entry.text);\n\t\tif (!existing || entry.timestamp > existing.timestamp) newestByText.set(entry.text, entry);\n\t}\n\treturn [...newestByText.values()].sort((left, right) => right.timestamp - left.timestamp);\n}\n\nasync function appendSessionEntries(sessionFile: string, entries: HistoryEntry[]): Promise<void> {\n\tconst text = await readFile(sessionFile, \"utf-8\");\n\tconst lines = text.split(\"\\n\").filter((line) => line.length > 0);\n\tconst headerLine = lines[0];\n\tif (!headerLine) return;\n\n\tconst header = parseHeader(headerLine, sessionFile);\n\tfor (let index = lines.length - 1; index >= 1; index--) {\n\t\tconst line = lines[index];\n\t\tif (line === undefined) continue;\n\t\tconst entry = parseMessage(line, sessionFile, header);\n\t\tif (entry) entries.push(entry);\n\t\tif (entries.length >= MAX_HISTORY_ENTRIES) return;\n\t}\n}\n\ntype DiscoveredSessionFile = {\n\treadonly path: string;\n\treadonly basename: string;\n};\n\nasync function collectJsonlFilesInDir(dir: string): Promise<readonly DiscoveredSessionFile[]> {\n\tconst fileNames = await readDirIfExists(dir);\n\tconst files: DiscoveredSessionFile[] = [];\n\tfor (const fileName of fileNames) {\n\t\tif (!fileName.endsWith(\".jsonl\")) continue;\n\t\tconst path = join(dir, fileName);\n\t\tconst fileStat = await statIfExists(path);\n\t\tif (!fileStat?.isFile()) continue;\n\t\tfiles.push({ path, basename: fileName });\n\t}\n\treturn files;\n}\n\nasync function discoverSessionFiles(rootDir: string): Promise<readonly DiscoveredSessionFile[]> {\n\tconst topLevel = await readDirIfExists(rootDir);\n\tconst all: DiscoveredSessionFile[] = [...(await collectJsonlFilesInDir(rootDir))];\n\tfor (const name of topLevel) {\n\t\tif (name.endsWith(\".jsonl\")) continue;\n\t\tconst subDir = join(rootDir, name);\n\t\tconst subStat = await statIfExists(subDir);\n\t\tif (!subStat?.isDirectory()) continue;\n\t\tall.push(...(await collectJsonlFilesInDir(subDir)));\n\t}\n\tall.sort((left, right) => right.basename.localeCompare(left.basename));\n\treturn all;\n}\n\nexport async function indexSessions(rootDir: string): Promise<readonly HistoryEntry[]> {\n\tconst sessionFiles = await discoverSessionFiles(rootDir);\n\tconst entries: HistoryEntry[] = [];\n\tfor (const file of sessionFiles) {\n\t\tawait appendSessionEntries(file.path, entries);\n\t\tif (entries.length >= MAX_HISTORY_ENTRIES) break;\n\t}\n\treturn dedupeNewest(entries);\n}\n"]}
1
+ {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/indexer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AA4J/C,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC,CAQrF"}
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/indexer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Stats } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport type { HistoryEntry } from \"./types.ts\";\n\nconst MAX_HISTORY_ENTRIES = 10_000;\nconst SYSTEM_PREFIXES: readonly string[] = [\"[SYSTEM DIRECTIVE\", \"[system:\", \"[SYSTEM\"];\n\ntype SessionHeader = {\n\treadonly id: string;\n\treadonly cwd: string;\n};\n\nfunction isReadonlyArray(value: unknown): value is readonly unknown[] {\n\treturn Array.isArray(value);\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n\treturn typeof value === \"object\" && value !== null && !isReadonlyArray(value);\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n\treturn error instanceof Error && \"code\" in error && error.code === code;\n}\n\nasync function statIfExists(path: string): Promise<Stats | undefined> {\n\ttry {\n\t\treturn await stat(path);\n\t} catch (error) {\n\t\tif (hasErrorCode(error, \"ENOENT\")) return undefined;\n\t\tthrow error;\n\t}\n}\n\nasync function readDirIfExists(path: string): Promise<readonly string[]> {\n\ttry {\n\t\treturn await readdir(path);\n\t} catch (error) {\n\t\tif (hasErrorCode(error, \"ENOENT\")) return [];\n\t\tthrow error;\n\t}\n}\n\nfunction parseJsonLine(line: string): unknown | undefined {\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(line);\n\t\treturn parsed;\n\t} catch (error) {\n\t\tif (error instanceof SyntaxError) return undefined;\n\t\tthrow error;\n\t}\n}\n\nfunction parseHeader(line: string, sessionFile: string): SessionHeader {\n\tconst parsed = parseJsonLine(line);\n\tif (!isRecord(parsed) || parsed.type !== \"session\") {\n\t\treturn { id: basename(sessionFile, \".jsonl\"), cwd: \"\" };\n\t}\n\n\tconst id = typeof parsed.id === \"string\" ? parsed.id : basename(sessionFile, \".jsonl\");\n\tconst cwd = typeof parsed.cwd === \"string\" ? parsed.cwd : \"\";\n\treturn { id, cwd };\n}\n\nfunction getTextParts(content: readonly unknown[]): readonly string[] {\n\tconst texts: string[] = [];\n\tfor (const part of content) {\n\t\tif (!isRecord(part)) continue;\n\t\tif (part.type !== \"text\") continue;\n\t\tif (typeof part.text === \"string\") texts.push(part.text);\n\t}\n\treturn texts;\n}\n\nfunction isSystemInjectedPrompt(text: string): boolean {\n\tconst trimmedStart = text.trimStart();\n\treturn SYSTEM_PREFIXES.some((prefix) => trimmedStart.startsWith(prefix));\n}\n\nfunction extractUserText(content: unknown): string | undefined {\n\tif (typeof content === \"string\") return content;\n\tif (isReadonlyArray(content)) return getTextParts(content).join(\"\\n\");\n\treturn undefined;\n}\n\nfunction parseMessage(line: string, sessionFile: string, header: SessionHeader): HistoryEntry | undefined {\n\tconst parsed = parseJsonLine(line);\n\tif (!isRecord(parsed) || parsed.type !== \"message\") return undefined;\n\n\tconst message = parsed.message;\n\tif (!isRecord(message) || message.role !== \"user\") return undefined;\n\tconst text = extractUserText(message.content);\n\tif (text === undefined || !text.trim() || isSystemInjectedPrompt(text)) return undefined;\n\n\tconst rawTimestamp = parsed.timestamp;\n\tif (typeof rawTimestamp !== \"string\") return undefined;\n\tconst timestamp = Date.parse(rawTimestamp);\n\tif (!Number.isFinite(timestamp)) return undefined;\n\n\treturn { text, sessionId: header.id, sessionFile, cwd: header.cwd, timestamp };\n}\n\nfunction dedupeNewest(entries: readonly HistoryEntry[]): readonly HistoryEntry[] {\n\tconst newestByText = new Map<string, HistoryEntry>();\n\tfor (const entry of entries) {\n\t\tconst existing = newestByText.get(entry.text);\n\t\tif (!existing || entry.timestamp > existing.timestamp) newestByText.set(entry.text, entry);\n\t}\n\treturn [...newestByText.values()].sort((left, right) => right.timestamp - left.timestamp);\n}\n\nasync function appendSessionEntries(sessionFile: string, entries: HistoryEntry[]): Promise<void> {\n\tconst text = await readFile(sessionFile, \"utf-8\");\n\tconst lines = text.split(\"\\n\").filter((line) => line.length > 0);\n\tconst headerLine = lines[0];\n\tif (!headerLine) return;\n\n\tconst header = parseHeader(headerLine, sessionFile);\n\tfor (let index = lines.length - 1; index >= 1; index--) {\n\t\tconst line = lines[index];\n\t\tif (line === undefined) continue;\n\t\tconst entry = parseMessage(line, sessionFile, header);\n\t\tif (entry) entries.push(entry);\n\t\tif (entries.length >= MAX_HISTORY_ENTRIES) return;\n\t}\n}\n\ntype DiscoveredSessionFile = {\n\treadonly path: string;\n\treadonly basename: string;\n};\n\nasync function collectJsonlFilesInDir(dir: string): Promise<readonly DiscoveredSessionFile[]> {\n\tconst fileNames = await readDirIfExists(dir);\n\tconst files: DiscoveredSessionFile[] = [];\n\tfor (const fileName of fileNames) {\n\t\tif (!fileName.endsWith(\".jsonl\")) continue;\n\t\tconst path = join(dir, fileName);\n\t\tconst fileStat = await statIfExists(path);\n\t\tif (!fileStat?.isFile()) continue;\n\t\tfiles.push({ path, basename: fileName });\n\t}\n\treturn files;\n}\n\nasync function discoverSessionFiles(rootDir: string): Promise<readonly DiscoveredSessionFile[]> {\n\tconst topLevel = await readDirIfExists(rootDir);\n\tconst all: DiscoveredSessionFile[] = [...(await collectJsonlFilesInDir(rootDir))];\n\tfor (const name of topLevel) {\n\t\tif (name.endsWith(\".jsonl\")) continue;\n\t\tconst subDir = join(rootDir, name);\n\t\tconst subStat = await statIfExists(subDir);\n\t\tif (!subStat?.isDirectory()) continue;\n\t\tall.push(...(await collectJsonlFilesInDir(subDir)));\n\t}\n\tall.sort((left, right) => right.basename.localeCompare(left.basename));\n\treturn all;\n}\n\nexport async function indexSessions(rootDir: string): Promise<readonly HistoryEntry[]> {\n\tconst sessionFiles = await discoverSessionFiles(rootDir);\n\tconst entries: HistoryEntry[] = [];\n\tfor (const file of sessionFiles) {\n\t\tawait appendSessionEntries(file.path, entries);\n\t\tif (entries.length >= MAX_HISTORY_ENTRIES) break;\n\t}\n\treturn dedupeNewest(entries);\n}\n"]}
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/indexer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Stats } from \"node:fs\";\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { basename, join } from \"node:path\";\nimport type { HistoryEntry } from \"./types.ts\";\n\nconst MAX_HISTORY_ENTRIES = 10_000;\nconst SYSTEM_PREFIXES: readonly string[] = [\"[SYSTEM DIRECTIVE\", \"[system:\", \"[SYSTEM\"];\n\ntype SessionHeader = {\n\treadonly id: string;\n\treadonly cwd: string;\n};\n\nfunction isReadonlyArray(value: unknown): value is readonly unknown[] {\n\treturn Array.isArray(value);\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n\treturn typeof value === \"object\" && value !== null && !isReadonlyArray(value);\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n\treturn error instanceof Error && \"code\" in error && error.code === code;\n}\n\nasync function statIfExists(path: string): Promise<Stats | undefined> {\n\ttry {\n\t\treturn await stat(path);\n\t} catch (error) {\n\t\tif (hasErrorCode(error, \"ENOENT\")) return undefined;\n\t\tthrow error;\n\t}\n}\n\nasync function readDirIfExists(path: string): Promise<readonly string[]> {\n\ttry {\n\t\treturn await readdir(path);\n\t} catch (error) {\n\t\tif (hasErrorCode(error, \"ENOENT\")) return [];\n\t\tthrow error;\n\t}\n}\n\nfunction parseJsonLine(line: string): unknown | undefined {\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(line);\n\t\treturn parsed;\n\t} catch (error) {\n\t\tif (error instanceof SyntaxError) return undefined;\n\t\tthrow error;\n\t}\n}\n\nfunction parseHeader(line: string, sessionFile: string): SessionHeader {\n\tconst parsed = parseJsonLine(line);\n\tif (!isRecord(parsed) || parsed.type !== \"session\") {\n\t\treturn { id: basename(sessionFile, \".jsonl\"), cwd: \"\" };\n\t}\n\n\tconst id = typeof parsed.id === \"string\" ? parsed.id : basename(sessionFile, \".jsonl\");\n\tconst cwd = typeof parsed.cwd === \"string\" ? parsed.cwd : \"\";\n\treturn { id, cwd };\n}\n\nfunction getTextParts(content: readonly unknown[]): readonly string[] {\n\tconst texts: string[] = [];\n\tfor (const part of content) {\n\t\tif (!isRecord(part)) continue;\n\t\tif (part.type !== \"text\") continue;\n\t\tif (typeof part.text === \"string\") texts.push(part.text);\n\t}\n\treturn texts;\n}\n\nfunction isSystemInjectedPrompt(text: string): boolean {\n\tconst trimmedStart = text.trimStart();\n\treturn SYSTEM_PREFIXES.some((prefix) => trimmedStart.startsWith(prefix));\n}\n\nfunction extractUserText(content: unknown): string | undefined {\n\tif (typeof content === \"string\") return content;\n\tif (isReadonlyArray(content)) return getTextParts(content).join(\"\\n\");\n\treturn undefined;\n}\n\nfunction parseMessage(line: string, sessionFile: string, header: SessionHeader): HistoryEntry | undefined {\n\tconst parsed = parseJsonLine(line);\n\tif (!isRecord(parsed) || parsed.type !== \"message\") return undefined;\n\n\tconst message = parsed.message;\n\tif (!isRecord(message) || message.role !== \"user\") return undefined;\n\tconst text = extractUserText(message.content);\n\tif (text === undefined || !text.trim() || isSystemInjectedPrompt(text)) return undefined;\n\n\tconst rawTimestamp = parsed.timestamp;\n\tif (typeof rawTimestamp !== \"string\") return undefined;\n\tconst timestamp = Date.parse(rawTimestamp);\n\tif (!Number.isFinite(timestamp)) return undefined;\n\n\treturn { text, sessionId: header.id, sessionFile, cwd: header.cwd, timestamp };\n}\n\nfunction dedupeNewest(entries: readonly HistoryEntry[]): readonly HistoryEntry[] {\n\tconst newestByText = new Map<string, HistoryEntry>();\n\tfor (const entry of entries) {\n\t\tconst existing = newestByText.get(entry.text);\n\t\tif (!existing || entry.timestamp > existing.timestamp) newestByText.set(entry.text, entry);\n\t}\n\treturn [...newestByText.values()].sort((left, right) => right.timestamp - left.timestamp);\n}\n\nasync function appendSessionEntries(sessionFile: string, entries: HistoryEntry[]): Promise<void> {\n\tconst text = await readFile(sessionFile, \"utf-8\");\n\tconst lines = text.split(\"\\n\").filter((line) => line.length > 0);\n\tconst headerLine = lines[0];\n\tif (!headerLine) return;\n\n\tconst header = parseHeader(headerLine, sessionFile);\n\tfor (let index = lines.length - 1; index >= 1; index--) {\n\t\tconst line = lines[index];\n\t\tif (line === undefined) continue;\n\t\tconst entry = parseMessage(line, sessionFile, header);\n\t\tif (entry) entries.push(entry);\n\t\tif (entries.length >= MAX_HISTORY_ENTRIES) return;\n\t}\n}\n\ntype DiscoveredSessionFile = {\n\treadonly path: string;\n\treadonly basename: string;\n};\n\nasync function collectJsonlFilesInDir(dir: string): Promise<readonly DiscoveredSessionFile[]> {\n\tconst fileNames = await readDirIfExists(dir);\n\tconst files: DiscoveredSessionFile[] = [];\n\tfor (const fileName of fileNames) {\n\t\tif (!fileName.endsWith(\".jsonl\")) continue;\n\t\tconst path = join(dir, fileName);\n\t\tconst fileStat = await statIfExists(path);\n\t\tif (!fileStat?.isFile()) continue;\n\t\tfiles.push({ path, basename: fileName });\n\t}\n\treturn files;\n}\n\nasync function discoverSessionFiles(rootDir: string): Promise<readonly DiscoveredSessionFile[]> {\n\tconst topLevel = await readDirIfExists(rootDir);\n\tconst all: DiscoveredSessionFile[] = [...(await collectJsonlFilesInDir(rootDir))];\n\tfor (const name of topLevel) {\n\t\tif (name.endsWith(\".jsonl\")) continue;\n\t\tconst subDir = join(rootDir, name);\n\t\tconst subStat = await statIfExists(subDir);\n\t\tif (!subStat?.isDirectory()) continue;\n\t\tall.push(...(await collectJsonlFilesInDir(subDir)));\n\t}\n\tall.sort((left, right) => right.basename.localeCompare(left.basename));\n\treturn all;\n}\n\nexport async function indexSessions(rootDir: string): Promise<readonly HistoryEntry[]> {\n\tconst sessionFiles = await discoverSessionFiles(rootDir);\n\tconst entries: HistoryEntry[] = [];\n\tfor (const file of sessionFiles) {\n\t\tawait appendSessionEntries(file.path, entries);\n\t\tif (entries.length >= MAX_HISTORY_ENTRIES) break;\n\t}\n\treturn dedupeNewest(entries);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAA4D,MAAM,wBAAwB,CAAC;AAE7G,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8CAA8C,CAAC;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAc/C,KAAK,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;AAEnD,KAAK,2BAA2B,GAAG;IAClC,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,KAAK,IAAI,CAAC;CACzD,CAAC;AAuBF,qBAAa,oBAAqB,SAAQ,SAAU,YAAW,SAAS;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,OAAO,EAAE,2BAA2B,EAO/C;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAED,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAa/B;IAED,cAAc,IAAI,MAAM,CAEvB;IAED,kBAAkB,IAAI,SAAS,YAAY,EAAE,CAE5C;IAED,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,eAAe;CAavB","sourcesContent":["import { basename } from \"node:path\";\nimport type { Focusable, TUI } from \"@earendil-works/pi-tui\";\nimport { Container, getKeybindings, Input, type SelectItem, SelectList, Text } from \"@earendil-works/pi-tui\";\nimport { DynamicBorder } from \"../../../../modes/interactive/components/dynamic-border.ts\";\nimport type { Theme } from \"../../../../modes/interactive/theme/theme.ts\";\nimport { filterHistory } from \"./filter.ts\";\nimport type { HistoryEntry } from \"./types.ts\";\n\nconst MAX_VISIBLE_ROWS = 15;\nconst MAX_RENDERED_MATCHES = 250;\n\ntype SelectListAction = \"tui.select.up\" | \"tui.select.down\" | \"tui.select.confirm\" | \"tui.select.cancel\";\n\nconst SELECT_LIST_ACTIONS: readonly SelectListAction[] = [\n\t\"tui.select.up\",\n\t\"tui.select.down\",\n\t\"tui.select.confirm\",\n\t\"tui.select.cancel\",\n];\n\ntype HistorySearchTui = Pick<TUI, \"requestRender\">;\n\ntype HistorySearchOverlayOptions = {\n\treadonly tui: HistorySearchTui;\n\treadonly entries: readonly HistoryEntry[];\n\treadonly theme: Theme;\n\treadonly done: (entry: HistoryEntry | undefined) => void;\n};\n\nfunction relativeTime(timestamp: number, now = Date.now()): string {\n\tconst seconds = Math.max(0, Math.floor((now - timestamp) / 1_000));\n\tif (seconds < 60) return \"now\";\n\tconst minutes = Math.floor(seconds / 60);\n\tif (minutes < 60) return `${minutes}m ago`;\n\tconst hours = Math.floor(minutes / 60);\n\tif (hours < 24) return `${hours}h ago`;\n\tconst days = Math.floor(hours / 24);\n\tif (days < 30) return `${days}d ago`;\n\tconst months = Math.floor(days / 30);\n\tif (months < 12) return `${months}mo ago`;\n\treturn `${Math.floor(months / 12)}y ago`;\n}\n\nfunction describeEntry(entry: HistoryEntry): string {\n\tconst shortId = entry.sessionId.length <= 8 ? entry.sessionId : entry.sessionId.slice(0, 8);\n\tconst cwdName = basename(entry.cwd);\n\tconst sessionLabel = cwdName ? `${cwdName}/${shortId}` : shortId;\n\treturn `${sessionLabel} · ${relativeTime(entry.timestamp)}`;\n}\n\nexport class HistorySearchOverlay extends Container implements Focusable {\n\tprivate readonly searchInput: Input;\n\tprivate readonly entriesByValue = new Map<string, HistoryEntry>();\n\tprivate readonly options: HistorySearchOverlayOptions;\n\tprivate list: SelectList | undefined;\n\tprivate filteredEntries: readonly HistoryEntry[] = [];\n\tprivate _focused = false;\n\n\tconstructor(options: HistorySearchOverlayOptions) {\n\t\tsuper();\n\n\t\tthis.options = options;\n\t\tthis.searchInput = new Input();\n\t\tthis.searchInput.onEscape = () => this.options.done(undefined);\n\t\tthis.rebuild();\n\t}\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\n\thandleInput(input: string): void {\n\t\tconst keybindings = getKeybindings();\n\t\tif (SELECT_LIST_ACTIONS.some((action) => keybindings.matches(input, action))) {\n\t\t\tthis.list?.handleInput(input);\n\t\t\treturn;\n\t\t}\n\n\t\tconst before = this.searchInput.getValue();\n\t\tthis.searchInput.handleInput(input);\n\t\tif (before !== this.searchInput.getValue()) {\n\t\t\tthis.rebuild();\n\t\t\tthis.options.tui.requestRender();\n\t\t}\n\t}\n\n\tgetSearchValue(): string {\n\t\treturn this.searchInput.getValue();\n\t}\n\n\tgetFilteredEntries(): readonly HistoryEntry[] {\n\t\treturn this.filteredEntries;\n\t}\n\n\tprivate rebuild(): void {\n\t\tthis.entriesByValue.clear();\n\t\tthis.filteredEntries = filterHistory(this.options.entries, this.searchInput.getValue());\n\t\tconst renderedEntries = this.filteredEntries.slice(0, MAX_RENDERED_MATCHES);\n\t\tconst items = renderedEntries.map((entry, index) => this.toSelectItem(entry, index));\n\t\tconst list = new SelectList(items, Math.min(MAX_VISIBLE_ROWS, Math.max(1, items.length)), {\n\t\t\tselectedPrefix: (text) => this.options.theme.fg(\"accent\", text),\n\t\t\tselectedText: (text) => text,\n\t\t\tdescription: (text) => this.options.theme.fg(\"muted\", text),\n\t\t\tscrollInfo: (text) => this.options.theme.fg(\"dim\", text),\n\t\t\tnoMatch: (text) => this.options.theme.fg(\"warning\", text.replace(\"commands\", \"prompts\")),\n\t\t});\n\t\tlist.onSelect = (item) => this.options.done(this.entriesByValue.get(item.value));\n\t\tlist.onCancel = () => this.options.done(undefined);\n\t\tthis.list = list;\n\t\tthis.renderContainer(list, this.filteredEntries.length);\n\t}\n\n\tprivate toSelectItem(entry: HistoryEntry, index: number): SelectItem {\n\t\tconst value = String(index);\n\t\tthis.entriesByValue.set(value, entry);\n\t\treturn {\n\t\t\tvalue,\n\t\t\tlabel: entry.text.replace(/[\\r\\n]+/g, \" \").trim(),\n\t\t\tdescription: describeEntry(entry),\n\t\t};\n\t}\n\n\tprivate renderContainer(list: SelectList, matchCount: number): void {\n\t\tconst title = this.options.theme.fg(\"accent\", this.options.theme.bold(\" Search prompt history\"));\n\t\tconst count = this.options.theme.fg(\"dim\", ` ${matchCount}/${this.options.entries.length} prompts`);\n\t\tthis.clear();\n\t\tthis.addChild(new DynamicBorder((text: string) => this.options.theme.fg(\"accent\", text)));\n\t\tthis.addChild(new Text(`${title}${count}`, 0, 0));\n\t\tthis.addChild(this.searchInput);\n\t\tthis.addChild(list);\n\t\tthis.addChild(\n\t\t\tnew Text(this.options.theme.fg(\"dim\", \" Type to filter • ↑↓ navigate • enter select • esc close\"), 0, 0),\n\t\t);\n\t\tthis.addChild(new DynamicBorder((text: string) => this.options.theme.fg(\"accent\", text)));\n\t}\n}\n"]}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAA4D,MAAM,wBAAwB,CAAC;AAE7G,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8CAA8C,CAAC;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAc/C,KAAK,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;AAEnD,KAAK,2BAA2B,GAAG;IAClC,QAAQ,CAAC,GAAG,EAAE,gBAAgB,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,KAAK,IAAI,CAAC;CACzD,CAAC;AAuBF,qBAAa,oBAAqB,SAAQ,SAAU,YAAW,SAAS;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAmC;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,QAAQ,CAAS;IAEzB,YAAY,OAAO,EAAE,2BAA2B,EAO/C;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;IAED,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAa/B;IAED,cAAc,IAAI,MAAM,CAEvB;IAED,kBAAkB,IAAI,SAAS,YAAY,EAAE,CAE5C;IAED,OAAO,CAAC,OAAO;IAkBf,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,eAAe;CAavB"}
@@ -35,14 +35,11 @@ function describeEntry(entry) {
35
35
  return `${sessionLabel} · ${relativeTime(entry.timestamp)}`;
36
36
  }
37
37
  export class HistorySearchOverlay extends Container {
38
- searchInput;
39
- entriesByValue = new Map();
40
- options;
41
- list;
42
- filteredEntries = [];
43
- _focused = false;
44
38
  constructor(options) {
45
39
  super();
40
+ this.entriesByValue = new Map();
41
+ this.filteredEntries = [];
42
+ this._focused = false;
46
43
  this.options = options;
47
44
  this.searchInput = new Input();
48
45
  this.searchInput.onEscape = () => this.options.done(undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,EAAmB,UAAU,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC7G,OAAO,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAE3F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAIjC,MAAM,mBAAmB,GAAgC;IACxD,eAAe;IACf,iBAAiB;IACjB,oBAAoB;IACpB,mBAAmB;CACnB,CAAC;AAWF,SAAS,YAAY,CAAC,SAAiB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,EAAU;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IACnE,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,EAAE;QAAE,OAAO,GAAG,MAAM,QAAQ,CAAC;IAC1C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;AAAA,CACzC;AAED,SAAS,aAAa,CAAC,KAAmB,EAAU;IACnD,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5F,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,OAAO,GAAG,YAAY,OAAM,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;AAAA,CAC5D;AAED,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IACjC,WAAW,CAAQ;IACnB,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,OAAO,CAA8B;IAC9C,IAAI,CAAyB;IAC7B,eAAe,GAA4B,EAAE,CAAC;IAC9C,QAAQ,GAAG,KAAK,CAAC;IAEzB,YAAY,OAAoC,EAAE;QACjD,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;IAAA,CACf;IAED,IAAI,OAAO,GAAY;QACtB,OAAO,IAAI,CAAC,QAAQ,CAAC;IAAA,CACrB;IAED,IAAI,OAAO,CAAC,KAAc,EAAE;QAC3B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC;IAAA,CACjC;IAED,WAAW,CAAC,KAAa,EAAQ;QAChC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YAC9E,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO;QACR,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC3C,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,MAAM,KAAK,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QAClC,CAAC;IAAA,CACD;IAED,cAAc,GAAW;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;IAAA,CACnC;IAED,kBAAkB,GAA4B;QAC7C,OAAO,IAAI,CAAC,eAAe,CAAC;IAAA,CAC5B;IAEO,OAAO,GAAS;QACvB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxF,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE;YACzF,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;YAC/D,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;YAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;YAC3D,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;YACxD,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;SACxF,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACjF,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAAA,CACxD;IAEO,YAAY,CAAC,KAAmB,EAAE,KAAa,EAAc;QACpE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACtC,OAAO;YACN,KAAK;YACL,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;YACjD,WAAW,EAAE,aAAa,CAAC,KAAK,CAAC;SACjC,CAAC;IAAA,CACF;IAEO,eAAe,CAAC,IAAgB,EAAE,UAAkB,EAAQ;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACjG,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;QACpG,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1F,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,QAAQ,CACZ,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,oEAA0D,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACxG,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CAC1F;CACD","sourcesContent":["import { basename } from \"node:path\";\nimport type { Focusable, TUI } from \"@earendil-works/pi-tui\";\nimport { Container, getKeybindings, Input, type SelectItem, SelectList, Text } from \"@earendil-works/pi-tui\";\nimport { DynamicBorder } from \"../../../../modes/interactive/components/dynamic-border.ts\";\nimport type { Theme } from \"../../../../modes/interactive/theme/theme.ts\";\nimport { filterHistory } from \"./filter.ts\";\nimport type { HistoryEntry } from \"./types.ts\";\n\nconst MAX_VISIBLE_ROWS = 15;\nconst MAX_RENDERED_MATCHES = 250;\n\ntype SelectListAction = \"tui.select.up\" | \"tui.select.down\" | \"tui.select.confirm\" | \"tui.select.cancel\";\n\nconst SELECT_LIST_ACTIONS: readonly SelectListAction[] = [\n\t\"tui.select.up\",\n\t\"tui.select.down\",\n\t\"tui.select.confirm\",\n\t\"tui.select.cancel\",\n];\n\ntype HistorySearchTui = Pick<TUI, \"requestRender\">;\n\ntype HistorySearchOverlayOptions = {\n\treadonly tui: HistorySearchTui;\n\treadonly entries: readonly HistoryEntry[];\n\treadonly theme: Theme;\n\treadonly done: (entry: HistoryEntry | undefined) => void;\n};\n\nfunction relativeTime(timestamp: number, now = Date.now()): string {\n\tconst seconds = Math.max(0, Math.floor((now - timestamp) / 1_000));\n\tif (seconds < 60) return \"now\";\n\tconst minutes = Math.floor(seconds / 60);\n\tif (minutes < 60) return `${minutes}m ago`;\n\tconst hours = Math.floor(minutes / 60);\n\tif (hours < 24) return `${hours}h ago`;\n\tconst days = Math.floor(hours / 24);\n\tif (days < 30) return `${days}d ago`;\n\tconst months = Math.floor(days / 30);\n\tif (months < 12) return `${months}mo ago`;\n\treturn `${Math.floor(months / 12)}y ago`;\n}\n\nfunction describeEntry(entry: HistoryEntry): string {\n\tconst shortId = entry.sessionId.length <= 8 ? entry.sessionId : entry.sessionId.slice(0, 8);\n\tconst cwdName = basename(entry.cwd);\n\tconst sessionLabel = cwdName ? `${cwdName}/${shortId}` : shortId;\n\treturn `${sessionLabel} · ${relativeTime(entry.timestamp)}`;\n}\n\nexport class HistorySearchOverlay extends Container implements Focusable {\n\tprivate readonly searchInput: Input;\n\tprivate readonly entriesByValue = new Map<string, HistoryEntry>();\n\tprivate readonly options: HistorySearchOverlayOptions;\n\tprivate list: SelectList | undefined;\n\tprivate filteredEntries: readonly HistoryEntry[] = [];\n\tprivate _focused = false;\n\n\tconstructor(options: HistorySearchOverlayOptions) {\n\t\tsuper();\n\n\t\tthis.options = options;\n\t\tthis.searchInput = new Input();\n\t\tthis.searchInput.onEscape = () => this.options.done(undefined);\n\t\tthis.rebuild();\n\t}\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\n\thandleInput(input: string): void {\n\t\tconst keybindings = getKeybindings();\n\t\tif (SELECT_LIST_ACTIONS.some((action) => keybindings.matches(input, action))) {\n\t\t\tthis.list?.handleInput(input);\n\t\t\treturn;\n\t\t}\n\n\t\tconst before = this.searchInput.getValue();\n\t\tthis.searchInput.handleInput(input);\n\t\tif (before !== this.searchInput.getValue()) {\n\t\t\tthis.rebuild();\n\t\t\tthis.options.tui.requestRender();\n\t\t}\n\t}\n\n\tgetSearchValue(): string {\n\t\treturn this.searchInput.getValue();\n\t}\n\n\tgetFilteredEntries(): readonly HistoryEntry[] {\n\t\treturn this.filteredEntries;\n\t}\n\n\tprivate rebuild(): void {\n\t\tthis.entriesByValue.clear();\n\t\tthis.filteredEntries = filterHistory(this.options.entries, this.searchInput.getValue());\n\t\tconst renderedEntries = this.filteredEntries.slice(0, MAX_RENDERED_MATCHES);\n\t\tconst items = renderedEntries.map((entry, index) => this.toSelectItem(entry, index));\n\t\tconst list = new SelectList(items, Math.min(MAX_VISIBLE_ROWS, Math.max(1, items.length)), {\n\t\t\tselectedPrefix: (text) => this.options.theme.fg(\"accent\", text),\n\t\t\tselectedText: (text) => text,\n\t\t\tdescription: (text) => this.options.theme.fg(\"muted\", text),\n\t\t\tscrollInfo: (text) => this.options.theme.fg(\"dim\", text),\n\t\t\tnoMatch: (text) => this.options.theme.fg(\"warning\", text.replace(\"commands\", \"prompts\")),\n\t\t});\n\t\tlist.onSelect = (item) => this.options.done(this.entriesByValue.get(item.value));\n\t\tlist.onCancel = () => this.options.done(undefined);\n\t\tthis.list = list;\n\t\tthis.renderContainer(list, this.filteredEntries.length);\n\t}\n\n\tprivate toSelectItem(entry: HistoryEntry, index: number): SelectItem {\n\t\tconst value = String(index);\n\t\tthis.entriesByValue.set(value, entry);\n\t\treturn {\n\t\t\tvalue,\n\t\t\tlabel: entry.text.replace(/[\\r\\n]+/g, \" \").trim(),\n\t\t\tdescription: describeEntry(entry),\n\t\t};\n\t}\n\n\tprivate renderContainer(list: SelectList, matchCount: number): void {\n\t\tconst title = this.options.theme.fg(\"accent\", this.options.theme.bold(\" Search prompt history\"));\n\t\tconst count = this.options.theme.fg(\"dim\", ` ${matchCount}/${this.options.entries.length} prompts`);\n\t\tthis.clear();\n\t\tthis.addChild(new DynamicBorder((text: string) => this.options.theme.fg(\"accent\", text)));\n\t\tthis.addChild(new Text(`${title}${count}`, 0, 0));\n\t\tthis.addChild(this.searchInput);\n\t\tthis.addChild(list);\n\t\tthis.addChild(\n\t\t\tnew Text(this.options.theme.fg(\"dim\", \" Type to filter • ↑↓ navigate • enter select • esc close\"), 0, 0),\n\t\t);\n\t\tthis.addChild(new DynamicBorder((text: string) => this.options.theme.fg(\"accent\", text)));\n\t}\n}\n"]}
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/overlay.ts"],"names":[],"mappings":"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","sourcesContent":["import { basename } from \"node:path\";\nimport type { Focusable, TUI } from \"@earendil-works/pi-tui\";\nimport { Container, getKeybindings, Input, type SelectItem, SelectList, Text } from \"@earendil-works/pi-tui\";\nimport { DynamicBorder } from \"../../../../modes/interactive/components/dynamic-border.ts\";\nimport type { Theme } from \"../../../../modes/interactive/theme/theme.ts\";\nimport { filterHistory } from \"./filter.ts\";\nimport type { HistoryEntry } from \"./types.ts\";\n\nconst MAX_VISIBLE_ROWS = 15;\nconst MAX_RENDERED_MATCHES = 250;\n\ntype SelectListAction = \"tui.select.up\" | \"tui.select.down\" | \"tui.select.confirm\" | \"tui.select.cancel\";\n\nconst SELECT_LIST_ACTIONS: readonly SelectListAction[] = [\n\t\"tui.select.up\",\n\t\"tui.select.down\",\n\t\"tui.select.confirm\",\n\t\"tui.select.cancel\",\n];\n\ntype HistorySearchTui = Pick<TUI, \"requestRender\">;\n\ntype HistorySearchOverlayOptions = {\n\treadonly tui: HistorySearchTui;\n\treadonly entries: readonly HistoryEntry[];\n\treadonly theme: Theme;\n\treadonly done: (entry: HistoryEntry | undefined) => void;\n};\n\nfunction relativeTime(timestamp: number, now = Date.now()): string {\n\tconst seconds = Math.max(0, Math.floor((now - timestamp) / 1_000));\n\tif (seconds < 60) return \"now\";\n\tconst minutes = Math.floor(seconds / 60);\n\tif (minutes < 60) return `${minutes}m ago`;\n\tconst hours = Math.floor(minutes / 60);\n\tif (hours < 24) return `${hours}h ago`;\n\tconst days = Math.floor(hours / 24);\n\tif (days < 30) return `${days}d ago`;\n\tconst months = Math.floor(days / 30);\n\tif (months < 12) return `${months}mo ago`;\n\treturn `${Math.floor(months / 12)}y ago`;\n}\n\nfunction describeEntry(entry: HistoryEntry): string {\n\tconst shortId = entry.sessionId.length <= 8 ? entry.sessionId : entry.sessionId.slice(0, 8);\n\tconst cwdName = basename(entry.cwd);\n\tconst sessionLabel = cwdName ? `${cwdName}/${shortId}` : shortId;\n\treturn `${sessionLabel} · ${relativeTime(entry.timestamp)}`;\n}\n\nexport class HistorySearchOverlay extends Container implements Focusable {\n\tprivate readonly searchInput: Input;\n\tprivate readonly entriesByValue = new Map<string, HistoryEntry>();\n\tprivate readonly options: HistorySearchOverlayOptions;\n\tprivate list: SelectList | undefined;\n\tprivate filteredEntries: readonly HistoryEntry[] = [];\n\tprivate _focused = false;\n\n\tconstructor(options: HistorySearchOverlayOptions) {\n\t\tsuper();\n\n\t\tthis.options = options;\n\t\tthis.searchInput = new Input();\n\t\tthis.searchInput.onEscape = () => this.options.done(undefined);\n\t\tthis.rebuild();\n\t}\n\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t\tthis.searchInput.focused = value;\n\t}\n\n\thandleInput(input: string): void {\n\t\tconst keybindings = getKeybindings();\n\t\tif (SELECT_LIST_ACTIONS.some((action) => keybindings.matches(input, action))) {\n\t\t\tthis.list?.handleInput(input);\n\t\t\treturn;\n\t\t}\n\n\t\tconst before = this.searchInput.getValue();\n\t\tthis.searchInput.handleInput(input);\n\t\tif (before !== this.searchInput.getValue()) {\n\t\t\tthis.rebuild();\n\t\t\tthis.options.tui.requestRender();\n\t\t}\n\t}\n\n\tgetSearchValue(): string {\n\t\treturn this.searchInput.getValue();\n\t}\n\n\tgetFilteredEntries(): readonly HistoryEntry[] {\n\t\treturn this.filteredEntries;\n\t}\n\n\tprivate rebuild(): void {\n\t\tthis.entriesByValue.clear();\n\t\tthis.filteredEntries = filterHistory(this.options.entries, this.searchInput.getValue());\n\t\tconst renderedEntries = this.filteredEntries.slice(0, MAX_RENDERED_MATCHES);\n\t\tconst items = renderedEntries.map((entry, index) => this.toSelectItem(entry, index));\n\t\tconst list = new SelectList(items, Math.min(MAX_VISIBLE_ROWS, Math.max(1, items.length)), {\n\t\t\tselectedPrefix: (text) => this.options.theme.fg(\"accent\", text),\n\t\t\tselectedText: (text) => text,\n\t\t\tdescription: (text) => this.options.theme.fg(\"muted\", text),\n\t\t\tscrollInfo: (text) => this.options.theme.fg(\"dim\", text),\n\t\t\tnoMatch: (text) => this.options.theme.fg(\"warning\", text.replace(\"commands\", \"prompts\")),\n\t\t});\n\t\tlist.onSelect = (item) => this.options.done(this.entriesByValue.get(item.value));\n\t\tlist.onCancel = () => this.options.done(undefined);\n\t\tthis.list = list;\n\t\tthis.renderContainer(list, this.filteredEntries.length);\n\t}\n\n\tprivate toSelectItem(entry: HistoryEntry, index: number): SelectItem {\n\t\tconst value = String(index);\n\t\tthis.entriesByValue.set(value, entry);\n\t\treturn {\n\t\t\tvalue,\n\t\t\tlabel: entry.text.replace(/[\\r\\n]+/g, \" \").trim(),\n\t\t\tdescription: describeEntry(entry),\n\t\t};\n\t}\n\n\tprivate renderContainer(list: SelectList, matchCount: number): void {\n\t\tconst title = this.options.theme.fg(\"accent\", this.options.theme.bold(\" Search prompt history\"));\n\t\tconst count = this.options.theme.fg(\"dim\", ` ${matchCount}/${this.options.entries.length} prompts`);\n\t\tthis.clear();\n\t\tthis.addChild(new DynamicBorder((text: string) => this.options.theme.fg(\"accent\", text)));\n\t\tthis.addChild(new Text(`${title}${count}`, 0, 0));\n\t\tthis.addChild(this.searchInput);\n\t\tthis.addChild(list);\n\t\tthis.addChild(\n\t\t\tnew Text(this.options.theme.fg(\"dim\", \" Type to filter • ↑↓ navigate • enter select • esc close\"), 0, 0),\n\t\t);\n\t\tthis.addChild(new DynamicBorder((text: string) => this.options.theme.fg(\"accent\", text)));\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B,CAAC","sourcesContent":["export type HistoryEntry = {\n\treadonly text: string;\n\treadonly sessionId: string;\n\treadonly sessionFile: string;\n\treadonly cwd: string;\n\treadonly timestamp: number;\n};\n"]}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/history-search/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAOxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAM9D,OAAO,YAAY,MAAM,UAAU,CAAC;AAEpC,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,wDAAyD,CAAC;AAEhG,eAAO,MAAM,+BAA+B;;;;;CAKoC,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAgBtD,CAAC","sourcesContent":["import type { ExtensionFactory } from \"../types.ts\";\nimport anthropicBashExtension from \"./anthropic-bash/index.ts\";\nimport anthropicWebSearchExtension from \"./anthropic-web-search/index.ts\";\nimport bashTimeoutExtension from \"./bash-timeout/index.ts\";\nimport compactionExtension from \"./compaction/index.ts\";\nimport diffExtension from \"./diff.ts\";\nimport filesExtension from \"./files.ts\";\nimport gptApplyPatchExtension from \"./gpt-apply-patch/index.ts\";\nimport historySearchExtension from \"./history-search/index.ts\";\nimport kimiWebSearchExtension from \"./kimi-web-search/index.ts\";\nimport openaiWebSearchExtension from \"./openai-web-search/index.ts\";\nimport permissionSystemExtension from \"./permission-system/index.ts\";\nimport promptPresetExtension from \"./prompt-preset/index.ts\";\nimport promptUrlWidgetExtension from \"./prompt-url-widget.ts\";\nimport redrawsExtension from \"./redraws.ts\";\nimport serviceTierExtension from \"./service-tier.ts\";\nimport sessionObserverExtension from \"./session-observer/index.ts\";\nimport todowriteExtension from \"./todotools/index.ts\";\nimport toolPairGuardExtension from \"./tool-pair-guard/index.ts\";\nimport tpsExtension from \"./tps.ts\";\n\nexport interface BuiltinExtensionFactory {\n\tid: string;\n\tfactory: ExtensionFactory;\n}\n\nexport const globalDefaultExtensionIds = [\"diff\", \"files\", \"prompt-url-widget\", \"tps\"] as const;\n\nexport const globalDefaultExtensionFactories = {\n\tdiff: diffExtension,\n\tfiles: filesExtension,\n\t\"prompt-url-widget\": promptUrlWidgetExtension,\n\ttps: tpsExtension,\n} satisfies Record<(typeof globalDefaultExtensionIds)[number], ExtensionFactory>;\n\nexport const builtinExtensions: BuiltinExtensionFactory[] = [\n\t{ id: \"permission-system\", factory: permissionSystemExtension },\n\t{ id: \"gpt-apply-patch\", factory: gptApplyPatchExtension },\n\t{ id: \"prompt-preset\", factory: promptPresetExtension },\n\t{ id: \"todowrite\", factory: todowriteExtension },\n\t{ id: \"redraws\", factory: redrawsExtension },\n\t{ id: \"anthropic-web-search\", factory: anthropicWebSearchExtension },\n\t{ id: \"anthropic-bash\", factory: anthropicBashExtension },\n\t{ id: \"openai-web-search\", factory: openaiWebSearchExtension },\n\t{ id: \"service-tier\", factory: serviceTierExtension },\n\t{ id: \"bash-timeout\", factory: bashTimeoutExtension },\n\t{ id: \"tool-pair-guard\", factory: toolPairGuardExtension },\n\t{ id: \"compaction\", factory: compactionExtension },\n\t{ id: \"history-search\", factory: historySearchExtension },\n\t{ id: \"session-observer\", factory: sessionObserverExtension },\n\t{ id: \"kimi-web-search\", factory: kimiWebSearchExtension },\n];\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/extensions/builtin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD,OAAO,aAAa,MAAM,WAAW,CAAC;AACtC,OAAO,cAAc,MAAM,YAAY,CAAC;AAOxC,OAAO,wBAAwB,MAAM,wBAAwB,CAAC;AAM9D,OAAO,YAAY,MAAM,UAAU,CAAC;AAEpC,MAAM,WAAW,uBAAuB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,gBAAgB,CAAC;CAC1B;AAED,eAAO,MAAM,yBAAyB,YAAI,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAU,CAAC;AAEhG,eAAO,MAAM,+BAA+B;;;;;CAKoC,CAAC;AAEjF,eAAO,MAAM,iBAAiB,EAAE,uBAAuB,EAgBtD,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/kimi-web-search/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AA4NrE,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmDrE","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { TextContent } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\n\nconst ENABLE_ENV = \"PI_KIMI_WEB_SEARCH\";\nconst SEARCH_BASE_URL_ENV = \"PI_KIMI_SEARCH_BASE_URL\";\nconst FETCH_BASE_URL_ENV = \"PI_KIMI_FETCH_BASE_URL\";\nconst DEFAULT_SEARCH_URL = \"https://api.kimi.com/coding/v1/search\";\nconst DEFAULT_FETCH_URL = \"https://api.kimi.com/coding/v1/fetch\";\n\nfunction parseEnableEnv(envVar: string): boolean {\n\tconst envValue = process.env[envVar];\n\tif (!envValue) {\n\t\treturn true;\n\t}\n\tconst normalized = envValue.trim().toLowerCase();\n\tif (normalized === \"0\" || normalized === \"false\" || normalized === \"no\" || normalized === \"off\") {\n\t\treturn false;\n\t}\n\tif (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\") {\n\t\treturn true;\n\t}\n\treturn true;\n}\n\nfunction isEnabled(): boolean {\n\treturn parseEnableEnv(ENABLE_ENV);\n}\n\nfunction getSearchBaseUrl(): string {\n\treturn process.env[SEARCH_BASE_URL_ENV] || DEFAULT_SEARCH_URL;\n}\n\nfunction getFetchBaseUrl(): string {\n\treturn process.env[FETCH_BASE_URL_ENV] || DEFAULT_FETCH_URL;\n}\n\nasync function resolveApiKey(ctx: ExtensionContext): Promise<string | undefined> {\n\tconst model = ctx.model;\n\tif (!model) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (auth.ok && auth.apiKey) {\n\t\t\treturn auth.apiKey;\n\t\t}\n\t} catch {\n\t\t// ignore\n\t}\n\treturn undefined;\n}\n\nconst searchWebSchema = Type.Object({\n\tquery: Type.String({ description: \"The query text to search for.\" }),\n\tlimit: Type.Optional(\n\t\tType.Number({\n\t\t\tdescription:\n\t\t\t\t\"The number of results to return. Typically you do not need to set this value. When the results do not contain what you need, you probably want to give a more concrete query.\",\n\t\t\tdefault: 5,\n\t\t\tminimum: 1,\n\t\t\tmaximum: 20,\n\t\t}),\n\t),\n\tinclude_content: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Whether to include the content of the web pages in the results. It can consume a large amount of tokens when this is set to True. You should avoid enabling this when limit is set to a large value.\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n});\n\ntype SearchWebInput = Static<typeof searchWebSchema>;\n\nconst fetchUrlSchema = Type.Object({\n\turl: Type.String({ description: \"The URL to fetch content from.\" }),\n});\n\ntype FetchUrlInput = Static<typeof fetchUrlSchema>;\n\ninterface SearchResult {\n\ttitle?: string;\n\turl?: string;\n\tsummary?: string;\n\tcontent?: string;\n}\n\ninterface SearchResponse {\n\tsearch_results?: SearchResult[];\n\tanswer?: string;\n\terror?: string;\n}\n\ninterface FetchResponse {\n\tcontent?: string;\n\tmarkdown?: string;\n\terror?: string;\n}\n\nasync function callKimiSearch(\n\tapiKey: string,\n\ttoolCallId: string,\n\tparams: SearchWebInput,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentToolResult<{ results: SearchResult[]; answer?: string }>> {\n\tconst baseUrl = getSearchBaseUrl();\n\tconst body = {\n\t\ttext_query: params.query,\n\t\tlimit: params.limit ?? 5,\n\t\tenable_page_crawling: params.include_content ?? false,\n\t\ttimeout_seconds: 30,\n\t};\n\n\tconst response = await fetch(baseUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"X-Msh-Tool-Call-Id\": toolCallId,\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal,\n\t} as RequestInit);\n\n\tif (!response.ok) {\n\t\tconst text = await response.text().catch(() => \"Unknown error\");\n\t\tthrow new Error(`Search service HTTP ${response.status}: ${text}`);\n\t}\n\n\tconst data = (await response.json()) as SearchResponse;\n\n\tif (data.error) {\n\t\tthrow new Error(`Search service error: ${data.error}`);\n\t}\n\n\tconst results = data.search_results ?? [];\n\tconst answer = data.answer;\n\n\tlet outputText = \"\";\n\tif (answer) {\n\t\toutputText += `Answer: ${answer}\\n\\n`;\n\t}\n\tif (results.length > 0) {\n\t\toutputText += \"Search results:\\n\";\n\t\tfor (const result of results) {\n\t\t\toutputText += `- ${result.title || \"Untitled\"}\\n`;\n\t\t\toutputText += ` URL: ${result.url || \"N/A\"}\\n`;\n\t\t\tif (result.summary) {\n\t\t\t\toutputText += ` Summary: ${result.summary}\\n`;\n\t\t\t}\n\t\t\tif (result.content) {\n\t\t\t\toutputText += ` Content: ${result.content}\\n`;\n\t\t\t}\n\t\t\toutputText += \"\\n\";\n\t\t}\n\t} else {\n\t\toutputText += \"No search results found.\\n\";\n\t}\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: outputText } as TextContent],\n\t\tdetails: { results, answer },\n\t};\n}\n\nasync function callKimiFetch(\n\tapiKey: string,\n\ttoolCallId: string,\n\tparams: FetchUrlInput,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentToolResult<{ url: string; content: string }>> {\n\tconst baseUrl = getFetchBaseUrl();\n\tconst body = {\n\t\turl: params.url,\n\t};\n\n\tconst response = await fetch(baseUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"X-Msh-Tool-Call-Id\": toolCallId,\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal,\n\t} as RequestInit);\n\n\tif (!response.ok) {\n\t\t// Fallback: try local fetch\n\t\tconst localResponse = await fetch(params.url, {\n\t\t\tmethod: \"GET\",\n\t\t\theaders: {\n\t\t\t\t\"User-Agent\":\n\t\t\t\t\t\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\",\n\t\t\t},\n\t\t\tsignal,\n\t\t} as RequestInit);\n\t\tif (!localResponse.ok) {\n\t\t\tthrow new Error(`Fetch URL failed: service HTTP ${response.status}, local HTTP ${localResponse.status}`);\n\t\t}\n\t\tconst text = await localResponse.text();\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text } as TextContent],\n\t\t\tdetails: { url: params.url, content: text },\n\t\t};\n\t}\n\n\tconst data = (await response.json()) as FetchResponse;\n\n\tif (data.error) {\n\t\tthrow new Error(`Fetch service error: ${data.error}`);\n\t}\n\n\tconst content = data.markdown || data.content || \"\";\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: content } as TextContent],\n\t\tdetails: { url: params.url, content },\n\t};\n}\n\nexport default function kimiWebSearchExtension(pi: ExtensionAPI): void {\n\tif (!isEnabled()) {\n\t\treturn;\n\t}\n\n\tpi.registerTool({\n\t\tname: \"SearchWeb\",\n\t\tlabel: \"SearchWeb\",\n\t\tdescription:\n\t\t\t\"WebSearch tool allows you to search on the internet to get latest information, including news, documents, release notes, blog posts, papers, etc.\",\n\t\tpromptSnippet: \"SearchWeb — search the internet for current information\",\n\t\tparameters: searchWebSchema,\n\t\tasync execute(toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst apiKey = await resolveApiKey(ctx);\n\t\t\tif (!apiKey) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Search service is not configured. No API key found for Kimi provider.\",\n\t\t\t\t\t\t} as TextContent,\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { results: [], error: \"No API key\" },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn callKimiSearch(apiKey, toolCallId, params, signal);\n\t\t},\n\t});\n\n\tpi.registerTool({\n\t\tname: \"FetchURL\",\n\t\tlabel: \"FetchURL\",\n\t\tdescription: \"FetchURL tool allows you to fetch content from a URL.\",\n\t\tpromptSnippet: \"FetchURL — fetch web page content from a URL\",\n\t\tparameters: fetchUrlSchema,\n\t\tasync execute(toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst apiKey = await resolveApiKey(ctx);\n\t\t\tif (!apiKey) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Fetch service is not configured. No API key found for Kimi provider.\",\n\t\t\t\t\t\t} as TextContent,\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { url: params.url, content: \"\", error: \"No API key\" },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn callKimiFetch(apiKey, toolCallId, params, signal);\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/kimi-web-search/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AA4NrE,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAmDrE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/kimi-web-search/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { TextContent } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\n\nconst ENABLE_ENV = \"PI_KIMI_WEB_SEARCH\";\nconst SEARCH_BASE_URL_ENV = \"PI_KIMI_SEARCH_BASE_URL\";\nconst FETCH_BASE_URL_ENV = \"PI_KIMI_FETCH_BASE_URL\";\nconst DEFAULT_SEARCH_URL = \"https://api.kimi.com/coding/v1/search\";\nconst DEFAULT_FETCH_URL = \"https://api.kimi.com/coding/v1/fetch\";\n\nfunction parseEnableEnv(envVar: string): boolean {\n\tconst envValue = process.env[envVar];\n\tif (!envValue) {\n\t\treturn true;\n\t}\n\tconst normalized = envValue.trim().toLowerCase();\n\tif (normalized === \"0\" || normalized === \"false\" || normalized === \"no\" || normalized === \"off\") {\n\t\treturn false;\n\t}\n\tif (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\") {\n\t\treturn true;\n\t}\n\treturn true;\n}\n\nfunction isEnabled(): boolean {\n\treturn parseEnableEnv(ENABLE_ENV);\n}\n\nfunction getSearchBaseUrl(): string {\n\treturn process.env[SEARCH_BASE_URL_ENV] || DEFAULT_SEARCH_URL;\n}\n\nfunction getFetchBaseUrl(): string {\n\treturn process.env[FETCH_BASE_URL_ENV] || DEFAULT_FETCH_URL;\n}\n\nasync function resolveApiKey(ctx: ExtensionContext): Promise<string | undefined> {\n\tconst model = ctx.model;\n\tif (!model) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (auth.ok && auth.apiKey) {\n\t\t\treturn auth.apiKey;\n\t\t}\n\t} catch {\n\t\t// ignore\n\t}\n\treturn undefined;\n}\n\nconst searchWebSchema = Type.Object({\n\tquery: Type.String({ description: \"The query text to search for.\" }),\n\tlimit: Type.Optional(\n\t\tType.Number({\n\t\t\tdescription:\n\t\t\t\t\"The number of results to return. Typically you do not need to set this value. When the results do not contain what you need, you probably want to give a more concrete query.\",\n\t\t\tdefault: 5,\n\t\t\tminimum: 1,\n\t\t\tmaximum: 20,\n\t\t}),\n\t),\n\tinclude_content: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Whether to include the content of the web pages in the results. It can consume a large amount of tokens when this is set to True. You should avoid enabling this when limit is set to a large value.\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n});\n\ntype SearchWebInput = Static<typeof searchWebSchema>;\n\nconst fetchUrlSchema = Type.Object({\n\turl: Type.String({ description: \"The URL to fetch content from.\" }),\n});\n\ntype FetchUrlInput = Static<typeof fetchUrlSchema>;\n\ninterface SearchResult {\n\ttitle?: string;\n\turl?: string;\n\tsummary?: string;\n\tcontent?: string;\n}\n\ninterface SearchResponse {\n\tsearch_results?: SearchResult[];\n\tanswer?: string;\n\terror?: string;\n}\n\ninterface FetchResponse {\n\tcontent?: string;\n\tmarkdown?: string;\n\terror?: string;\n}\n\nasync function callKimiSearch(\n\tapiKey: string,\n\ttoolCallId: string,\n\tparams: SearchWebInput,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentToolResult<{ results: SearchResult[]; answer?: string }>> {\n\tconst baseUrl = getSearchBaseUrl();\n\tconst body = {\n\t\ttext_query: params.query,\n\t\tlimit: params.limit ?? 5,\n\t\tenable_page_crawling: params.include_content ?? false,\n\t\ttimeout_seconds: 30,\n\t};\n\n\tconst response = await fetch(baseUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"X-Msh-Tool-Call-Id\": toolCallId,\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal,\n\t} as RequestInit);\n\n\tif (!response.ok) {\n\t\tconst text = await response.text().catch(() => \"Unknown error\");\n\t\tthrow new Error(`Search service HTTP ${response.status}: ${text}`);\n\t}\n\n\tconst data = (await response.json()) as SearchResponse;\n\n\tif (data.error) {\n\t\tthrow new Error(`Search service error: ${data.error}`);\n\t}\n\n\tconst results = data.search_results ?? [];\n\tconst answer = data.answer;\n\n\tlet outputText = \"\";\n\tif (answer) {\n\t\toutputText += `Answer: ${answer}\\n\\n`;\n\t}\n\tif (results.length > 0) {\n\t\toutputText += \"Search results:\\n\";\n\t\tfor (const result of results) {\n\t\t\toutputText += `- ${result.title || \"Untitled\"}\\n`;\n\t\t\toutputText += ` URL: ${result.url || \"N/A\"}\\n`;\n\t\t\tif (result.summary) {\n\t\t\t\toutputText += ` Summary: ${result.summary}\\n`;\n\t\t\t}\n\t\t\tif (result.content) {\n\t\t\t\toutputText += ` Content: ${result.content}\\n`;\n\t\t\t}\n\t\t\toutputText += \"\\n\";\n\t\t}\n\t} else {\n\t\toutputText += \"No search results found.\\n\";\n\t}\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: outputText } as TextContent],\n\t\tdetails: { results, answer },\n\t};\n}\n\nasync function callKimiFetch(\n\tapiKey: string,\n\ttoolCallId: string,\n\tparams: FetchUrlInput,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentToolResult<{ url: string; content: string }>> {\n\tconst baseUrl = getFetchBaseUrl();\n\tconst body = {\n\t\turl: params.url,\n\t};\n\n\tconst response = await fetch(baseUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"X-Msh-Tool-Call-Id\": toolCallId,\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal,\n\t} as RequestInit);\n\n\tif (!response.ok) {\n\t\t// Fallback: try local fetch\n\t\tconst localResponse = await fetch(params.url, {\n\t\t\tmethod: \"GET\",\n\t\t\theaders: {\n\t\t\t\t\"User-Agent\":\n\t\t\t\t\t\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\",\n\t\t\t},\n\t\t\tsignal,\n\t\t} as RequestInit);\n\t\tif (!localResponse.ok) {\n\t\t\tthrow new Error(`Fetch URL failed: service HTTP ${response.status}, local HTTP ${localResponse.status}`);\n\t\t}\n\t\tconst text = await localResponse.text();\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text } as TextContent],\n\t\t\tdetails: { url: params.url, content: text },\n\t\t};\n\t}\n\n\tconst data = (await response.json()) as FetchResponse;\n\n\tif (data.error) {\n\t\tthrow new Error(`Fetch service error: ${data.error}`);\n\t}\n\n\tconst content = data.markdown || data.content || \"\";\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: content } as TextContent],\n\t\tdetails: { url: params.url, content },\n\t};\n}\n\nexport default function kimiWebSearchExtension(pi: ExtensionAPI): void {\n\tif (!isEnabled()) {\n\t\treturn;\n\t}\n\n\tpi.registerTool({\n\t\tname: \"SearchWeb\",\n\t\tlabel: \"SearchWeb\",\n\t\tdescription:\n\t\t\t\"WebSearch tool allows you to search on the internet to get latest information, including news, documents, release notes, blog posts, papers, etc.\",\n\t\tpromptSnippet: \"SearchWeb — search the internet for current information\",\n\t\tparameters: searchWebSchema,\n\t\tasync execute(toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst apiKey = await resolveApiKey(ctx);\n\t\t\tif (!apiKey) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Search service is not configured. No API key found for Kimi provider.\",\n\t\t\t\t\t\t} as TextContent,\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { results: [], error: \"No API key\" },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn callKimiSearch(apiKey, toolCallId, params, signal);\n\t\t},\n\t});\n\n\tpi.registerTool({\n\t\tname: \"FetchURL\",\n\t\tlabel: \"FetchURL\",\n\t\tdescription: \"FetchURL tool allows you to fetch content from a URL.\",\n\t\tpromptSnippet: \"FetchURL — fetch web page content from a URL\",\n\t\tparameters: fetchUrlSchema,\n\t\tasync execute(toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst apiKey = await resolveApiKey(ctx);\n\t\t\tif (!apiKey) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Fetch service is not configured. No API key found for Kimi provider.\",\n\t\t\t\t\t\t} as TextContent,\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { url: params.url, content: \"\", error: \"No API key\" },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn callKimiFetch(apiKey, toolCallId, params, signal);\n\t\t},\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/kimi-web-search/index.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { TextContent } from \"@earendil-works/pi-ai\";\nimport { type Static, Type } from \"typebox\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\n\nconst ENABLE_ENV = \"PI_KIMI_WEB_SEARCH\";\nconst SEARCH_BASE_URL_ENV = \"PI_KIMI_SEARCH_BASE_URL\";\nconst FETCH_BASE_URL_ENV = \"PI_KIMI_FETCH_BASE_URL\";\nconst DEFAULT_SEARCH_URL = \"https://api.kimi.com/coding/v1/search\";\nconst DEFAULT_FETCH_URL = \"https://api.kimi.com/coding/v1/fetch\";\n\nfunction parseEnableEnv(envVar: string): boolean {\n\tconst envValue = process.env[envVar];\n\tif (!envValue) {\n\t\treturn true;\n\t}\n\tconst normalized = envValue.trim().toLowerCase();\n\tif (normalized === \"0\" || normalized === \"false\" || normalized === \"no\" || normalized === \"off\") {\n\t\treturn false;\n\t}\n\tif (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\") {\n\t\treturn true;\n\t}\n\treturn true;\n}\n\nfunction isEnabled(): boolean {\n\treturn parseEnableEnv(ENABLE_ENV);\n}\n\nfunction getSearchBaseUrl(): string {\n\treturn process.env[SEARCH_BASE_URL_ENV] || DEFAULT_SEARCH_URL;\n}\n\nfunction getFetchBaseUrl(): string {\n\treturn process.env[FETCH_BASE_URL_ENV] || DEFAULT_FETCH_URL;\n}\n\nasync function resolveApiKey(ctx: ExtensionContext): Promise<string | undefined> {\n\tconst model = ctx.model;\n\tif (!model) {\n\t\treturn undefined;\n\t}\n\ttry {\n\t\tconst auth = await ctx.modelRegistry.getApiKeyAndHeaders(model);\n\t\tif (auth.ok && auth.apiKey) {\n\t\t\treturn auth.apiKey;\n\t\t}\n\t} catch {\n\t\t// ignore\n\t}\n\treturn undefined;\n}\n\nconst searchWebSchema = Type.Object({\n\tquery: Type.String({ description: \"The query text to search for.\" }),\n\tlimit: Type.Optional(\n\t\tType.Number({\n\t\t\tdescription:\n\t\t\t\t\"The number of results to return. Typically you do not need to set this value. When the results do not contain what you need, you probably want to give a more concrete query.\",\n\t\t\tdefault: 5,\n\t\t\tminimum: 1,\n\t\t\tmaximum: 20,\n\t\t}),\n\t),\n\tinclude_content: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription:\n\t\t\t\t\"Whether to include the content of the web pages in the results. It can consume a large amount of tokens when this is set to True. You should avoid enabling this when limit is set to a large value.\",\n\t\t\tdefault: false,\n\t\t}),\n\t),\n});\n\ntype SearchWebInput = Static<typeof searchWebSchema>;\n\nconst fetchUrlSchema = Type.Object({\n\turl: Type.String({ description: \"The URL to fetch content from.\" }),\n});\n\ntype FetchUrlInput = Static<typeof fetchUrlSchema>;\n\ninterface SearchResult {\n\ttitle?: string;\n\turl?: string;\n\tsummary?: string;\n\tcontent?: string;\n}\n\ninterface SearchResponse {\n\tsearch_results?: SearchResult[];\n\tanswer?: string;\n\terror?: string;\n}\n\ninterface FetchResponse {\n\tcontent?: string;\n\tmarkdown?: string;\n\terror?: string;\n}\n\nasync function callKimiSearch(\n\tapiKey: string,\n\ttoolCallId: string,\n\tparams: SearchWebInput,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentToolResult<{ results: SearchResult[]; answer?: string }>> {\n\tconst baseUrl = getSearchBaseUrl();\n\tconst body = {\n\t\ttext_query: params.query,\n\t\tlimit: params.limit ?? 5,\n\t\tenable_page_crawling: params.include_content ?? false,\n\t\ttimeout_seconds: 30,\n\t};\n\n\tconst response = await fetch(baseUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"X-Msh-Tool-Call-Id\": toolCallId,\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal,\n\t} as RequestInit);\n\n\tif (!response.ok) {\n\t\tconst text = await response.text().catch(() => \"Unknown error\");\n\t\tthrow new Error(`Search service HTTP ${response.status}: ${text}`);\n\t}\n\n\tconst data = (await response.json()) as SearchResponse;\n\n\tif (data.error) {\n\t\tthrow new Error(`Search service error: ${data.error}`);\n\t}\n\n\tconst results = data.search_results ?? [];\n\tconst answer = data.answer;\n\n\tlet outputText = \"\";\n\tif (answer) {\n\t\toutputText += `Answer: ${answer}\\n\\n`;\n\t}\n\tif (results.length > 0) {\n\t\toutputText += \"Search results:\\n\";\n\t\tfor (const result of results) {\n\t\t\toutputText += `- ${result.title || \"Untitled\"}\\n`;\n\t\t\toutputText += ` URL: ${result.url || \"N/A\"}\\n`;\n\t\t\tif (result.summary) {\n\t\t\t\toutputText += ` Summary: ${result.summary}\\n`;\n\t\t\t}\n\t\t\tif (result.content) {\n\t\t\t\toutputText += ` Content: ${result.content}\\n`;\n\t\t\t}\n\t\t\toutputText += \"\\n\";\n\t\t}\n\t} else {\n\t\toutputText += \"No search results found.\\n\";\n\t}\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: outputText } as TextContent],\n\t\tdetails: { results, answer },\n\t};\n}\n\nasync function callKimiFetch(\n\tapiKey: string,\n\ttoolCallId: string,\n\tparams: FetchUrlInput,\n\tsignal: AbortSignal | undefined,\n): Promise<AgentToolResult<{ url: string; content: string }>> {\n\tconst baseUrl = getFetchBaseUrl();\n\tconst body = {\n\t\turl: params.url,\n\t};\n\n\tconst response = await fetch(baseUrl, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t\tAuthorization: `Bearer ${apiKey}`,\n\t\t\t\"X-Msh-Tool-Call-Id\": toolCallId,\n\t\t},\n\t\tbody: JSON.stringify(body),\n\t\tsignal,\n\t} as RequestInit);\n\n\tif (!response.ok) {\n\t\t// Fallback: try local fetch\n\t\tconst localResponse = await fetch(params.url, {\n\t\t\tmethod: \"GET\",\n\t\t\theaders: {\n\t\t\t\t\"User-Agent\":\n\t\t\t\t\t\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36\",\n\t\t\t},\n\t\t\tsignal,\n\t\t} as RequestInit);\n\t\tif (!localResponse.ok) {\n\t\t\tthrow new Error(`Fetch URL failed: service HTTP ${response.status}, local HTTP ${localResponse.status}`);\n\t\t}\n\t\tconst text = await localResponse.text();\n\t\treturn {\n\t\t\tcontent: [{ type: \"text\", text } as TextContent],\n\t\t\tdetails: { url: params.url, content: text },\n\t\t};\n\t}\n\n\tconst data = (await response.json()) as FetchResponse;\n\n\tif (data.error) {\n\t\tthrow new Error(`Fetch service error: ${data.error}`);\n\t}\n\n\tconst content = data.markdown || data.content || \"\";\n\n\treturn {\n\t\tcontent: [{ type: \"text\", text: content } as TextContent],\n\t\tdetails: { url: params.url, content },\n\t};\n}\n\nexport default function kimiWebSearchExtension(pi: ExtensionAPI): void {\n\tif (!isEnabled()) {\n\t\treturn;\n\t}\n\n\tpi.registerTool({\n\t\tname: \"SearchWeb\",\n\t\tlabel: \"SearchWeb\",\n\t\tdescription:\n\t\t\t\"WebSearch tool allows you to search on the internet to get latest information, including news, documents, release notes, blog posts, papers, etc.\",\n\t\tpromptSnippet: \"SearchWeb — search the internet for current information\",\n\t\tparameters: searchWebSchema,\n\t\tasync execute(toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst apiKey = await resolveApiKey(ctx);\n\t\t\tif (!apiKey) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Search service is not configured. No API key found for Kimi provider.\",\n\t\t\t\t\t\t} as TextContent,\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { results: [], error: \"No API key\" },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn callKimiSearch(apiKey, toolCallId, params, signal);\n\t\t},\n\t});\n\n\tpi.registerTool({\n\t\tname: \"FetchURL\",\n\t\tlabel: \"FetchURL\",\n\t\tdescription: \"FetchURL tool allows you to fetch content from a URL.\",\n\t\tpromptSnippet: \"FetchURL — fetch web page content from a URL\",\n\t\tparameters: fetchUrlSchema,\n\t\tasync execute(toolCallId, params, signal, _onUpdate, ctx) {\n\t\t\tconst apiKey = await resolveApiKey(ctx);\n\t\t\tif (!apiKey) {\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext: \"Fetch service is not configured. No API key found for Kimi provider.\",\n\t\t\t\t\t\t} as TextContent,\n\t\t\t\t\t],\n\t\t\t\t\tdetails: { url: params.url, content: \"\", error: \"No API key\" },\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn callKimiFetch(apiKey, toolCallId, params, signal);\n\t\t},\n\t});\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/openai-web-search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAyB,MAAM,uBAAuB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAGrE,KAAK,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;AAC3E,KAAK,qBAAqB,GAAG,GAAG,GAAG,oBAAoB,GAAG,SAAS,CAAC;AAsDpE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAWpF;AA2FD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAoDpG;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAYD,eAAO,MAAM,yBAAyB,wMAMrC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8BvE","sourcesContent":["import type { Api, Model, OpenAIResponsesCompat } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../types.ts\";\n\ntype ToolDefinition = Record<string, unknown>;\ntype OpenAiWebSearchModel = Pick<Model<Api>, \"api\" | \"baseUrl\" | \"compat\">;\ntype OpenAiWebSearchTarget = Api | OpenAiWebSearchModel | undefined;\n\nconst OPENAI_RESPONSES_APIS: ReadonlySet<Api> = new Set([\"openai-responses\", \"azure-openai-responses\"]);\nconst ENABLE_ENV = \"PI_OPENAI_WEB_SEARCH\";\nconst NATIVE_OPENAI_WEB_SEARCH_TYPE = \"web_search_preview\";\nconst WEB_SEARCH_SOURCES_INCLUDE = \"web_search_call.action.sources\";\nconst STATUS_KEY = \"openai-web-search\";\nconst WIDGET_KEY = \"openai-web-search\";\n\nfunction parseEnableEnv(envVar: string): boolean {\n\tconst envValue = process.env[envVar];\n\tif (!envValue) {\n\t\treturn true;\n\t}\n\n\tconst normalized = envValue.trim().toLowerCase();\n\tif (normalized === \"0\" || normalized === \"false\" || normalized === \"no\" || normalized === \"off\") {\n\t\treturn false;\n\t}\n\n\tif (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\") {\n\t\treturn true;\n\t}\n\n\t// Unknown values fall back to default-on behavior.\n\treturn true;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nfunction isOpenAiResponsesApi(api: Api | undefined): api is \"openai-responses\" | \"azure-openai-responses\" {\n\treturn api !== undefined && OPENAI_RESPONSES_APIS.has(api);\n}\n\nfunction resolveTarget(target: OpenAiWebSearchTarget): OpenAiWebSearchModel | undefined {\n\tif (target === undefined) {\n\t\treturn undefined;\n\t}\n\tif (typeof target === \"string\") {\n\t\treturn { api: target, baseUrl: target === \"openai-responses\" ? \"https://api.openai.com/v1\" : \"\" };\n\t}\n\treturn target;\n}\n\nfunction isOpenAiResponsesNativeEndpoint(model: OpenAiWebSearchModel): boolean {\n\ttry {\n\t\treturn new URL(model.baseUrl || \"https://api.openai.com/v1\").hostname === \"api.openai.com\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport function supportsNativeOpenAiWebSearch(target: OpenAiWebSearchTarget): boolean {\n\tconst model = resolveTarget(target);\n\tif (!isOpenAiResponsesApi(model?.api)) {\n\t\treturn false;\n\t}\n\tif (model.api === \"azure-openai-responses\") {\n\t\treturn true;\n\t}\n\n\tconst compat = model.compat as OpenAIResponsesCompat | undefined;\n\treturn compat?.supportsWebSearchPreview ?? isOpenAiResponsesNativeEndpoint(model);\n}\n\nfunction isNativeOpenAiWebSearchType(value: unknown): value is \"web_search_preview\" | \"web_search_preview_2025_03_11\" {\n\treturn value === \"web_search_preview\" || value === \"web_search_preview_2025_03_11\";\n}\n\nfunction isUnsupportedWebSearchType(value: unknown): boolean {\n\treturn (\n\t\ttypeof value === \"string\" &&\n\t\t(value === \"web_search\" || value.startsWith(\"web_search_\")) &&\n\t\t!isNativeOpenAiWebSearchType(value)\n\t);\n}\n\nfunction isAnthropicWebFetchType(value: unknown): boolean {\n\treturn typeof value === \"string\" && value.startsWith(\"web_fetch_\");\n}\n\ntype SanitizedTools = {\n\tchanged: boolean;\n\ttools: ToolDefinition[];\n};\n\ntype SanitizeToolsOptions = {\n\tstripFunctionWebSearch: boolean;\n};\n\nfunction stripNativeOpenAiWebSearch(payload: unknown): unknown {\n\tif (!isRecord(payload)) {\n\t\treturn payload;\n\t}\n\n\tlet changed = false;\n\tconst sanitized: Record<string, unknown> = { ...payload };\n\n\tconst tools = payload.tools;\n\tif (Array.isArray(tools)) {\n\t\tconst sanitizedTools = tools.filter((tool) => !(isRecord(tool) && isNativeOpenAiWebSearchType(tool.type)));\n\t\tif (sanitizedTools.length !== tools.length) {\n\t\t\tchanged = true;\n\t\t\tsanitized.tools = sanitizedTools;\n\t\t}\n\t}\n\n\tconst include = payload.include;\n\tif (Array.isArray(include)) {\n\t\tconst sanitizedInclude = include.filter((value) => value !== WEB_SEARCH_SOURCES_INCLUDE);\n\t\tif (sanitizedInclude.length !== include.length) {\n\t\t\tchanged = true;\n\t\t\tsanitized.include = sanitizedInclude;\n\t\t}\n\t}\n\n\tif (isRecord(payload.tool_choice) && isNativeOpenAiWebSearchType(payload.tool_choice.type)) {\n\t\tchanged = true;\n\t\tdelete sanitized.tool_choice;\n\t}\n\n\treturn changed ? sanitized : payload;\n}\n\nfunction sanitizeTools(tools: unknown[], options: SanitizeToolsOptions): SanitizedTools {\n\tconst sanitized: ToolDefinition[] = [];\n\tlet changed = false;\n\tfor (const tool of tools) {\n\t\tif (!isRecord(tool)) {\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst type = tool.type;\n\t\tconst shouldStripFunctionVariant =\n\t\t\toptions.stripFunctionWebSearch && tool.name === \"web_search\" && !isNativeOpenAiWebSearchType(type);\n\t\tconst shouldStripProviderNativeVariant = isUnsupportedWebSearchType(type) || isAnthropicWebFetchType(type);\n\t\tif (shouldStripFunctionVariant || shouldStripProviderNativeVariant) {\n\t\t\tchanged = true;\n\t\t} else {\n\t\t\tsanitized.push(tool);\n\t\t}\n\t}\n\n\treturn { changed, tools: sanitized };\n}\n\nfunction includeWebSearchSources(payload: Record<string, unknown>): string[] {\n\tconst include = Array.isArray(payload.include)\n\t\t? payload.include.filter((value): value is string => typeof value === \"string\")\n\t\t: [];\n\treturn include.includes(WEB_SEARCH_SOURCES_INCLUDE) ? include : [...include, WEB_SEARCH_SOURCES_INCLUDE];\n}\n\nexport function addOpenAiWebSearchToPayload(target: OpenAiWebSearchTarget, payload: unknown): unknown {\n\tconst model = resolveTarget(target);\n\tif (!isOpenAiResponsesApi(model?.api)) {\n\t\t// Defense in depth. `web_search_preview` is an OpenAI Responses-only tool\n\t\t// type, but proxies that translate openai-responses → anthropic-messages\n\t\t// (e.g., ccapi/quotio for Claude models) can forward it verbatim, which\n\t\t// Anthropic rejects with `tools.N: Input tag 'web_search_preview'...`.\n\t\t// Strip the OpenAI-native variants for any non-openai-responses payload\n\t\t// so they never leak to Anthropic or Chat Completions backends.\n\t\treturn stripNativeOpenAiWebSearch(payload);\n\t}\n\n\tif (!isRecord(payload)) {\n\t\treturn payload;\n\t}\n\n\tconst supportsNativeWebSearch = supportsNativeOpenAiWebSearch(model);\n\tconst tools = Array.isArray(payload.tools) ? payload.tools : [];\n\tconst shouldInjectWebSearch = supportsNativeWebSearch && isOpenaiWebSearchEnabled();\n\tconst strippedPayload = supportsNativeWebSearch ? payload : stripNativeOpenAiWebSearch(payload);\n\tif (!isRecord(strippedPayload)) {\n\t\treturn strippedPayload;\n\t}\n\n\tconst strippedTools = Array.isArray(strippedPayload.tools) ? strippedPayload.tools : [];\n\tconst activeTools = supportsNativeWebSearch ? tools : strippedTools;\n\tconst sanitized = sanitizeTools(tools, { stripFunctionWebSearch: shouldInjectWebSearch });\n\tconst sanitizedTools = sanitized.tools;\n\tif (!shouldInjectWebSearch) {\n\t\tconst nativeStripped = strippedPayload !== payload;\n\t\tconst passiveSanitized = sanitizeTools(activeTools, { stripFunctionWebSearch: false });\n\t\tif (!nativeStripped && !passiveSanitized.changed) {\n\t\t\treturn strippedPayload;\n\t\t}\n\n\t\treturn {\n\t\t\t...strippedPayload,\n\t\t\ttools: passiveSanitized.tools,\n\t\t};\n\t}\n\n\tconst hasNativeWebSearch = sanitizedTools.some((tool) => isNativeOpenAiWebSearchType(tool.type));\n\n\tif (!hasNativeWebSearch) {\n\t\tsanitizedTools.push({ type: NATIVE_OPENAI_WEB_SEARCH_TYPE });\n\t}\n\n\treturn {\n\t\t...payload,\n\t\ttools: sanitizedTools,\n\t\tinclude: includeWebSearchSources(payload),\n\t};\n}\n\nexport function isOpenaiWebSearchEnabled(): boolean {\n\treturn parseEnableEnv(ENABLE_ENV);\n}\n\nfunction clearUi(ctx: ExtensionContext): void {\n\tif (!ctx.hasUI) return;\n\tctx.ui.setStatus(STATUS_KEY, undefined);\n\tctx.ui.setWidget(WIDGET_KEY, undefined);\n}\n\nfunction syncUi(ctx: ExtensionContext): void {\n\tclearUi(ctx);\n}\n\nexport const OPENAI_WEB_SEARCH_SECTION = `\n## Web Search\n\nNative web search is available in this session.\nUse web search when the user asks for current or online information.\nPrefer web search over guessing when freshness matters.\n`;\n\nexport default function openaiWebSearchExtension(pi: ExtensionAPI): void {\n\tpi.on(\"before_provider_request\", (event, ctx) => {\n\t\treturn addOpenAiWebSearchToPayload(ctx.model, event.payload);\n\t});\n\n\tpi.on(\"session_start\", async (_event, ctx) => {\n\t\tsyncUi(ctx);\n\t});\n\n\tpi.on(\"model_select\", async (_event, ctx) => {\n\t\tsyncUi(ctx);\n\t});\n\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tclearUi(ctx);\n\t});\n\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\tif (!supportsNativeOpenAiWebSearch(ctx.model)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!isOpenaiWebSearchEnabled()) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn {\n\t\t\tsystemPrompt: `${event.systemPrompt}\\n${OPENAI_WEB_SEARCH_SECTION}`,\n\t\t};\n\t});\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/openai-web-search/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAyB,MAAM,uBAAuB,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,gBAAgB,CAAC;AAGrE,KAAK,oBAAoB,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;AAC3E,KAAK,qBAAqB,GAAG,GAAG,GAAG,oBAAoB,GAAG,SAAS,CAAC;AAsDpE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAWpF;AA2FD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,qBAAqB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAoDpG;AAED,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAYD,eAAO,MAAM,yBAAyB,wMAMrC,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,wBAAwB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8BvE"}