@code-yeongyu/senpi 2026.6.21 → 2026.6.28-4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (945) hide show
  1. package/CHANGELOG.md +136 -0
  2. package/README.md +39 -4
  3. package/dist/bun/register-bedrock.js +1 -1
  4. package/dist/bun/register-bedrock.js.map +1 -1
  5. package/dist/cli/args.js +1 -1
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/file-processor.d.ts.map +1 -1
  8. package/dist/cli/file-processor.js +13 -25
  9. package/dist/cli/file-processor.js.map +1 -1
  10. package/dist/cli/session-picker.d.ts +2 -1
  11. package/dist/cli/session-picker.d.ts.map +1 -1
  12. package/dist/cli/session-picker.js +5 -4
  13. package/dist/cli/session-picker.js.map +1 -1
  14. package/dist/cli/startup-ui.d.ts +4 -1
  15. package/dist/cli/startup-ui.d.ts.map +1 -1
  16. package/dist/cli/startup-ui.js +63 -14
  17. package/dist/cli/startup-ui.js.map +1 -1
  18. package/dist/core/agent-session.d.ts +4 -3
  19. package/dist/core/agent-session.d.ts.map +1 -1
  20. package/dist/core/agent-session.js +17 -22
  21. package/dist/core/agent-session.js.map +1 -1
  22. package/dist/core/auth-storage.d.ts +6 -12
  23. package/dist/core/auth-storage.d.ts.map +1 -1
  24. package/dist/core/auth-storage.js +4 -19
  25. package/dist/core/auth-storage.js.map +1 -1
  26. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  27. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  28. package/dist/core/compaction/branch-summarization.js +1 -1
  29. package/dist/core/compaction/branch-summarization.js.map +1 -1
  30. package/dist/core/compaction/compaction.d.ts +2 -2
  31. package/dist/core/compaction/compaction.d.ts.map +1 -1
  32. package/dist/core/compaction/compaction.js +7 -4
  33. package/dist/core/compaction/compaction.js.map +1 -1
  34. package/dist/core/dynamic-prompt/style.d.ts.map +1 -1
  35. package/dist/core/dynamic-prompt/style.js +26 -1
  36. package/dist/core/dynamic-prompt/style.js.map +1 -1
  37. package/dist/core/experimental.d.ts +2 -0
  38. package/dist/core/experimental.d.ts.map +1 -0
  39. package/dist/core/experimental.js +4 -0
  40. package/dist/core/experimental.js.map +1 -0
  41. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts +1 -1
  42. package/dist/core/extensions/builtin/compaction/openai-remote.d.ts.map +1 -1
  43. package/dist/core/extensions/builtin/compaction/openai-remote.js +1 -1
  44. package/dist/core/extensions/builtin/compaction/openai-remote.js.map +1 -1
  45. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  46. package/dist/core/extensions/builtin/compaction/speculative.js +2 -1
  47. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  48. package/dist/core/extensions/builtin/goal/command-registration.d.ts +12 -0
  49. package/dist/core/extensions/builtin/goal/command-registration.d.ts.map +1 -0
  50. package/dist/core/extensions/builtin/goal/command-registration.js +86 -0
  51. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -0
  52. package/dist/core/extensions/builtin/goal/continuation.d.ts +2 -1
  53. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/goal/continuation.js +33 -2
  55. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  56. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/goal/index.js +19 -136
  58. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  59. package/dist/core/extensions/builtin/goal/tool-registration.d.ts +10 -0
  60. package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -0
  61. package/dist/core/extensions/builtin/goal/tool-registration.js +63 -0
  62. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -0
  63. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  64. package/dist/core/extensions/builtin/index.js +2 -0
  65. package/dist/core/extensions/builtin/index.js.map +1 -1
  66. package/dist/core/extensions/builtin/permission-system/cli.d.ts +3 -1
  67. package/dist/core/extensions/builtin/permission-system/cli.d.ts.map +1 -1
  68. package/dist/core/extensions/builtin/permission-system/cli.js +14 -0
  69. package/dist/core/extensions/builtin/permission-system/cli.js.map +1 -1
  70. package/dist/core/extensions/builtin/permission-system/config.d.ts +3 -1
  71. package/dist/core/extensions/builtin/permission-system/config.d.ts.map +1 -1
  72. package/dist/core/extensions/builtin/permission-system/config.js +26 -0
  73. package/dist/core/extensions/builtin/permission-system/config.js.map +1 -1
  74. package/dist/core/extensions/builtin/permission-system/external-dir.js +2 -2
  75. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  76. package/dist/core/extensions/builtin/permission-system/index.d.ts.map +1 -1
  77. package/dist/core/extensions/builtin/permission-system/index.js +11 -2
  78. package/dist/core/extensions/builtin/permission-system/index.js.map +1 -1
  79. package/dist/core/extensions/builtin/permission-system/parsers.d.ts.map +1 -1
  80. package/dist/core/extensions/builtin/permission-system/parsers.js +39 -16
  81. package/dist/core/extensions/builtin/permission-system/parsers.js.map +1 -1
  82. package/dist/core/extensions/builtin/permission-system/settings.d.ts +6 -5
  83. package/dist/core/extensions/builtin/permission-system/settings.d.ts.map +1 -1
  84. package/dist/core/extensions/builtin/permission-system/settings.js +26 -6
  85. package/dist/core/extensions/builtin/permission-system/settings.js.map +1 -1
  86. package/dist/core/extensions/builtin/permission-system/types.d.ts +1 -0
  87. package/dist/core/extensions/builtin/permission-system/types.d.ts.map +1 -1
  88. package/dist/core/extensions/builtin/permission-system/types.js.map +1 -1
  89. package/dist/core/extensions/builtin/pi-codex-app-server/capability-negotiator.d.ts +42 -0
  90. package/dist/core/extensions/builtin/pi-codex-app-server/capability-negotiator.d.ts.map +1 -0
  91. package/dist/core/extensions/builtin/pi-codex-app-server/capability-negotiator.js +130 -0
  92. package/dist/core/extensions/builtin/pi-codex-app-server/capability-negotiator.js.map +1 -0
  93. package/dist/core/extensions/builtin/pi-codex-app-server/error-mapper.d.ts +27 -0
  94. package/dist/core/extensions/builtin/pi-codex-app-server/error-mapper.d.ts.map +1 -0
  95. package/dist/core/extensions/builtin/pi-codex-app-server/error-mapper.js +18 -0
  96. package/dist/core/extensions/builtin/pi-codex-app-server/error-mapper.js.map +1 -0
  97. package/dist/core/extensions/builtin/pi-codex-app-server/extension.d.ts +25 -0
  98. package/dist/core/extensions/builtin/pi-codex-app-server/extension.d.ts.map +1 -0
  99. package/dist/core/extensions/builtin/pi-codex-app-server/extension.js +110 -0
  100. package/dist/core/extensions/builtin/pi-codex-app-server/extension.js.map +1 -0
  101. package/dist/core/extensions/builtin/pi-codex-app-server/id-mapper.d.ts +48 -0
  102. package/dist/core/extensions/builtin/pi-codex-app-server/id-mapper.d.ts.map +1 -0
  103. package/dist/core/extensions/builtin/pi-codex-app-server/id-mapper.js +74 -0
  104. package/dist/core/extensions/builtin/pi-codex-app-server/id-mapper.js.map +1 -0
  105. package/dist/core/extensions/builtin/pi-codex-app-server/index.d.ts +3 -0
  106. package/dist/core/extensions/builtin/pi-codex-app-server/index.d.ts.map +1 -0
  107. package/dist/core/extensions/builtin/pi-codex-app-server/index.js +5 -0
  108. package/dist/core/extensions/builtin/pi-codex-app-server/index.js.map +1 -0
  109. package/dist/core/extensions/builtin/pi-codex-app-server/item-stream-projector.d.ts +29 -0
  110. package/dist/core/extensions/builtin/pi-codex-app-server/item-stream-projector.d.ts.map +1 -0
  111. package/dist/core/extensions/builtin/pi-codex-app-server/item-stream-projector.js +105 -0
  112. package/dist/core/extensions/builtin/pi-codex-app-server/item-stream-projector.js.map +1 -0
  113. package/dist/core/extensions/builtin/pi-codex-app-server/notification-projector.d.ts +49 -0
  114. package/dist/core/extensions/builtin/pi-codex-app-server/notification-projector.d.ts.map +1 -0
  115. package/dist/core/extensions/builtin/pi-codex-app-server/notification-projector.js +99 -0
  116. package/dist/core/extensions/builtin/pi-codex-app-server/notification-projector.js.map +1 -0
  117. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-core.d.ts +42 -0
  118. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-core.d.ts.map +1 -0
  119. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-core.js +191 -0
  120. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-core.js.map +1 -0
  121. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-inventory.d.ts +3 -0
  122. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-inventory.d.ts.map +1 -0
  123. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-inventory.js +103 -0
  124. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-inventory.js.map +1 -0
  125. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-required-surfaces.d.ts +7 -0
  126. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-required-surfaces.d.ts.map +1 -0
  127. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-required-surfaces.js +234 -0
  128. package/dist/core/extensions/builtin/pi-codex-app-server/protocol-required-surfaces.js.map +1 -0
  129. package/dist/core/extensions/builtin/pi-codex-app-server/reconnect-resume-token.d.ts +18 -0
  130. package/dist/core/extensions/builtin/pi-codex-app-server/reconnect-resume-token.d.ts.map +1 -0
  131. package/dist/core/extensions/builtin/pi-codex-app-server/reconnect-resume-token.js +77 -0
  132. package/dist/core/extensions/builtin/pi-codex-app-server/reconnect-resume-token.js.map +1 -0
  133. package/dist/core/extensions/builtin/pi-codex-app-server/reconnect-resume.d.ts +70 -0
  134. package/dist/core/extensions/builtin/pi-codex-app-server/reconnect-resume.d.ts.map +1 -0
  135. package/dist/core/extensions/builtin/pi-codex-app-server/reconnect-resume.js +138 -0
  136. package/dist/core/extensions/builtin/pi-codex-app-server/reconnect-resume.js.map +1 -0
  137. package/dist/core/extensions/builtin/pi-codex-app-server/request-router-params.d.ts +34 -0
  138. package/dist/core/extensions/builtin/pi-codex-app-server/request-router-params.d.ts.map +1 -0
  139. package/dist/core/extensions/builtin/pi-codex-app-server/request-router-params.js +92 -0
  140. package/dist/core/extensions/builtin/pi-codex-app-server/request-router-params.js.map +1 -0
  141. package/dist/core/extensions/builtin/pi-codex-app-server/request-router.d.ts +32 -0
  142. package/dist/core/extensions/builtin/pi-codex-app-server/request-router.d.ts.map +1 -0
  143. package/dist/core/extensions/builtin/pi-codex-app-server/request-router.js +279 -0
  144. package/dist/core/extensions/builtin/pi-codex-app-server/request-router.js.map +1 -0
  145. package/dist/core/extensions/builtin/pi-codex-app-server/runtime-errors.d.ts +6 -0
  146. package/dist/core/extensions/builtin/pi-codex-app-server/runtime-errors.d.ts.map +1 -0
  147. package/dist/core/extensions/builtin/pi-codex-app-server/runtime-errors.js +8 -0
  148. package/dist/core/extensions/builtin/pi-codex-app-server/runtime-errors.js.map +1 -0
  149. package/dist/core/extensions/builtin/pi-codex-app-server/server-request-bridge.d.ts +76 -0
  150. package/dist/core/extensions/builtin/pi-codex-app-server/server-request-bridge.d.ts.map +1 -0
  151. package/dist/core/extensions/builtin/pi-codex-app-server/server-request-bridge.js +169 -0
  152. package/dist/core/extensions/builtin/pi-codex-app-server/server-request-bridge.js.map +1 -0
  153. package/dist/core/extensions/builtin/pi-codex-app-server/server-request-fields.d.ts +24 -0
  154. package/dist/core/extensions/builtin/pi-codex-app-server/server-request-fields.d.ts.map +1 -0
  155. package/dist/core/extensions/builtin/pi-codex-app-server/server-request-fields.js +81 -0
  156. package/dist/core/extensions/builtin/pi-codex-app-server/server-request-fields.js.map +1 -0
  157. package/dist/core/extensions/builtin/pi-codex-app-server/session-registry.d.ts +42 -0
  158. package/dist/core/extensions/builtin/pi-codex-app-server/session-registry.d.ts.map +1 -0
  159. package/dist/core/extensions/builtin/pi-codex-app-server/session-registry.js +89 -0
  160. package/dist/core/extensions/builtin/pi-codex-app-server/session-registry.js.map +1 -0
  161. package/dist/core/extensions/builtin/pi-codex-app-server/stream-backpressure.d.ts +36 -0
  162. package/dist/core/extensions/builtin/pi-codex-app-server/stream-backpressure.d.ts.map +1 -0
  163. package/dist/core/extensions/builtin/pi-codex-app-server/stream-backpressure.js +94 -0
  164. package/dist/core/extensions/builtin/pi-codex-app-server/stream-backpressure.js.map +1 -0
  165. package/dist/core/extensions/builtin/pi-codex-app-server/transport-runtime.d.ts +34 -0
  166. package/dist/core/extensions/builtin/pi-codex-app-server/transport-runtime.d.ts.map +1 -0
  167. package/dist/core/extensions/builtin/pi-codex-app-server/transport-runtime.js +179 -0
  168. package/dist/core/extensions/builtin/pi-codex-app-server/transport-runtime.js.map +1 -0
  169. package/dist/core/extensions/builtin/pi-codex-app-server/websocket-transport.d.ts +20 -0
  170. package/dist/core/extensions/builtin/pi-codex-app-server/websocket-transport.d.ts.map +1 -0
  171. package/dist/core/extensions/builtin/pi-codex-app-server/websocket-transport.js +90 -0
  172. package/dist/core/extensions/builtin/pi-codex-app-server/websocket-transport.js.map +1 -0
  173. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.d.ts +3 -0
  174. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.d.ts.map +1 -0
  175. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js +12 -0
  176. package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js.map +1 -0
  177. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  178. package/dist/core/extensions/builtin/prompt-preset/presets.js +6 -0
  179. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  180. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  181. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  182. package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
  183. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  184. package/dist/core/extensions/builtin/webfetch/webfetch/content.d.ts +2 -2
  185. package/dist/core/extensions/builtin/webfetch/webfetch/content.d.ts.map +1 -1
  186. package/dist/core/extensions/builtin/webfetch/webfetch/content.js +170 -7
  187. package/dist/core/extensions/builtin/webfetch/webfetch/content.js.map +1 -1
  188. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.d.ts.map +1 -1
  189. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js +101 -43
  190. package/dist/core/extensions/builtin/webfetch/webfetch/fetcher.js.map +1 -1
  191. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +2 -2
  192. package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -1
  193. package/dist/core/extensions/loader.d.ts.map +1 -1
  194. package/dist/core/extensions/loader.js +25 -14
  195. package/dist/core/extensions/loader.js.map +1 -1
  196. package/dist/core/extensions/types.d.ts +2 -0
  197. package/dist/core/extensions/types.d.ts.map +1 -1
  198. package/dist/core/extensions/types.js.map +1 -1
  199. package/dist/core/keybindings.d.ts +1 -1
  200. package/dist/core/model-registry.d.ts +1 -1
  201. package/dist/core/model-registry.d.ts.map +1 -1
  202. package/dist/core/model-registry.js +4 -6
  203. package/dist/core/model-registry.js.map +1 -1
  204. package/dist/core/model-resolver.js +1 -1
  205. package/dist/core/model-resolver.js.map +1 -1
  206. package/dist/core/provider-attribution.d.ts +2 -2
  207. package/dist/core/provider-attribution.d.ts.map +1 -1
  208. package/dist/core/provider-attribution.js.map +1 -1
  209. package/dist/core/provider-display-names.js +1 -1
  210. package/dist/core/provider-display-names.js.map +1 -1
  211. package/dist/core/resource-loader.d.ts.map +1 -1
  212. package/dist/core/resource-loader.js +2 -0
  213. package/dist/core/resource-loader.js.map +1 -1
  214. package/dist/core/sdk.d.ts +1 -1
  215. package/dist/core/sdk.d.ts.map +1 -1
  216. package/dist/core/sdk.js +20 -14
  217. package/dist/core/sdk.js.map +1 -1
  218. package/dist/core/session-manager.d.ts +5 -1
  219. package/dist/core/session-manager.d.ts.map +1 -1
  220. package/dist/core/session-manager.js +75 -14
  221. package/dist/core/session-manager.js.map +1 -1
  222. package/dist/core/session-resident-store.d.ts.map +1 -1
  223. package/dist/core/session-resident-store.js +63 -2
  224. package/dist/core/session-resident-store.js.map +1 -1
  225. package/dist/core/settings-manager.d.ts +3 -1
  226. package/dist/core/settings-manager.d.ts.map +1 -1
  227. package/dist/core/settings-manager.js +14 -6
  228. package/dist/core/settings-manager.js.map +1 -1
  229. package/dist/core/timings.d.ts +4 -2
  230. package/dist/core/timings.d.ts.map +1 -1
  231. package/dist/core/timings.js +24 -14
  232. package/dist/core/timings.js.map +1 -1
  233. package/dist/core/tools/find.d.ts.map +1 -1
  234. package/dist/core/tools/find.js +19 -11
  235. package/dist/core/tools/find.js.map +1 -1
  236. package/dist/core/tools/read.d.ts.map +1 -1
  237. package/dist/core/tools/read.js +12 -25
  238. package/dist/core/tools/read.js.map +1 -1
  239. package/dist/main.d.ts.map +1 -1
  240. package/dist/main.js +22 -7
  241. package/dist/main.js.map +1 -1
  242. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  243. package/dist/modes/interactive/components/assistant-message.js +13 -11
  244. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  245. package/dist/modes/interactive/components/extension-editor.d.ts +3 -1
  246. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  247. package/dist/modes/interactive/components/extension-editor.js +11 -3
  248. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  249. package/dist/modes/interactive/components/render-signature.d.ts +2 -0
  250. package/dist/modes/interactive/components/render-signature.d.ts.map +1 -0
  251. package/dist/modes/interactive/components/render-signature.js +101 -0
  252. package/dist/modes/interactive/components/render-signature.js.map +1 -0
  253. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  254. package/dist/modes/interactive/components/session-selector.js +14 -3
  255. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  256. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  257. package/dist/modes/interactive/components/tool-execution.js +4 -1
  258. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  259. package/dist/modes/interactive/components/user-message.js +1 -1
  260. package/dist/modes/interactive/components/user-message.js.map +1 -1
  261. package/dist/modes/interactive/interactive-mode.d.ts +2 -1
  262. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  263. package/dist/modes/interactive/interactive-mode.js +62 -46
  264. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  265. package/dist/modes/interactive/theme/theme-controller.d.ts +0 -1
  266. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  267. package/dist/modes/interactive/theme/theme-controller.js +2 -13
  268. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  269. package/dist/modes/interactive/theme/theme.d.ts +10 -0
  270. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  271. package/dist/modes/interactive/theme/theme.js +11 -0
  272. package/dist/modes/interactive/theme/theme.js.map +1 -1
  273. package/dist/rpc-entry.d.ts +3 -0
  274. package/dist/rpc-entry.d.ts.map +1 -0
  275. package/dist/rpc-entry.js +10 -0
  276. package/dist/rpc-entry.js.map +1 -0
  277. package/dist/utils/child-process.js +1 -1
  278. package/dist/utils/child-process.js.map +1 -1
  279. package/dist/utils/image-convert.d.ts +1 -0
  280. package/dist/utils/image-convert.d.ts.map +1 -1
  281. package/dist/utils/image-convert.js +21 -15
  282. package/dist/utils/image-convert.js.map +1 -1
  283. package/dist/utils/image-process.d.ts +18 -0
  284. package/dist/utils/image-process.d.ts.map +1 -0
  285. package/dist/utils/image-process.js +83 -0
  286. package/dist/utils/image-process.js.map +1 -0
  287. package/dist/utils/mime.d.ts.map +1 -1
  288. package/dist/utils/mime.js +41 -0
  289. package/dist/utils/mime.js.map +1 -1
  290. package/docs/compaction.md +3 -1
  291. package/docs/extensions.md +6 -1
  292. package/docs/keybindings.md +2 -2
  293. package/docs/models.md +4 -2
  294. package/docs/providers.md +3 -2
  295. package/docs/security.md +4 -0
  296. package/docs/settings.md +63 -0
  297. package/docs/terminal-setup.md +1 -7
  298. package/docs/tui.md +3 -3
  299. package/docs/usage.md +6 -4
  300. package/examples/extensions/custom-compaction.ts +5 -4
  301. package/examples/extensions/custom-provider-anthropic/index.ts +1 -1
  302. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  303. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  304. package/examples/extensions/custom-provider-gitlab-duo/index.ts +11 -7
  305. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  306. package/examples/extensions/custom-provider-gitlab-duo/test.ts +1 -1
  307. package/examples/extensions/gondolin/package-lock.json +5 -5
  308. package/examples/extensions/gondolin/package.json +1 -1
  309. package/examples/extensions/handoff.ts +4 -4
  310. package/examples/extensions/plan-mode/README.md +3 -2
  311. package/examples/extensions/plan-mode/index.ts +87 -37
  312. package/examples/extensions/qna.ts +4 -4
  313. package/examples/extensions/sandbox/package-lock.json +2 -2
  314. package/examples/extensions/sandbox/package.json +1 -1
  315. package/examples/extensions/summarize.ts +4 -3
  316. package/examples/extensions/with-deps/package-lock.json +2 -2
  317. package/examples/extensions/with-deps/package.json +1 -1
  318. package/examples/sdk/02-custom-model.ts +2 -2
  319. package/examples/sdk/12-full-control.ts +2 -2
  320. package/node_modules/@earendil-works/pi-agent-core/README.md +0 -18
  321. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts +1 -1
  322. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  323. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +2 -1
  324. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  325. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +1 -1
  326. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  327. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +1 -1
  328. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  329. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts +2 -2
  330. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  331. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +6 -19
  332. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  333. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts +3 -5
  334. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.d.ts.map +1 -1
  335. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js +2 -3
  336. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/branch-summarization.js.map +1 -1
  337. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts +4 -4
  338. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.d.ts.map +1 -1
  339. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js +17 -15
  340. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/compaction.js.map +1 -1
  341. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.d.ts +1 -1
  342. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.d.ts.map +1 -1
  343. package/node_modules/@earendil-works/pi-agent-core/dist/harness/compaction/utils.js.map +1 -1
  344. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.d.ts +1 -1
  345. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.d.ts.map +1 -1
  346. package/node_modules/@earendil-works/pi-agent-core/dist/harness/messages.js.map +1 -1
  347. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +1 -1
  348. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  349. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +2 -1
  350. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  351. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts +24 -22
  352. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.d.ts.map +1 -1
  353. package/node_modules/@earendil-works/pi-agent-core/dist/harness/types.js.map +1 -1
  354. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts +2 -2
  355. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.d.ts.map +1 -1
  356. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js +1 -1
  357. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/shell-output.js.map +1 -1
  358. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +19 -2
  359. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  360. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +24 -4
  361. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  362. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts +1 -1
  363. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
  364. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js +1 -1
  365. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
  366. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +4 -3
  367. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  368. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  369. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  370. package/node_modules/@earendil-works/pi-ai/README.md +651 -526
  371. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts +71 -0
  372. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -0
  373. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +1277 -0
  374. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -0
  375. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.lazy.d.ts +3 -0
  376. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.lazy.d.ts.map +1 -0
  377. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.lazy.js +3 -0
  378. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.lazy.js.map +1 -0
  379. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts +15 -0
  380. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.d.ts.map +1 -0
  381. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js +231 -0
  382. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.js.map +1 -0
  383. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.lazy.d.ts +3 -0
  384. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.lazy.d.ts.map +1 -0
  385. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.lazy.js +3 -0
  386. package/node_modules/@earendil-works/pi-ai/dist/api/azure-openai-responses.lazy.js.map +1 -0
  387. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts +38 -0
  388. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -0
  389. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +895 -0
  390. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -0
  391. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.lazy.d.ts +9 -0
  392. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.lazy.d.ts.map +1 -0
  393. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.lazy.js +30 -0
  394. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.lazy.js.map +1 -0
  395. package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/cloudflare.d.ts +0 -1
  396. package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare.d.ts.map +1 -0
  397. package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/cloudflare.js +7 -12
  398. package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare.js.map +1 -0
  399. package/node_modules/@earendil-works/pi-ai/dist/api/github-copilot-headers.d.ts.map +1 -0
  400. package/node_modules/@earendil-works/pi-ai/dist/api/github-copilot-headers.js.map +1 -0
  401. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.d.ts +13 -0
  402. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.d.ts.map +1 -0
  403. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +436 -0
  404. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -0
  405. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.lazy.d.ts +3 -0
  406. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.lazy.d.ts.map +1 -0
  407. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.lazy.js +3 -0
  408. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.lazy.js.map +1 -0
  409. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts +69 -0
  410. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -0
  411. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +346 -0
  412. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -0
  413. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.d.ts +15 -0
  414. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.d.ts.map +1 -0
  415. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +478 -0
  416. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -0
  417. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.lazy.d.ts +3 -0
  418. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.lazy.d.ts.map +1 -0
  419. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.lazy.js +3 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.lazy.js.map +1 -0
  421. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.d.ts +15 -0
  422. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.d.ts.map +1 -0
  423. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js +59 -0
  424. package/node_modules/@earendil-works/pi-ai/dist/api/lazy.js.map +1 -0
  425. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts +25 -0
  426. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts.map +1 -0
  427. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js +562 -0
  428. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js.map +1 -0
  429. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.lazy.d.ts +3 -0
  430. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.lazy.d.ts.map +1 -0
  431. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.lazy.js +3 -0
  432. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.lazy.js.map +1 -0
  433. package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/openai-codex-responses.d.ts +2 -3
  434. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -0
  435. package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/openai-codex-responses.js +54 -43
  436. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -0
  437. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.lazy.d.ts +3 -0
  438. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.lazy.d.ts.map +1 -0
  439. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.lazy.js +3 -0
  440. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.lazy.js.map +1 -0
  441. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts +22 -0
  442. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -0
  443. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +1094 -0
  444. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -0
  445. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.lazy.d.ts +3 -0
  446. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.lazy.d.ts.map +1 -0
  447. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.lazy.js +3 -0
  448. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.lazy.js.map +1 -0
  449. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.d.ts.map +1 -0
  450. package/node_modules/@earendil-works/pi-ai/dist/api/openai-prompt-cache.js.map +1 -0
  451. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +20 -0
  452. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -0
  453. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +568 -0
  454. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -0
  455. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +13 -0
  456. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -0
  457. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +657 -0
  458. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -0
  459. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.lazy.d.ts +3 -0
  460. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.lazy.d.ts.map +1 -0
  461. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.lazy.js +3 -0
  462. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.lazy.js.map +1 -0
  463. package/node_modules/@earendil-works/pi-ai/dist/api/openrouter-images.d.ts +3 -0
  464. package/node_modules/@earendil-works/pi-ai/dist/api/openrouter-images.d.ts.map +1 -0
  465. package/node_modules/@earendil-works/pi-ai/dist/{providers/images/openrouter.js → api/openrouter-images.js} +5 -15
  466. package/node_modules/@earendil-works/pi-ai/dist/api/openrouter-images.js.map +1 -0
  467. package/node_modules/@earendil-works/pi-ai/dist/api/openrouter-images.lazy.d.ts +3 -0
  468. package/node_modules/@earendil-works/pi-ai/dist/api/openrouter-images.lazy.d.ts.map +1 -0
  469. package/node_modules/@earendil-works/pi-ai/dist/api/openrouter-images.lazy.js +4 -0
  470. package/node_modules/@earendil-works/pi-ai/dist/api/openrouter-images.lazy.js.map +1 -0
  471. package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/simple-options.d.ts +3 -2
  472. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.d.ts.map +1 -0
  473. package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/simple-options.js +11 -2
  474. package/node_modules/@earendil-works/pi-ai/dist/api/simple-options.js.map +1 -0
  475. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -0
  476. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -0
  477. package/node_modules/@earendil-works/pi-ai/dist/auth/context.d.ts +7 -0
  478. package/node_modules/@earendil-works/pi-ai/dist/auth/context.d.ts.map +1 -0
  479. package/node_modules/@earendil-works/pi-ai/dist/auth/context.js +42 -0
  480. package/node_modules/@earendil-works/pi-ai/dist/auth/context.js.map +1 -0
  481. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts +16 -0
  482. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -0
  483. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js +39 -0
  484. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js.map +1 -0
  485. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.d.ts +20 -0
  486. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.d.ts.map +1 -0
  487. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.js +46 -0
  488. package/node_modules/@earendil-works/pi-ai/dist/auth/helpers.js.map +1 -0
  489. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts +26 -0
  490. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.d.ts.map +1 -0
  491. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +100 -0
  492. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -0
  493. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +180 -0
  494. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -0
  495. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js +2 -0
  496. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -0
  497. package/node_modules/@earendil-works/pi-ai/dist/bedrock-provider.d.ts +2 -4
  498. package/node_modules/@earendil-works/pi-ai/dist/bedrock-provider.d.ts.map +1 -1
  499. package/node_modules/@earendil-works/pi-ai/dist/bedrock-provider.js +3 -4
  500. package/node_modules/@earendil-works/pi-ai/dist/bedrock-provider.js.map +1 -1
  501. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +65 -0
  502. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -0
  503. package/node_modules/@earendil-works/pi-ai/dist/compat.js +195 -0
  504. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -0
  505. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +45 -0
  506. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  507. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +45 -0
  508. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  509. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.d.ts +0 -1
  510. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.d.ts.map +1 -1
  511. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.js +0 -3
  512. package/node_modules/@earendil-works/pi-ai/dist/images-api-registry.js.map +1 -1
  513. package/node_modules/@earendil-works/pi-ai/dist/images-models.d.ts +93 -0
  514. package/node_modules/@earendil-works/pi-ai/dist/images-models.d.ts.map +1 -0
  515. package/node_modules/@earendil-works/pi-ai/dist/images-models.js +139 -0
  516. package/node_modules/@earendil-works/pi-ai/dist/images-models.js.map +1 -0
  517. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts +1 -0
  518. package/node_modules/@earendil-works/pi-ai/dist/images.d.ts.map +1 -1
  519. package/node_modules/@earendil-works/pi-ai/dist/images.js +1 -0
  520. package/node_modules/@earendil-works/pi-ai/dist/images.js.map +1 -1
  521. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +21 -3
  522. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  523. package/node_modules/@earendil-works/pi-ai/dist/index.js +10 -5
  524. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  525. package/node_modules/@earendil-works/pi-ai/dist/legacy-api-aliases.d.ts +42 -0
  526. package/node_modules/@earendil-works/pi-ai/dist/legacy-api-aliases.d.ts.map +1 -0
  527. package/node_modules/@earendil-works/pi-ai/dist/legacy-api-aliases.js +49 -0
  528. package/node_modules/@earendil-works/pi-ai/dist/legacy-api-aliases.js.map +1 -0
  529. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts +134 -25
  530. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  531. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +2244 -293
  532. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  533. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js +70 -17244
  534. package/node_modules/@earendil-works/pi-ai/dist/models.generated.js.map +1 -1
  535. package/node_modules/@earendil-works/pi-ai/dist/models.js +239 -65
  536. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  537. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts +21 -0
  538. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -0
  539. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +147 -0
  540. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -0
  541. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts +2 -38
  542. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  543. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js +35 -896
  544. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  545. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts +1718 -0
  546. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.d.ts.map +1 -0
  547. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js +1675 -0
  548. package/node_modules/@earendil-works/pi-ai/dist/providers/amazon-bedrock.models.js.map +1 -0
  549. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.d.ts +3 -0
  550. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.d.ts.map +1 -0
  551. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.js +15 -0
  552. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.js.map +1 -0
  553. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.d.ts +86 -0
  554. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.d.ts.map +1 -0
  555. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.js +60 -0
  556. package/node_modules/@earendil-works/pi-ai/dist/providers/ant-ling.models.js.map +1 -0
  557. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts +4 -69
  558. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  559. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js +20 -1273
  560. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.js.map +1 -1
  561. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts +424 -0
  562. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.d.ts.map +1 -0
  563. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js +405 -0
  564. package/node_modules/@earendil-works/pi-ai/dist/providers/anthropic.models.js.map +1 -0
  565. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts +2 -15
  566. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  567. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js +11 -234
  568. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  569. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts +804 -0
  570. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.d.ts.map +1 -0
  571. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js +743 -0
  572. package/node_modules/@earendil-works/pi-ai/dist/providers/azure-openai-responses.models.js.map +1 -0
  573. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.d.ts +3 -0
  574. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.d.ts.map +1 -0
  575. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.js +15 -0
  576. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.js.map +1 -0
  577. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.d.ts +45 -0
  578. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.d.ts.map +1 -0
  579. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.js +41 -0
  580. package/node_modules/@earendil-works/pi-ai/dist/providers/cerebras.models.js.map +1 -0
  581. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.d.ts +3 -0
  582. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -0
  583. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.js +20 -0
  584. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.js.map +1 -0
  585. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts +765 -0
  586. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.d.ts.map +1 -0
  587. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js +666 -0
  588. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.models.js.map +1 -0
  589. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.d.ts +4 -0
  590. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.d.ts.map +1 -0
  591. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js +85 -0
  592. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-auth.js.map +1 -0
  593. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.d.ts +3 -0
  594. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.d.ts.map +1 -0
  595. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.js +14 -0
  596. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.js.map +1 -0
  597. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.d.ts +302 -0
  598. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.d.ts.map +1 -0
  599. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.js +239 -0
  600. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-workers-ai.models.js.map +1 -0
  601. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.d.ts +3 -0
  602. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.d.ts.map +1 -0
  603. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.js +15 -0
  604. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.js.map +1 -0
  605. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts +63 -0
  606. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.d.ts.map +1 -0
  607. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js +43 -0
  608. package/node_modules/@earendil-works/pi-ai/dist/providers/deepseek.models.js.map +1 -0
  609. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts +60 -11
  610. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
  611. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js +86 -22
  612. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  613. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.d.ts +3 -0
  614. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.d.ts.map +1 -0
  615. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.js +19 -0
  616. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.js.map +1 -0
  617. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts +376 -0
  618. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.d.ts.map +1 -0
  619. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js +294 -0
  620. package/node_modules/@earendil-works/pi-ai/dist/providers/fireworks.models.js.map +1 -0
  621. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.d.ts +3 -0
  622. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.d.ts.map +1 -0
  623. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.js +25 -0
  624. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.js.map +1 -0
  625. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +616 -0
  626. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -0
  627. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +426 -0
  628. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -0
  629. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.d.ts +1 -68
  630. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  631. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.js +1 -345
  632. package/node_modules/@earendil-works/pi-ai/dist/providers/google-shared.js.map +1 -1
  633. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts +4 -13
  634. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.d.ts.map +1 -1
  635. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js +33 -478
  636. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.js.map +1 -1
  637. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.d.ts +202 -0
  638. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.d.ts.map +1 -0
  639. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.js +182 -0
  640. package/node_modules/@earendil-works/pi-ai/dist/providers/google-vertex.models.js.map +1 -0
  641. package/node_modules/@earendil-works/pi-ai/dist/providers/google.d.ts +4 -11
  642. package/node_modules/@earendil-works/pi-ai/dist/providers/google.d.ts.map +1 -1
  643. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js +15 -439
  644. package/node_modules/@earendil-works/pi-ai/dist/providers/google.js.map +1 -1
  645. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts +328 -0
  646. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.d.ts.map +1 -0
  647. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js +288 -0
  648. package/node_modules/@earendil-works/pi-ai/dist/providers/google.models.js.map +1 -0
  649. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.d.ts +3 -0
  650. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.d.ts.map +1 -0
  651. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.js +15 -0
  652. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.js.map +1 -0
  653. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.d.ts +128 -0
  654. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.d.ts.map +1 -0
  655. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.js +125 -0
  656. package/node_modules/@earendil-works/pi-ai/dist/providers/groq.models.js.map +1 -0
  657. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.d.ts +3 -0
  658. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.d.ts.map +1 -0
  659. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.js +15 -0
  660. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.js.map +1 -0
  661. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.d.ts +963 -0
  662. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.d.ts.map +1 -0
  663. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.js +869 -0
  664. package/node_modules/@earendil-works/pi-ai/dist/providers/huggingface.models.js.map +1 -0
  665. package/node_modules/@earendil-works/pi-ai/dist/providers/images/{openrouter.d.ts → register-builtins.d.ts} +2 -2
  666. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts.map +1 -0
  667. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js +34 -0
  668. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -0
  669. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.d.ts +3 -0
  670. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.d.ts.map +1 -0
  671. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.js +15 -0
  672. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.js.map +1 -0
  673. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +63 -0
  674. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -0
  675. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js +59 -0
  676. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -0
  677. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.d.ts +3 -0
  678. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.d.ts.map +1 -0
  679. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.js +15 -0
  680. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.js.map +1 -0
  681. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.d.ts +54 -0
  682. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.d.ts.map +1 -0
  683. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.js +56 -0
  684. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax-cn.models.js.map +1 -0
  685. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.d.ts +3 -0
  686. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.d.ts.map +1 -0
  687. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.js +15 -0
  688. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.js.map +1 -0
  689. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.d.ts +54 -0
  690. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.d.ts.map +1 -0
  691. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.js +56 -0
  692. package/node_modules/@earendil-works/pi-ai/dist/providers/minimax.models.js.map +1 -0
  693. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.d.ts +2 -25
  694. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.d.ts.map +1 -1
  695. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js +12 -567
  696. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.js.map +1 -1
  697. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.d.ts +513 -0
  698. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.d.ts.map +1 -0
  699. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.js +515 -0
  700. package/node_modules/@earendil-works/pi-ai/dist/providers/mistral.models.js.map +1 -0
  701. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.d.ts +3 -0
  702. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.d.ts.map +1 -0
  703. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.js +15 -0
  704. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.js.map +1 -0
  705. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts +234 -0
  706. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.d.ts.map +1 -0
  707. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js +169 -0
  708. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js.map +1 -0
  709. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.d.ts +3 -0
  710. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.d.ts.map +1 -0
  711. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.js +15 -0
  712. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.js.map +1 -0
  713. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts +234 -0
  714. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.d.ts.map +1 -0
  715. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js +169 -0
  716. package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js.map +1 -0
  717. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.d.ts +3 -0
  718. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.d.ts.map +1 -0
  719. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.js +15 -0
  720. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.js.map +1 -0
  721. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.d.ts +563 -0
  722. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.d.ts.map +1 -0
  723. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.js +385 -0
  724. package/node_modules/@earendil-works/pi-ai/dist/providers/nvidia.models.js.map +1 -0
  725. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.d.ts +3 -0
  726. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.d.ts.map +1 -0
  727. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.js +18 -0
  728. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.js.map +1 -0
  729. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts +87 -0
  730. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.d.ts.map +1 -0
  731. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js +77 -0
  732. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex.models.js.map +1 -0
  733. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts +2 -22
  734. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  735. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js +1 -1070
  736. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-completions.js.map +1 -1
  737. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts +1 -19
  738. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.d.ts.map +1 -1
  739. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js +1 -584
  740. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses-shared.js.map +1 -1
  741. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts +2 -13
  742. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  743. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js +1 -656
  744. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-responses.js.map +1 -1
  745. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.d.ts +3 -0
  746. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.d.ts.map +1 -0
  747. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.js +15 -0
  748. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.js.map +1 -0
  749. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts +805 -0
  750. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.d.ts.map +1 -0
  751. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js +743 -0
  752. package/node_modules/@earendil-works/pi-ai/dist/providers/openai.models.js.map +1 -0
  753. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.d.ts +3 -0
  754. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.d.ts.map +1 -0
  755. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.js +18 -0
  756. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.js.map +1 -0
  757. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts +309 -0
  758. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts.map +1 -0
  759. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +240 -0
  760. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -0
  761. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.d.ts +3 -0
  762. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.d.ts.map +1 -0
  763. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.js +22 -0
  764. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.js.map +1 -0
  765. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +976 -0
  766. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -0
  767. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +815 -0
  768. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -0
  769. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter-images.d.ts +3 -0
  770. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter-images.d.ts.map +1 -0
  771. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter-images.js +14 -0
  772. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter-images.js.map +1 -0
  773. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.d.ts +3 -0
  774. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.d.ts.map +1 -0
  775. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.js +15 -0
  776. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.js.map +1 -0
  777. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts +5426 -0
  778. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.d.ts.map +1 -0
  779. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +4653 -0
  780. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -0
  781. package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.d.ts +1 -36
  782. package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  783. package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.js +1 -190
  784. package/node_modules/@earendil-works/pi-ai/dist/providers/register-builtins.js.map +1 -1
  785. package/node_modules/@earendil-works/pi-ai/dist/providers/together.d.ts +3 -0
  786. package/node_modules/@earendil-works/pi-ai/dist/providers/together.d.ts.map +1 -0
  787. package/node_modules/@earendil-works/pi-ai/dist/providers/together.js +15 -0
  788. package/node_modules/@earendil-works/pi-ai/dist/providers/together.js.map +1 -0
  789. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts +598 -0
  790. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.d.ts.map +1 -0
  791. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js +380 -0
  792. package/node_modules/@earendil-works/pi-ai/dist/providers/together.models.js.map +1 -0
  793. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.d.ts +3 -0
  794. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.d.ts.map +1 -0
  795. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.js +15 -0
  796. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.js.map +1 -0
  797. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts +3210 -0
  798. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.d.ts.map +1 -0
  799. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +3169 -0
  800. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -0
  801. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.d.ts +3 -0
  802. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.d.ts.map +1 -0
  803. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.js +15 -0
  804. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.js.map +1 -0
  805. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts +157 -0
  806. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts.map +1 -0
  807. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js +131 -0
  808. package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js.map +1 -0
  809. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.d.ts +3 -0
  810. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.d.ts.map +1 -0
  811. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.js +15 -0
  812. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.js.map +1 -0
  813. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts +113 -0
  814. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.d.ts.map +1 -0
  815. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js +95 -0
  816. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-ams.models.js.map +1 -0
  817. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.d.ts +3 -0
  818. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.d.ts.map +1 -0
  819. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.js +15 -0
  820. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.js.map +1 -0
  821. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts +113 -0
  822. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.d.ts.map +1 -0
  823. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js +95 -0
  824. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-cn.models.js.map +1 -0
  825. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.d.ts +3 -0
  826. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.d.ts.map +1 -0
  827. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.js +15 -0
  828. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.js.map +1 -0
  829. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts +113 -0
  830. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.d.ts.map +1 -0
  831. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js +95 -0
  832. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi-token-plan-sgp.models.js.map +1 -0
  833. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.d.ts +3 -0
  834. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.d.ts.map +1 -0
  835. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.js +15 -0
  836. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.js.map +1 -0
  837. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.d.ts +135 -0
  838. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.d.ts.map +1 -0
  839. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.js +113 -0
  840. package/node_modules/@earendil-works/pi-ai/dist/providers/xiaomi.models.js.map +1 -0
  841. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.d.ts +3 -0
  842. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.d.ts.map +1 -0
  843. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.js +15 -0
  844. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.js.map +1 -0
  845. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts +153 -0
  846. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.d.ts.map +1 -0
  847. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js +114 -0
  848. package/node_modules/@earendil-works/pi-ai/dist/providers/zai-coding-cn.models.js.map +1 -0
  849. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.d.ts +3 -0
  850. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.d.ts.map +1 -0
  851. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.js +15 -0
  852. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.js.map +1 -0
  853. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts +153 -0
  854. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.d.ts.map +1 -0
  855. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js +114 -0
  856. package/node_modules/@earendil-works/pi-ai/dist/providers/zai.models.js.map +1 -0
  857. package/node_modules/@earendil-works/pi-ai/dist/stream.d.ts +1 -5
  858. package/node_modules/@earendil-works/pi-ai/dist/stream.d.ts.map +1 -1
  859. package/node_modules/@earendil-works/pi-ai/dist/stream.js +1 -53
  860. package/node_modules/@earendil-works/pi-ai/dist/stream.js.map +1 -1
  861. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +74 -8
  862. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  863. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  864. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.d.ts +17 -0
  865. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.d.ts.map +1 -0
  866. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js +98 -0
  867. package/node_modules/@earendil-works/pi-ai/dist/utils/estimate.js.map +1 -0
  868. package/node_modules/@earendil-works/pi-ai/dist/utils/headers.d.ts +2 -0
  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 +10 -0
  871. package/node_modules/@earendil-works/pi-ai/dist/utils/headers.js.map +1 -1
  872. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts +2 -0
  873. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.d.ts.map +1 -1
  874. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.js +31 -0
  875. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/anthropic.js.map +1 -1
  876. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts +2 -0
  877. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  878. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js +33 -2
  879. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  880. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.d.ts +5 -0
  881. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.d.ts.map +1 -0
  882. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.js +22 -0
  883. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/load.js.map +1 -0
  884. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.d.ts +2 -0
  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 +49 -0
  887. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  888. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts +12 -0
  889. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -0
  890. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +86 -0
  891. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -0
  892. package/node_modules/@earendil-works/pi-ai/package.json +15 -42
  893. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts +2 -0
  894. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.d.ts.map +1 -1
  895. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js +5 -1
  896. package/node_modules/@earendil-works/pi-tui/dist/components/markdown.js.map +1 -1
  897. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts +1 -1
  898. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
  899. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +1 -1
  900. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
  901. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  902. package/node_modules/marked/README.md +8 -0
  903. package/node_modules/marked/bin/main.js +12 -11
  904. package/node_modules/marked/lib/marked.d.ts +22 -11
  905. package/node_modules/marked/lib/marked.esm.js +50 -46
  906. package/node_modules/marked/lib/marked.esm.js.map +3 -3
  907. package/node_modules/marked/lib/marked.umd.js +50 -46
  908. package/node_modules/marked/lib/marked.umd.js.map +3 -3
  909. package/node_modules/marked/man/marked.1 +1 -1
  910. package/node_modules/marked/package.json +17 -17
  911. package/npm-shrinkwrap.json +788 -38
  912. package/package.json +11 -5
  913. package/node_modules/@earendil-works/pi-agent-core/dist/base.d.ts +0 -20
  914. package/node_modules/@earendil-works/pi-agent-core/dist/base.d.ts.map +0 -1
  915. package/node_modules/@earendil-works/pi-agent-core/dist/base.js +0 -20
  916. package/node_modules/@earendil-works/pi-agent-core/dist/base.js.map +0 -1
  917. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts +0 -20
  918. package/node_modules/@earendil-works/pi-ai/dist/api-registry.d.ts.map +0 -1
  919. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js +0 -44
  920. package/node_modules/@earendil-works/pi-ai/dist/api-registry.js.map +0 -1
  921. package/node_modules/@earendil-works/pi-ai/dist/base.d.ts +0 -30
  922. package/node_modules/@earendil-works/pi-ai/dist/base.d.ts.map +0 -1
  923. package/node_modules/@earendil-works/pi-ai/dist/base.js +0 -18
  924. package/node_modules/@earendil-works/pi-ai/dist/base.js.map +0 -1
  925. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.d.ts.map +0 -1
  926. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare.js.map +0 -1
  927. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot-headers.d.ts.map +0 -1
  928. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot-headers.js.map +0 -1
  929. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.d.ts.map +0 -1
  930. package/node_modules/@earendil-works/pi-ai/dist/providers/images/openrouter.js.map +0 -1
  931. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.d.ts.map +0 -1
  932. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-codex-responses.js.map +0 -1
  933. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-prompt-cache.d.ts.map +0 -1
  934. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-prompt-cache.js.map +0 -1
  935. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.d.ts.map +0 -1
  936. package/node_modules/@earendil-works/pi-ai/dist/providers/simple-options.js.map +0 -1
  937. package/node_modules/@earendil-works/pi-ai/dist/providers/transform-messages.d.ts.map +0 -1
  938. package/node_modules/@earendil-works/pi-ai/dist/providers/transform-messages.js.map +0 -1
  939. /package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/github-copilot-headers.d.ts +0 -0
  940. /package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/github-copilot-headers.js +0 -0
  941. /package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/openai-prompt-cache.d.ts +0 -0
  942. /package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/openai-prompt-cache.js +0 -0
  943. /package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/transform-messages.d.ts +0 -0
  944. /package/node_modules/@earendil-works/pi-ai/dist/{providers → api}/transform-messages.js +0 -0
  945. /package/node_modules/marked/{LICENSE.md → LICENSE} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"child-process.js","sourceRoot":"","sources":["../../src/utils/child-process.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype ChildProcess,\n\ttype ChildProcessByStdio,\n\tspawn as nodeSpawn,\n\tspawnSync as nodeSpawnSync,\n\ttype SpawnOptions,\n\ttype SpawnOptionsWithStdioTuple,\n\ttype SpawnSyncOptionsWithStringEncoding,\n\ttype SpawnSyncReturns,\n\ttype StdioNull,\n\ttype StdioPipe,\n} from \"node:child_process\";\nimport type { Readable } from \"node:stream\";\nimport crossSpawn from \"cross-spawn\";\n\nconst EXIT_STDIO_GRACE_MS = 100;\n\nexport function spawnProcess(\n\tcommand: string,\n\targs: string[],\n\toptions: SpawnOptionsWithStdioTuple<StdioNull, StdioPipe, StdioPipe>,\n): ChildProcessByStdio<null, Readable, Readable>;\nexport function spawnProcess(command: string, args: string[], options: SpawnOptions): ChildProcess;\nexport function spawnProcess(command: string, args: string[], options: SpawnOptions): ChildProcess {\n\treturn process.platform === \"win32\" ? crossSpawn(command, args, options) : nodeSpawn(command, args, options);\n}\n\nexport function spawnProcessSync(\n\tcommand: string,\n\targs: string[],\n\toptions: SpawnSyncOptionsWithStringEncoding,\n): SpawnSyncReturns<string> {\n\treturn process.platform === \"win32\"\n\t\t? crossSpawn.sync(command, args, options)\n\t\t: nodeSpawnSync(command, args, options);\n}\n\n/**\n * Wait for a child process to terminate without hanging on inherited stdio handles.\n *\n * A short-lived child can `exit` while a detached descendant keeps its stdout/stderr\n * pipe open. We must not resolve and destroy the streams on a fixed deadline measured\n * from `exit`, or output still being written past that deadline is silently lost\n * (earendil-works/pi#5303). Instead, after `exit` we wait for the pipes to fall idle:\n * the grace timer is re-armed on every chunk, so an actively writing descendant keeps\n * us reading, while a quiet inherited handle (e.g. a Windows daemonized descendant\n * that never lets `close` fire) still releases us after the grace elapses.\n */\nexport function waitForChildProcess(child: ChildProcess): Promise<number | null> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet exited = false;\n\t\tlet exitCode: number | null = null;\n\t\tlet postExitTimer: NodeJS.Timeout | undefined;\n\t\tlet stdoutEnded = child.stdout === null;\n\t\tlet stderrEnded = child.stderr === null;\n\n\t\tconst cleanup = () => {\n\t\t\tif (postExitTimer) {\n\t\t\t\tclearTimeout(postExitTimer);\n\t\t\t\tpostExitTimer = undefined;\n\t\t\t}\n\t\t\tchild.removeListener(\"error\", onError);\n\t\t\tchild.removeListener(\"exit\", onExit);\n\t\t\tchild.removeListener(\"close\", onClose);\n\t\t\tchild.stdout?.removeListener(\"end\", onStdoutEnd);\n\t\t\tchild.stderr?.removeListener(\"end\", onStderrEnd);\n\t\t\tchild.stdout?.removeListener(\"data\", onData);\n\t\t\tchild.stderr?.removeListener(\"data\", onData);\n\t\t};\n\n\t\tconst finalize = (code: number | null) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tchild.stdout?.destroy();\n\t\t\tchild.stderr?.destroy();\n\t\t\tresolve(code);\n\t\t};\n\n\t\tconst maybeFinalizeAfterExit = () => {\n\t\t\tif (!exited || settled) return;\n\t\t\tif (stdoutEnded && stderrEnded) {\n\t\t\t\tfinalize(exitCode);\n\t\t\t}\n\t\t};\n\n\t\tconst armIdleTimer = () => {\n\t\t\tif (postExitTimer) clearTimeout(postExitTimer);\n\t\t\tpostExitTimer = setTimeout(() => finalize(exitCode), EXIT_STDIO_GRACE_MS);\n\t\t};\n\n\t\tconst onData = () => {\n\t\t\t// Output is still arriving after exit; defer finalizing so we don't\n\t\t\t// destroy the stream mid-write and truncate the tail.\n\t\t\tif (exited && !settled) armIdleTimer();\n\t\t};\n\n\t\tconst onStdoutEnd = () => {\n\t\t\tstdoutEnded = true;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t};\n\n\t\tconst onStderrEnd = () => {\n\t\t\tstderrEnded = true;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t};\n\n\t\tconst onError = (err: Error) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(err);\n\t\t};\n\n\t\tconst onExit = (code: number | null) => {\n\t\t\texited = true;\n\t\t\texitCode = code;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t\tif (!settled) {\n\t\t\t\tarmIdleTimer();\n\t\t\t}\n\t\t};\n\n\t\tconst onClose = (code: number | null) => {\n\t\t\tfinalize(code);\n\t\t};\n\n\t\tchild.stdout?.once(\"end\", onStdoutEnd);\n\t\tchild.stderr?.once(\"end\", onStderrEnd);\n\t\tchild.stdout?.on(\"data\", onData);\n\t\tchild.stderr?.on(\"data\", onData);\n\t\tchild.once(\"error\", onError);\n\t\tchild.once(\"exit\", onExit);\n\t\tchild.once(\"close\", onClose);\n\t});\n}\n"]}
