@code-yeongyu/senpi 2026.6.4 → 2026.6.10

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 (1142) hide show
  1. package/CHANGELOG.md +64 -1
  2. package/README.md +127 -110
  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 +13 -4
  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/project-trust.d.ts +10 -0
  22. package/dist/cli/project-trust.d.ts.map +1 -0
  23. package/dist/cli/project-trust.js +48 -0
  24. package/dist/cli/project-trust.js.map +1 -0
  25. package/dist/cli/session-picker.d.ts.map +1 -1
  26. package/dist/cli/session-picker.js.map +1 -1
  27. package/dist/cli/startup-ui.d.ts +7 -0
  28. package/dist/cli/startup-ui.d.ts.map +1 -0
  29. package/dist/cli/startup-ui.js +59 -0
  30. package/dist/cli/startup-ui.js.map +1 -0
  31. package/dist/cli-main.d.ts.map +1 -1
  32. package/dist/cli-main.js.map +1 -1
  33. package/dist/cli.d.ts.map +1 -1
  34. package/dist/cli.js +10 -1
  35. package/dist/cli.js.map +1 -1
  36. package/dist/config.d.ts.map +1 -1
  37. package/dist/config.js.map +1 -1
  38. package/dist/core/agent-session-runtime.d.ts +3 -1
  39. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  40. package/dist/core/agent-session-runtime.js +4 -9
  41. package/dist/core/agent-session-runtime.js.map +1 -1
  42. package/dist/core/agent-session-services.d.ts +2 -1
  43. package/dist/core/agent-session-services.d.ts.map +1 -1
  44. package/dist/core/agent-session-services.js +2 -2
  45. package/dist/core/agent-session-services.js.map +1 -1
  46. package/dist/core/agent-session.d.ts +33 -0
  47. package/dist/core/agent-session.d.ts.map +1 -1
  48. package/dist/core/agent-session.js +57 -79
  49. package/dist/core/agent-session.js.map +1 -1
  50. package/dist/core/auth-guidance.d.ts.map +1 -1
  51. package/dist/core/auth-guidance.js.map +1 -1
  52. package/dist/core/auth-storage.d.ts +4 -0
  53. package/dist/core/auth-storage.d.ts.map +1 -1
  54. package/dist/core/auth-storage.js +4 -8
  55. package/dist/core/auth-storage.js.map +1 -1
  56. package/dist/core/bash-executor.d.ts.map +1 -1
  57. package/dist/core/bash-executor.js.map +1 -1
  58. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  59. package/dist/core/compaction/branch-summarization.js.map +1 -1
  60. package/dist/core/compaction/compaction.d.ts.map +1 -1
  61. package/dist/core/compaction/compaction.js.map +1 -1
  62. package/dist/core/compaction/index.d.ts.map +1 -1
  63. package/dist/core/compaction/utils.d.ts +1 -1
  64. package/dist/core/compaction/utils.d.ts.map +1 -1
  65. package/dist/core/compaction/utils.js +1 -1
  66. package/dist/core/compaction/utils.js.map +1 -1
  67. package/dist/core/defaults.d.ts.map +1 -1
  68. package/dist/core/diagnostics.d.ts.map +1 -1
  69. package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
  70. package/dist/core/dynamic-prompt/build.js.map +1 -1
  71. package/dist/core/dynamic-prompt/exploration.d.ts.map +1 -1
  72. package/dist/core/dynamic-prompt/exploration.js.map +1 -1
  73. package/dist/core/dynamic-prompt/identity.d.ts.map +1 -1
  74. package/dist/core/dynamic-prompt/identity.js.map +1 -1
  75. package/dist/core/dynamic-prompt/index.d.ts.map +1 -1
  76. package/dist/core/dynamic-prompt/intent-gate.d.ts.map +1 -1
  77. package/dist/core/dynamic-prompt/intent-gate.js.map +1 -1
  78. package/dist/core/dynamic-prompt/parallel-tools.d.ts.map +1 -1
  79. package/dist/core/dynamic-prompt/parallel-tools.js.map +1 -1
  80. package/dist/core/dynamic-prompt/policies.d.ts.map +1 -1
  81. package/dist/core/dynamic-prompt/policies.js.map +1 -1
  82. package/dist/core/dynamic-prompt/style.d.ts.map +1 -1
  83. package/dist/core/dynamic-prompt/style.js.map +1 -1
  84. package/dist/core/dynamic-prompt/tool-categorization.d.ts.map +1 -1
  85. package/dist/core/dynamic-prompt/tool-categorization.js.map +1 -1
  86. package/dist/core/dynamic-prompt/tool-section.d.ts.map +1 -1
  87. package/dist/core/dynamic-prompt/tool-section.js.map +1 -1
  88. package/dist/core/dynamic-prompt/types.d.ts.map +1 -1
  89. package/dist/core/dynamic-prompt/verification.d.ts.map +1 -1
  90. package/dist/core/dynamic-prompt/verification.js.map +1 -1
  91. package/dist/core/event-bus.d.ts.map +1 -1
  92. package/dist/core/event-bus.js.map +1 -1
  93. package/dist/core/exec.d.ts.map +1 -1
  94. package/dist/core/exec.js.map +1 -1
  95. package/dist/core/experimental.d.ts +2 -0
  96. package/dist/core/experimental.d.ts.map +1 -0
  97. package/dist/core/experimental.js +4 -0
  98. package/dist/core/experimental.js.map +1 -0
  99. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  100. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  101. package/dist/core/export-html/index.d.ts.map +1 -1
  102. package/dist/core/export-html/index.js.map +1 -1
  103. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  104. package/dist/core/export-html/tool-renderer.js.map +1 -1
  105. package/dist/core/extensions/builtin/anthropic-bash/index.d.ts.map +1 -1
  106. package/dist/core/extensions/builtin/anthropic-bash/index.js.map +1 -1
  107. package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
  108. package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
  109. package/dist/core/extensions/builtin/bash-timeout/index.d.ts.map +1 -1
  110. package/dist/core/extensions/builtin/bash-timeout/index.js.map +1 -1
  111. package/dist/core/extensions/builtin/bash-timeout/timeout.d.ts.map +1 -1
  112. package/dist/core/extensions/builtin/bash-timeout/timeout.js.map +1 -1
  113. package/dist/core/extensions/builtin/compaction/checkpoint-state.d.ts.map +1 -1
  114. package/dist/core/extensions/builtin/compaction/checkpoint-state.js.map +1 -1
  115. package/dist/core/extensions/builtin/compaction/circuit-breaker.d.ts.map +1 -1
  116. package/dist/core/extensions/builtin/compaction/circuit-breaker.js.map +1 -1
  117. package/dist/core/extensions/builtin/compaction/context-reduction.d.ts.map +1 -1
  118. package/dist/core/extensions/builtin/compaction/context-reduction.js +1 -1
  119. package/dist/core/extensions/builtin/compaction/context-reduction.js.map +1 -1
  120. package/dist/core/extensions/builtin/compaction/degradation-monitor.d.ts.map +1 -1
  121. package/dist/core/extensions/builtin/compaction/degradation-monitor.js.map +1 -1
  122. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  123. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  124. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  125. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  126. package/dist/core/extensions/builtin/compaction/overflow-detection.d.ts.map +1 -1
  127. package/dist/core/extensions/builtin/compaction/overflow-detection.js.map +1 -1
  128. package/dist/core/extensions/builtin/compaction/per-turn-cap.d.ts.map +1 -1
  129. package/dist/core/extensions/builtin/compaction/per-turn-cap.js.map +1 -1
  130. package/dist/core/extensions/builtin/compaction/policy.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/compaction/policy.js.map +1 -1
  132. package/dist/core/extensions/builtin/compaction/prompts.d.ts.map +1 -1
  133. package/dist/core/extensions/builtin/compaction/prompts.js.map +1 -1
  134. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/compaction/repair-tool-pairs.js.map +1 -1
  136. package/dist/core/extensions/builtin/compaction/restoration-tracker.d.ts.map +1 -1
  137. package/dist/core/extensions/builtin/compaction/restoration-tracker.js.map +1 -1
  138. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  139. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  140. package/dist/core/extensions/builtin/compaction/state.d.ts.map +1 -1
  141. package/dist/core/extensions/builtin/compaction/state.js.map +1 -1
  142. package/dist/core/extensions/builtin/compaction/todo-bridge.d.ts.map +1 -1
  143. package/dist/core/extensions/builtin/compaction/todo-bridge.js.map +1 -1
  144. package/dist/core/extensions/builtin/compaction/tool-truncation.d.ts.map +1 -1
  145. package/dist/core/extensions/builtin/compaction/tool-truncation.js.map +1 -1
  146. package/dist/core/extensions/builtin/diff.d.ts.map +1 -1
  147. package/dist/core/extensions/builtin/diff.js.map +1 -1
  148. package/dist/core/extensions/builtin/files.d.ts.map +1 -1
  149. package/dist/core/extensions/builtin/files.js.map +1 -1
  150. package/dist/core/extensions/builtin/gpt-apply-patch/apply.d.ts.map +1 -1
  151. package/dist/core/extensions/builtin/gpt-apply-patch/apply.js.map +1 -1
  152. package/dist/core/extensions/builtin/gpt-apply-patch/constants.d.ts.map +1 -1
  153. package/dist/core/extensions/builtin/gpt-apply-patch/constants.js.map +1 -1
  154. package/dist/core/extensions/builtin/gpt-apply-patch/errors.d.ts.map +1 -1
  155. package/dist/core/extensions/builtin/gpt-apply-patch/errors.js +0 -2
  156. package/dist/core/extensions/builtin/gpt-apply-patch/errors.js.map +1 -1
  157. package/dist/core/extensions/builtin/gpt-apply-patch/extension.d.ts.map +1 -1
  158. package/dist/core/extensions/builtin/gpt-apply-patch/extension.js.map +1 -1
  159. package/dist/core/extensions/builtin/gpt-apply-patch/index.d.ts.map +1 -1
  160. package/dist/core/extensions/builtin/gpt-apply-patch/params.d.ts.map +1 -1
  161. package/dist/core/extensions/builtin/gpt-apply-patch/params.js.map +1 -1
  162. package/dist/core/extensions/builtin/gpt-apply-patch/parser.d.ts.map +1 -1
  163. package/dist/core/extensions/builtin/gpt-apply-patch/parser.js.map +1 -1
  164. package/dist/core/extensions/builtin/gpt-apply-patch/patch-diff.d.ts.map +1 -1
  165. package/dist/core/extensions/builtin/gpt-apply-patch/patch-diff.js.map +1 -1
  166. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.d.ts.map +1 -1
  167. package/dist/core/extensions/builtin/gpt-apply-patch/patch-replace.js.map +1 -1
  168. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.d.ts.map +1 -1
  169. package/dist/core/extensions/builtin/gpt-apply-patch/preview-format.js.map +1 -1
  170. package/dist/core/extensions/builtin/gpt-apply-patch/preview.d.ts.map +1 -1
  171. package/dist/core/extensions/builtin/gpt-apply-patch/preview.js.map +1 -1
  172. package/dist/core/extensions/builtin/gpt-apply-patch/seek-sequence.d.ts.map +1 -1
  173. package/dist/core/extensions/builtin/gpt-apply-patch/seek-sequence.js.map +1 -1
  174. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.d.ts.map +1 -1
  175. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js +7 -5
  176. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-parser.js.map +1 -1
  177. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.d.ts.map +1 -1
  178. package/dist/core/extensions/builtin/gpt-apply-patch/streaming-render.js.map +1 -1
  179. package/dist/core/extensions/builtin/gpt-apply-patch/text.d.ts.map +1 -1
  180. package/dist/core/extensions/builtin/gpt-apply-patch/text.js.map +1 -1
  181. package/dist/core/extensions/builtin/gpt-apply-patch/tool.d.ts.map +1 -1
  182. package/dist/core/extensions/builtin/gpt-apply-patch/tool.js.map +1 -1
  183. package/dist/core/extensions/builtin/gpt-apply-patch/types.d.ts.map +1 -1
  184. package/dist/core/extensions/builtin/gpt-apply-patch/workspace.d.ts.map +1 -1
  185. package/dist/core/extensions/builtin/gpt-apply-patch/workspace.js.map +1 -1
  186. package/dist/core/extensions/builtin/history-search/filter.d.ts.map +1 -1
  187. package/dist/core/extensions/builtin/history-search/filter.js.map +1 -1
  188. package/dist/core/extensions/builtin/history-search/index.d.ts.map +1 -1
  189. package/dist/core/extensions/builtin/history-search/index.js.map +1 -1
  190. package/dist/core/extensions/builtin/history-search/indexer.d.ts.map +1 -1
  191. package/dist/core/extensions/builtin/history-search/indexer.js.map +1 -1
  192. package/dist/core/extensions/builtin/history-search/overlay.d.ts.map +1 -1
  193. package/dist/core/extensions/builtin/history-search/overlay.js +3 -6
  194. package/dist/core/extensions/builtin/history-search/overlay.js.map +1 -1
  195. package/dist/core/extensions/builtin/history-search/types.d.ts.map +1 -1
  196. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  197. package/dist/core/extensions/builtin/kimi-web-search/index.d.ts.map +1 -1
  198. package/dist/core/extensions/builtin/kimi-web-search/index.js.map +1 -1
  199. package/dist/core/extensions/builtin/openai-web-search/index.d.ts.map +1 -1
  200. package/dist/core/extensions/builtin/openai-web-search/index.js.map +1 -1
  201. package/dist/core/extensions/builtin/permission-system/arity.d.ts.map +1 -1
  202. package/dist/core/extensions/builtin/permission-system/arity.js.map +1 -1
  203. package/dist/core/extensions/builtin/permission-system/cli.d.ts.map +1 -1
  204. package/dist/core/extensions/builtin/permission-system/cli.js.map +1 -1
  205. package/dist/core/extensions/builtin/permission-system/config.d.ts.map +1 -1
  206. package/dist/core/extensions/builtin/permission-system/config.js.map +1 -1
  207. package/dist/core/extensions/builtin/permission-system/evaluate.d.ts.map +1 -1
  208. package/dist/core/extensions/builtin/permission-system/evaluate.js.map +1 -1
  209. package/dist/core/extensions/builtin/permission-system/events.d.ts.map +1 -1
  210. package/dist/core/extensions/builtin/permission-system/events.js.map +1 -1
  211. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  212. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  213. package/dist/core/extensions/builtin/permission-system/index.d.ts.map +1 -1
  214. package/dist/core/extensions/builtin/permission-system/index.js.map +1 -1
  215. package/dist/core/extensions/builtin/permission-system/non-interactive.d.ts.map +1 -1
  216. package/dist/core/extensions/builtin/permission-system/non-interactive.js.map +1 -1
  217. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  218. package/dist/core/extensions/builtin/permission-system/parsers.js +3 -1
  219. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  220. package/dist/core/extensions/builtin/permission-system/prompt.d.ts.map +1 -1
  221. package/dist/core/extensions/builtin/permission-system/prompt.js.map +1 -1
  222. package/dist/core/extensions/builtin/permission-system/service.d.ts.map +1 -1
  223. package/dist/core/extensions/builtin/permission-system/service.js +2 -5
  224. package/dist/core/extensions/builtin/permission-system/service.js.map +1 -1
  225. package/dist/core/extensions/builtin/permission-system/settings.d.ts.map +1 -1
  226. package/dist/core/extensions/builtin/permission-system/settings.js.map +1 -1
  227. package/dist/core/extensions/builtin/permission-system/storage.d.ts.map +1 -1
  228. package/dist/core/extensions/builtin/permission-system/storage.js.map +1 -1
  229. package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
  230. package/dist/core/extensions/builtin/permission-system/types.js +3 -5
  231. package/dist/core/extensions/builtin/permission-system/types.js.map +1 -1
  232. package/dist/core/extensions/builtin/permission-system/wildcard.d.ts.map +1 -1
  233. package/dist/core/extensions/builtin/permission-system/wildcard.js.map +1 -1
  234. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
  235. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
  236. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
  237. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
  238. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
  239. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
  240. package/dist/core/extensions/builtin/prompt-preset/file-operations.d.ts.map +1 -1
  241. package/dist/core/extensions/builtin/prompt-preset/file-operations.js.map +1 -1
  242. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.d.ts.map +1 -1
  243. package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js.map +1 -1
  244. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.d.ts.map +1 -1
  245. package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js.map +1 -1
  246. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.d.ts.map +1 -1
  247. package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js.map +1 -1
  248. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts.map +1 -1
  249. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
  250. package/dist/core/extensions/builtin/prompt-preset/gpt-5.d.ts.map +1 -1
  251. package/dist/core/extensions/builtin/prompt-preset/gpt-5.js.map +1 -1
  252. package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
  253. package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
  254. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.d.ts.map +1 -1
  255. package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
  256. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  257. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  258. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  259. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  260. package/dist/core/extensions/builtin/prompt-url-widget.d.ts.map +1 -1
  261. package/dist/core/extensions/builtin/prompt-url-widget.js.map +1 -1
  262. package/dist/core/extensions/builtin/redraws.d.ts.map +1 -1
  263. package/dist/core/extensions/builtin/redraws.js.map +1 -1
  264. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  265. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  266. package/dist/core/extensions/builtin/session-observer/index.d.ts.map +1 -1
  267. package/dist/core/extensions/builtin/session-observer/index.js.map +1 -1
  268. package/dist/core/extensions/builtin/session-observer/loader.d.ts.map +1 -1
  269. package/dist/core/extensions/builtin/session-observer/loader.js.map +1 -1
  270. package/dist/core/extensions/builtin/session-observer/overlay-format.d.ts.map +1 -1
  271. package/dist/core/extensions/builtin/session-observer/overlay-format.js.map +1 -1
  272. package/dist/core/extensions/builtin/session-observer/overlay.d.ts.map +1 -1
  273. package/dist/core/extensions/builtin/session-observer/overlay.js +13 -18
  274. package/dist/core/extensions/builtin/session-observer/overlay.js.map +1 -1
  275. package/dist/core/extensions/builtin/session-observer/scanner.d.ts.map +1 -1
  276. package/dist/core/extensions/builtin/session-observer/scanner.js.map +1 -1
  277. package/dist/core/extensions/builtin/session-observer/text.d.ts.map +1 -1
  278. package/dist/core/extensions/builtin/session-observer/text.js.map +1 -1
  279. package/dist/core/extensions/builtin/session-observer/transcript-entries.d.ts.map +1 -1
  280. package/dist/core/extensions/builtin/session-observer/transcript-entries.js.map +1 -1
  281. package/dist/core/extensions/builtin/session-observer/transcript-format.d.ts.map +1 -1
  282. package/dist/core/extensions/builtin/session-observer/transcript-format.js.map +1 -1
  283. package/dist/core/extensions/builtin/session-observer/transcript.d.ts.map +1 -1
  284. package/dist/core/extensions/builtin/session-observer/transcript.js.map +1 -1
  285. package/dist/core/extensions/builtin/session-observer/types.d.ts.map +1 -1
  286. package/dist/core/extensions/builtin/system-messages.d.ts.map +1 -1
  287. package/dist/core/extensions/builtin/system-messages.js.map +1 -1
  288. package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
  289. package/dist/core/extensions/builtin/todotools/index.js +0 -2
  290. package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
  291. package/dist/core/extensions/builtin/todotools/prompt.d.ts +1 -1
  292. package/dist/core/extensions/builtin/todotools/prompt.d.ts.map +1 -1
  293. package/dist/core/extensions/builtin/todotools/prompt.js +0 -2
  294. package/dist/core/extensions/builtin/todotools/prompt.js.map +1 -1
  295. package/dist/core/extensions/builtin/todotools/state.d.ts.map +1 -1
  296. package/dist/core/extensions/builtin/todotools/state.js.map +1 -1
  297. package/dist/core/extensions/builtin/todotools/tools/todoread.d.ts.map +1 -1
  298. package/dist/core/extensions/builtin/todotools/tools/todoread.js.map +1 -1
  299. package/dist/core/extensions/builtin/todotools/tools/todowrite.d.ts.map +1 -1
  300. package/dist/core/extensions/builtin/todotools/tools/todowrite.js.map +1 -1
  301. package/dist/core/extensions/builtin/tool-pair-guard/index.d.ts.map +1 -1
  302. package/dist/core/extensions/builtin/tool-pair-guard/index.js.map +1 -1
  303. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.d.ts.map +1 -1
  304. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-anthropic-payload.js.map +1 -1
  305. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.d.ts.map +1 -1
  306. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-chat-completions-payload.js.map +1 -1
  307. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.d.ts.map +1 -1
  308. package/dist/core/extensions/builtin/tool-pair-guard/sanitize-openai-responses-payload.js.map +1 -1
  309. package/dist/core/extensions/builtin/tps.d.ts.map +1 -1
  310. package/dist/core/extensions/builtin/tps.js.map +1 -1
  311. package/dist/core/extensions/index.d.ts +1 -1
  312. package/dist/core/extensions/index.d.ts.map +1 -1
  313. package/dist/core/extensions/index.js.map +1 -1
  314. package/dist/core/extensions/loader.d.ts +1 -1
  315. package/dist/core/extensions/loader.d.ts.map +1 -1
  316. package/dist/core/extensions/loader.js +4 -4
  317. package/dist/core/extensions/loader.js.map +1 -1
  318. package/dist/core/extensions/runner.d.ts +7 -2
  319. package/dist/core/extensions/runner.d.ts.map +1 -1
  320. package/dist/core/extensions/runner.js +69 -43
  321. package/dist/core/extensions/runner.js.map +1 -1
  322. package/dist/core/extensions/types.d.ts +22 -2
  323. package/dist/core/extensions/types.d.ts.map +1 -1
  324. package/dist/core/extensions/types.js.map +1 -1
  325. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  326. package/dist/core/extensions/wrapper.js.map +1 -1
  327. package/dist/core/footer-data-provider.d.ts.map +1 -1
  328. package/dist/core/footer-data-provider.js +17 -18
  329. package/dist/core/footer-data-provider.js.map +1 -1
  330. package/dist/core/http-dispatcher.d.ts.map +1 -1
  331. package/dist/core/http-dispatcher.js.map +1 -1
  332. package/dist/core/index.d.ts +1 -0
  333. package/dist/core/index.d.ts.map +1 -1
  334. package/dist/core/index.js +1 -0
  335. package/dist/core/index.js.map +1 -1
  336. package/dist/core/keybindings.d.ts +1 -1
  337. package/dist/core/keybindings.d.ts.map +1 -1
  338. package/dist/core/keybindings.js +0 -1
  339. package/dist/core/keybindings.js.map +1 -1
  340. package/dist/core/messages.d.ts.map +1 -1
  341. package/dist/core/messages.js.map +1 -1
  342. package/dist/core/model-registry.d.ts +3 -1
  343. package/dist/core/model-registry.d.ts.map +1 -1
  344. package/dist/core/model-registry.js +30 -13
  345. package/dist/core/model-registry.js.map +1 -1
  346. package/dist/core/model-resolver.d.ts.map +1 -1
  347. package/dist/core/model-resolver.js.map +1 -1
  348. package/dist/core/output-guard.d.ts.map +1 -1
  349. package/dist/core/output-guard.js.map +1 -1
  350. package/dist/core/package-manager.d.ts +1 -0
  351. package/dist/core/package-manager.d.ts.map +1 -1
  352. package/dist/core/package-manager.js +25 -13
  353. package/dist/core/package-manager.js.map +1 -1
  354. package/dist/core/project-trust.d.ts +15 -0
  355. package/dist/core/project-trust.d.ts.map +1 -0
  356. package/dist/core/project-trust.js +58 -0
  357. package/dist/core/project-trust.js.map +1 -0
  358. package/dist/core/prompt-templates.d.ts +2 -1
  359. package/dist/core/prompt-templates.d.ts.map +1 -1
  360. package/dist/core/prompt-templates.js +24 -26
  361. package/dist/core/prompt-templates.js.map +1 -1
  362. package/dist/core/provider-attribution.d.ts.map +1 -1
  363. package/dist/core/provider-attribution.js.map +1 -1
  364. package/dist/core/provider-display-names.d.ts.map +1 -1
  365. package/dist/core/resolve-config-value.d.ts.map +1 -1
  366. package/dist/core/resolve-config-value.js.map +1 -1
  367. package/dist/core/resource-loader.d.ts +14 -2
  368. package/dist/core/resource-loader.d.ts.map +1 -1
  369. package/dist/core/resource-loader.js +117 -74
  370. package/dist/core/resource-loader.js.map +1 -1
  371. package/dist/core/sdk.d.ts.map +1 -1
  372. package/dist/core/sdk.js.map +1 -1
  373. package/dist/core/session-cwd.d.ts.map +1 -1
  374. package/dist/core/session-cwd.js +0 -1
  375. package/dist/core/session-cwd.js.map +1 -1
  376. package/dist/core/session-manager.d.ts +3 -0
  377. package/dist/core/session-manager.d.ts.map +1 -1
  378. package/dist/core/session-manager.js +41 -28
  379. package/dist/core/session-manager.js.map +1 -1
  380. package/dist/core/session-resident-store.d.ts +16 -0
  381. package/dist/core/session-resident-store.d.ts.map +1 -0
  382. package/dist/core/session-resident-store.js +48 -0
  383. package/dist/core/session-resident-store.js.map +1 -0
  384. package/dist/core/session-work-barrier.d.ts.map +1 -1
  385. package/dist/core/session-work-barrier.js +5 -3
  386. package/dist/core/session-work-barrier.js.map +1 -1
  387. package/dist/core/settings-manager.d.ts +14 -2
  388. package/dist/core/settings-manager.d.ts.map +1 -1
  389. package/dist/core/settings-manager.js +86 -46
  390. package/dist/core/settings-manager.js.map +1 -1
  391. package/dist/core/skills.d.ts.map +1 -1
  392. package/dist/core/skills.js.map +1 -1
  393. package/dist/core/slash-commands.d.ts.map +1 -1
  394. package/dist/core/slash-commands.js +1 -0
  395. package/dist/core/slash-commands.js.map +1 -1
  396. package/dist/core/source-info.d.ts.map +1 -1
  397. package/dist/core/source-info.js.map +1 -1
  398. package/dist/core/system-prompt.d.ts.map +1 -1
  399. package/dist/core/system-prompt.js.map +1 -1
  400. package/dist/core/telemetry.d.ts.map +1 -1
  401. package/dist/core/telemetry.js.map +1 -1
  402. package/dist/core/thinking-levels.d.ts.map +1 -1
  403. package/dist/core/thinking-levels.js.map +1 -1
  404. package/dist/core/timings.d.ts.map +1 -1
  405. package/dist/core/timings.js.map +1 -1
  406. package/dist/core/tools/bash.d.ts.map +1 -1
  407. package/dist/core/tools/bash.js +9 -6
  408. package/dist/core/tools/bash.js.map +1 -1
  409. package/dist/core/tools/diff-render.d.ts.map +1 -1
  410. package/dist/core/tools/diff-render.js.map +1 -1
  411. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  412. package/dist/core/tools/edit-diff.js.map +1 -1
  413. package/dist/core/tools/edit.d.ts.map +1 -1
  414. package/dist/core/tools/edit.js.map +1 -1
  415. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  416. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  417. package/dist/core/tools/find.d.ts.map +1 -1
  418. package/dist/core/tools/find.js +1 -1
  419. package/dist/core/tools/find.js.map +1 -1
  420. package/dist/core/tools/grep.d.ts.map +1 -1
  421. package/dist/core/tools/grep.js +1 -1
  422. package/dist/core/tools/grep.js.map +1 -1
  423. package/dist/core/tools/index.d.ts.map +1 -1
  424. package/dist/core/tools/index.js.map +1 -1
  425. package/dist/core/tools/ls.d.ts.map +1 -1
  426. package/dist/core/tools/ls.js +1 -1
  427. package/dist/core/tools/ls.js.map +1 -1
  428. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  429. package/dist/core/tools/output-accumulator.js +12 -18
  430. package/dist/core/tools/output-accumulator.js.map +1 -1
  431. package/dist/core/tools/path-utils.d.ts.map +1 -1
  432. package/dist/core/tools/path-utils.js.map +1 -1
  433. package/dist/core/tools/read.d.ts.map +1 -1
  434. package/dist/core/tools/read.js +1 -1
  435. package/dist/core/tools/read.js.map +1 -1
  436. package/dist/core/tools/render-utils.d.ts.map +1 -1
  437. package/dist/core/tools/render-utils.js.map +1 -1
  438. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  439. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  440. package/dist/core/tools/truncate.d.ts.map +1 -1
  441. package/dist/core/tools/truncate.js.map +1 -1
  442. package/dist/core/tools/write.d.ts.map +1 -1
  443. package/dist/core/tools/write.js +1 -2
  444. package/dist/core/tools/write.js.map +1 -1
  445. package/dist/core/trust-manager.d.ts +31 -0
  446. package/dist/core/trust-manager.d.ts.map +1 -0
  447. package/dist/core/trust-manager.js +186 -0
  448. package/dist/core/trust-manager.js.map +1 -0
  449. package/dist/index.d.ts +5 -4
  450. package/dist/index.d.ts.map +1 -1
  451. package/dist/index.js +2 -1
  452. package/dist/index.js.map +1 -1
  453. package/dist/main.d.ts.map +1 -1
  454. package/dist/main.js +101 -86
  455. package/dist/main.js.map +1 -1
  456. package/dist/migrations.d.ts.map +1 -1
  457. package/dist/migrations.js +39 -34
  458. package/dist/migrations.js.map +1 -1
  459. package/dist/modes/index.d.ts +1 -1
  460. package/dist/modes/index.d.ts.map +1 -1
  461. package/dist/modes/index.js.map +1 -1
  462. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  463. package/dist/modes/interactive/components/armin.js +6 -10
  464. package/dist/modes/interactive/components/armin.js.map +1 -1
  465. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  466. package/dist/modes/interactive/components/assistant-message.js +2 -11
  467. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  468. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  469. package/dist/modes/interactive/components/bash-execution.js +6 -11
  470. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  471. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  472. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  473. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  474. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  475. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  476. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  477. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  478. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  479. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  480. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  481. package/dist/modes/interactive/components/config-selector.js +5 -15
  482. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  483. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  484. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  485. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  486. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  487. package/dist/modes/interactive/components/custom-editor.js +1 -8
  488. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  489. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  490. package/dist/modes/interactive/components/custom-message.js +1 -6
  491. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  492. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  493. package/dist/modes/interactive/components/daxnuts.js +6 -8
  494. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  495. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  496. package/dist/modes/interactive/components/diff.js +2 -2
  497. package/dist/modes/interactive/components/diff.js.map +1 -1
  498. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  499. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  500. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  501. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  502. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  503. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  504. package/dist/modes/interactive/components/extension-editor.js +1 -6
  505. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  506. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  507. package/dist/modes/interactive/components/extension-input.js +2 -8
  508. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  509. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  510. package/dist/modes/interactive/components/extension-selector.js +1 -9
  511. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  512. package/dist/modes/interactive/components/favorite-models-selector.d.ts.map +1 -1
  513. package/dist/modes/interactive/components/favorite-models-selector.js +9 -15
  514. package/dist/modes/interactive/components/favorite-models-selector.js.map +1 -1
  515. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  516. package/dist/modes/interactive/components/footer.js +10 -3
  517. package/dist/modes/interactive/components/footer.js.map +1 -1
  518. package/dist/modes/interactive/components/index.d.ts +1 -0
  519. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  520. package/dist/modes/interactive/components/index.js +1 -0
  521. package/dist/modes/interactive/components/index.js.map +1 -1
  522. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  523. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  524. package/dist/modes/interactive/components/login-dialog.d.ts +1 -0
  525. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  526. package/dist/modes/interactive/components/login-dialog.js +10 -10
  527. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  528. package/dist/modes/interactive/components/model-favorites.d.ts.map +1 -1
  529. package/dist/modes/interactive/components/model-favorites.js.map +1 -1
  530. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  531. package/dist/modes/interactive/components/model-selector.js +9 -22
  532. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  533. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  534. package/dist/modes/interactive/components/oauth-selector.js +3 -12
  535. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  536. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  537. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  538. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  539. package/dist/modes/interactive/components/session-selector.js +33 -58
  540. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  541. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  542. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  543. package/dist/modes/interactive/components/settings-selector.js +20 -4
  544. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  545. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  546. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  547. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  548. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  549. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  550. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  551. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  552. package/dist/modes/interactive/components/theme-selector.js +0 -2
  553. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  554. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  555. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  556. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  557. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  558. package/dist/modes/interactive/components/tool-execution.js +35 -32
  559. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  560. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  561. package/dist/modes/interactive/components/tree-selector.js +18 -32
  562. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  563. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  564. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  565. package/dist/modes/interactive/components/trust-selector.js +85 -0
  566. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  567. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  568. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  569. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  570. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  571. package/dist/modes/interactive/components/user-message.js +0 -1
  572. package/dist/modes/interactive/components/user-message.js.map +1 -1
  573. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  574. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  575. package/dist/modes/interactive/interactive-mode.d.ts +39 -0
  576. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  577. package/dist/modes/interactive/interactive-mode.js +264 -114
  578. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  579. package/dist/modes/interactive/session-info-format.d.ts.map +1 -1
  580. package/dist/modes/interactive/session-info-format.js.map +1 -1
  581. package/dist/modes/interactive/startup-tools.d.ts.map +1 -1
  582. package/dist/modes/interactive/startup-tools.js.map +1 -1
  583. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  584. package/dist/modes/interactive/theme/theme.js +0 -6
  585. package/dist/modes/interactive/theme/theme.js.map +1 -1
  586. package/dist/modes/interactive/working-status.d.ts +2 -0
  587. package/dist/modes/interactive/working-status.d.ts.map +1 -1
  588. package/dist/modes/interactive/working-status.js +34 -0
  589. package/dist/modes/interactive/working-status.js.map +1 -1
  590. package/dist/modes/print-mode.d.ts.map +1 -1
  591. package/dist/modes/print-mode.js.map +1 -1
  592. package/dist/modes/provider-native-rendering.d.ts.map +1 -1
  593. package/dist/modes/provider-native-rendering.js.map +1 -1
  594. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  595. package/dist/modes/rpc/jsonl.js.map +1 -1
  596. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  597. package/dist/modes/rpc/rpc-client.js +7 -8
  598. package/dist/modes/rpc/rpc-client.js.map +1 -1
  599. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  600. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  601. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  602. package/dist/package-manager-cli.d.ts +6 -2
  603. package/dist/package-manager-cli.d.ts.map +1 -1
  604. package/dist/package-manager-cli.js +105 -11
  605. package/dist/package-manager-cli.js.map +1 -1
  606. package/dist/self-update-bootstrap.d.ts.map +1 -1
  607. package/dist/self-update-bootstrap.js.map +1 -1
  608. package/dist/senpi +10 -1
  609. package/dist/utils/ansi.d.ts.map +1 -1
  610. package/dist/utils/ansi.js.map +1 -1
  611. package/dist/utils/changelog.d.ts +1 -0
  612. package/dist/utils/changelog.d.ts.map +1 -1
  613. package/dist/utils/changelog.js +78 -0
  614. package/dist/utils/changelog.js.map +1 -1
  615. package/dist/utils/child-process.d.ts.map +1 -1
  616. package/dist/utils/child-process.js.map +1 -1
  617. package/dist/utils/clipboard-image.d.ts.map +1 -1
  618. package/dist/utils/clipboard-image.js.map +1 -1
  619. package/dist/utils/clipboard-native.d.ts.map +1 -1
  620. package/dist/utils/clipboard-native.js.map +1 -1
  621. package/dist/utils/clipboard.d.ts.map +1 -1
  622. package/dist/utils/clipboard.js.map +1 -1
  623. package/dist/utils/deprecation.d.ts.map +1 -1
  624. package/dist/utils/deprecation.js.map +1 -1
  625. package/dist/utils/exif-orientation.d.ts.map +1 -1
  626. package/dist/utils/exif-orientation.js.map +1 -1
  627. package/dist/utils/frontmatter.d.ts.map +1 -1
  628. package/dist/utils/frontmatter.js.map +1 -1
  629. package/dist/utils/fs-watch.d.ts.map +1 -1
  630. package/dist/utils/fs-watch.js.map +1 -1
  631. package/dist/utils/git.d.ts.map +1 -1
  632. package/dist/utils/git.js.map +1 -1
  633. package/dist/utils/html.d.ts.map +1 -1
  634. package/dist/utils/html.js.map +1 -1
  635. package/dist/utils/image-convert.d.ts.map +1 -1
  636. package/dist/utils/image-convert.js.map +1 -1
  637. package/dist/utils/image-resize-core.d.ts.map +1 -1
  638. package/dist/utils/image-resize-core.js.map +1 -1
  639. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  640. package/dist/utils/image-resize-worker.js.map +1 -1
  641. package/dist/utils/image-resize.d.ts.map +1 -1
  642. package/dist/utils/image-resize.js.map +1 -1
  643. package/dist/utils/json.d.ts.map +1 -1
  644. package/dist/utils/json.js.map +1 -1
  645. package/dist/utils/mime.d.ts.map +1 -1
  646. package/dist/utils/mime.js.map +1 -1
  647. package/dist/utils/open-browser.d.ts.map +1 -1
  648. package/dist/utils/open-browser.js.map +1 -1
  649. package/dist/utils/paths.d.ts.map +1 -1
  650. package/dist/utils/paths.js.map +1 -1
  651. package/dist/utils/photon.d.ts.map +1 -1
  652. package/dist/utils/photon.js.map +1 -1
  653. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  654. package/dist/utils/pi-user-agent.js.map +1 -1
  655. package/dist/utils/shell.d.ts.map +1 -1
  656. package/dist/utils/shell.js.map +1 -1
  657. package/dist/utils/sleep.d.ts.map +1 -1
  658. package/dist/utils/sleep.js.map +1 -1
  659. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  660. package/dist/utils/syntax-highlight.js.map +1 -1
  661. package/dist/utils/tools-manager.d.ts.map +1 -1
  662. package/dist/utils/tools-manager.js.map +1 -1
  663. package/dist/utils/version-check.d.ts.map +1 -1
  664. package/dist/utils/version-check.js.map +1 -1
  665. package/dist/utils/windows-self-update.d.ts.map +1 -1
  666. package/dist/utils/windows-self-update.js.map +1 -1
  667. package/docs/docs.json +4 -0
  668. package/docs/extensions.md +31 -2
  669. package/docs/index.md +1 -0
  670. package/docs/models.md +6 -39
  671. package/docs/packages.md +1 -1
  672. package/docs/prompt-templates.md +9 -2
  673. package/docs/sdk.md +5 -0
  674. package/docs/security.md +55 -0
  675. package/docs/settings.md +13 -0
  676. package/docs/skills.md +3 -3
  677. package/docs/terminal-setup.md +36 -2
  678. package/docs/themes.md +1 -1
  679. package/docs/tmux.md +4 -2
  680. package/docs/usage.md +18 -1
  681. package/examples/extensions/README.md +1 -0
  682. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  683. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  684. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  685. package/examples/extensions/gondolin/package-lock.json +2 -2
  686. package/examples/extensions/gondolin/package.json +1 -1
  687. package/examples/extensions/minimal-mode.ts +6 -6
  688. package/examples/extensions/project-trust.ts +64 -0
  689. package/examples/extensions/sandbox/package-lock.json +2 -2
  690. package/examples/extensions/sandbox/package.json +1 -1
  691. package/examples/extensions/with-deps/package-lock.json +2 -2
  692. package/examples/extensions/with-deps/package.json +1 -1
  693. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  694. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +125 -77
  695. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  696. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +7 -0
  697. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  698. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -27
  699. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  700. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  701. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +7 -20
  702. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  703. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  704. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
  705. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts +1 -1
  706. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
  707. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +1 -1
  708. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  709. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.d.ts.map +1 -1
  710. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.js.map +1 -1
  711. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  712. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +0 -3
  713. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  714. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.d.ts.map +1 -1
  715. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js.map +1 -1
  716. package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.d.ts.map +1 -1
  717. package/node_modules/@earendil-works/pi-agent-core/dist/harness/prompt-templates.js.map +1 -1
  718. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.d.ts.map +1 -1
  719. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js +0 -3
  720. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-repo.js.map +1 -1
  721. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.d.ts.map +1 -1
  722. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js +0 -7
  723. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl-storage.js.map +1 -1
  724. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.d.ts.map +1 -1
  725. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.js +3 -1
  726. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-repo.js.map +1 -1
  727. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.d.ts.map +1 -1
  728. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.js +0 -5
  729. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory-storage.js.map +1 -1
  730. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.d.ts.map +1 -1
  731. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/repo-utils.js.map +1 -1
  732. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  733. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +0 -1
  734. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  735. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.d.ts.map +1 -1
  736. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/uuid.js.map +1 -1
  737. package/node_modules/@earendil-works/pi-agent-core/dist/harness/skills.d.ts.map +1 -1
  738. package/node_modules/@earendil-works/pi-agent-core/dist/harness/skills.js.map +1 -1
  739. package/node_modules/@earendil-works/pi-agent-core/dist/harness/system-prompt.d.ts.map +1 -1
  740. package/node_modules/@earendil-works/pi-agent-core/dist/harness/system-prompt.js.map +1 -1
  741. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  742. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js +0 -16
  743. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  744. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
  745. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
  746. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.d.ts.map +1 -1
  747. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/truncate.js.map +1 -1
  748. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  749. package/node_modules/@earendil-works/pi-agent-core/dist/node.d.ts.map +1 -1
  750. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
  751. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
  752. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +6 -3
  753. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  754. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  755. package/node_modules/@earendil-works/pi-agent-core/package.json +6 -6
  756. package/node_modules/@earendil-works/pi-ai/README.md +2 -1
  757. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +1 -1
  758. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +1 -1
  759. package/node_modules/@earendil-works/pi-ai/dist/bedrock-provider.d.ts.map +1 -1
  760. package/node_modules/@earendil-works/pi-ai/dist/cli.d.ts.map +1 -1
  761. package/node_modules/@earendil-works/pi-ai/dist/cli.js.map +1 -1
  762. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  763. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  764. package/node_modules/@earendil-works/pi-ai/dist/image-models.d.ts.map +1 -1
  765. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +30 -0
  766. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  767. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +30 -0
  768. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  769. package/node_modules/@earendil-works/pi-ai/dist/image-models.js.map +1 -1
  770. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.d.ts.map +1 -1
  771. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.js.map +1 -1
  772. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
  773. package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
  774. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  775. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  776. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +533 -131
  777. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  778. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +530 -255
  779. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  780. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  781. package/node_modules/@earendil-works/pi-ai/dist/oauth.d.ts.map +1 -1
  782. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  783. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +15 -7
  784. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  785. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts +1 -1
  786. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  787. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +17 -7
  788. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  789. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  790. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js +1 -0
  791. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  792. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.d.ts.map +1 -1
  793. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.js.map +1 -1
  794. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
  795. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  796. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  797. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  798. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  799. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.js.map +1 -1
  800. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
  801. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
  802. package/node_modules/@earendil-works/pi-ai/dist/providers/google.d.ts.map +1 -1
  803. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js.map +1 -1
  804. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.d.ts.map +1 -1
  805. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js.map +1 -1
  806. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts.map +1 -1
  807. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -1
  808. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.d.ts.map +1 -1
  809. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js +3 -3
  810. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js.map +1 -1
  811. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  812. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js +0 -7
  813. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  814. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  815. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +5 -4
  816. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
  817. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-prompt-cache.d.ts.map +1 -1
  818. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-prompt-cache.js.map +1 -1
  819. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  820. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js +2 -1
  821. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  822. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  823. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js +3 -2
  824. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
  825. package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  826. package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.js.map +1 -1
  827. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts +1 -1
  828. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  829. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js +2 -2
  830. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +1 -1
  831. package/node_modules/@earendil-works/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  832. package/node_modules/@earendil-works/pi-ai/dist/providers/transform-messages.js.map +1 -1
  833. package/node_modules/@earendil-works/pi-ai/dist/session-resources.d.ts.map +1 -1
  834. package/node_modules/@earendil-works/pi-ai/dist/session-resources.js.map +1 -1
  835. package/node_modules/@earendil-works/pi-ai/dist/stream.d.ts.map +1 -1
  836. package/node_modules/@earendil-works/pi-ai/dist/stream.js.map +1 -1
  837. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  838. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  839. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  840. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  841. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.d.ts.map +1 -1
  842. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js +10 -8
  843. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/gemma4.js.map +1 -1
  844. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/hermes.d.ts.map +1 -1
  845. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/hermes.js.map +1 -1
  846. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.d.ts.map +1 -1
  847. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/json-mix.js.map +1 -1
  848. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.d.ts.map +1 -1
  849. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/morph-xml.js.map +1 -1
  850. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.d.ts.map +1 -1
  851. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/xml-tool-tag-scanner.js.map +1 -1
  852. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.d.ts.map +1 -1
  853. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/yaml-xml.js.map +1 -1
  854. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.d.ts.map +1 -1
  855. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/stream-wrapper.js.map +1 -1
  856. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
  857. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +6 -2
  858. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  859. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  860. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.d.ts.map +1 -1
  861. package/node_modules/@earendil-works/pi-ai/dist/utils/abort-signals.js.map +1 -1
  862. package/node_modules/@earendil-works/pi-ai/dist/utils/diagnostics.d.ts.map +1 -1
  863. package/node_modules/@earendil-works/pi-ai/dist/utils/diagnostics.js.map +1 -1
  864. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  865. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js +3 -7
  866. package/node_modules/@earendil-works/pi-ai/dist/utils/event-stream.js.map +1 -1
  867. package/node_modules/@earendil-works/pi-ai/dist/utils/hash.d.ts.map +1 -1
  868. package/node_modules/@earendil-works/pi-ai/dist/utils/hash.js.map +1 -1
  869. package/node_modules/@earendil-works/pi-ai/dist/utils/headers.d.ts.map +1 -1
  870. package/node_modules/@earendil-works/pi-ai/dist/utils/headers.js.map +1 -1
  871. package/node_modules/@earendil-works/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  872. package/node_modules/@earendil-works/pi-ai/dist/utils/json-parse.js.map +1 -1
  873. package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.d.ts.map +1 -1
  874. package/node_modules/@earendil-works/pi-ai/dist/utils/node-http-proxy.js.map +1 -1
  875. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts.map +1 -1
  876. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.js.map +1 -1
  877. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.d.ts.map +1 -1
  878. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/device-code.js.map +1 -1
  879. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  880. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  881. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  882. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
  883. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.d.ts.map +1 -1
  884. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/oauth-page.js.map +1 -1
  885. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  886. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  887. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.d.ts.map +1 -1
  888. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/pkce.js.map +1 -1
  889. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/types.d.ts.map +1 -1
  890. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  891. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  892. package/node_modules/@earendil-works/pi-ai/dist/utils/sanitize-unicode.d.ts.map +1 -1
  893. package/node_modules/@earendil-works/pi-ai/dist/utils/sanitize-unicode.js.map +1 -1
  894. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.d.ts.map +1 -1
  895. package/node_modules/@earendil-works/pi-ai/dist/utils/tool-pair-repair.js.map +1 -1
  896. package/node_modules/@earendil-works/pi-ai/dist/utils/typebox-helpers.d.ts.map +1 -1
  897. package/node_modules/@earendil-works/pi-ai/dist/utils/typebox-helpers.js.map +1 -1
  898. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.d.ts.map +1 -1
  899. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
  900. package/node_modules/@earendil-works/pi-ai/package.json +5 -5
  901. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +3 -1
  902. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
  903. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +0 -3
  904. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
  905. package/node_modules/@earendil-works/pi-tui/dist/components/box.d.ts.map +1 -1
  906. package/node_modules/@earendil-works/pi-tui/dist/components/box.js +1 -6
  907. package/node_modules/@earendil-works/pi-tui/dist/components/box.js.map +1 -1
  908. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.d.ts.map +1 -1
  909. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js +4 -3
  910. package/node_modules/@earendil-works/pi-tui/dist/components/cancellable-loader.js.map +1 -1
  911. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts +6 -1
  912. package/node_modules/@earendil-works/pi-tui/dist/components/editor.d.ts.map +1 -1
  913. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js +132 -93
  914. package/node_modules/@earendil-works/pi-tui/dist/components/editor.js.map +1 -1
  915. package/node_modules/@earendil-works/pi-tui/dist/components/image.d.ts.map +1 -1
  916. package/node_modules/@earendil-works/pi-tui/dist/components/image.js +0 -8
  917. package/node_modules/@earendil-works/pi-tui/dist/components/image.js.map +1 -1
  918. package/node_modules/@earendil-works/pi-tui/dist/components/input.d.ts.map +1 -1
  919. package/node_modules/@earendil-works/pi-tui/dist/components/input.js +14 -14
  920. package/node_modules/@earendil-works/pi-tui/dist/components/input.js.map +1 -1
  921. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts +5 -0
  922. package/node_modules/@earendil-works/pi-tui/dist/components/loader.d.ts.map +1 -1
  923. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js +29 -17
  924. package/node_modules/@earendil-works/pi-tui/dist/components/loader.js.map +1 -1
  925. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  926. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +0 -11
  927. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  928. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.d.ts.map +1 -1
  929. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js +4 -9
  930. package/node_modules/@earendil-works/pi-tui/dist/components/select-list.js.map +1 -1
  931. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.d.ts.map +1 -1
  932. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js +4 -12
  933. package/node_modules/@earendil-works/pi-tui/dist/components/settings-list.js.map +1 -1
  934. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.d.ts.map +1 -1
  935. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js +0 -1
  936. package/node_modules/@earendil-works/pi-tui/dist/components/spacer.js.map +1 -1
  937. package/node_modules/@earendil-works/pi-tui/dist/components/text.d.ts.map +1 -1
  938. package/node_modules/@earendil-works/pi-tui/dist/components/text.js +0 -8
  939. package/node_modules/@earendil-works/pi-tui/dist/components/text.js.map +1 -1
  940. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.d.ts.map +1 -1
  941. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js +0 -3
  942. package/node_modules/@earendil-works/pi-tui/dist/components/truncated-text.js.map +1 -1
  943. package/node_modules/@earendil-works/pi-tui/dist/editor-component.d.ts.map +1 -1
  944. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.d.ts.map +1 -1
  945. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js +131 -61
  946. package/node_modules/@earendil-works/pi-tui/dist/fuzzy.js.map +1 -1
  947. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  948. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
  949. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +2 -4
  950. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
  951. package/node_modules/@earendil-works/pi-tui/dist/keys.d.ts.map +1 -1
  952. package/node_modules/@earendil-works/pi-tui/dist/keys.js.map +1 -1
  953. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.d.ts.map +1 -1
  954. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js +3 -1
  955. package/node_modules/@earendil-works/pi-tui/dist/kill-ring.js.map +1 -1
  956. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.d.ts.map +1 -1
  957. package/node_modules/@earendil-works/pi-tui/dist/native-modifiers.js.map +1 -1
  958. package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.d.ts.map +1 -1
  959. package/node_modules/@earendil-works/pi-tui/dist/slash-command-autocomplete.js.map +1 -1
  960. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  961. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js +4 -6
  962. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
  963. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
  964. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  965. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +4 -7
  966. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  967. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +60 -103
  968. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  969. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  970. package/node_modules/@earendil-works/pi-tui/dist/tui.js +39 -31
  971. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  972. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.d.ts.map +1 -1
  973. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js +3 -1
  974. package/node_modules/@earendil-works/pi-tui/dist/undo-stack.js.map +1 -1
  975. package/node_modules/@earendil-works/pi-tui/dist/utils.d.ts.map +1 -1
  976. package/node_modules/@earendil-works/pi-tui/dist/utils.js +57 -27
  977. package/node_modules/@earendil-works/pi-tui/dist/utils.js.map +1 -1
  978. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.d.ts.map +1 -1
  979. package/node_modules/@earendil-works/pi-tui/dist/word-navigation.js.map +1 -1
  980. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  981. package/node_modules/@types/node/README.md +3 -3
  982. package/node_modules/@types/node/assert/strict.d.ts +3 -55
  983. package/node_modules/@types/node/assert.d.ts +49 -177
  984. package/node_modules/@types/node/async_hooks.d.ts +151 -43
  985. package/node_modules/@types/node/buffer.buffer.d.ts +2 -8
  986. package/node_modules/@types/node/buffer.d.ts +43 -212
  987. package/node_modules/@types/node/child_process.d.ts +23 -133
  988. package/node_modules/@types/node/cluster.d.ts +238 -384
  989. package/node_modules/@types/node/compatibility/iterators.d.ts +1 -0
  990. package/node_modules/@types/node/console.d.ts +45 -404
  991. package/node_modules/@types/node/constants.d.ts +3 -10
  992. package/node_modules/@types/node/crypto.d.ts +640 -1127
  993. package/node_modules/@types/node/dgram.d.ts +14 -77
  994. package/node_modules/@types/node/diagnostics_channel.d.ts +3 -29
  995. package/node_modules/@types/node/dns/promises.d.ts +4 -10
  996. package/node_modules/@types/node/dns.d.ts +130 -177
  997. package/node_modules/@types/node/domain.d.ts +12 -32
  998. package/node_modules/@types/node/events.d.ts +872 -840
  999. package/node_modules/@types/node/fs/promises.d.ts +193 -20
  1000. package/node_modules/@types/node/fs.d.ts +754 -435
  1001. package/node_modules/@types/node/globals.d.ts +8 -30
  1002. package/node_modules/@types/node/globals.typedarray.d.ts +63 -0
  1003. package/node_modules/@types/node/http.d.ts +363 -305
  1004. package/node_modules/@types/node/http2.d.ts +545 -781
  1005. package/node_modules/@types/node/https.d.ts +64 -243
  1006. package/node_modules/@types/node/index.d.ts +26 -6
  1007. package/node_modules/@types/node/inspector/promises.d.ts +35 -0
  1008. package/node_modules/@types/node/inspector.d.ts +68 -57
  1009. package/node_modules/@types/node/inspector.generated.d.ts +764 -410
  1010. package/node_modules/@types/node/module.d.ts +53 -189
  1011. package/node_modules/@types/node/net.d.ts +101 -207
  1012. package/node_modules/@types/node/os.d.ts +11 -19
  1013. package/node_modules/@types/node/package.json +13 -3
  1014. package/node_modules/@types/node/path/posix.d.ts +8 -0
  1015. package/node_modules/@types/node/path/win32.d.ts +8 -0
  1016. package/node_modules/@types/node/path.d.ts +119 -141
  1017. package/node_modules/@types/node/perf_hooks.d.ts +317 -673
  1018. package/node_modules/@types/node/process.d.ts +277 -157
  1019. package/node_modules/@types/node/punycode.d.ts +3 -31
  1020. package/node_modules/@types/node/querystring.d.ts +3 -16
  1021. package/node_modules/@types/node/quic.d.ts +897 -0
  1022. package/node_modules/@types/node/readline/promises.d.ts +3 -6
  1023. package/node_modules/@types/node/readline.d.ts +65 -152
  1024. package/node_modules/@types/node/repl.d.ts +101 -109
  1025. package/node_modules/@types/node/sea.d.ts +9 -115
  1026. package/node_modules/@types/node/sqlite.d.ts +415 -68
  1027. package/node_modules/@types/node/stream/consumers.d.ts +91 -15
  1028. package/node_modules/@types/node/stream/iter.d.ts +301 -0
  1029. package/node_modules/@types/node/stream/promises.d.ts +136 -15
  1030. package/node_modules/@types/node/stream/web.d.ts +179 -501
  1031. package/node_modules/@types/node/stream.d.ts +577 -490
  1032. package/node_modules/@types/node/string_decoder.d.ts +3 -43
  1033. package/node_modules/@types/node/test/reporters.d.ts +59 -0
  1034. package/node_modules/@types/node/test.d.ts +402 -286
  1035. package/node_modules/@types/node/timers/promises.d.ts +3 -18
  1036. package/node_modules/@types/node/timers.d.ts +3 -141
  1037. package/node_modules/@types/node/tls.d.ts +115 -241
  1038. package/node_modules/@types/node/trace_events.d.ts +3 -97
  1039. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +2 -8
  1040. package/node_modules/@types/node/ts5.6/compatibility/float16array.d.ts +71 -0
  1041. package/node_modules/@types/node/ts5.6/globals.typedarray.d.ts +2 -0
  1042. package/node_modules/@types/node/ts5.6/index.d.ts +28 -6
  1043. package/node_modules/@types/node/ts5.7/compatibility/float16array.d.ts +72 -0
  1044. package/node_modules/@types/node/ts5.7/index.d.ts +119 -0
  1045. package/node_modules/@types/node/tty.d.ts +57 -40
  1046. package/node_modules/@types/node/url.d.ts +156 -584
  1047. package/node_modules/@types/node/util/types.d.ts +558 -0
  1048. package/node_modules/@types/node/util.d.ts +167 -1096
  1049. package/node_modules/@types/node/v8.d.ts +75 -15
  1050. package/node_modules/@types/node/vm.d.ts +334 -198
  1051. package/node_modules/@types/node/wasi.d.ts +24 -74
  1052. package/node_modules/@types/node/web-globals/abortcontroller.d.ts +27 -2
  1053. package/node_modules/@types/node/web-globals/blob.d.ts +23 -0
  1054. package/node_modules/@types/node/web-globals/console.d.ts +9 -0
  1055. package/node_modules/@types/node/web-globals/crypto.d.ts +39 -0
  1056. package/node_modules/@types/node/web-globals/encoding.d.ts +11 -0
  1057. package/node_modules/@types/node/web-globals/events.d.ts +9 -0
  1058. package/node_modules/@types/node/web-globals/fetch.d.ts +14 -0
  1059. package/node_modules/@types/node/web-globals/importmeta.d.ts +13 -0
  1060. package/node_modules/@types/node/web-globals/messaging.d.ts +23 -0
  1061. package/node_modules/@types/node/web-globals/navigator.d.ts +3 -0
  1062. package/node_modules/@types/node/web-globals/performance.d.ts +45 -0
  1063. package/node_modules/@types/node/web-globals/streams.d.ts +115 -0
  1064. package/node_modules/@types/node/web-globals/timers.d.ts +44 -0
  1065. package/node_modules/@types/node/web-globals/url.d.ts +24 -0
  1066. package/node_modules/@types/node/worker_threads.d.ts +280 -393
  1067. package/node_modules/@types/node/zlib/iter.d.ts +131 -0
  1068. package/node_modules/@types/node/zlib.d.ts +7 -165
  1069. package/node_modules/undici-types/agent.d.ts +13 -12
  1070. package/node_modules/undici-types/api.d.ts +26 -26
  1071. package/node_modules/undici-types/balanced-pool.d.ts +13 -12
  1072. package/node_modules/undici-types/cache-interceptor.d.ts +179 -0
  1073. package/node_modules/undici-types/client-stats.d.ts +15 -0
  1074. package/node_modules/undici-types/client.d.ts +34 -19
  1075. package/node_modules/undici-types/connector.d.ts +4 -2
  1076. package/node_modules/undici-types/cookies.d.ts +2 -0
  1077. package/node_modules/undici-types/diagnostics-channel.d.ts +18 -10
  1078. package/node_modules/undici-types/dispatcher.d.ts +127 -104
  1079. package/node_modules/undici-types/env-http-proxy-agent.d.ts +4 -3
  1080. package/node_modules/undici-types/errors.d.ts +82 -54
  1081. package/node_modules/undici-types/eventsource.d.ts +9 -4
  1082. package/node_modules/undici-types/fetch.d.ts +22 -20
  1083. package/node_modules/undici-types/formdata.d.ts +7 -7
  1084. package/node_modules/undici-types/global-dispatcher.d.ts +4 -4
  1085. package/node_modules/undici-types/global-origin.d.ts +5 -5
  1086. package/node_modules/undici-types/h2c-client.d.ts +73 -0
  1087. package/node_modules/undici-types/handlers.d.ts +8 -8
  1088. package/node_modules/undici-types/header.d.ts +157 -1
  1089. package/node_modules/undici-types/index.d.ts +67 -47
  1090. package/node_modules/undici-types/interceptors.d.ts +71 -8
  1091. package/node_modules/undici-types/mock-agent.d.ts +36 -18
  1092. package/node_modules/undici-types/mock-call-history.d.ts +111 -0
  1093. package/node_modules/undici-types/mock-client.d.ts +6 -4
  1094. package/node_modules/undici-types/mock-errors.d.ts +3 -3
  1095. package/node_modules/undici-types/mock-interceptor.d.ts +21 -20
  1096. package/node_modules/undici-types/mock-pool.d.ts +6 -4
  1097. package/node_modules/undici-types/package.json +1 -1
  1098. package/node_modules/undici-types/patch.d.ts +0 -4
  1099. package/node_modules/undici-types/pool-stats.d.ts +8 -8
  1100. package/node_modules/undici-types/pool.d.ts +15 -13
  1101. package/node_modules/undici-types/proxy-agent.d.ts +5 -4
  1102. package/node_modules/undici-types/readable.d.ts +19 -16
  1103. package/node_modules/undici-types/retry-agent.d.ts +1 -1
  1104. package/node_modules/undici-types/retry-handler.d.ts +19 -10
  1105. package/node_modules/undici-types/round-robin-pool.d.ts +41 -0
  1106. package/node_modules/undici-types/snapshot-agent.d.ts +109 -0
  1107. package/node_modules/undici-types/socks5-proxy-agent.d.ts +25 -0
  1108. package/node_modules/undici-types/util.d.ts +3 -3
  1109. package/node_modules/undici-types/utility.d.ts +7 -0
  1110. package/node_modules/undici-types/webidl.d.ts +148 -29
  1111. package/node_modules/undici-types/websocket.d.ts +48 -10
  1112. package/npm-shrinkwrap.json +21 -21
  1113. package/package.json +13 -12
  1114. package/dist/core/extensions/builtin/todotools/continuation/config.d.ts +0 -10
  1115. package/dist/core/extensions/builtin/todotools/continuation/config.d.ts.map +0 -1
  1116. package/dist/core/extensions/builtin/todotools/continuation/config.js +0 -33
  1117. package/dist/core/extensions/builtin/todotools/continuation/config.js.map +0 -1
  1118. package/dist/core/extensions/builtin/todotools/continuation/index.d.ts +0 -2
  1119. package/dist/core/extensions/builtin/todotools/continuation/index.d.ts.map +0 -1
  1120. package/dist/core/extensions/builtin/todotools/continuation/index.js +0 -2
  1121. package/dist/core/extensions/builtin/todotools/continuation/index.js.map +0 -1
  1122. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts +0 -5
  1123. package/dist/core/extensions/builtin/todotools/continuation/prompt.d.ts.map +0 -1
  1124. package/dist/core/extensions/builtin/todotools/continuation/prompt.js +0 -34
  1125. package/dist/core/extensions/builtin/todotools/continuation/prompt.js.map +0 -1
  1126. package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts +0 -11
  1127. package/dist/core/extensions/builtin/todotools/continuation/runtime.d.ts.map +0 -1
  1128. package/dist/core/extensions/builtin/todotools/continuation/runtime.js +0 -201
  1129. package/dist/core/extensions/builtin/todotools/continuation/runtime.js.map +0 -1
  1130. package/dist/core/extensions/builtin/todotools/settings.d.ts +0 -6
  1131. package/dist/core/extensions/builtin/todotools/settings.d.ts.map +0 -1
  1132. package/dist/core/extensions/builtin/todotools/settings.js +0 -58
  1133. package/dist/core/extensions/builtin/todotools/settings.js.map +0 -1
  1134. package/dist/core/extensions/builtin/todotools/system-messages.d.ts +0 -34
  1135. package/dist/core/extensions/builtin/todotools/system-messages.d.ts.map +0 -1
  1136. package/dist/core/extensions/builtin/todotools/system-messages.js +0 -82
  1137. package/dist/core/extensions/builtin/todotools/system-messages.js.map +0 -1
  1138. package/node_modules/@types/node/compatibility/disposable.d.ts +0 -14
  1139. package/node_modules/@types/node/compatibility/index.d.ts +0 -9
  1140. package/node_modules/@types/node/compatibility/indexable.d.ts +0 -20
  1141. package/node_modules/undici-types/file.d.ts +0 -39
  1142. package/node_modules/undici-types/filereader.d.ts +0 -54