1
+ {"version":3,"file":"child-process.js","sourceRoot":"","sources":["../../src/utils/child-process.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype ChildProcess,\n\ttype ChildProcessByStdio,\n\tspawn as nodeSpawn,\n\tspawnSync as nodeSpawnSync,\n\ttype SpawnOptions,\n\ttype SpawnOptionsWithStdioTuple,\n\ttype SpawnSyncOptionsWithStringEncoding,\n\ttype SpawnSyncReturns,\n\ttype StdioNull,\n\ttype StdioPipe,\n} from \"node:child_process\";\nimport type { Readable } from \"node:stream\";\nimport crossSpawn from \"cross-spawn\";\n\nconst EXIT_STDIO_GRACE_MS = 250;\n\nexport function spawnProcess(\n\tcommand: string,\n\targs: string[],\n\toptions: SpawnOptionsWithStdioTuple<StdioNull, StdioPipe, StdioPipe>,\n): ChildProcessByStdio<null, Readable, Readable>;\nexport function spawnProcess(command: string, args: string[], options: SpawnOptions): ChildProcess;\nexport function spawnProcess(command: string, args: string[], options: SpawnOptions): ChildProcess {\n\treturn process.platform === \"win32\" ? crossSpawn(command, args, options) : nodeSpawn(command, args, options);\n}\n\nexport function spawnProcessSync(\n\tcommand: string,\n\targs: string[],\n\toptions: SpawnSyncOptionsWithStringEncoding,\n): SpawnSyncReturns<string> {\n\treturn process.platform === \"win32\"\n\t\t? crossSpawn.sync(command, args, options)\n\t\t: nodeSpawnSync(command, args, options);\n}\n\n/**\n * Wait for a child process to terminate without hanging on inherited stdio handles.\n *\n * A short-lived child can `exit` while a detached descendant keeps its stdout/stderr\n * pipe open. We must not resolve and destroy the streams on a fixed deadline measured\n * from `exit`, or output still being written past that deadline is silently lost\n * (earendil-works/pi#5303). Instead, after `exit` we wait for the pipes to fall idle:\n * the grace timer is re-armed on every chunk, so an actively writing descendant keeps\n * us reading, while a quiet inherited handle (e.g. a Windows daemonized descendant\n * that never lets `close` fire) still releases us after the grace elapses.\n */\nexport function waitForChildProcess(child: ChildProcess): Promise<number | null> {\n\treturn new Promise((resolve, reject) => {\n\t\tlet settled = false;\n\t\tlet exited = false;\n\t\tlet exitCode: number | null = null;\n\t\tlet postExitTimer: NodeJS.Timeout | undefined;\n\t\tlet stdoutEnded = child.stdout === null;\n\t\tlet stderrEnded = child.stderr === null;\n\n\t\tconst cleanup = () => {\n\t\t\tif (postExitTimer) {\n\t\t\t\tclearTimeout(postExitTimer);\n\t\t\t\tpostExitTimer = undefined;\n\t\t\t}\n\t\t\tchild.removeListener(\"error\", onError);\n\t\t\tchild.removeListener(\"exit\", onExit);\n\t\t\tchild.removeListener(\"close\", onClose);\n\t\t\tchild.stdout?.removeListener(\"end\", onStdoutEnd);\n\t\t\tchild.stderr?.removeListener(\"end\", onStderrEnd);\n\t\t\tchild.stdout?.removeListener(\"data\", onData);\n\t\t\tchild.stderr?.removeListener(\"data\", onData);\n\t\t};\n\n\t\tconst finalize = (code: number | null) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tchild.stdout?.destroy();\n\t\t\tchild.stderr?.destroy();\n\t\t\tresolve(code);\n\t\t};\n\n\t\tconst maybeFinalizeAfterExit = () => {\n\t\t\tif (!exited || settled) return;\n\t\t\tif (stdoutEnded && stderrEnded) {\n\t\t\t\tfinalize(exitCode);\n\t\t\t}\n\t\t};\n\n\t\tconst armIdleTimer = () => {\n\t\t\tif (postExitTimer) clearTimeout(postExitTimer);\n\t\t\tpostExitTimer = setTimeout(() => finalize(exitCode), EXIT_STDIO_GRACE_MS);\n\t\t};\n\n\t\tconst onData = () => {\n\t\t\t// Output is still arriving after exit; defer finalizing so we don't\n\t\t\t// destroy the stream mid-write and truncate the tail.\n\t\t\tif (exited && !settled) armIdleTimer();\n\t\t};\n\n\t\tconst onStdoutEnd = () => {\n\t\t\tstdoutEnded = true;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t};\n\n\t\tconst onStderrEnd = () => {\n\t\t\tstderrEnded = true;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t};\n\n\t\tconst onError = (err: Error) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(err);\n\t\t};\n\n\t\tconst onExit = (code: number | null) => {\n\t\t\texited = true;\n\t\t\texitCode = code;\n\t\t\tmaybeFinalizeAfterExit();\n\t\t\tif (!settled) {\n\t\t\t\tarmIdleTimer();\n\t\t\t}\n\t\t};\n\n\t\tconst onClose = (code: number | null) => {\n\t\t\tfinalize(code);\n\t\t};\n\n\t\tchild.stdout?.once(\"end\", onStdoutEnd);\n\t\tchild.stderr?.once(\"end\", onStderrEnd);\n\t\tchild.stdout?.on(\"data\", onData);\n\t\tchild.stderr?.on(\"data\", onData);\n\t\tchild.once(\"error\", onError);\n\t\tchild.once(\"exit\", onExit);\n\t\tchild.once(\"close\", onClose);\n\t});\n}\n"]}
@@ -1,3 +1,4 @@
1
+ export declare function convertImageBytesToPng(bytes: Uint8Array): Promise<Uint8Array | null>;
1
2
  /**
2
3
  * Convert image to PNG format for terminal display.
3
4
  * Kitty graphics protocol requires PNG format (f=100).
@@ -1 +1 @@
1
- {"version":3,"file":"image-convert.d.ts","sourceRoot":"","sources":["../../src/utils/image-convert.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAsB,YAAY,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA8BpD"}
1
+ {"version":3,"file":"image-convert.d.ts","sourceRoot":"","sources":["../../src/utils/image-convert.ts"],"names":[],"mappings":"AAGA,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAoB1F;AAED;;;GAGG;AACH,wBAAsB,YAAY,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAgBpD"}
@@ -1,31 +1,18 @@
1
1
  import { applyExifOrientation } from "./exif-orientation.js";
2
2
  import { loadPhoton } from "./photon.js";
3
- /**
4
- * Convert image to PNG format for terminal display.
5
- * Kitty graphics protocol requires PNG format (f=100).
6
- */
7
- export async function convertToPng(base64Data, mimeType) {
8
- // Already PNG, no conversion needed
9
- if (mimeType === "image/png") {
10
- return { data: base64Data, mimeType };
11
- }
3
+ export async function convertImageBytesToPng(bytes) {
12
4
  const photon = await loadPhoton();
13
5
  if (!photon) {
14
6
  // Photon not available, can't convert
15
7
  return null;
16
8
  }
17
9
  try {
18
- const bytes = new Uint8Array(Buffer.from(base64Data, "base64"));
19
10
  const rawImage = photon.PhotonImage.new_from_byteslice(bytes);
20
11
  const image = applyExifOrientation(photon, rawImage, bytes);
21
12
  if (image !== rawImage)
22
13
  rawImage.free();
23
14
  try {
24
- const pngBuffer = image.get_bytes();
25
- return {
26
- data: Buffer.from(pngBuffer).toString("base64"),
27
- mimeType: "image/png",
28
- };
15
+ return new Uint8Array(image.get_bytes());
29
16
  }
30
17
  finally {
31
18
  image.free();
@@ -36,4 +23,23 @@ export async function convertToPng(base64Data, mimeType) {
36
23
  return null;
37
24
  }
38
25
  }
26
+ /**
27
+ * Convert image to PNG format for terminal display.
28
+ * Kitty graphics protocol requires PNG format (f=100).
29
+ */
30
+ export async function convertToPng(base64Data, mimeType) {
31
+ // Already PNG, no conversion needed
32
+ if (mimeType === "image/png") {
33
+ return { data: base64Data, mimeType };
34
+ }
35
+ const bytes = new Uint8Array(Buffer.from(base64Data, "base64"));
36
+ const pngBytes = await convertImageBytesToPng(bytes);
37
+ if (!pngBytes) {
38
+ return null;
39
+ }
40
+ return {
41
+ data: Buffer.from(pngBytes).toString("base64"),
42
+ mimeType: "image/png",
43
+ };
44
+ }
39
45
  //# sourceMappingURL=image-convert.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"image-convert.js","sourceRoot":"","sources":["../../src/utils/image-convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,UAAkB,EAClB,QAAgB;IAEhB,oCAAoC;IACpC,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,sCAAsC;QACtC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,QAAQ;YAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC;YACJ,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACpC,OAAO;gBACN,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC/C,QAAQ,EAAE,WAAW;aACrB,CAAC;QACH,CAAC;gBAAS,CAAC;YACV,KAAK,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,oBAAoB;QACpB,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC","sourcesContent":["import { applyExifOrientation } from \"./exif-orientation.ts\";\nimport { loadPhoton } from \"./photon.ts\";\n\n/**\n * Convert image to PNG format for terminal display.\n * Kitty graphics protocol requires PNG format (f=100).\n */\nexport async function convertToPng(\n\tbase64Data: string,\n\tmimeType: string,\n): Promise<{ data: string; mimeType: string } | null> {\n\t// Already PNG, no conversion needed\n\tif (mimeType === \"image/png\") {\n\t\treturn { data: base64Data, mimeType };\n\t}\n\n\tconst photon = await loadPhoton();\n\tif (!photon) {\n\t\t// Photon not available, can't convert\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst bytes = new Uint8Array(Buffer.from(base64Data, \"base64\"));\n\t\tconst rawImage = photon.PhotonImage.new_from_byteslice(bytes);\n\t\tconst image = applyExifOrientation(photon, rawImage, bytes);\n\t\tif (image !== rawImage) rawImage.free();\n\t\ttry {\n\t\t\tconst pngBuffer = image.get_bytes();\n\t\t\treturn {\n\t\t\t\tdata: Buffer.from(pngBuffer).toString(\"base64\"),\n\t\t\t\tmimeType: \"image/png\",\n\t\t\t};\n\t\t} finally {\n\t\t\timage.free();\n\t\t}\n\t} catch {\n\t\t// Conversion failed\n\t\treturn null;\n\t}\n}\n"]}
1
+ {"version":3,"file":"image-convert.js","sourceRoot":"","sources":["../../src/utils/image-convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAAiB;IAC7D,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,sCAAsC;QACtC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,KAAK,KAAK,QAAQ;YAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC;YACJ,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1C,CAAC;gBAAS,CAAC;YACV,KAAK,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,oBAAoB;QACpB,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,UAAkB,EAClB,QAAgB;IAEhB,oCAAoC;IACpC,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC9C,QAAQ,EAAE,WAAW;KACrB,CAAC;AACH,CAAC","sourcesContent":["import { applyExifOrientation } from \"./exif-orientation.ts\";\nimport { loadPhoton } from \"./photon.ts\";\n\nexport async function convertImageBytesToPng(bytes: Uint8Array): Promise<Uint8Array | null> {\n\tconst photon = await loadPhoton();\n\tif (!photon) {\n\t\t// Photon not available, can't convert\n\t\treturn null;\n\t}\n\n\ttry {\n\t\tconst rawImage = photon.PhotonImage.new_from_byteslice(bytes);\n\t\tconst image = applyExifOrientation(photon, rawImage, bytes);\n\t\tif (image !== rawImage) rawImage.free();\n\t\ttry {\n\t\t\treturn new Uint8Array(image.get_bytes());\n\t\t} finally {\n\t\t\timage.free();\n\t\t}\n\t} catch {\n\t\t// Conversion failed\n\t\treturn null;\n\t}\n}\n\n/**\n * Convert image to PNG format for terminal display.\n * Kitty graphics protocol requires PNG format (f=100).\n */\nexport async function convertToPng(\n\tbase64Data: string,\n\tmimeType: string,\n): Promise<{ data: string; mimeType: string } | null> {\n\t// Already PNG, no conversion needed\n\tif (mimeType === \"image/png\") {\n\t\treturn { data: base64Data, mimeType };\n\t}\n\n\tconst bytes = new Uint8Array(Buffer.from(base64Data, \"base64\"));\n\tconst pngBytes = await convertImageBytesToPng(bytes);\n\tif (!pngBytes) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tdata: Buffer.from(pngBytes).toString(\"base64\"),\n\t\tmimeType: \"image/png\",\n\t};\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { type ImageResizeOptions } from "./image-resize.ts";
2
+ export interface ProcessImageOptions {
3
+ /** Whether to resize images to inline provider limits. Default: true */
4
+ autoResizeImages?: boolean;
5
+ /** Optional resize overrides. Uses resizeImage defaults when omitted. */
6
+ resizeOptions?: ImageResizeOptions;
7
+ }
8
+ export type ProcessImageResult = {
9
+ ok: true;
10
+ data: string;
11
+ mimeType: string;
12
+ hints: string[];
13
+ } | {
14
+ ok: false;
15
+ message: string;
16
+ };
17
+ export declare function processImage(bytes: Uint8Array, mimeType: string, options?: ProcessImageOptions): Promise<ProcessImageResult>;
18
+ //# sourceMappingURL=image-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-process.d.ts","sourceRoot":"","sources":["../../src/utils/image-process.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,KAAK,kBAAkB,EAAe,MAAM,mBAAmB,CAAC;AAE9F,MAAM,WAAW,mBAAmB;IACnC,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yEAAyE;IACzE,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED,MAAM,MAAM,kBAAkB,GAC3B;IACA,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,EAAE,CAAC;CACf,GACD;IACA,EAAE,EAAE,KAAK,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;CACf,CAAC;AAmDL,wBAAsB,YAAY,CACjC,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA2C7B"}
@@ -0,0 +1,83 @@
1
+ import { convertImageBytesToPng } from "./image-convert.js";
2
+ import { formatDimensionNote, resizeImage } from "./image-resize.js";
3
+ function baseMimeType(mimeType) {
4
+ return mimeType.split(";")[0]?.trim().toLowerCase() ?? mimeType.toLowerCase();
5
+ }
6
+ function normalizeSupportedImageMimeType(mimeType) {
7
+ switch (baseMimeType(mimeType)) {
8
+ case "image/png":
9
+ return "image/png";
10
+ case "image/jpeg":
11
+ case "image/jpg":
12
+ return "image/jpeg";
13
+ case "image/gif":
14
+ return "image/gif";
15
+ case "image/webp":
16
+ return "image/webp";
17
+ default:
18
+ return null;
19
+ }
20
+ }
21
+ async function normalizeImage(bytes, mimeType) {
22
+ const normalizedMimeType = normalizeSupportedImageMimeType(mimeType);
23
+ if (normalizedMimeType) {
24
+ return { bytes, mimeType: normalizedMimeType };
25
+ }
26
+ const pngBytes = await convertImageBytesToPng(bytes);
27
+ if (!pngBytes) {
28
+ return null;
29
+ }
30
+ return {
31
+ bytes: pngBytes,
32
+ mimeType: "image/png",
33
+ convertedFrom: baseMimeType(mimeType),
34
+ };
35
+ }
36
+ function conversionHint(from, to) {
37
+ if (!from || from === to)
38
+ return undefined;
39
+ return `[Image converted from ${from} to ${to}.]`;
40
+ }
41
+ export async function processImage(bytes, mimeType, options) {
42
+ const autoResizeImages = options?.autoResizeImages ?? true;
43
+ const normalized = await normalizeImage(bytes, mimeType);
44
+ if (!normalized) {
45
+ return {
46
+ ok: false,
47
+ message: "[Image omitted: could not be converted to a supported inline image format.]",
48
+ };
49
+ }
50
+ if (autoResizeImages) {
51
+ const resized = await resizeImage(normalized.bytes, normalized.mimeType, options?.resizeOptions);
52
+ if (!resized) {
53
+ return {
54
+ ok: false,
55
+ message: "[Image omitted: could not be resized below the inline image size limit.]",
56
+ };
57
+ }
58
+ const hints = [];
59
+ const convertedHint = conversionHint(normalized.convertedFrom, resized.mimeType);
60
+ if (convertedHint)
61
+ hints.push(convertedHint);
62
+ const dimensionNote = formatDimensionNote(resized);
63
+ if (dimensionNote)
64
+ hints.push(dimensionNote);
65
+ return {
66
+ ok: true,
67
+ data: resized.data,
68
+ mimeType: resized.mimeType,
69
+ hints,
70
+ };
71
+ }
72
+ const hints = [];
73
+ const convertedHint = conversionHint(normalized.convertedFrom, normalized.mimeType);
74
+ if (convertedHint)
75
+ hints.push(convertedHint);
76
+ return {
77
+ ok: true,
78
+ data: Buffer.from(normalized.bytes).toString("base64"),
79
+ mimeType: normalized.mimeType,
80
+ hints,
81
+ };
82
+ }
83
+ //# sourceMappingURL=image-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-process.js","sourceRoot":"","sources":["../../src/utils/image-process.ts"],"names":[],"mappings":"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","sourcesContent":["import { convertImageBytesToPng } from \"./image-convert.ts\";\nimport { formatDimensionNote, type ImageResizeOptions, resizeImage } from \"./image-resize.ts\";\n\nexport interface ProcessImageOptions {\n\t/** Whether to resize images to inline provider limits. Default: true */\n\tautoResizeImages?: boolean;\n\t/** Optional resize overrides. Uses resizeImage defaults when omitted. */\n\tresizeOptions?: ImageResizeOptions;\n}\n\nexport type ProcessImageResult =\n\t| {\n\t\t\tok: true;\n\t\t\tdata: string;\n\t\t\tmimeType: string;\n\t\t\thints: string[];\n\t }\n\t| {\n\t\t\tok: false;\n\t\t\tmessage: string;\n\t };\n\ninterface NormalizedImage {\n\tbytes: Uint8Array;\n\tmimeType: string;\n\tconvertedFrom?: string;\n}\n\nfunction baseMimeType(mimeType: string): string {\n\treturn mimeType.split(\";\")[0]?.trim().toLowerCase() ?? mimeType.toLowerCase();\n}\n\nfunction normalizeSupportedImageMimeType(mimeType: string): string | null {\n\tswitch (baseMimeType(mimeType)) {\n\t\tcase \"image/png\":\n\t\t\treturn \"image/png\";\n\t\tcase \"image/jpeg\":\n\t\tcase \"image/jpg\":\n\t\t\treturn \"image/jpeg\";\n\t\tcase \"image/gif\":\n\t\t\treturn \"image/gif\";\n\t\tcase \"image/webp\":\n\t\t\treturn \"image/webp\";\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n\nasync function normalizeImage(bytes: Uint8Array, mimeType: string): Promise<NormalizedImage | null> {\n\tconst normalizedMimeType = normalizeSupportedImageMimeType(mimeType);\n\tif (normalizedMimeType) {\n\t\treturn { bytes, mimeType: normalizedMimeType };\n\t}\n\n\tconst pngBytes = await convertImageBytesToPng(bytes);\n\tif (!pngBytes) {\n\t\treturn null;\n\t}\n\n\treturn {\n\t\tbytes: pngBytes,\n\t\tmimeType: \"image/png\",\n\t\tconvertedFrom: baseMimeType(mimeType),\n\t};\n}\n\nfunction conversionHint(from: string | undefined, to: string): string | undefined {\n\tif (!from || from === to) return undefined;\n\treturn `[Image converted from ${from} to ${to}.]`;\n}\n\nexport async function processImage(\n\tbytes: Uint8Array,\n\tmimeType: string,\n\toptions?: ProcessImageOptions,\n): Promise<ProcessImageResult> {\n\tconst autoResizeImages = options?.autoResizeImages ?? true;\n\tconst normalized = await normalizeImage(bytes, mimeType);\n\tif (!normalized) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tmessage: \"[Image omitted: could not be converted to a supported inline image format.]\",\n\t\t};\n\t}\n\n\tif (autoResizeImages) {\n\t\tconst resized = await resizeImage(normalized.bytes, normalized.mimeType, options?.resizeOptions);\n\t\tif (!resized) {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tmessage: \"[Image omitted: could not be resized below the inline image size limit.]\",\n\t\t\t};\n\t\t}\n\n\t\tconst hints: string[] = [];\n\t\tconst convertedHint = conversionHint(normalized.convertedFrom, resized.mimeType);\n\t\tif (convertedHint) hints.push(convertedHint);\n\t\tconst dimensionNote = formatDimensionNote(resized);\n\t\tif (dimensionNote) hints.push(dimensionNote);\n\n\t\treturn {\n\t\t\tok: true,\n\t\t\tdata: resized.data,\n\t\t\tmimeType: resized.mimeType,\n\t\t\thints,\n\t\t};\n\t}\n\n\tconst hints: string[] = [];\n\tconst convertedHint = conversionHint(normalized.convertedFrom, normalized.mimeType);\n\tif (convertedHint) hints.push(convertedHint);\n\n\treturn {\n\t\tok: true,\n\t\tdata: Buffer.from(normalized.bytes).toString(\"base64\"),\n\t\tmimeType: normalized.mimeType,\n\t\thints,\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../src/utils/mime.ts"],"names":[],"mappings":"AAKA,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAc9E;AAED,wBAAsB,oCAAoC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASnG"}
1
+ {"version":3,"file":"mime.d.ts","sourceRoot":"","sources":["../../src/utils/mime.ts"],"names":[],"mappings":"AAKA,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAiB9E;AAED,wBAAsB,oCAAoC,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CASnG"}
@@ -14,6 +14,9 @@ export function detectSupportedImageMimeType(buffer) {
14
14
  if (startsWithAscii(buffer, 0, "RIFF") && startsWithAscii(buffer, 8, "WEBP")) {
15
15
  return "image/webp";
16
16
  }
17
+ if (startsWithAscii(buffer, 0, "BM") && isBmp(buffer)) {
18
+ return "image/bmp";
19
+ }
17
20
  return null;
18
21
  }
19
22
  export async function detectSupportedImageMimeTypeFromFile(filePath) {
@@ -46,12 +49,50 @@ function isAnimatedPng(buffer) {
46
49
  }
47
50
  return false;
48
51
  }
52
+ function isBmp(buffer) {
53
+ if (buffer.length < 26)
54
+ return false;
55
+ const declaredFileSize = readUint32LE(buffer, 2);
56
+ const pixelDataOffset = readUint32LE(buffer, 10);
57
+ const dibHeaderSize = readUint32LE(buffer, 14);
58
+ if (declaredFileSize !== 0 && declaredFileSize < 26)
59
+ return false;
60
+ if (pixelDataOffset < 14 + dibHeaderSize)
61
+ return false;
62
+ if (declaredFileSize !== 0 && pixelDataOffset >= declaredFileSize)
63
+ return false;
64
+ let colorPlanes;
65
+ let bitsPerPixel;
66
+ if (dibHeaderSize === 12) {
67
+ colorPlanes = readUint16LE(buffer, 22);
68
+ bitsPerPixel = readUint16LE(buffer, 24);
69
+ }
70
+ else if (dibHeaderSize >= 40 && dibHeaderSize <= 124) {
71
+ if (buffer.length < 30)
72
+ return false;
73
+ colorPlanes = readUint16LE(buffer, 26);
74
+ bitsPerPixel = readUint16LE(buffer, 28);
75
+ }
76
+ else {
77
+ return false;
78
+ }
79
+ return colorPlanes === 1 && [1, 4, 8, 16, 24, 32].includes(bitsPerPixel);
80
+ }
81
+ function readUint16LE(buffer, offset) {
82
+ return (buffer[offset] ?? 0) + ((buffer[offset + 1] ?? 0) << 8);
83
+ }
49
84
  function readUint32BE(buffer, offset) {
50
85
  return ((buffer[offset] ?? 0) * 0x1000000 +
51
86
  ((buffer[offset + 1] ?? 0) << 16) +
52
87
  ((buffer[offset + 2] ?? 0) << 8) +
53
88
  (buffer[offset + 3] ?? 0));
54
89
  }
90
+ function readUint32LE(buffer, offset) {
91
+ return ((buffer[offset] ?? 0) +
92
+ ((buffer[offset + 1] ?? 0) << 8) +
93
+ ((buffer[offset + 2] ?? 0) << 16) +
94
+ (buffer[offset + 3] ?? 0) * 0x1000000);
95
+ }
55
96
  function startsWith(buffer, bytes) {
56
97
  if (buffer.length < bytes.length)
57
98
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"mime.js","sourceRoot":"","sources":["../../src/utils/mime.ts"],"names":[],"mappings":"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","sourcesContent":["import { open } from \"node:fs/promises\";\n\nconst IMAGE_TYPE_SNIFF_BYTES = 4100;\nconst PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n\nexport function detectSupportedImageMimeType(buffer: Uint8Array): string | null {\n\tif (startsWith(buffer, [0xff, 0xd8, 0xff])) {\n\t\treturn buffer[3] === 0xf7 ? null : \"image/jpeg\";\n\t}\n\tif (startsWith(buffer, PNG_SIGNATURE)) {\n\t\treturn isPng(buffer) && !isAnimatedPng(buffer) ? \"image/png\" : null;\n\t}\n\tif (startsWithAscii(buffer, 0, \"GIF\")) {\n\t\treturn \"image/gif\";\n\t}\n\tif (startsWithAscii(buffer, 0, \"RIFF\") && startsWithAscii(buffer, 8, \"WEBP\")) {\n\t\treturn \"image/webp\";\n\t}\n\treturn null;\n}\n\nexport async function detectSupportedImageMimeTypeFromFile(filePath: string): Promise<string | null> {\n\tconst fileHandle = await open(filePath, \"r\");\n\ttry {\n\t\tconst buffer = Buffer.alloc(IMAGE_TYPE_SNIFF_BYTES);\n\t\tconst { bytesRead } = await fileHandle.read(buffer, 0, IMAGE_TYPE_SNIFF_BYTES, 0);\n\t\treturn detectSupportedImageMimeType(buffer.subarray(0, bytesRead));\n\t} finally {\n\t\tawait fileHandle.close();\n\t}\n}\n\nfunction isPng(buffer: Uint8Array): boolean {\n\treturn (\n\t\tbuffer.length >= 16 && readUint32BE(buffer, PNG_SIGNATURE.length) === 13 && startsWithAscii(buffer, 12, \"IHDR\")\n\t);\n}\n\nfunction isAnimatedPng(buffer: Uint8Array): boolean {\n\tlet offset = PNG_SIGNATURE.length;\n\twhile (offset + 8 <= buffer.length) {\n\t\tconst chunkLength = readUint32BE(buffer, offset);\n\t\tconst chunkTypeOffset = offset + 4;\n\t\tif (startsWithAscii(buffer, chunkTypeOffset, \"acTL\")) return true;\n\t\tif (startsWithAscii(buffer, chunkTypeOffset, \"IDAT\")) return false;\n\n\t\tconst nextOffset = offset + 8 + chunkLength + 4;\n\t\tif (nextOffset <= offset || nextOffset > buffer.length) return false;\n\t\toffset = nextOffset;\n\t}\n\treturn false;\n}\n\nfunction readUint32BE(buffer: Uint8Array, offset: number): number {\n\treturn (\n\t\t(buffer[offset] ?? 0) * 0x1000000 +\n\t\t((buffer[offset + 1] ?? 0) << 16) +\n\t\t((buffer[offset + 2] ?? 0) << 8) +\n\t\t(buffer[offset + 3] ?? 0)\n\t);\n}\n\nfunction startsWith(buffer: Uint8Array, bytes: number[]): boolean {\n\tif (buffer.length < bytes.length) return false;\n\treturn bytes.every((byte, index) => buffer[index] === byte);\n}\n\nfunction startsWithAscii(buffer: Uint8Array, offset: number, text: string): boolean {\n\tif (buffer.length < offset + text.length) return false;\n\tfor (let index = 0; index < text.length; index++) {\n\t\tif (buffer[offset + index] !== text.charCodeAt(index)) return false;\n\t}\n\treturn true;\n}\n"]}
1
+ {"version":3,"file":"mime.js","sourceRoot":"","sources":["../../src/utils/mime.ts"],"names":[],"mappings":"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","sourcesContent":["import { open } from \"node:fs/promises\";\n\nconst IMAGE_TYPE_SNIFF_BYTES = 4100;\nconst PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];\n\nexport function detectSupportedImageMimeType(buffer: Uint8Array): string | null {\n\tif (startsWith(buffer, [0xff, 0xd8, 0xff])) {\n\t\treturn buffer[3] === 0xf7 ? null : \"image/jpeg\";\n\t}\n\tif (startsWith(buffer, PNG_SIGNATURE)) {\n\t\treturn isPng(buffer) && !isAnimatedPng(buffer) ? \"image/png\" : null;\n\t}\n\tif (startsWithAscii(buffer, 0, \"GIF\")) {\n\t\treturn \"image/gif\";\n\t}\n\tif (startsWithAscii(buffer, 0, \"RIFF\") && startsWithAscii(buffer, 8, \"WEBP\")) {\n\t\treturn \"image/webp\";\n\t}\n\tif (startsWithAscii(buffer, 0, \"BM\") && isBmp(buffer)) {\n\t\treturn \"image/bmp\";\n\t}\n\treturn null;\n}\n\nexport async function detectSupportedImageMimeTypeFromFile(filePath: string): Promise<string | null> {\n\tconst fileHandle = await open(filePath, \"r\");\n\ttry {\n\t\tconst buffer = Buffer.alloc(IMAGE_TYPE_SNIFF_BYTES);\n\t\tconst { bytesRead } = await fileHandle.read(buffer, 0, IMAGE_TYPE_SNIFF_BYTES, 0);\n\t\treturn detectSupportedImageMimeType(buffer.subarray(0, bytesRead));\n\t} finally {\n\t\tawait fileHandle.close();\n\t}\n}\n\nfunction isPng(buffer: Uint8Array): boolean {\n\treturn (\n\t\tbuffer.length >= 16 && readUint32BE(buffer, PNG_SIGNATURE.length) === 13 && startsWithAscii(buffer, 12, \"IHDR\")\n\t);\n}\n\nfunction isAnimatedPng(buffer: Uint8Array): boolean {\n\tlet offset = PNG_SIGNATURE.length;\n\twhile (offset + 8 <= buffer.length) {\n\t\tconst chunkLength = readUint32BE(buffer, offset);\n\t\tconst chunkTypeOffset = offset + 4;\n\t\tif (startsWithAscii(buffer, chunkTypeOffset, \"acTL\")) return true;\n\t\tif (startsWithAscii(buffer, chunkTypeOffset, \"IDAT\")) return false;\n\n\t\tconst nextOffset = offset + 8 + chunkLength + 4;\n\t\tif (nextOffset <= offset || nextOffset > buffer.length) return false;\n\t\toffset = nextOffset;\n\t}\n\treturn false;\n}\n\nfunction isBmp(buffer: Uint8Array): boolean {\n\tif (buffer.length < 26) return false;\n\n\tconst declaredFileSize = readUint32LE(buffer, 2);\n\tconst pixelDataOffset = readUint32LE(buffer, 10);\n\tconst dibHeaderSize = readUint32LE(buffer, 14);\n\tif (declaredFileSize !== 0 && declaredFileSize < 26) return false;\n\tif (pixelDataOffset < 14 + dibHeaderSize) return false;\n\tif (declaredFileSize !== 0 && pixelDataOffset >= declaredFileSize) return false;\n\n\tlet colorPlanes: number;\n\tlet bitsPerPixel: number;\n\tif (dibHeaderSize === 12) {\n\t\tcolorPlanes = readUint16LE(buffer, 22);\n\t\tbitsPerPixel = readUint16LE(buffer, 24);\n\t} else if (dibHeaderSize >= 40 && dibHeaderSize <= 124) {\n\t\tif (buffer.length < 30) return false;\n\t\tcolorPlanes = readUint16LE(buffer, 26);\n\t\tbitsPerPixel = readUint16LE(buffer, 28);\n\t} else {\n\t\treturn false;\n\t}\n\n\treturn colorPlanes === 1 && [1, 4, 8, 16, 24, 32].includes(bitsPerPixel);\n}\n\nfunction readUint16LE(buffer: Uint8Array, offset: number): number {\n\treturn (buffer[offset] ?? 0) + ((buffer[offset + 1] ?? 0) << 8);\n}\n\nfunction readUint32BE(buffer: Uint8Array, offset: number): number {\n\treturn (\n\t\t(buffer[offset] ?? 0) * 0x1000000 +\n\t\t((buffer[offset + 1] ?? 0) << 16) +\n\t\t((buffer[offset + 2] ?? 0) << 8) +\n\t\t(buffer[offset + 3] ?? 0)\n\t);\n}\n\nfunction readUint32LE(buffer: Uint8Array, offset: number): number {\n\treturn (\n\t\t(buffer[offset] ?? 0) +\n\t\t((buffer[offset + 1] ?? 0) << 8) +\n\t\t((buffer[offset + 2] ?? 0) << 16) +\n\t\t(buffer[offset + 3] ?? 0) * 0x1000000\n\t);\n}\n\nfunction startsWith(buffer: Uint8Array, bytes: number[]): boolean {\n\tif (buffer.length < bytes.length) return false;\n\treturn bytes.every((byte, index) => buffer[index] === byte);\n}\n\nfunction startsWithAscii(buffer: Uint8Array, offset: number, text: string): boolean {\n\tif (buffer.length < offset + text.length) return false;\n\tfor (let index = 0; index < text.length; index++) {\n\t\tif (buffer[offset + index] !== text.charCodeAt(index)) return false;\n\t}\n\treturn true;\n}\n"]}
@@ -276,7 +276,7 @@ Fired before auto-compaction or `/compact`. Can cancel or provide custom summary
276
276
 
277
277
  ```typescript
278
278
  pi.on("session_before_compact", async (event, ctx) => {
279
- const { preparation, branchEntries, customInstructions, signal } = event;
279
+ const { preparation, branchEntries, customInstructions, reason, willRetry, signal } = event;
280
280
 
281
281
  // preparation.messagesToSummarize - messages to summarize
282
282
  // preparation.turnPrefixMessages - split turn prefix (if isSplitTurn)
@@ -287,6 +287,8 @@ pi.on("session_before_compact", async (event, ctx) => {
287
287
  // preparation.settings - compaction settings
288
288
 
289
289
  // branchEntries - all entries on current branch (for custom state)
290
+ // reason - "manual" (/compact), "threshold", or "overflow"
291
+ // willRetry - whether the aborted turn is retried after compaction (overflow recovery)
290
292
  // signal - AbortSignal (pass to LLM calls)
291
293
 
292
294
  // Cancel:
@@ -437,7 +437,10 @@ Fired on compaction. See [compaction.md](compaction.md) for details.
437
437
 
438
438
  ```typescript
439
439
  pi.on("session_before_compact", async (event, ctx) => {
440
- const { preparation, branchEntries, customInstructions, signal } = event;
440
+ const { preparation, branchEntries, customInstructions, reason, willRetry, signal } = event;
441
+
442
+ // reason - "manual" (/compact), "threshold", or "overflow"
443
+ // willRetry - whether the aborted turn is retried after compaction (overflow recovery)
441
444
 
442
445
  // Cancel:
443
446
  return { cancel: true };
@@ -455,6 +458,8 @@ pi.on("session_before_compact", async (event, ctx) => {
455
458
  pi.on("session_compact", async (event, ctx) => {
456
459
  // event.compactionEntry - the saved compaction
457
460
  // event.fromExtension - whether extension provided it
461
+ // event.reason - "manual" (/compact), "threshold", or "overflow"
462
+ // event.willRetry - whether the aborted turn is retried after compaction (overflow recovery)
458
463
  });
459
464
  ```
460
465
 
@@ -54,7 +54,7 @@ Modifier combinations: `ctrl+shift+x`, `alt+ctrl+x`, `ctrl+shift+alt+x`, `ctrl+1
54
54
 
55
55
  | Keybinding id | Default | Description |
56
56
  |--------|---------|-------------|
57
- | `tui.input.newLine` | `shift+enter` | Insert new line |
57
+ | `tui.input.newLine` | `shift+enter`, `ctrl+j` | Insert new line |
58
58
  | `tui.input.submit` | `enter` | Submit input |
59
59
  | `tui.input.tab` | `tab` | Tab / autocomplete |
60
60
 
@@ -86,7 +86,7 @@ Modifier combinations: `ctrl+shift+x`, `alt+ctrl+x`, `ctrl+shift+alt+x`, `ctrl+1
86
86
  | `app.clear` | `ctrl+c` | Clear editor |
87
87
  | `app.exit` | `ctrl+d` | Exit (when editor empty) |
88
88
  | `app.suspend` | `ctrl+z` (none on Windows) | Suspend to background |
89
- | `app.editor.external` | `ctrl+g` | Open in external editor (`$VISUAL` or `$EDITOR`) |
89
+ | `app.editor.external` | `ctrl+g` | Open in external editor (`externalEditor`, `$VISUAL`, `$EDITOR`, Notepad on Windows, or `nano` elsewhere) |
90
90
  | `app.clipboard.pasteImage` | `ctrl+v` (`alt+v` on Windows) | Paste image from clipboard |
91
91
  | `app.history.search` | `ctrl+r` | Search prompt history across sessions |
92
92
  | `app.sessions.observe` | `ctrl+s` | Observe session transcripts |
package/docs/models.md CHANGED
@@ -34,7 +34,7 @@ For local models (Ollama, LM Studio, vLLM), only `id` is required per model:
34
34
  }
35
35
  ```
36
36
 
37
- The `apiKey` is required but Ollama ignores it, so any value works.
37
+ The `apiKey` value is a placeholder because Ollama ignores it. pi still treats models as requiring auth before they appear in `/model`, so keyless local servers should keep a dummy value, save a key for that provider with `/login`, or pass `--api-key` when selecting the model.
38
38
 
39
39
  Some OpenAI-compatible servers do not understand the `developer` role used for reasoning-capable models. For those providers, set `compat.supportsDeveloperRole` to `false` so senpi sends the system prompt as a `system` message instead. If the server also does not support `reasoning_effort`, set `compat.supportsReasoningEffort` to `false` too.
40
40
 
@@ -135,12 +135,14 @@ Set `api` at provider level (default for all models) or model level (override pe
135
135
  |-------|-------------|
136
136
  | `baseUrl` | API endpoint URL |
137
137
  | `api` | API type (see above) |
138
- | `apiKey` | API key (see value resolution below) |
138
+ | `apiKey` | Optional API key config (see value resolution below). Omit it when auth is provided by `/login`/`auth.json` or CLI `--api-key`. |
139
139
  | `headers` | Custom headers (see value resolution below) |
140
140
  | `authHeader` | Set `true` to add `Authorization: Bearer <apiKey>` automatically |
141
141
  | `models` | Array of model configurations |
142
142
  | `modelOverrides` | Per-model overrides for built-in models on this provider |
143
143
 
144
+ For providers with `models`, non-built-in provider configs need `baseUrl` and an `api` value at either provider or model level. `apiKey` is not required to load the file: models become available when auth is configured through `/login`/`auth.json`, CLI `--api-key`, or provider `apiKey`. If no auth is configured, the models load but stay unavailable in `/model` and `--list-models`.
145
+
144
146
  ### Value Resolution
145
147
 
146
148
  The `apiKey` and `headers` fields support command execution, environment interpolation, and literals:
package/docs/providers.md CHANGED
@@ -63,7 +63,7 @@ senpi
63
63
  | xAI | `XAI_API_KEY` | `xai` |
64
64
  | OpenRouter | `OPENROUTER_API_KEY` | `openrouter` |
65
65
  | Vercel AI Gateway | `AI_GATEWAY_API_KEY` | `vercel-ai-gateway` |
66
- | ZAI | `ZAI_API_KEY` | `zai` |
66
+ | ZAI Coding Plan (Global) | `ZAI_API_KEY` | `zai` |
67
67
  | ZAI Coding Plan (China) | `ZAI_CODING_CN_API_KEY` | `zai-coding-cn` |
68
68
  | OpenCode Zen | `OPENCODE_API_KEY` | `opencode` |
69
69
  | OpenCode Go | `OPENCODE_API_KEY` | `opencode-go` |
@@ -156,8 +156,9 @@ OAuth credentials are also stored here after `/login` and managed automatically.
156
156
 
157
157
  ```bash
158
158
  export AZURE_OPENAI_API_KEY=...
159
- export AZURE_OPENAI_BASE_URL=https://your-resource.openai.azure.com
159
+ export AZURE_OPENAI_BASE_URL=https://your-resource.ai.azure.com
160
160
  # also supported: https://your-resource.cognitiveservices.azure.com
161
+ # also supported: https://your-resource.openai.azure.com
161
162
  # root endpoints are auto-normalized to /openai/v1
162
163
  # or use resource name instead of base URL
163
164
  export AZURE_OPENAI_RESOURCE_NAME=your-resource
package/docs/security.md CHANGED
@@ -32,6 +32,10 @@ Non-interactive modes (`-p`, `--mode json`, and `--mode rpc`) do not show a trus
32
32
 
33
33
  senpi 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 senpi 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.
34
34
 
35
+ The built-in permission system is a tool-call confirmation policy. Its default preset is `full-access`, so ordinary tool calls do not prompt. You can choose stricter presets with `permissionPreset` or `--permission-preset`: `workspace`, `read-only`, or `ask`. Explicit `permission` rules and `--permission` CLI rules can allow, ask, or deny matching tool calls.
36
+
37
+ Permission presets are not an isolation boundary. They do not constrain the host process itself, user-installed extensions, package lifecycle behavior, already-started child processes, or credentials available to the process.
38
+
35
39
  This is intentional. senpi 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.
36
40
 
37
41
  Project trust is only an input-loading guard. It prevents a repository from silently changing senpi'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 senpi.
package/docs/settings.md CHANGED
@@ -21,6 +21,60 @@ If no extension or saved decision applies, `defaultProjectTrust` controls the fa
21
21
 
22
22
  Use `/trust` in interactive mode to save a project trust decision for future sessions, including trust for the immediate parent folder. It writes `~/.senpi/agent/trust.json` only; the current session is not reloaded, so restart senpi for changes to take effect.
23
23
 
24
+ ## Permissions
25
+
26
+ Senpi includes a built-in permission system for tool calls. It evaluates a preset first, then applies explicit rules from global settings, project settings, and CLI flags. The last matching rule wins.
27
+
28
+ | Setting | Type | Default | Description |
29
+ |---------|------|---------|-------------|
30
+ | `permissionPreset` | string | `"full-access"` | Permission preset: `"full-access"`, `"workspace"`, `"read-only"`, or `"ask"` |
31
+ | `permission` | object | - | Explicit permission rules that override the selected preset |
32
+
33
+ Presets:
34
+
35
+ | Preset | Behavior |
36
+ |--------|----------|
37
+ | `full-access` | Allow all permission checks without prompting |
38
+ | `workspace` | Allow `read`, `list`, `grep`, `edit`, and `bash`; ask for `external_directory` |
39
+ | `read-only` | Allow `read`, `list`, and `grep`; ask for `edit`, `bash`, and `external_directory` |
40
+ | `ask` | Restore prompt-on-unknown behavior |
41
+
42
+ Example:
43
+
44
+ ```json
45
+ {
46
+ "permissionPreset": "workspace",
47
+ "permission": {
48
+ "bash": {
49
+ "rm *": "deny"
50
+ },
51
+ "edit": {
52
+ "secrets/*": "ask"
53
+ }
54
+ }
55
+ }
56
+ ```
57
+
58
+ Flat rules apply to all patterns for that permission:
59
+
60
+ ```json
61
+ {
62
+ "permissionPreset": "read-only",
63
+ "permission": {
64
+ "bash": "deny"
65
+ }
66
+ }
67
+ ```
68
+
69
+ CLI overrides have the highest precedence:
70
+
71
+ ```bash
72
+ senpi --permission-preset ask
73
+ senpi --permission-preset workspace --permission "bash:rm *=deny"
74
+ ```
75
+
76
+ Permission rules are a confirmation policy, not a sandbox. Senpi, extensions, package installs, and child processes still run with the host process permissions.
77
+
24
78
  ## All Settings
25
79
 
26
80
  ### Model & Thinking
@@ -65,6 +119,7 @@ When this value is anything other than `"auto"`, it overrides any model-level `p
65
119
  | Setting | Type | Default | Description |
66
120
  |---------|------|---------|-------------|
67
121
  | `theme` | string | `"dark"` | Theme name (`"dark"`, `"light"`, or custom) |
122
+ | `externalEditor` | string | `$VISUAL`, then `$EDITOR`, then Notepad on Windows or `nano` elsewhere | Command for Ctrl+G external editor; takes precedence over environment variables |
68
123
  | `quietStartup` | boolean | `false` | Hide startup header |
69
124
  | `defaultProjectTrust` | string | `"ask"` | Fallback project trust behavior: `"ask"`, `"always"`, or `"never"`. Global setting only |
70
125
  | `collapseChangelog` | boolean | `false` | Show condensed changelog after updates |
@@ -77,6 +132,14 @@ When this value is anything other than `"auto"`, it overrides any model-level `p
77
132
  | `autocompleteMaxVisible` | number | `5` | Max visible items in autocomplete dropdown (3-20) |
78
133
  | `showHardwareCursor` | boolean | `false` | Show the terminal cursor while TUI positions it for IME support |
79
134
 
135
+ For VS Code, include `--wait` so pi resumes after the editor exits:
136
+
137
+ ```json
138
+ {
139
+ "externalEditor": "code --wait"
140
+ }
141
+ ```
142
+
80
143
  ### Telemetry and update checks
81
144
 
82
145
  `enableInstallTelemetry` only controls the anonymous install/update ping to `https://pi.dev/api/report-install`. Opting out of telemetry does not disable update checks; senpi can still fetch the latest published `@code-yeongyu/senpi` version from the npm registry (`registry.npmjs.org`).
@@ -30,13 +30,7 @@ That mapping sends a raw linefeed byte. Inside pi, that is indistinguishable fro
30
30
 
31
31
  If Claude Code 2.x or newer is the only reason you added that mapping, you can remove it, unless you want to use Claude Code in tmux, where it still requires that Ghostty mapping.
32
32
 
33
- If you want `Shift+Enter` to keep working in tmux via that remap, add `ctrl+j` to your senpi `newLine` keybinding in `~/.senpi/agent/keybindings.json`:
34
-
35
- ```json
36
- {
37
- "newLine": ["shift+enter", "ctrl+j"]
38
- }
39
- ```
33
+ Pi binds `Ctrl+J` as a default newline alias, so `Shift+Enter` keeps working in tmux via that remap without extra pi configuration.
40
34
 
41
35
  ## WezTerm
42
36
 
package/docs/tui.md CHANGED
@@ -742,7 +742,7 @@ ctx.ui.setStatus("my-ext", ctx.ui.theme.fg("accent", "● active"));
742
742
  ctx.ui.setStatus("my-ext", undefined);
743
743
  ```
744
744
 
745
- **Examples:** [status-line.ts](../examples/extensions/status-line.ts), [plan-mode/](../examples/extensions/plan-mode/), [preset.ts](../examples/extensions/preset.ts)
745
+ **Examples:** [status-line.ts](../examples/extensions/status-line.ts), [plan-mode/index.ts](../examples/extensions/plan-mode/index.ts), [preset.ts](../examples/extensions/preset.ts)
746
746
 
747
747
  ### Pattern 4b: Working Indicator Customization
748
748
 
@@ -802,7 +802,7 @@ ctx.ui.setWidget("my-widget", (_tui, theme) => {
802
802
  ctx.ui.setWidget("my-widget", undefined);
803
803
  ```
804
804
 
805
- **Examples:** [plan-mode/](../examples/extensions/plan-mode/)
805
+ **Examples:** [plan-mode/index.ts](../examples/extensions/plan-mode/index.ts)
806
806
 
807
807
  ### Pattern 6: Custom Footer
808
808
 
@@ -919,7 +919,7 @@ export default function (pi: ExtensionAPI) {
919
919
  - **Selection UI**: [examples/extensions/preset.ts](../examples/extensions/preset.ts) - SelectList with DynamicBorder framing
920
920
  - **Async with cancel**: [examples/extensions/qna.ts](../examples/extensions/qna.ts) - BorderedLoader for LLM calls
921
921
  - **Settings toggles**: [examples/extensions/tools.ts](../examples/extensions/tools.ts) - SettingsList for tool enable/disable
922
- - **Status indicators**: [examples/extensions/plan-mode/](../examples/extensions/plan-mode/) - setStatus and setWidget
922
+ - **Status indicators**: [examples/extensions/plan-mode/index.ts](../examples/extensions/plan-mode/index.ts) - setStatus and setWidget
923
923
  - **Working indicator**: [examples/extensions/working-indicator.ts](../examples/extensions/working-indicator.ts) - setWorkingIndicator
924
924
  - **Custom footer**: [examples/extensions/custom-footer.ts](../examples/extensions/custom-footer.ts) - setFooter with stats
925
925
  - **Custom editor**: [examples/extensions/modal-editor.ts](../examples/extensions/modal-editor.ts) - Vim-like modal editing