@@ -0,0 +1,55 @@
1
+ # Security
2
+
3
+ Pi is a local coding agent. It runs with the permissions of the user account that starts it, and it treats files writable by that user as inside the same local trust boundary.
4
+
5
+ ## Project Trust
6
+
7
+ Project trust controls whether pi loads project-local settings, resources, packages, and extensions. It is not a sandbox and it does not restrict what the model can ask tools to do after you start working in a directory.
8
+
9
+ Pi considers a project to have trust inputs when it finds any of these from the current working directory:
10
+
11
+ - `.pi/` in the current directory
12
+ - `.agents/skills` in the current directory or an ancestor directory
13
+
14
+ When an interactive session starts in a project with configs in `.pi` or `.agents/skills` and no saved decision for the current directory or a parent directory, pi follows `defaultProjectTrust` from global settings. The default value is `"ask"`, which asks whether to trust the project when UI is available. Saved decisions are stored by canonical directory in `~/.pi/agent/trust.json`, and the closest saved decision on the current or parent path applies before the global default.
15
+
16
+ Trusting a project allows pi to load trust-gated project inputs, including:
17
+
18
+ - `.pi/settings.json`
19
+ - `.pi` resources such as extensions, skills, prompt templates, themes, and system prompt files
20
+ - missing project packages configured through project settings
21
+ - project-local extensions and project package-managed extensions
22
+
23
+ Declining trust skips protected resources. `AGENTS.md` and `CLAUDE.md` context files are loaded regardless of project trust unless context loading is disabled. Before trust is resolved, pi only loads context files, user/global extensions, and CLI `-e` extensions. User/global and CLI extensions can handle the `project_trust` event; the first extension that returns a yes/no decision owns the decision.
24
+
25
+ Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trust prompt. Without an applicable saved trust decision, `defaultProjectTrust: "ask"` and `"never"` ignore such resources, while `"always"` trusts them. Use `--approve`/`-a` or `--no-approve`/`-na` to override project trust for one run.
26
+
27
+ ## No Built-in Sandbox
28
+
29
+ Pi does not include a built-in sandbox. Built-in tools can read files, write files, edit files, and run shell commands with the permissions of the pi process. Extensions are TypeScript modules that run with the same permissions. Package installs, shell commands, language servers, test commands, and other developer tools behave as ordinary local processes.
30
+
31
+ This is intentional. Pi is designed to operate on local source trees, invoke project toolchains, and integrate with the user's existing development environment. A partial in-process sandbox would be easy to misunderstand as a security boundary while still depending on the host shell, filesystem, package managers, credentials, and extension code. Real isolation needs to come from the operating system or a virtualization/container boundary.
32
+
33
+ Project trust is only an input-loading guard. It prevents a repository from silently changing pi's settings or extensions before you approve it. It does not make untrusted code, untrusted prompts, or untrusted model output safe. Prompt injection from repository files, comments, documentation, context files, or build output is expected local-agent risk and cannot be reliably prevented by pi.
34
+
35
+ ## Running Untrusted or Unmonitored Work
36
+
37
+ For untrusted repositories, generated code you do not intend to monitor closely, or unattended automation, run pi in a contained environment. Use a container, VM, micro-VM, remote sandbox, or policy-controlled sandbox with only the files and credentials required for the task.
38
+
39
+ Common patterns are documented in [Containerization](containerization.md):
40
+
41
+ - run the whole `pi` process inside OpenShell or Docker
42
+ - run host pi while routing built-in tool execution into a Gondolin micro-VM
43
+ - mount only the workspace paths the agent should access
44
+ - avoid mounting host `~/.pi/agent` unless the container should access host sessions, settings, and credentials
45
+ - pass the minimum required API keys or use short-lived credentials
46
+ - restrict network access when the task does not need it
47
+ - review diffs and outputs before copying results back to trusted systems
48
+
49
+ If you bind-mount a host workspace read/write, writes from inside the container or VM can still modify host files. Use read-only mounts or copy files into and out of the sandbox when you need stronger protection from unintended writes.
50
+
51
+ ## Reporting Security Issues
52
+
53
+ To report a security issue, follow the repository [Security Policy](https://github.com/earendil-works/pi-mono/blob/main/SECURITY.md). Do not open a public issue for security-sensitive reports.
54
+
55
+ Expected local-agent behavior, lack of a built-in sandbox, prompt injection from untrusted content, and behavior of user-installed extensions or skills are generally outside the security boundary unless the report demonstrates a real privilege-boundary bypass or shows how pi grants access that the local user did not already have.
package/docs/settings.md CHANGED
@@ -9,6 +9,18 @@ Pi uses JSON settings files with project settings overriding global settings.
9
9
 
10
10
  Edit directly or use `/settings` for common options.
11
11
 
12
+ ## Project Trust
13
+
14
+ On interactive startup, pi asks before trusting a project folder that contains trust-gated project inputs and has no saved decision for the folder or a parent folder in `~/.pi/agent/trust.json`. Trusting a project allows pi to load `.pi/settings.json` and `.pi` resources, install missing project packages, and execute project extensions.
15
+
16
+ Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trust prompt. Without an applicable saved trust decision, they use `defaultProjectTrust` from global settings: `ask` (default) and `never` ignore trust-gated project inputs, while `always` trusts them. Pass `--approve`/`-a` or `--no-approve`/`-na` to override project trust for one run.
17
+
18
+ If no extension or saved decision applies, `defaultProjectTrust` controls the fallback behavior. Set it to `"ask"`, `"always"`, or `"never"` in `~/.pi/agent/settings.json`, or change it with `/settings`.
19
+
20
+ `pi config` and package commands use the same project trust flow. Pass `--approve` to trust project-local settings for one command or `--no-approve` to ignore them.
21
+
22
+ Use `/trust` in interactive mode to save a project trust decision for future sessions, including trust for the immediate parent folder. It writes `~/.pi/agent/trust.json` only; the current session is not reloaded, so restart pi for changes to take effect.
23
+
12
24
  ## All Settings
13
25
 
14
26
  ### Model & Thinking
@@ -54,6 +66,7 @@ When this value is anything other than `"auto"`, it overrides any model-level `p
54
66
  |---------|------|---------|-------------|
55
67
  | `theme` | string | `"dark"` | Theme name (`"dark"`, `"light"`, or custom) |
56
68
  | `quietStartup` | boolean | `false` | Hide startup header |
69
+ | `defaultProjectTrust` | string | `"ask"` | Fallback project trust behavior: `"ask"`, `"always"`, or `"never"`. Global setting only |
57
70
  | `collapseChangelog` | boolean | `false` | Show condensed changelog after updates |
58
71
  | `enableInstallTelemetry` | boolean | `true` | Send an anonymous install/update version ping after first install or changelog-detected updates. This does not control update checks |
59
72
  | `doubleEscapeAction` | string | `"tree"` | Action for double-escape: `"tree"`, `"fork"`, or `"none"` |
package/docs/skills.md CHANGED
@@ -24,10 +24,10 @@ Pi implements the [Agent Skills standard](https://agentskills.io/specification),
24
24
  Pi loads skills from:
25
25
 
26
26
  - Global:
27
- - `~/.senpi/agent/skills/`
27
+ - `~/.senpi/agent/skills/`
28
28
  - `~/.agents/skills/`
29
- - Project:
30
- - `.senpi/skills/`
29
+ - Project (only after the project is trusted):
30
+ - `.senpi/skills/`
31
31
  - `.agents/skills/` in `cwd` and ancestor directories (up to git repo root, or filesystem root when not in a repo)
32
32
  - Packages: `skills/` directories or `pi.skills` entries in `package.json`
33
33
  - Settings: `skills` array with files or directories
@@ -40,7 +40,7 @@ If you want `Shift+Enter` to keep working in tmux via that remap, add `ctrl+j` t
40
40
 
41
41
  ## WezTerm
42
42
 
43
- Create `~/.wezterm.lua`:
43
+ WezTerm usually works out of the box for `Shift+Enter` via xterm modifyOtherKeys. To use the Kitty keyboard protocol explicitly, create `~/.wezterm.lua`:
44
44
 
45
45
  ```lua
46
46
  local wezterm = require 'wezterm'
@@ -49,16 +49,50 @@ config.enable_kitty_keyboard = true
49
49
  return config
50
50
  ```
51
51
 
52
+ On macOS, WezTerm binds `Option+Enter` to fullscreen by default. To use `Option+Enter` for pi follow-up queueing, add this key override:
53
+
54
+ ```lua
55
+ local wezterm = require 'wezterm'
56
+ local config = wezterm.config_builder()
57
+ config.keys = {
58
+ {
59
+ key = 'Enter',
60
+ mods = 'ALT',
61
+ action = wezterm.action.SendString('\x1b[13;3u'),
62
+ },
63
+ }
64
+ return config
65
+ ```
66
+
67
+ If you already have a `config.keys` table, add the entry to it.
68
+
52
69
  On WSL, WezTerm may require a visible hardware cursor for IME candidate window positioning. If CJK IME candidates do not follow the text cursor, set `PI_HARDWARE_CURSOR=1` before running pi or set `showHardwareCursor` to `true` in settings.
53
70
 
71
+ ## Alacritty
72
+
73
+ Alacritty usually works out of the box for `Shift+Enter`. On macOS, `Option+Enter` may arrive as plain `Enter`. To use `Option+Enter` for pi follow-up queueing, add to `~/.config/alacritty/alacritty.toml`:
74
+
75
+ ```toml
76
+ [[keyboard.bindings]]
77
+ key = "Enter"
78
+ mods = "Alt"
79
+ chars = "\u001b[13;3u"
80
+ ```
81
+
82
+ Restart Alacritty after changing the config.
83
+
54
84
  ## VS Code (Integrated Terminal)
55
85
 
86
+ VS Code 1.109.5 and newer enable Kitty keyboard protocol in the integrated terminal by default, so `Shift+Enter` should work out of the box.
87
+
88
+ VS Code versions older than 1.109.5 need an explicit terminal keybinding for `Shift+Enter`.
89
+
56
90
  `keybindings.json` locations:
57
91
  - macOS: `~/Library/Application Support/Code/User/keybindings.json`
58
92
  - Linux: `~/.config/Code/User/keybindings.json`
59
93
  - Windows: `%APPDATA%\\Code\\User\\keybindings.json`
60
94
 
61
- Add to `keybindings.json` to enable `Shift+Enter` for multi-line input:
95
+ Add to `keybindings.json`:
62
96
 
63
97
  ```json
64
98
  {
package/docs/themes.md CHANGED
@@ -20,7 +20,7 @@ Pi loads themes from:
20
20
 
21
21
  - Built-in: `dark`, `light`
22
22
  - Global: `~/.senpi/agent/themes/*.json`
23
- - Project: `.senpi/themes/*.json`
23
+ - Project: `.senpi/themes/*.json` (only after the project is trusted)
24
24
  - Packages: `themes/` directories or `pi.themes` entries in `package.json`
25
25
  - Settings: `themes` array with files or directories
26
26
  - CLI: `--theme <path>` (repeatable)
package/docs/tmux.md CHANGED
@@ -18,7 +18,7 @@ tmux kill-server
18
18
  tmux
19
19
  ```
20
20
 
21
- Pi requests extended key reporting automatically when Kitty keyboard protocol is not available. With `extended-keys-format csi-u`, tmux forwards modified keys in CSI-u format, which is the most reliable configuration.
21
+ Pi requests extended key reporting automatically when Kitty keyboard protocol is not available. With `extended-keys-format csi-u`, tmux forwards modified keys in CSI-u format, which is the most reliable configuration. The `extended-keys-format` option requires tmux 3.5 or later.
22
22
 
23
23
  ## Why `csi-u` Is Recommended
24
24
 
@@ -57,5 +57,7 @@ This affects the default keybindings (`Enter` to submit, `Shift+Enter` for newli
57
57
 
58
58
  ## Requirements
59
59
 
60
- - tmux 3.2 or later (run `tmux -V` to check)
60
+ - tmux 3.5 or later for `extended-keys-format csi-u` (run `tmux -V` to check)
61
61
  - A terminal emulator that supports extended keys (Ghostty, Kitty, iTerm2, WezTerm, Windows Terminal)
62
+
63
+ With tmux 3.2 through 3.4, omit `extended-keys-format csi-u`; Pi still supports tmux's default xterm `modifyOtherKeys` format.
package/docs/usage.md CHANGED
@@ -110,6 +110,21 @@ Replace the default system prompt with:
110
110
 
111
111
  Append to the default prompt without replacing it with `APPEND_SYSTEM.md` in either location.
112
112
 
113
+ ### Project Trust
114
+
115
+ On interactive startup, pi asks before trusting a project folder that contains project-local extensions or settings and has no saved decision for the folder or a parent folder in `~/.pi/agent/trust.json`. Trusting a project allows pi to load `.pi/settings.json` and `.pi` resources, install missing project packages, and execute project extensions.
116
+
117
+ Before the trust decision, pi loads only context files, user/global extensions, and CLI `-e` extensions so they can handle the `project_trust` event. Project-local extensions, project package-managed extensions, and project settings are loaded only after the project is trusted. This split also applies when switching to a session from a different cwd whose trust has not been resolved in the current process.
118
+
119
+ Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trust prompt. Without an applicable saved trust decision, they use `defaultProjectTrust` from global settings: `ask` (default) and `never` ignore trust-gated project inputs, while `always` trusts them. Pass `--approve`/`-a` or `--no-approve`/`-na` to override project trust for one run.
120
+
121
+ If no extension or saved decision applies, `defaultProjectTrust` controls the fallback behavior. Set it to `"ask"`, `"always"`, or `"never"` in `~/.pi/agent/settings.json`, or change it with `/settings`.
122
+
123
+ `pi config` and package commands use the same project trust flow. Pass `--approve` to trust project-local settings for one command or `--no-approve` to ignore them.
124
+
125
+ Use `/trust` in interactive mode to save a project trust decision for future sessions, including trust for the immediate parent folder. It writes `~/.pi/agent/trust.json` only; the current session is not reloaded, so restart pi for changes to take effect.
126
+
127
+
113
128
  ## Exporting and Sharing Sessions
114
129
 
115
130
  Use `/export [file]` to write a session to HTML.
@@ -138,7 +153,7 @@ pi list # List installed packages
138
153
  pi config # Enable/disable package resources
139
154
  ```
140
155
 
141
- These commands manage pi packages, not the pi CLI installation. To uninstall pi itself, see [Quickstart](quickstart.md#uninstall).
156
+ These commands manage pi packages, not the pi CLI installation. To uninstall pi itself, see [Quickstart](quickstart.md#uninstall). `pi config` and project package commands accept `--approve`/`--no-approve` to trust or ignore project-local settings for one command.
142
157
 
143
158
  See [Pi Packages](packages.md) for package sources and security notes.
144
159
 
@@ -219,6 +234,8 @@ pi --no-extensions -e ./my-extension.ts
219
234
  | `--system-prompt <text>` | Replace default prompt; context files and skills are still appended |
220
235
  | `--append-system-prompt <text>` | Append to system prompt |
221
236
  | `--verbose` | Force verbose startup |
237
+ | `-a`, `--approve` | Trust project-local files for this run |
238
+ | `-na`, `--no-approve` | Ignore project-local files for this run |
222
239
  | `-h`, `--help` | Show help |
223
240
  | `-v`, `--version` | Show version |
224
241
 
@@ -19,6 +19,7 @@ cp permission-gate.ts ~/.senpi/agent/extensions/
19
19
  | Extension | Description |
20
20
  |-----------|-------------|
21
21
  | `permission-gate.ts` | Prompts for confirmation before dangerous bash commands (rm -rf, sudo, etc.) |
22
+ | `project-trust.ts` | Demonstrates the `project_trust` event for user/global and CLI extensions |
22
23
  | `protected-paths.ts` | Blocks writes to protected paths (.env, .git/, node_modules/) |
23
24
  | `confirm-destructive.ts` | Confirms before destructive session actions (clear, switch, fork) |
24
25
  | `dirty-repo-guard.ts` | Prevents session changes with uncommitted git changes |
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.78.0",
3
+ "version": "0.79.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "0.78.0",
9
+ "version": "0.79.1",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.78.0",
4
+ "version": "0.79.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.78.0",
4
+ "version": "0.79.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
- "version": "0.78.0",
3
+ "version": "0.79.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-gondolin",
9
- "version": "0.78.0",
9
+ "version": "0.79.1",
10
10
  "dependencies": {
11
11
  "@earendil-works/gondolin": "0.12.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
3
  "private": true,
4
- "version": "0.78.0",
4
+ "version": "0.79.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -102,7 +102,7 @@ export default function (pi: ExtensionAPI) {
102
102
 
103
103
  // Expanded mode: show full output
104
104
  const textContent = result.content.find((c) => c.type === "text");
105
- if (!textContent || textContent.type !== "text") {
105
+ if (textContent?.type !== "text") {
106
106
  return new Text("", 0, 0);
107
107
  }
108
108
 
@@ -143,7 +143,7 @@ export default function (pi: ExtensionAPI) {
143
143
 
144
144
  // Expanded mode: show full output
145
145
  const textContent = result.content.find((c) => c.type === "text");
146
- if (!textContent || textContent.type !== "text") {
146
+ if (textContent?.type !== "text") {
147
147
  return new Text("", 0, 0);
148
148
  }
149
149
 
@@ -233,7 +233,7 @@ export default function (pi: ExtensionAPI) {
233
233
 
234
234
  // Expanded mode: show diff or error
235
235
  const textContent = result.content.find((c) => c.type === "text");
236
- if (!textContent || textContent.type !== "text") {
236
+ if (textContent?.type !== "text") {
237
237
  return new Text("", 0, 0);
238
238
  }
239
239
 
@@ -292,7 +292,7 @@ export default function (pi: ExtensionAPI) {
292
292
 
293
293
  // Expanded: show full results
294
294
  const textContent = result.content.find((c) => c.type === "text");
295
- if (!textContent || textContent.type !== "text") {
295
+ if (textContent?.type !== "text") {
296
296
  return new Text("", 0, 0);
297
297
  }
298
298
 
@@ -354,7 +354,7 @@ export default function (pi: ExtensionAPI) {
354
354
 
355
355
  // Expanded: show full results
356
356
  const textContent = result.content.find((c) => c.type === "text");
357
- if (!textContent || textContent.type !== "text") {
357
+ if (textContent?.type !== "text") {
358
358
  return new Text("", 0, 0);
359
359
  }
360
360
 
@@ -410,7 +410,7 @@ export default function (pi: ExtensionAPI) {
410
410
 
411
411
  // Expanded: show full listing
412
412
  const textContent = result.content.find((c) => c.type === "text");
413
- if (!textContent || textContent.type !== "text") {
413
+ if (textContent?.type !== "text") {
414
414
  return new Text("", 0, 0);
415
415
  }
416
416
 
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Project Trust Extension
3
+ *
4
+ * Demonstrates the project_trust event. Install globally or pass via -e:
5
+ *
6
+ * mkdir -p ~/.pi/agent/extensions
7
+ * cp packages/coding-agent/examples/extensions/project-trust.ts ~/.pi/agent/extensions/
8
+ *
9
+ * Or:
10
+ *
11
+ * pi -e packages/coding-agent/examples/extensions/project-trust.ts
12
+ *
13
+ * Try it in a project containing .pi, AGENTS.md/CLAUDE.md, or .agents/skills.
14
+ */
15
+
16
+ import type { ExtensionAPI, ProjectTrustEventResult } from "@earendil-works/pi-coding-agent";
17
+
18
+ export default function (pi: ExtensionAPI) {
19
+ let loadCount = 0;
20
+ loadCount++;
21
+
22
+ // Multiple handlers in one extension are allowed. The first handler that returns
23
+ // { trusted: "yes" } or { trusted: "no" } wins and suppresses the built-in
24
+ // trust prompt. Return { trusted: "undecided" } to let another handler or the
25
+ // built-in flow decide.
26
+ pi.on("project_trust", async (event, ctx): Promise<ProjectTrustEventResult> => {
27
+ ctx.ui.notify(`project_trust fired for ${event.cwd} (mode: ${ctx.mode}, load: ${loadCount})`, "info");
28
+
29
+ if (!ctx.hasUI) {
30
+ return { trusted: "undecided" };
31
+ }
32
+
33
+ const choice = await ctx.ui.select(`Project trust for:\n${event.cwd}`, [
34
+ "Trust and remember",
35
+ "Trust with note and remember",
36
+ "Trust this session",
37
+ "Do not trust this session",
38
+ "Let built-in prompt decide",
39
+ ]);
40
+
41
+ if (choice === "Trust with note and remember") {
42
+ const note = await ctx.ui.input("Project trust note", "Optional note for this demo");
43
+ ctx.ui.notify(note ? `Recorded demo note: ${note}` : "No demo note entered", "info");
44
+ return { trusted: "yes", remember: true };
45
+ }
46
+ if (choice === "Trust and remember") {
47
+ return { trusted: "yes", remember: true };
48
+ }
49
+ if (choice === "Trust this session") {
50
+ return { trusted: "yes" };
51
+ }
52
+ if (choice === "Do not trust this session") {
53
+ return { trusted: "no" };
54
+ }
55
+ if (choice === "Let built-in prompt decide") {
56
+ return { trusted: "undecided" };
57
+ }
58
+ return { trusted: "undecided" };
59
+ });
60
+
61
+ pi.on("session_start", (_event, ctx) => {
62
+ ctx.ui.notify(`project-trust example loaded after trust resolution in ${ctx.cwd}`, "info");
63
+ });
64
+ }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "1.8.0",
3
+ "version": "1.9.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "1.8.0",
9
+ "version": "1.9.1",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "1.8.0",
4
+ "version": "1.9.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "0.78.0",
3
+ "version": "0.79.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.78.0",
9
+ "version": "0.79.1",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.78.0",
4
+ "version": "0.79.1",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIN,WAAW,EAIX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EAIZ,QAAQ,EACR,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAiBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAwBzC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB","sourcesContent":["/**\n * Agent loop that works with AgentMessage throughout.\n * Transforms to Message[] only at the LLM call boundary.\n */\n\nimport {\n\ttype AssistantMessage,\n\ttype AssistantMessageEvent,\n\ttype Context,\n\tEventStream,\n\tstreamSimple,\n\ttype ToolResultMessage,\n\tvalidateToolArguments,\n} from \"@earendil-works/pi-ai\";\nimport type {\n\tAgentContext,\n\tAgentEvent,\n\tAgentLoopConfig,\n\tAgentMessage,\n\tAgentTool,\n\tAgentToolCall,\n\tAgentToolResult,\n\tStreamFn,\n} from \"./types.ts\";\n\nexport type AgentEventSink = (event: AgentEvent) => Promise<void> | void;\n\n/**\n * Start an agent loop with a new prompt message.\n * The prompt is added to the context and events are emitted for it.\n */\nexport function agentLoop(\n\tprompts: AgentMessage[],\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal?: AbortSignal,\n\tstreamFn?: StreamFn,\n): EventStream<AgentEvent, AgentMessage[]> {\n\tconst stream = createAgentStream();\n\n\tvoid runAgentLoop(\n\t\tprompts,\n\t\tcontext,\n\t\tconfig,\n\t\tasync (event) => {\n\t\t\tstream.push(event);\n\t\t},\n\t\tsignal,\n\t\tstreamFn,\n\t).then((messages) => {\n\t\tstream.end(messages);\n\t});\n\n\treturn stream;\n}\n\n/**\n * Continue an agent loop from the current context without adding a new message.\n * Used for retries - context already has user message or tool results.\n *\n * **Important:** The last message in context must convert to a `user` or `toolResult` message\n * via `convertToLlm`. If it doesn't, the LLM provider will reject the request.\n * This cannot be validated here since `convertToLlm` is only called once per turn.\n */\nexport function agentLoopContinue(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal?: AbortSignal,\n\tstreamFn?: StreamFn,\n): EventStream<AgentEvent, AgentMessage[]> {\n\tif (context.messages.length === 0) {\n\t\tthrow new Error(\"Cannot continue: no messages in context\");\n\t}\n\n\tif (context.messages[context.messages.length - 1].role === \"assistant\") {\n\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t}\n\n\tconst stream = createAgentStream();\n\n\tvoid runAgentLoopContinue(\n\t\tcontext,\n\t\tconfig,\n\t\tasync (event) => {\n\t\t\tstream.push(event);\n\t\t},\n\t\tsignal,\n\t\tstreamFn,\n\t).then((messages) => {\n\t\tstream.end(messages);\n\t});\n\n\treturn stream;\n}\n\nexport async function runAgentLoop(\n\tprompts: AgentMessage[],\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\temit: AgentEventSink,\n\tsignal?: AbortSignal,\n\tstreamFn?: StreamFn,\n): Promise<AgentMessage[]> {\n\tconst newMessages: AgentMessage[] = [...prompts];\n\tconst currentContext: AgentContext = {\n\t\t...context,\n\t\tmessages: [...context.messages, ...prompts],\n\t};\n\n\tawait emit({ type: \"agent_start\" });\n\tawait emit({ type: \"turn_start\" });\n\tfor (const prompt of prompts) {\n\t\tawait emit({ type: \"message_start\", message: prompt });\n\t\tawait emit({ type: \"message_end\", message: prompt });\n\t}\n\n\tawait runLoop(currentContext, newMessages, config, signal, emit, streamFn);\n\treturn newMessages;\n}\n\nexport async function runAgentLoopContinue(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\temit: AgentEventSink,\n\tsignal?: AbortSignal,\n\tstreamFn?: StreamFn,\n): Promise<AgentMessage[]> {\n\tif (context.messages.length === 0) {\n\t\tthrow new Error(\"Cannot continue: no messages in context\");\n\t}\n\n\tif (context.messages[context.messages.length - 1].role === \"assistant\") {\n\t\tthrow new Error(\"Cannot continue from message role: assistant\");\n\t}\n\n\tconst newMessages: AgentMessage[] = [];\n\tconst currentContext: AgentContext = { ...context };\n\n\tawait emit({ type: \"agent_start\" });\n\tawait emit({ type: \"turn_start\" });\n\n\tawait runLoop(currentContext, newMessages, config, signal, emit, streamFn);\n\treturn newMessages;\n}\n\nfunction createAgentStream(): EventStream<AgentEvent, AgentMessage[]> {\n\treturn new EventStream<AgentEvent, AgentMessage[]>(\n\t\t(event: AgentEvent) => event.type === \"agent_end\",\n\t\t(event: AgentEvent) => (event.type === \"agent_end\" ? event.messages : []),\n\t);\n}\n\nconst EMPTY_USAGE = {\n\tinput: 0,\n\toutput: 0,\n\tcacheRead: 0,\n\tcacheWrite: 0,\n\ttotalTokens: 0,\n\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n} satisfies AssistantMessage[\"usage\"];\n\nclass StreamIdleTimeoutError extends Error {\n\tconstructor(timeoutMs: number) {\n\t\tsuper(`Idle timeout waiting for provider stream after ${timeoutMs}ms`);\n\t\tthis.name = \"StreamIdleTimeoutError\";\n\t}\n}\n\n/**\n * Main loop logic shared by agentLoop and agentLoopContinue.\n */\nasync function runLoop(\n\tinitialContext: AgentContext,\n\tnewMessages: AgentMessage[],\n\tinitialConfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n\tstreamFn?: StreamFn,\n): Promise<void> {\n\tlet currentContext = initialContext;\n\tlet config = initialConfig;\n\tlet firstTurn = true;\n\t// Check for steering messages at start (user may have typed while waiting)\n\tlet pendingMessages: AgentMessage[] = (await config.getSteeringMessages?.()) || [];\n\n\t// Outer loop: continues when queued follow-up messages arrive after agent would stop\n\twhile (true) {\n\t\tlet hasMoreToolCalls = true;\n\n\t\t// Inner loop: process tool calls and steering messages\n\t\twhile (hasMoreToolCalls || pendingMessages.length > 0) {\n\t\t\tif (!firstTurn) {\n\t\t\t\tawait emit({ type: \"turn_start\" });\n\t\t\t} else {\n\t\t\t\tfirstTurn = false;\n\t\t\t}\n\n\t\t\t// Process pending messages (inject before next assistant response)\n\t\t\tif (pendingMessages.length > 0) {\n\t\t\t\tfor (const message of pendingMessages) {\n\t\t\t\t\tawait emit({ type: \"message_start\", message });\n\t\t\t\t\tawait emit({ type: \"message_end\", message });\n\t\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\t\tnewMessages.push(message);\n\t\t\t\t}\n\t\t\t\tpendingMessages = [];\n\t\t\t}\n\n\t\t\t// Stream assistant response\n\t\t\tconst message = await streamAssistantResponse(currentContext, config, signal, emit, streamFn);\n\t\t\tnewMessages.push(message);\n\n\t\t\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\t\t\tawait emit({ type: \"turn_end\", message, toolResults: [] });\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check for tool calls\n\t\t\tconst toolCalls = message.content.filter((c) => c.type === \"toolCall\");\n\n\t\t\tconst toolResults: ToolResultMessage[] = [];\n\t\t\thasMoreToolCalls = false;\n\t\t\tif (toolCalls.length > 0) {\n\t\t\t\tconst executedToolBatch = await executeToolCalls(currentContext, message, config, signal, emit);\n\t\t\t\ttoolResults.push(...executedToolBatch.messages);\n\t\t\t\thasMoreToolCalls = !executedToolBatch.terminate;\n\n\t\t\t\tfor (const result of toolResults) {\n\t\t\t\t\tcurrentContext.messages.push(result);\n\t\t\t\t\tnewMessages.push(result);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait emit({ type: \"turn_end\", message, toolResults });\n\t\t\tif (signal?.aborted) {\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextTurnContext = {\n\t\t\t\tmessage,\n\t\t\t\ttoolResults,\n\t\t\t\tcontext: currentContext,\n\t\t\t\tnewMessages,\n\t\t\t};\n\t\t\tconst nextTurnSnapshot = await config.prepareNextTurn?.(nextTurnContext);\n\t\t\tif (nextTurnSnapshot) {\n\t\t\t\tcurrentContext = nextTurnSnapshot.context ?? currentContext;\n\t\t\t\tconfig = {\n\t\t\t\t\t...config,\n\t\t\t\t\tmodel: nextTurnSnapshot.model ?? config.model,\n\t\t\t\t\treasoning:\n\t\t\t\t\t\tnextTurnSnapshot.thinkingLevel === undefined\n\t\t\t\t\t\t\t? config.reasoning\n\t\t\t\t\t\t\t: nextTurnSnapshot.thinkingLevel === \"off\"\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: nextTurnSnapshot.thinkingLevel,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tawait config.shouldStopAfterTurn?.({\n\t\t\t\t\tmessage,\n\t\t\t\t\ttoolResults,\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t\tnewMessages,\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\tawait emit({ type: \"agent_end\", messages: newMessages });\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t}\n\n\t\t// Agent would stop here. Check for follow-up messages.\n\t\tconst followUpMessages = (await config.getFollowUpMessages?.()) || [];\n\t\tif (followUpMessages.length > 0) {\n\t\t\t// Set as pending so inner loop processes them\n\t\t\tpendingMessages = followUpMessages;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// No more messages, exit\n\t\tbreak;\n\t}\n\n\tawait emit({ type: \"agent_end\", messages: newMessages });\n}\n\n/**\n * Stream an assistant response from the LLM.\n * This is where AgentMessage[] gets transformed to Message[] for the LLM.\n */\nasync function streamAssistantResponse(\n\tcontext: AgentContext,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n\tstreamFn?: StreamFn,\n): Promise<AssistantMessage> {\n\tlet partialMessage: AssistantMessage | null = null;\n\tlet addedPartial = false;\n\n\ttry {\n\t\t// Apply context transform if configured (AgentMessage[] → AgentMessage[])\n\t\tlet messages = context.messages;\n\t\tif (config.transformContext) {\n\t\t\tmessages = await config.transformContext(messages, signal);\n\t\t}\n\n\t\t// Convert to LLM-compatible messages (AgentMessage[] → Message[])\n\t\tconst llmMessages = await config.convertToLlm(messages);\n\n\t\t// Build LLM context\n\t\tconst llmContext: Context = {\n\t\t\tsystemPrompt: context.systemPrompt,\n\t\t\tmessages: llmMessages,\n\t\t\ttools: context.tools,\n\t\t};\n\n\t\tconst streamFunction = streamFn || streamSimple;\n\n\t\t// Resolve API key (important for expiring tokens)\n\t\tconst resolvedApiKey =\n\t\t\t(config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\n\t\tconst response = await streamFunction(config.model, llmContext, {\n\t\t\t...config,\n\t\t\tapiKey: resolvedApiKey,\n\t\t\tsignal,\n\t\t});\n\n\t\tconst iterator = response[Symbol.asyncIterator]();\n\t\twhile (true) {\n\t\t\tconst next = await readNextAssistantEvent(iterator, config.timeoutMs, signal);\n\t\t\tif (next.done) break;\n\t\t\tconst event = next.value;\n\t\t\tswitch (event.type) {\n\t\t\t\tcase \"start\":\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tcontext.messages.push(partialMessage);\n\t\t\t\t\taddedPartial = true;\n\t\t\t\t\tawait emit({ type: \"message_start\", message: { ...partialMessage } });\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"text_start\":\n\t\t\t\tcase \"text_delta\":\n\t\t\t\tcase \"text_end\":\n\t\t\t\tcase \"thinking_start\":\n\t\t\t\tcase \"thinking_delta\":\n\t\t\t\tcase \"thinking_end\":\n\t\t\t\tcase \"toolcall_start\":\n\t\t\t\tcase \"toolcall_delta\":\n\t\t\t\tcase \"toolcall_end\":\n\t\t\t\t\tif (partialMessage) {\n\t\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\t\tcontext.messages[context.messages.length - 1] = partialMessage;\n\t\t\t\t\t\tawait emit({\n\t\t\t\t\t\t\ttype: \"message_update\",\n\t\t\t\t\t\t\tassistantMessageEvent: event,\n\t\t\t\t\t\t\tmessage: { ...partialMessage },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"done\":\n\t\t\t\tcase \"error\": {\n\t\t\t\t\tconst finalMessage = normalizeTerminalAssistantMessage(await response.result(), event);\n\t\t\t\t\tif (addedPartial) {\n\t\t\t\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.messages.push(finalMessage);\n\t\t\t\t\t}\n\t\t\t\t\tif (!addedPartial) {\n\t\t\t\t\t\tawait emit({ type: \"message_start\", message: { ...finalMessage } });\n\t\t\t\t\t}\n\t\t\t\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\t\t\t\treturn finalMessage;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst finalMessage = await response.result();\n\t\tif (addedPartial) {\n\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t} else {\n\t\t\tcontext.messages.push(finalMessage);\n\t\t\tawait emit({ type: \"message_start\", message: { ...finalMessage } });\n\t\t}\n\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\treturn finalMessage;\n\t} catch (error) {\n\t\tconst finalMessage = createTerminalFailureAssistantMessage(\n\t\t\tconfig.model,\n\t\t\tsignal?.aborted ? \"aborted\" : \"error\",\n\t\t\terror,\n\t\t\tpartialMessage,\n\t\t);\n\t\tif (addedPartial) {\n\t\t\tcontext.messages[context.messages.length - 1] = finalMessage;\n\t\t} else {\n\t\t\tcontext.messages.push(finalMessage);\n\t\t\tawait emit({ type: \"message_start\", message: { ...finalMessage } });\n\t\t}\n\t\tawait emit({ type: \"message_end\", message: finalMessage });\n\t\treturn finalMessage;\n\t}\n}\n\nasync function readNextAssistantEvent(\n\titerator: AsyncIterator<AssistantMessageEvent>,\n\ttimeoutMs: number | undefined,\n\tsignal: AbortSignal | undefined,\n): Promise<IteratorResult<AssistantMessageEvent>> {\n\tconst idleTimeoutMs =\n\t\ttypeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : undefined;\n\tif (idleTimeoutMs === undefined && signal === undefined) {\n\t\treturn iterator.next();\n\t}\n\tif (signal?.aborted) {\n\t\tthrow new Error(\"Request was aborted\");\n\t}\n\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\tlet abortHandler: (() => void) | undefined;\n\tlet settled = false;\n\n\treturn new Promise<IteratorResult<AssistantMessageEvent>>((resolve, reject) => {\n\t\tconst settle = (complete: () => void): void => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tif (timeout !== undefined) {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t}\n\t\t\tif (abortHandler !== undefined) {\n\t\t\t\tsignal?.removeEventListener(\"abort\", abortHandler);\n\t\t\t}\n\t\t\tcomplete();\n\t\t};\n\n\t\tif (idleTimeoutMs !== undefined) {\n\t\t\ttimeout = setTimeout(() => {\n\t\t\t\tvoid iterator.return?.();\n\t\t\t\tsettle(() => reject(new StreamIdleTimeoutError(idleTimeoutMs)));\n\t\t\t}, idleTimeoutMs);\n\t\t}\n\n\t\tif (signal !== undefined) {\n\t\t\tabortHandler = () => {\n\t\t\t\tvoid iterator.return?.();\n\t\t\t\tsettle(() => reject(new Error(\"Request was aborted\")));\n\t\t\t};\n\t\t\tsignal.addEventListener(\"abort\", abortHandler, { once: true });\n\t\t}\n\n\t\tvoid iterator.next().then(\n\t\t\t(result) => settle(() => resolve(result)),\n\t\t\t(error: unknown) => settle(() => reject(error)),\n\t\t);\n\t});\n}\n\n/**\n * Execute tool calls from an assistant message.\n */\nasync function executeToolCalls(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\tconst toolCalls = assistantMessage.content.filter((c) => c.type === \"toolCall\");\n\tconst hasSequentialToolCall = toolCalls.some(\n\t\t(tc) => currentContext.tools?.find((t) => t.name === tc.name)?.executionMode === \"sequential\",\n\t);\n\tif (config.toolExecution === \"sequential\" || hasSequentialToolCall) {\n\t\treturn executeToolCallsSequential(currentContext, assistantMessage, toolCalls, config, signal, emit);\n\t}\n\treturn executeToolCallsParallel(currentContext, assistantMessage, toolCalls, config, signal, emit);\n}\n\ntype ExecutedToolCallBatch = {\n\tmessages: ToolResultMessage[];\n\tterminate: boolean;\n};\n\ntype TerminalAssistantMessageEvent = Extract<AssistantMessageEvent, { type: \"done\" | \"error\" }>;\n\nfunction createTerminalFailureAssistantMessage(\n\tmodel: AgentLoopConfig[\"model\"],\n\treason: Extract<AssistantMessage[\"stopReason\"], \"aborted\" | \"error\">,\n\terror: unknown,\n\tpartialMessage: AssistantMessage | null,\n): AssistantMessage {\n\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: partialMessage?.content ?? [{ type: \"text\", text: \"\" }],\n\t\tapi: partialMessage?.api ?? model.api,\n\t\tprovider: partialMessage?.provider ?? model.provider,\n\t\tmodel: partialMessage?.model ?? model.id,\n\t\tresponseModel: partialMessage?.responseModel,\n\t\tresponseId: partialMessage?.responseId,\n\t\tdiagnostics: partialMessage?.diagnostics,\n\t\tusage: partialMessage?.usage ?? EMPTY_USAGE,\n\t\tstopReason: reason,\n\t\terrorMessage: errorMessage || (reason === \"aborted\" ? \"Request was aborted\" : \"Error\"),\n\t\ttimestamp: partialMessage?.timestamp ?? Date.now(),\n\t};\n}\n\nfunction normalizeTerminalAssistantMessage(\n\tmessage: AssistantMessage,\n\tevent: TerminalAssistantMessageEvent,\n): AssistantMessage {\n\tif (event.type === \"done\") {\n\t\treturn message;\n\t}\n\tconst errorMessage = message.errorMessage ?? (event.reason === \"aborted\" ? \"Request was aborted\" : \"Error\");\n\tif (message.stopReason === event.reason && message.errorMessage === errorMessage) {\n\t\treturn message;\n\t}\n\treturn {\n\t\t...message,\n\t\tstopReason: event.reason,\n\t\terrorMessage,\n\t};\n}\n\nasync function executeToolCallsSequential(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCalls: AgentToolCall[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\tconst finalizedCalls: FinalizedToolCallOutcome[] = [];\n\tconst messages: ToolResultMessage[] = [];\n\n\tfor (const toolCall of toolCalls) {\n\t\tawait emit({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tconst preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);\n\t\tlet finalized: FinalizedToolCallOutcome;\n\t\tif (preparation.kind === \"immediate\") {\n\t\t\tfinalized = {\n\t\t\t\ttoolCall,\n\t\t\t\tresult: preparation.result,\n\t\t\t\tisError: preparation.isError,\n\t\t\t};\n\t\t} else {\n\t\t\tconst executed = await executePreparedToolCall(preparation, signal, emit);\n\t\t\tfinalized = await finalizeExecutedToolCall(\n\t\t\t\tcurrentContext,\n\t\t\t\tassistantMessage,\n\t\t\t\tpreparation,\n\t\t\t\texecuted,\n\t\t\t\tconfig,\n\t\t\t\tsignal,\n\t\t\t);\n\t\t}\n\n\t\tawait emitToolExecutionEnd(finalized, emit);\n\t\tconst toolResultMessage = createToolResultMessage(finalized);\n\t\tawait emitToolResultMessage(toolResultMessage, emit);\n\t\tfinalizedCalls.push(finalized);\n\t\tmessages.push(toolResultMessage);\n\n\t\tif (signal?.aborted) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn {\n\t\tmessages,\n\t\tterminate: shouldTerminateToolBatch(finalizedCalls),\n\t};\n}\n\nasync function executeToolCallsParallel(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCalls: AgentToolCall[],\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallBatch> {\n\tconst finalizedCalls: FinalizedToolCallEntry[] = [];\n\n\tfor (const toolCall of toolCalls) {\n\t\tawait emit({\n\t\t\ttype: \"tool_execution_start\",\n\t\t\ttoolCallId: toolCall.id,\n\t\t\ttoolName: toolCall.name,\n\t\t\targs: toolCall.arguments,\n\t\t});\n\n\t\tconst preparation = await prepareToolCall(currentContext, assistantMessage, toolCall, config, signal);\n\t\tif (preparation.kind === \"immediate\") {\n\t\t\tconst finalized = {\n\t\t\t\ttoolCall,\n\t\t\t\tresult: preparation.result,\n\t\t\t\tisError: preparation.isError,\n\t\t\t} satisfies FinalizedToolCallOutcome;\n\t\t\tawait emitToolExecutionEnd(finalized, emit);\n\t\t\tfinalizedCalls.push(finalized);\n\t\t\tif (signal?.aborted) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tfinalizedCalls.push(async () => {\n\t\t\tconst executed = await executePreparedToolCall(preparation, signal, emit);\n\t\t\tconst finalized = await finalizeExecutedToolCall(\n\t\t\t\tcurrentContext,\n\t\t\t\tassistantMessage,\n\t\t\t\tpreparation,\n\t\t\t\texecuted,\n\t\t\t\tconfig,\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tawait emitToolExecutionEnd(finalized, emit);\n\t\t\treturn finalized;\n\t\t});\n\t\tif (signal?.aborted) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst orderedFinalizedCalls = await Promise.all(\n\t\tfinalizedCalls.map((entry) => (typeof entry === \"function\" ? entry() : Promise.resolve(entry))),\n\t);\n\tconst messages: ToolResultMessage[] = [];\n\tfor (const finalized of orderedFinalizedCalls) {\n\t\tconst toolResultMessage = createToolResultMessage(finalized);\n\t\tawait emitToolResultMessage(toolResultMessage, emit);\n\t\tmessages.push(toolResultMessage);\n\t}\n\n\treturn {\n\t\tmessages,\n\t\tterminate: shouldTerminateToolBatch(orderedFinalizedCalls),\n\t};\n}\n\ntype PreparedToolCall = {\n\tkind: \"prepared\";\n\ttoolCall: AgentToolCall;\n\ttool: AgentTool<any>;\n\targs: unknown;\n};\n\ntype ImmediateToolCallOutcome = {\n\tkind: \"immediate\";\n\tresult: AgentToolResult<any>;\n\tisError: boolean;\n};\n\ntype ExecutedToolCallOutcome = {\n\tresult: AgentToolResult<any>;\n\tisError: boolean;\n};\n\ntype FinalizedToolCallOutcome = {\n\ttoolCall: AgentToolCall;\n\tresult: AgentToolResult<any>;\n\tisError: boolean;\n};\n\ntype FinalizedToolCallEntry = FinalizedToolCallOutcome | (() => Promise<FinalizedToolCallOutcome>);\n\nfunction shouldTerminateToolBatch(finalizedCalls: FinalizedToolCallOutcome[]): boolean {\n\treturn finalizedCalls.length > 0 && finalizedCalls.every((finalized) => finalized.result.terminate === true);\n}\n\nfunction prepareToolCallArguments(tool: AgentTool<any>, toolCall: AgentToolCall): AgentToolCall {\n\tif (!tool.prepareArguments) {\n\t\treturn toolCall;\n\t}\n\tconst preparedArguments = tool.prepareArguments(toolCall.arguments);\n\tif (preparedArguments === toolCall.arguments) {\n\t\treturn toolCall;\n\t}\n\treturn {\n\t\t...toolCall,\n\t\targuments: preparedArguments as Record<string, any>,\n\t};\n}\n\nasync function prepareToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\ttoolCall: AgentToolCall,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<PreparedToolCall | ImmediateToolCallOutcome> {\n\tconst tool = currentContext.tools?.find((t) => t.name === toolCall.name);\n\tif (!tool) {\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\tresult: createErrorToolResult(`Tool ${toolCall.name} not found`),\n\t\t\tisError: true,\n\t\t};\n\t}\n\n\ttry {\n\t\tconst preparedToolCall = prepareToolCallArguments(tool, toolCall);\n\t\tconst validatedArgs = validateToolArguments(tool, preparedToolCall);\n\t\tif (config.beforeToolCall) {\n\t\t\tconst beforeResult = await config.beforeToolCall(\n\t\t\t\t{\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\ttoolCall,\n\t\t\t\t\targs: validatedArgs,\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (signal?.aborted) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"immediate\",\n\t\t\t\t\tresult: createErrorToolResult(\"Operation aborted\"),\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (beforeResult?.block) {\n\t\t\t\treturn {\n\t\t\t\t\tkind: \"immediate\",\n\t\t\t\t\tresult: createErrorToolResult(beforeResult.reason || \"Tool execution was blocked\"),\n\t\t\t\t\tisError: true,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tif (signal?.aborted) {\n\t\t\treturn {\n\t\t\t\tkind: \"immediate\",\n\t\t\t\tresult: createErrorToolResult(\"Operation aborted\"),\n\t\t\t\tisError: true,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkind: \"prepared\",\n\t\t\ttoolCall,\n\t\t\ttool,\n\t\t\targs: validatedArgs,\n\t\t};\n\t} catch (error) {\n\t\treturn {\n\t\t\tkind: \"immediate\",\n\t\t\tresult: createErrorToolResult(error instanceof Error ? error.message : String(error)),\n\t\t\tisError: true,\n\t\t};\n\t}\n}\n\nasync function executePreparedToolCall(\n\tprepared: PreparedToolCall,\n\tsignal: AbortSignal | undefined,\n\temit: AgentEventSink,\n): Promise<ExecutedToolCallOutcome> {\n\tconst updateEvents: Promise<void>[] = [];\n\n\ttry {\n\t\tconst result = await prepared.tool.execute(\n\t\t\tprepared.toolCall.id,\n\t\t\tprepared.args as never,\n\t\t\tsignal,\n\t\t\t(partialResult) => {\n\t\t\t\tupdateEvents.push(\n\t\t\t\t\tPromise.resolve(\n\t\t\t\t\t\temit({\n\t\t\t\t\t\t\ttype: \"tool_execution_update\",\n\t\t\t\t\t\t\ttoolCallId: prepared.toolCall.id,\n\t\t\t\t\t\t\ttoolName: prepared.toolCall.name,\n\t\t\t\t\t\t\targs: prepared.toolCall.arguments,\n\t\t\t\t\t\t\tpartialResult,\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t},\n\t\t);\n\t\tawait Promise.all(updateEvents);\n\t\treturn { result, isError: false };\n\t} catch (error) {\n\t\tawait Promise.all(updateEvents);\n\t\treturn {\n\t\t\tresult: createErrorToolResult(error instanceof Error ? error.message : String(error)),\n\t\t\tisError: true,\n\t\t};\n\t}\n}\n\nasync function finalizeExecutedToolCall(\n\tcurrentContext: AgentContext,\n\tassistantMessage: AssistantMessage,\n\tprepared: PreparedToolCall,\n\texecuted: ExecutedToolCallOutcome,\n\tconfig: AgentLoopConfig,\n\tsignal: AbortSignal | undefined,\n): Promise<FinalizedToolCallOutcome> {\n\tlet result = executed.result;\n\tlet isError = executed.isError;\n\n\tif (config.afterToolCall) {\n\t\ttry {\n\t\t\tconst afterResult = await config.afterToolCall(\n\t\t\t\t{\n\t\t\t\t\tassistantMessage,\n\t\t\t\t\ttoolCall: prepared.toolCall,\n\t\t\t\t\targs: prepared.args,\n\t\t\t\t\tresult,\n\t\t\t\t\tisError,\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (afterResult) {\n\t\t\t\tresult = {\n\t\t\t\t\tcontent: afterResult.content ?? result.content,\n\t\t\t\t\tdetails: afterResult.details ?? result.details,\n\t\t\t\t\tterminate: afterResult.terminate ?? result.terminate,\n\t\t\t\t};\n\t\t\t\tisError = afterResult.isError ?? isError;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tresult = createErrorToolResult(error instanceof Error ? error.message : String(error));\n\t\t\tisError = true;\n\t\t}\n\t}\n\n\treturn {\n\t\ttoolCall: prepared.toolCall,\n\t\tresult,\n\t\tisError,\n\t};\n}\n\nfunction createErrorToolResult(message: string): AgentToolResult<any> {\n\treturn {\n\t\tcontent: [{ type: \"text\", text: message }],\n\t\tdetails: {},\n\t};\n}\n\nasync function emitToolExecutionEnd(finalized: FinalizedToolCallOutcome, emit: AgentEventSink): Promise<void> {\n\tawait emit({\n\t\ttype: \"tool_execution_end\",\n\t\ttoolCallId: finalized.toolCall.id,\n\t\ttoolName: finalized.toolCall.name,\n\t\tresult: finalized.result,\n\t\tisError: finalized.isError,\n\t});\n}\n\nfunction createToolResultMessage(finalized: FinalizedToolCallOutcome): ToolResultMessage {\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId: finalized.toolCall.id,\n\t\ttoolName: finalized.toolCall.name,\n\t\tcontent: finalized.result.content,\n\t\tdetails: finalized.result.details,\n\t\tisError: finalized.isError,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\nasync function emitToolResultMessage(toolResultMessage: ToolResultMessage, emit: AgentEventSink): Promise<void> {\n\tawait emit({ type: \"message_start\", message: toolResultMessage });\n\tawait emit({ type: \"message_end\", message: toolResultMessage });\n}\n"]}
1
+ {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIN,WAAW,EAIX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EACf,YAAY,EAIZ,QAAQ,EACR,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAiBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAwBzC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,CAAC,EAAE,WAAW,EACpB,QAAQ,CAAC,EAAE,QAAQ,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB"}