@code-yeongyu/senpi 2026.8.13 → 2026.8.16

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 (514) hide show
  1. package/CHANGELOG.md +142 -0
  2. package/README.md +1 -0
  3. package/dist/cli/args.d.ts +1 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +14 -0
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/auth-command.d.ts.map +1 -1
  8. package/dist/cli/auth-command.js +5 -4
  9. package/dist/cli/auth-command.js.map +1 -1
  10. package/dist/core/agent-session.d.ts +80 -8
  11. package/dist/core/agent-session.d.ts.map +1 -1
  12. package/dist/core/agent-session.js +206 -31
  13. package/dist/core/agent-session.js.map +1 -1
  14. package/dist/core/auth-storage.d.ts.map +1 -1
  15. package/dist/core/auth-storage.js +19 -8
  16. package/dist/core/auth-storage.js.map +1 -1
  17. package/dist/core/experimental.d.ts +4 -0
  18. package/dist/core/experimental.d.ts.map +1 -1
  19. package/dist/core/experimental.js +4 -0
  20. package/dist/core/experimental.js.map +1 -1
  21. package/dist/core/export-html/template.js +31 -9
  22. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.d.ts +4 -0
  23. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.d.ts.map +1 -0
  24. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.js +30 -0
  25. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-environment.js.map +1 -0
  26. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts +2 -0
  27. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.d.ts.map +1 -1
  28. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js +13 -47
  29. package/dist/core/extensions/builtin/claude-sdk-oauth/auth-lane.js.map +1 -1
  30. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +18 -1
  31. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -1
  32. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +64 -2
  33. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -1
  34. package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.d.ts +3 -0
  35. package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.d.ts.map +1 -0
  36. package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.js +27 -0
  37. package/dist/core/extensions/builtin/claude-sdk-oauth/config-dir-credentials.js.map +1 -0
  38. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts +15 -2
  39. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +45 -11
  41. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
  42. package/dist/core/extensions/builtin/claude-sdk-oauth/options.d.ts.map +1 -1
  43. package/dist/core/extensions/builtin/claude-sdk-oauth/options.js +1 -0
  44. package/dist/core/extensions/builtin/claude-sdk-oauth/options.js.map +1 -1
  45. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
  46. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +3 -1
  47. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +1 -0
  49. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
  50. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.d.ts.map +1 -1
  51. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js +17 -1
  52. package/dist/core/extensions/builtin/claude-sdk-oauth/session-sync.js.map +1 -1
  53. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js +1 -0
  55. package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -1
  56. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/compaction/index.js +225 -75
  58. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  59. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts +2 -3
  60. package/dist/core/extensions/builtin/compaction/lane-policy.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/compaction/lane-policy.js +2 -3
  62. package/dist/core/extensions/builtin/compaction/lane-policy.js.map +1 -1
  63. package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
  64. package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/compaction/log.js +2 -0
  66. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  67. package/dist/core/extensions/builtin/compaction/overflow-retry.d.ts.map +1 -1
  68. package/dist/core/extensions/builtin/compaction/overflow-retry.js +38 -4
  69. package/dist/core/extensions/builtin/compaction/overflow-retry.js.map +1 -1
  70. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  71. package/dist/core/extensions/builtin/compaction/speculative.js +2 -1
  72. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  73. package/dist/core/extensions/builtin/compaction/summarization-turn-order.d.ts +33 -0
  74. package/dist/core/extensions/builtin/compaction/summarization-turn-order.d.ts.map +1 -0
  75. package/dist/core/extensions/builtin/compaction/summarization-turn-order.js +67 -0
  76. package/dist/core/extensions/builtin/compaction/summarization-turn-order.js.map +1 -0
  77. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
  78. package/dist/core/extensions/builtin/config-reload/index.js +31 -8
  79. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
  80. package/dist/core/extensions/builtin/config-reload/routine-settings.d.ts.map +1 -1
  81. package/dist/core/extensions/builtin/config-reload/routine-settings.js +11 -12
  82. package/dist/core/extensions/builtin/config-reload/routine-settings.js.map +1 -1
  83. package/dist/core/extensions/builtin/goal/terminal-provider-error.d.ts.map +1 -1
  84. package/dist/core/extensions/builtin/goal/terminal-provider-error.js +16 -0
  85. package/dist/core/extensions/builtin/goal/terminal-provider-error.js.map +1 -1
  86. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/index.js +4 -0
  88. package/dist/core/extensions/builtin/index.js.map +1 -1
  89. package/dist/core/extensions/builtin/mcp/process-tree.js +6 -1
  90. package/dist/core/extensions/builtin/mcp/process-tree.js.map +1 -1
  91. package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts +3 -0
  92. package/dist/core/extensions/builtin/prompt-preset/glm-5-3.d.ts.map +1 -0
  93. package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js +14 -0
  94. package/dist/core/extensions/builtin/prompt-preset/glm-5-3.js.map +1 -0
  95. package/dist/core/extensions/builtin/prompt-preset/grok-4.6.d.ts +3 -0
  96. package/dist/core/extensions/builtin/prompt-preset/grok-4.6.d.ts.map +1 -0
  97. package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js +91 -0
  98. package/dist/core/extensions/builtin/prompt-preset/grok-4.6.js.map +1 -0
  99. package/dist/core/extensions/builtin/prompt-preset/index.d.ts.map +1 -1
  100. package/dist/core/extensions/builtin/prompt-preset/index.js +22 -2
  101. package/dist/core/extensions/builtin/prompt-preset/index.js.map +1 -1
  102. package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/prompt-preset/presets.js +25 -0
  104. package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
  105. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
  106. package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
  107. package/dist/core/extensions/builtin/prompt-preset/settings.js +2 -0
  108. package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
  109. package/dist/core/extensions/builtin/reasoning/index.d.ts +3 -0
  110. package/dist/core/extensions/builtin/reasoning/index.d.ts.map +1 -0
  111. package/dist/core/extensions/builtin/reasoning/index.js +211 -0
  112. package/dist/core/extensions/builtin/reasoning/index.js.map +1 -0
  113. package/dist/core/extensions/builtin/service-tier.d.ts +44 -1
  114. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  115. package/dist/core/extensions/builtin/service-tier.js +176 -24
  116. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  117. package/dist/core/extensions/runner.d.ts.map +1 -1
  118. package/dist/core/extensions/runner.js +4 -4
  119. package/dist/core/extensions/runner.js.map +1 -1
  120. package/dist/core/extensions/types.d.ts +13 -1
  121. package/dist/core/extensions/types.d.ts.map +1 -1
  122. package/dist/core/extensions/types.js.map +1 -1
  123. package/dist/core/keybindings.d.ts +24 -0
  124. package/dist/core/keybindings.d.ts.map +1 -1
  125. package/dist/core/lockfile-policy.d.ts +15 -0
  126. package/dist/core/lockfile-policy.d.ts.map +1 -0
  127. package/dist/core/lockfile-policy.js +15 -0
  128. package/dist/core/lockfile-policy.js.map +1 -0
  129. package/dist/core/model-config.d.ts.map +1 -1
  130. package/dist/core/model-config.js +1 -0
  131. package/dist/core/model-config.js.map +1 -1
  132. package/dist/core/model-resolver.d.ts +34 -7
  133. package/dist/core/model-resolver.d.ts.map +1 -1
  134. package/dist/core/model-resolver.js +115 -27
  135. package/dist/core/model-resolver.js.map +1 -1
  136. package/dist/core/model-runtime.d.ts.map +1 -1
  137. package/dist/core/model-runtime.js +5 -3
  138. package/dist/core/model-runtime.js.map +1 -1
  139. package/dist/core/provider-api-key-auth.d.ts.map +1 -1
  140. package/dist/core/provider-api-key-auth.js +45 -2
  141. package/dist/core/provider-api-key-auth.js.map +1 -1
  142. package/dist/core/provider-composer.d.ts +12 -1
  143. package/dist/core/provider-composer.d.ts.map +1 -1
  144. package/dist/core/provider-composer.js.map +1 -1
  145. package/dist/core/provider-display-names.d.ts.map +1 -1
  146. package/dist/core/provider-display-names.js +1 -0
  147. package/dist/core/provider-display-names.js.map +1 -1
  148. package/dist/core/remote-catalog-provider.d.ts +13 -0
  149. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  150. package/dist/core/remote-catalog-provider.js +15 -0
  151. package/dist/core/remote-catalog-provider.js.map +1 -1
  152. package/dist/core/retry-fallback/controller.d.ts +1 -1
  153. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  154. package/dist/core/retry-fallback/controller.js +5 -3
  155. package/dist/core/retry-fallback/controller.js.map +1 -1
  156. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  157. package/dist/core/retry-fallback/settings.js +4 -1
  158. package/dist/core/retry-fallback/settings.js.map +1 -1
  159. package/dist/core/sdk.d.ts +5 -3
  160. package/dist/core/sdk.d.ts.map +1 -1
  161. package/dist/core/sdk.js +14 -8
  162. package/dist/core/sdk.js.map +1 -1
  163. package/dist/core/session-manager.d.ts.map +1 -1
  164. package/dist/core/session-manager.js +20 -4
  165. package/dist/core/session-manager.js.map +1 -1
  166. package/dist/core/settings-manager.d.ts +50 -1
  167. package/dist/core/settings-manager.d.ts.map +1 -1
  168. package/dist/core/settings-manager.js +258 -15
  169. package/dist/core/settings-manager.js.map +1 -1
  170. package/dist/core/system-prompt.js +1 -1
  171. package/dist/core/system-prompt.js.map +1 -1
  172. package/dist/core/thinking-levels.d.ts +22 -0
  173. package/dist/core/thinking-levels.d.ts.map +1 -1
  174. package/dist/core/thinking-levels.js +29 -0
  175. package/dist/core/thinking-levels.js.map +1 -1
  176. package/dist/core/tools/bash.d.ts.map +1 -1
  177. package/dist/core/tools/bash.js +2 -0
  178. package/dist/core/tools/bash.js.map +1 -1
  179. package/dist/core/tools/edit.d.ts.map +1 -1
  180. package/dist/core/tools/edit.js +2 -0
  181. package/dist/core/tools/edit.js.map +1 -1
  182. package/dist/core/tools/find.js +1 -1
  183. package/dist/core/tools/find.js.map +1 -1
  184. package/dist/core/tools/grep.js +1 -1
  185. package/dist/core/tools/grep.js.map +1 -1
  186. package/dist/core/tools/read.d.ts.map +1 -1
  187. package/dist/core/tools/read.js +2 -0
  188. package/dist/core/tools/read.js.map +1 -1
  189. package/dist/core/tools/write.d.ts.map +1 -1
  190. package/dist/core/tools/write.js +2 -0
  191. package/dist/core/tools/write.js.map +1 -1
  192. package/dist/index.d.ts +1 -1
  193. package/dist/index.d.ts.map +1 -1
  194. package/dist/index.js.map +1 -1
  195. package/dist/main.d.ts.map +1 -1
  196. package/dist/main.js +18 -1
  197. package/dist/main.js.map +1 -1
  198. package/dist/modes/interactive/components/extension-selector.d.ts +2 -0
  199. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  200. package/dist/modes/interactive/components/extension-selector.js +17 -1
  201. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  202. package/dist/modes/interactive/components/model-favorites.d.ts +2 -1
  203. package/dist/modes/interactive/components/model-favorites.d.ts.map +1 -1
  204. package/dist/modes/interactive/components/model-favorites.js +72 -6
  205. package/dist/modes/interactive/components/model-favorites.js.map +1 -1
  206. package/dist/modes/interactive/components/model-selector.d.ts +5 -1
  207. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  208. package/dist/modes/interactive/components/model-selector.js +10 -6
  209. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  210. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  211. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  212. package/dist/modes/interactive/components/settings-selector.js +10 -0
  213. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  214. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  215. package/dist/modes/interactive/components/tool-execution.js +22 -1
  216. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  217. package/dist/modes/interactive/interactive-mode.d.ts +14 -4
  218. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  219. package/dist/modes/interactive/interactive-mode.js +109 -50
  220. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  221. package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
  222. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  223. package/dist/modes/interactive/model-catalog-refresh.js +36 -0
  224. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  225. package/dist/modes/interactive/theme/dark.json +2 -0
  226. package/dist/modes/interactive/theme/grok-day.json +2 -0
  227. package/dist/modes/interactive/theme/grok-night.json +2 -0
  228. package/dist/modes/interactive/theme/light.json +2 -0
  229. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  230. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  231. package/dist/modes/interactive/theme/theme-controller.js +23 -10
  232. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  233. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  234. package/dist/modes/interactive/theme/theme.d.ts +5 -3
  235. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  236. package/dist/modes/interactive/theme/theme.js +12 -2
  237. package/dist/modes/interactive/theme/theme.js.map +1 -1
  238. package/dist/modes/json-event.d.ts +4 -1
  239. package/dist/modes/json-event.d.ts.map +1 -1
  240. package/dist/modes/json-event.js +5 -2
  241. package/dist/modes/json-event.js.map +1 -1
  242. package/dist/modes/rpc/connection-handler.d.ts +10 -0
  243. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  244. package/dist/modes/rpc/connection-handler.js +87 -19
  245. package/dist/modes/rpc/connection-handler.js.map +1 -1
  246. package/dist/modes/rpc/multi-session-host.js +3 -3
  247. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  248. package/dist/modes/rpc/rpc-client.d.ts +26 -1
  249. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  250. package/dist/modes/rpc/rpc-client.js +25 -2
  251. package/dist/modes/rpc/rpc-client.js.map +1 -1
  252. package/dist/modes/rpc/rpc-types.d.ts +60 -0
  253. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  254. package/dist/modes/rpc/rpc-types.js.map +1 -1
  255. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  256. package/dist/modes/rpc/session-command-router.js +2 -14
  257. package/dist/modes/rpc/session-command-router.js.map +1 -1
  258. package/dist/modes/rpc/session-event-writer.d.ts +29 -10
  259. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  260. package/dist/modes/rpc/session-event-writer.js +229 -50
  261. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  262. package/dist/server/create-harness.d.ts.map +1 -1
  263. package/dist/server/create-harness.js +2 -0
  264. package/dist/server/create-harness.js.map +1 -1
  265. package/dist/utils/shell.d.ts +27 -0
  266. package/dist/utils/shell.d.ts.map +1 -1
  267. package/dist/utils/shell.js +79 -13
  268. package/dist/utils/shell.js.map +1 -1
  269. package/dist/utils/tools-manager.d.ts +10 -1
  270. package/dist/utils/tools-manager.d.ts.map +1 -1
  271. package/dist/utils/tools-manager.js +14 -19
  272. package/dist/utils/tools-manager.js.map +1 -1
  273. package/docs/compaction.md +3 -3
  274. package/docs/custom-provider.md +1 -1
  275. package/docs/environment-variables.md +8 -2
  276. package/docs/extensions.md +13 -1
  277. package/docs/json.md +9 -5
  278. package/docs/keybindings.md +8 -2
  279. package/docs/providers.md +9 -1
  280. package/docs/rpc.md +128 -6
  281. package/docs/sdk.md +9 -0
  282. package/docs/settings.md +93 -1
  283. package/docs/terminal-setup.md +23 -2
  284. package/docs/themes.md +24 -3
  285. package/docs/tui.md +2 -2
  286. package/docs/usage.md +24 -4
  287. package/examples/extensions/subagent/agents.ts +40 -9
  288. package/examples/extensions/subagent/index.ts +26 -3
  289. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +38 -0
  290. package/node_modules/@code-yeongyu/senpi-codemode/README.md +5 -0
  291. package/node_modules/@code-yeongyu/senpi-codemode/package.json +5 -4
  292. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +14 -1
  293. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/call-capture.ts +64 -0
  294. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +45 -61
  295. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-runtime.ts +6 -0
  296. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-execution-event.ts +201 -0
  297. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool-options.ts +2 -0
  298. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +22 -0
  299. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts +25 -0
  300. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  301. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +77 -12
  302. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  303. package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts +43 -0
  304. package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.d.ts.map +1 -0
  305. package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.js +67 -0
  306. package/node_modules/@earendil-works/pi-agent-core/dist/harness/events.js.map +1 -0
  307. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.d.ts +4 -2
  308. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.d.ts.map +1 -1
  309. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js +127 -88
  310. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/codec.js.map +1 -1
  311. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts +5 -1
  312. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.d.ts.map +1 -1
  313. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.js +9 -2
  314. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/errors.js.map +1 -1
  315. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts +12 -3
  316. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.d.ts.map +1 -1
  317. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js +88 -45
  318. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/repo.js.map +1 -1
  319. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts +1 -1
  320. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.d.ts.map +1 -1
  321. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js +28 -19
  322. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/storage.js.map +1 -1
  323. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.d.ts +1 -1
  324. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.d.ts.map +1 -1
  325. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/jsonl/types.js.map +1 -1
  326. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts +1 -1
  327. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.d.ts.map +1 -1
  328. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/memory.js.map +1 -1
  329. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts +6 -1
  330. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.d.ts.map +1 -1
  331. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js +7 -2
  332. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/session.js.map +1 -1
  333. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts +1 -1
  334. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.d.ts.map +1 -1
  335. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/state.js.map +1 -1
  336. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.d.ts.map +1 -1
  337. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js +19 -0
  338. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/testing/conformance.js.map +1 -1
  339. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts +18 -5
  340. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.d.ts.map +1 -1
  341. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/types.js.map +1 -1
  342. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +1 -1
  343. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  344. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +1 -1
  345. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  346. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts +4 -1
  347. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.d.ts.map +1 -1
  348. package/node_modules/@earendil-works/pi-agent-core/dist/proxy.js.map +1 -1
  349. package/node_modules/@earendil-works/pi-agent-core/dist/search/index.d.ts +21 -0
  350. package/node_modules/@earendil-works/pi-agent-core/dist/search/index.d.ts.map +1 -0
  351. package/node_modules/@earendil-works/pi-agent-core/dist/search/index.js +2 -0
  352. package/node_modules/@earendil-works/pi-agent-core/dist/search/index.js.map +1 -0
  353. package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.d.ts +29 -0
  354. package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.d.ts.map +1 -0
  355. package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js +103 -0
  356. package/node_modules/@earendil-works/pi-agent-core/dist/search/scanning.js.map +1 -0
  357. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  358. package/node_modules/@earendil-works/pi-ai/README.md +2 -0
  359. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  360. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +40 -14
  361. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  362. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  363. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +16 -4
  364. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  365. package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.d.ts +69 -0
  366. package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.d.ts.map +1 -0
  367. package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.js +159 -0
  368. package/node_modules/@earendil-works/pi-ai/dist/api/cloudflare-gateway-binding.js.map +1 -0
  369. package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.d.ts +3 -0
  370. package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.d.ts.map +1 -1
  371. package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js +125 -5
  372. package/node_modules/@earendil-works/pi-ai/dist/api/constrained-sampling.js.map +1 -1
  373. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js +7 -3
  374. package/node_modules/@earendil-works/pi-ai/dist/api/google-generative-ai.js.map +1 -1
  375. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts +1 -1
  376. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.d.ts.map +1 -1
  377. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js +13 -9
  378. package/node_modules/@earendil-works/pi-ai/dist/api/google-shared.js.map +1 -1
  379. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js +7 -3
  380. package/node_modules/@earendil-works/pi-ai/dist/api/google-vertex.js.map +1 -1
  381. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts +1 -1
  382. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts.map +1 -1
  383. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js +208 -42
  384. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js.map +1 -1
  385. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  386. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +13 -4
  387. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  388. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  389. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +10 -7
  390. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  391. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts +1 -0
  392. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  393. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +31 -7
  394. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  395. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  396. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +8 -1
  397. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  398. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.d.ts +16 -0
  399. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.d.ts.map +1 -0
  400. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.js +234 -0
  401. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/cursor.js.map +1 -0
  402. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.d.ts.map +1 -1
  403. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.js +6 -3
  404. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/github-copilot.js.map +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts +2 -0
  406. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.d.ts.map +1 -1
  407. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js +5 -0
  408. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/load.js.map +1 -1
  409. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js +44 -9
  410. package/node_modules/@earendil-works/pi-ai/dist/auth/resolve.js.map +1 -1
  411. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +2 -0
  412. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  413. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  414. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.d.ts.map +1 -1
  415. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js +2 -0
  416. package/node_modules/@earendil-works/pi-ai/dist/bun-oauth.js.map +1 -1
  417. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +15 -0
  418. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  419. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +15 -0
  420. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  421. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  422. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -0
  423. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  424. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts +15 -0
  425. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -0
  426. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +32 -0
  427. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -0
  428. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  429. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  430. package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
  431. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  432. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  433. package/node_modules/@earendil-works/pi-ai/dist/providers/data/deepseek.json +1 -1
  434. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  435. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  436. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google-vertex.json +1 -1
  437. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  438. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  439. package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
  440. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  441. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
  442. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  443. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  444. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  445. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  446. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
  447. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  448. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  449. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  450. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  451. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +14 -3
  452. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  453. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  454. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  455. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +2 -0
  456. package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
  457. package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.d.ts +2 -0
  458. package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.d.ts.map +1 -0
  459. package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.js +12 -0
  460. package/node_modules/@earendil-works/pi-ai/dist/utils/pi-user-agent.js.map +1 -0
  461. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
  462. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js +3 -2
  463. package/node_modules/@earendil-works/pi-ai/dist/utils/prompt-cache-ttl.js.map +1 -1
  464. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  465. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -0
  466. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  467. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.d.ts.map +1 -1
  468. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js +34 -0
  469. package/node_modules/@earendil-works/pi-ai/dist/utils/validation.js.map +1 -1
  470. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  471. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  472. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  473. package/node_modules/@earendil-works/pi-tui/README.md +1 -1
  474. package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts +26 -0
  475. package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.d.ts.map +1 -0
  476. package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.js +121 -0
  477. package/node_modules/@earendil-works/pi-tui/dist/alt-screen-search.js.map +1 -0
  478. package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts +6 -1
  479. package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.d.ts.map +1 -1
  480. package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js +23 -7
  481. package/node_modules/@earendil-works/pi-tui/dist/components/scroll-view.js.map +1 -1
  482. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +4 -1
  483. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  484. package/node_modules/@earendil-works/pi-tui/dist/index.js +7 -1
  485. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  486. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts +30 -0
  487. package/node_modules/@earendil-works/pi-tui/dist/keybindings.d.ts.map +1 -1
  488. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js +24 -0
  489. package/node_modules/@earendil-works/pi-tui/dist/keybindings.js.map +1 -1
  490. package/node_modules/@earendil-works/pi-tui/dist/layout.d.ts.map +1 -1
  491. package/node_modules/@earendil-works/pi-tui/dist/layout.js +9 -2
  492. package/node_modules/@earendil-works/pi-tui/dist/layout.js.map +1 -1
  493. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts +8 -2
  494. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  495. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js +6 -2
  496. package/node_modules/@earendil-works/pi-tui/dist/stdin-buffer.js.map +1 -1
  497. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts +6 -0
  498. package/node_modules/@earendil-works/pi-tui/dist/terminal.d.ts.map +1 -1
  499. package/node_modules/@earendil-works/pi-tui/dist/terminal.js +18 -1
  500. package/node_modules/@earendil-works/pi-tui/dist/terminal.js.map +1 -1
  501. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts +21 -0
  502. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts.map +1 -1
  503. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js +243 -5
  504. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js.map +1 -1
  505. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts +2 -0
  506. package/node_modules/@earendil-works/pi-tui/dist/tui.d.ts.map +1 -1
  507. package/node_modules/@earendil-works/pi-tui/dist/tui.js +33 -8
  508. package/node_modules/@earendil-works/pi-tui/dist/tui.js.map +1 -1
  509. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  510. package/package.json +7 -7
  511. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.d.ts +0 -19
  512. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.d.ts.map +0 -1
  513. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.js +0 -41
  514. package/node_modules/@earendil-works/pi-agent-core/dist/harness/session/search.js.map +0 -1
@@ -42,6 +42,7 @@ import { openBrowser } from "../../utils/open-browser.js";
42
42
  import { getCwdRelativePath } from "../../utils/paths.js";
43
43
  import { getPiUserAgent } from "../../utils/pi-user-agent.js";
44
44
  import { killTrackedDetachedChildren } from "../../utils/shell.js";
45
+ import { ensureTool } from "../../utils/tools-manager.js";
45
46
  import { checkForNewPiVersion, getReleaseChangelogUrl } from "../../utils/version-check.js";
46
47
  import { abortedErrorLabel } from "./aborted-error-label.js";
47
48
  import { transferCompactionQueue, waitForPromptDisposition, } from "./compaction-queue-transfer.js";
@@ -86,9 +87,9 @@ import { editFileInExternalEditor, editInExternalEditor } from "./external-edito
86
87
  import { GrokChrome } from "./grok/chrome.js";
87
88
  import { restoreInteractiveStderr, takeOverInteractiveStderr } from "./interactive-stderr-guard.js";
88
89
  import { applyKeybindingsFileEdit, seedKeybindingsFile } from "./keybindings-command.js";
90
+ import { refreshModelCatalogs } from "./model-catalog-refresh.js";
89
91
  import { getModelSearchText } from "./model-search.js";
90
92
  import { isRiskyMainModel, RISKY_MAIN_MODEL_WARNING } from "./risky-main-model-warning.js";
91
- import { resolveStartupToolPaths } from "./startup-tools.js";
92
93
  import { DEFAULT_SMOOTH_FPS, StreamingRevealController } from "./streaming-reveal.js";
93
94
  import { getAvailableThemes, getAvailableThemesWithPaths, getEditorTheme, getMarkdownTheme, getThemeByName, onThemeChange, setRegisteredThemes, stopThemeWatcher, Theme, theme, } from "./theme/theme.js";
94
95
  import { InteractiveThemeController } from "./theme/theme-controller.js";
@@ -261,9 +262,21 @@ function formatLoginProviderCompletionDescription(provider) {
261
262
  export function createInteractiveTui(options) {
262
263
  const terminal = options.terminal ?? new ProcessTerminal({ onExternalStdoutWrite: appendHiddenTuiStdout });
263
264
  if (options.tuiMode === "fullscreen") {
265
+ const styleSearchMatch = (text) => theme.bg("searchMatchBg", theme.fg("searchMatchText", text));
264
266
  return new TuiAltScreen(terminal, options.showHardwareCursor, options.logDirectory, {
267
+ searchMatchStyle: (text) => theme.underline(styleSearchMatch(text)),
268
+ searchCurrentMatchStyle: (text) => theme.bold(theme.inverse(styleSearchMatch(text))),
265
269
  openUrl: openBrowser,
266
270
  onRightClickPaste: options.onRightClickPaste,
271
+ copySelection: async (text) => {
272
+ try {
273
+ await copyToClipboard(text);
274
+ return true;
275
+ }
276
+ catch {
277
+ return false;
278
+ }
279
+ },
267
280
  });
268
281
  }
269
282
  return new TuiMainScreen(terminal, options.showHardwareCursor, options.logDirectory);
@@ -359,6 +372,7 @@ export class InteractiveMode {
359
372
  // Status line tracking (for mutating immediately-sequential status updates)
360
373
  this.lastStatusSpacer = undefined;
361
374
  this.lastStatusText = undefined;
375
+ this.managedToolStatusStarted = false;
362
376
  // Streaming message tracking
363
377
  this.streamingComponent = undefined;
364
378
  this.streamingMessage = undefined;
@@ -427,6 +441,7 @@ export class InteractiveMode {
427
441
  });
428
442
  this.runtimeHost.setRebindSession(async () => {
429
443
  await this.rebindCurrentSession({ renderBeforeBind: true });
444
+ await this.themeController.applyFromSettings();
430
445
  });
431
446
  this.version = DISPLAY_VERSION;
432
447
  this.renderer = createInteractiveTui({
@@ -498,7 +513,12 @@ export class InteractiveMode {
498
513
  this.outputPad = this.settingsManager.getOutputPad();
499
514
  // Register themes from resource loader and initialize
500
515
  setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
501
- this.themeController = new InteractiveThemeController(this.ui, this.settingsManager, (message) => this.showError(message), () => this.updateEditorBorderColor());
516
+ this.themeController = new InteractiveThemeController(this.ui, {
517
+ getSettingsManager: () => this.settingsManager,
518
+ showError: (message) => this.showError(message),
519
+ onChanged: () => this.updateEditorBorderColor(),
520
+ initialThemeSetting: options.initialThemeSetting,
521
+ });
502
522
  }
503
523
  getAutocompleteSourceTag(sourceInfo) {
504
524
  if (!sourceInfo) {
@@ -661,14 +681,14 @@ export class InteractiveMode {
661
681
  tui.setLayoutRoot(this.fullscreenLayoutRoot);
662
682
  }
663
683
  }
664
- stopInteractiveTui() {
665
- if (this.renderer.mode === "fullscreen") {
684
+ stopInteractiveTui(fullscreenExitOutput) {
685
+ if (this.renderer.mode === "fullscreen" && fullscreenExitOutput === "transcript") {
666
686
  while (this.renderer.hasOverlayEntries)
667
687
  this.renderer.hideOverlay();
668
688
  this.switchTuiMode("regular", false, false);
669
689
  this.renderer.renderNow();
670
690
  }
671
- this.ui.stop();
691
+ this.ui.stop({ preserveScreen: this.renderer.mode === "fullscreen" });
672
692
  }
673
693
  switchTuiMode(mode, restoreProgress = true, startRenderer = true) {
674
694
  const previousUi = this.renderer;
@@ -725,9 +745,6 @@ export class InteractiveMode {
725
745
  this.registerSignalHandlers();
726
746
  // Load changelog (only show new entries, skip for resumed sessions)
727
747
  this.changelogMarkdown = this.getChangelogForDisplay();
728
- // Startup should never wait for tool downloads. Missing tools are resolved
729
- // lazily by the tools that need them.
730
- this.fdPath = resolveStartupToolPaths().fdPath;
731
748
  if (this.session.scopedModels.length > 0 && (this.options.verbose || !this.settingsManager.getQuietStartup())) {
732
749
  const modelList = this.session.scopedModels
733
750
  .map((sm) => {
@@ -780,9 +797,14 @@ export class InteractiveMode {
780
797
  else {
781
798
  this.mountInteractiveTui(this.renderer, rootComponents);
782
799
  }
800
+ // Accept text while startup completes, but only enable interrupt, exit, and submission feedback.
801
+ // Renderer-only lifecycle hosts may mount the chrome tree without constructing the base editor.
802
+ if (this.defaultEditor) {
803
+ this.defaultEditor.onAction("app.clear", () => this.handleCtrlC());
804
+ this.defaultEditor.onCtrlD = () => this.handleCtrlD();
805
+ this.defaultEditor.onSubmit = (text) => this.handleStartupSubmit(text);
806
+ }
783
807
  this.ui.setFocus(this.editor);
784
- this.setupKeyHandlers();
785
- this.setupEditorSubmitHandler();
786
808
  // Start the UI before initializing extensions so session_start handlers can use interactive dialogs
787
809
  try {
788
810
  takeOverInteractiveStderr();
@@ -857,6 +879,18 @@ export class InteractiveMode {
857
879
  this.headerContainer.addChild(this.builtInHeader);
858
880
  }
859
881
  this.ui.requestRender();
882
+ // Ensure fd and rg are available after mounting the TUI (downloads if missing, adds to PATH via getBinDir)
883
+ // so slow downloads do not make startup appear frozen.
884
+ // Both are needed: fd for autocomplete, rg for grep tool and bash commands.
885
+ const [fdPath] = await Promise.all([
886
+ ensureTool("fd", (status) => this.showManagedToolStatus(status)),
887
+ ensureTool("rg", (status) => this.showManagedToolStatus(status)),
888
+ ]);
889
+ this.fdPath = fdPath;
890
+ // Enable the remaining input handlers only after managed-tool setup completes.
891
+ this.setupKeyHandlers();
892
+ this.setupEditorSubmitHandler();
893
+ this.ui.requestRender();
860
894
  // Initialize extensions first so resources are shown before messages
861
895
  await this.rebindCurrentSession();
862
896
  // Render initial messages AFTER showing loaded resources
@@ -903,8 +937,7 @@ export class InteractiveMode {
903
937
  if (!envValue("OFFLINE")) {
904
938
  const controller = new AbortController();
905
939
  const timeout = setTimeout(() => controller.abort(), 15_000);
906
- void this.session.modelRuntime
907
- .refresh({ signal: controller.signal })
940
+ void refreshModelCatalogs(this.session.modelRuntime, controller.signal)
908
941
  .then(() => {
909
942
  this.updateAvailableProviderCount();
910
943
  this.ui.requestRender();
@@ -1733,7 +1766,7 @@ export class InteractiveMode {
1733
1766
  const message = error instanceof Error ? error.message : String(error);
1734
1767
  this.showError(`${prefix}: ${message}`);
1735
1768
  stopThemeWatcher();
1736
- this.stop();
1769
+ this.stop("transcript");
1737
1770
  process.exit(1);
1738
1771
  }
1739
1772
  renderCurrentSessionState() {
@@ -2805,6 +2838,10 @@ export class InteractiveMode {
2805
2838
  this.sessionLogger ??= createSessionLogger(this.runtimeHost.services.agentDir);
2806
2839
  return this.sessionLogger;
2807
2840
  }
2841
+ handleStartupSubmit(text) {
2842
+ this.editor.setText(text);
2843
+ this.showStatus("Startup is still in progress");
2844
+ }
2808
2845
  setupEditorSubmitHandler() {
2809
2846
  this.defaultEditor.onSubmit = async (text) => {
2810
2847
  this.hideShortcutOverlay();
@@ -3080,6 +3117,9 @@ export class InteractiveMode {
3080
3117
  case "high_reasoning_warning":
3081
3118
  this.showHighReasoningWarning(event);
3082
3119
  break;
3120
+ case "settings_source_selected":
3121
+ this.showSettingsSourceSelected(event);
3122
+ break;
3083
3123
  case "message_start":
3084
3124
  if (event.message.role === "custom") {
3085
3125
  this.addMessageToChat(event.message);
@@ -3515,6 +3555,19 @@ export class InteractiveMode {
3515
3555
  : message.content.filter((content) => content.type === "text");
3516
3556
  return textBlocks.map((content) => content.text).join("");
3517
3557
  }
3558
+ /** Show a managed-tool status update in the chat. */
3559
+ showManagedToolStatus(status) {
3560
+ if (!this.managedToolStatusStarted) {
3561
+ this.chatContainer.addChild(new Spacer(1));
3562
+ this.managedToolStatusStarted = true;
3563
+ }
3564
+ const message = status.type === "warning" ? `Warning: ${status.message}` : status.message;
3565
+ const color = status.type === "warning" ? "warning" : "dim";
3566
+ this.chatContainer.addChild(new Text(theme.fg(color, message), 1, 0));
3567
+ this.lastStatusSpacer = undefined;
3568
+ this.lastStatusText = undefined;
3569
+ this.ui.requestRender();
3570
+ }
3518
3571
  /**
3519
3572
  * Show a status message in the chat.
3520
3573
  *
@@ -3910,7 +3963,7 @@ export class InteractiveMode {
3910
3963
  }
3911
3964
  catch { }
3912
3965
  restoreInteractiveStderr();
3913
- console.error("pi exiting due to uncaughtException:");
3966
+ console.error(`${APP_NAME} exiting due to uncaughtException:`);
3914
3967
  console.error(error);
3915
3968
  process.exit(1);
3916
3969
  }
@@ -4210,6 +4263,9 @@ export class InteractiveMode {
4210
4263
  this.chatContainer.addChild(new DynamicBorder((text) => theme.fg("error", text)));
4211
4264
  this.ui.requestRender();
4212
4265
  }
4266
+ showSettingsSourceSelected(event) {
4267
+ this.showStatus(`Settings: ${path.basename(event.path)} (${event.format.toUpperCase()})`);
4268
+ }
4213
4269
  showHighReasoningWarning(event) {
4214
4270
  const { title, body } = buildHighReasoningWarning({ id: event.modelId, provider: event.provider }, event.thinkingLevel);
4215
4271
  this.chatContainer.addChild(new Spacer(1));
@@ -4498,7 +4554,7 @@ export class InteractiveMode {
4498
4554
  httpIdleTimeoutMs: this.settingsManager.getHttpIdleTimeoutMs(),
4499
4555
  thinkingLevel: this.session.thinkingLevel,
4500
4556
  availableThinkingLevels: this.session.getAvailableThinkingLevels(),
4501
- currentTheme: this.settingsManager.getThemeSetting() || "dark",
4557
+ currentTheme: this.themeController.getThemeSelection() || "dark",
4502
4558
  terminalTheme: this.themeController.getTerminalTheme(),
4503
4559
  availableThemes: getAvailableThemes(),
4504
4560
  hideThinkingBlock: this.hideThinkingBlock,
@@ -4519,6 +4575,7 @@ export class InteractiveMode {
4519
4575
  clearOnShrink: this.settingsManager.getClearOnShrink(),
4520
4576
  showTerminalProgress: this.settingsManager.getShowTerminalProgress(),
4521
4577
  tuiMode: this.ui.mode,
4578
+ fullscreenExitOutput: this.settingsManager.getFullscreenExitOutput(),
4522
4579
  fullscreenScrollbar: this.settingsManager.getFullscreenScrollbar(),
4523
4580
  warnings: this.settingsManager.getWarnings(),
4524
4581
  }, {
@@ -4576,7 +4633,7 @@ export class InteractiveMode {
4576
4633
  },
4577
4634
  onThemeChange: (themeSetting) => {
4578
4635
  this.settingsManager.setTheme(themeSetting);
4579
- void this.themeController.applyFromSettings();
4636
+ void this.themeController.setThemeSetting(themeSetting);
4580
4637
  },
4581
4638
  onThemePreview: (themeName) => this.themeController.preview(themeName),
4582
4639
  onHideThinkingBlockChange: (hidden) => {
@@ -4702,6 +4759,9 @@ export class InteractiveMode {
4702
4759
  this.statusContainer.clear();
4703
4760
  this.showStatus(`TUI mode: ${mode}`);
4704
4761
  },
4762
+ onFullscreenExitOutputChange: (output) => {
4763
+ this.settingsManager.setFullscreenExitOutput(output);
4764
+ },
4705
4765
  onFullscreenScrollbarChange: (mode) => {
4706
4766
  this.settingsManager.setFullscreenScrollbar(mode);
4707
4767
  this.applyFullscreenScrollbarSetting();
@@ -4744,7 +4804,7 @@ export class InteractiveMode {
4744
4804
  controller.abort();
4745
4805
  }, 15_000);
4746
4806
  try {
4747
- const result = await this.session.modelRuntime.refresh({ signal: controller.signal });
4807
+ const result = await refreshModelCatalogs(this.session.modelRuntime, controller.signal);
4748
4808
  if (result.aborted && timedOut) {
4749
4809
  this.showWarning("Model refresh timed out; searching cached models.");
4750
4810
  }
@@ -4805,34 +4865,31 @@ export class InteractiveMode {
4805
4865
  const favoriteModels = await this.resolveFavoriteModelsForUi(patterns, candidateModels);
4806
4866
  return favoriteModels.map((favorite) => getModelFullId(favorite.model));
4807
4867
  }
4808
- async updateSessionFavoritesFromIds(favoriteIds, candidateModels) {
4809
- const nextIds = favoriteIds === null ? candidateModels.map(getModelFullId) : favoriteIds;
4810
- if (nextIds.length === 0) {
4811
- this.session.setFavoriteModels([]);
4812
- this.ui.requestRender();
4813
- return;
4814
- }
4815
- const newFavoriteModels = await this.resolveFavoriteModelsForUi(nextIds, candidateModels);
4868
+ async captureFavoritePatternSnapshot() {
4869
+ const storedPatterns = this.settingsManager.getFavoriteModels() ?? [];
4870
+ const { patternResolutions } = await resolveModelScopeWithDiagnostics(storedPatterns, this.session.modelRuntime);
4871
+ return { storedPatterns, patternResolutions };
4872
+ }
4873
+ async applyFavoriteSelection(favoriteIds, candidateModels, persist, patternSnapshot) {
4874
+ const { storedPatterns, patternResolutions } = patternSnapshot;
4875
+ const mergedPatterns = mergeFavoritePatternsForPersist({
4876
+ storedPatterns,
4877
+ patternResolutions,
4878
+ selectedIds: favoriteIds,
4879
+ candidateIds: candidateModels.map(getModelFullId),
4880
+ });
4881
+ const newFavoriteModels = mergedPatterns
4882
+ ? await resolveModelScope(mergedPatterns, this.session.modelRuntime)
4883
+ : [];
4816
4884
  this.session.setFavoriteModels(newFavoriteModels.map((favorite) => ({
4817
4885
  model: favorite.model,
4818
4886
  thinkingLevel: favorite.thinkingLevel,
4819
4887
  serviceTier: favorite.serviceTier,
4820
4888
  })));
4889
+ if (persist)
4890
+ this.settingsManager.setFavoriteModels(mergedPatterns);
4821
4891
  this.ui.requestRender();
4822
4892
  }
4823
- async persistFavoritePatterns(favoriteIds, candidateModels) {
4824
- const storedPatterns = this.settingsManager.getFavoriteModels() ?? [];
4825
- const { diagnostics } = await resolveModelScopeWithDiagnostics(storedPatterns, this.session.modelRuntime);
4826
- const unresolvedPatterns = diagnostics
4827
- .filter((diagnostic) => diagnostic.code === "no-match")
4828
- .map((diagnostic) => diagnostic.pattern);
4829
- this.settingsManager.setFavoriteModels(mergeFavoritePatternsForPersist({
4830
- storedPatterns,
4831
- unresolvedPatterns,
4832
- selectedIds: favoriteIds,
4833
- candidateIds: candidateModels.map(getModelFullId),
4834
- }));
4835
- }
4836
4893
  /** Update the footer's available provider count from the current snapshot without refreshing catalogs. */
4837
4894
  updateAvailableProviderCount() {
4838
4895
  const models = this.session.scopedModels.length > 0
@@ -4903,7 +4960,7 @@ export class InteractiveMode {
4903
4960
  onSelect: (selection) => {
4904
4961
  trustStore.setMany(selection.updates);
4905
4962
  done();
4906
- this.showStatus(`Saved trust decision: ${selection.trusted ? "trusted" : "untrusted"}. Restart pi for this to take effect.`);
4963
+ this.showStatus(`Saved trust decision: ${selection.trusted ? "trusted" : "untrusted"}. Restart ${APP_NAME} for this to take effect.`);
4907
4964
  },
4908
4965
  onCancel: () => {
4909
4966
  done();
@@ -4914,6 +4971,7 @@ export class InteractiveMode {
4914
4971
  });
4915
4972
  }
4916
4973
  showModelSelector(initialSearchInput) {
4974
+ const favoritePatternSnapshot = this.captureFavoritePatternSnapshot();
4917
4975
  this.showSelector((done) => {
4918
4976
  const favoriteModelIds = this.session.favoriteModels.map((favorite) => getModelFullId(favorite.model));
4919
4977
  const selector = new ModelSelectorComponent(this.ui, this.session.model, this.settingsManager, this.session.modelRuntime, this.session.scopedModels, (model) => {
@@ -4924,8 +4982,7 @@ export class InteractiveMode {
4924
4982
  }, initialSearchInput, {
4925
4983
  favoriteModelIds,
4926
4984
  onFavoriteChange: async (favoriteIds, allModels) => {
4927
- await this.updateSessionFavoritesFromIds(favoriteIds, allModels);
4928
- await this.persistFavoritePatterns(favoriteIds, allModels);
4985
+ await this.applyFavoriteSelection(favoriteIds, allModels, true, await favoritePatternSnapshot);
4929
4986
  },
4930
4987
  });
4931
4988
  return { component: selector, focus: selector, dispose: () => selector.dispose() };
@@ -4938,6 +4995,7 @@ export class InteractiveMode {
4938
4995
  return;
4939
4996
  }
4940
4997
  const currentFavoriteIds = await this.getFavoriteModelIdsForUi(allModels);
4998
+ const favoritePatternSnapshot = await this.captureFavoritePatternSnapshot();
4941
4999
  this.showSelector((done) => {
4942
5000
  const selector = new FavoriteModelsSelectorComponent({
4943
5001
  allModels,
@@ -4945,10 +5003,10 @@ export class InteractiveMode {
4945
5003
  currentModel: this.session.model,
4946
5004
  }, {
4947
5005
  onChange: async (favoriteIds) => {
4948
- await this.updateSessionFavoritesFromIds(favoriteIds, allModels);
5006
+ await this.applyFavoriteSelection(favoriteIds, allModels, false, favoritePatternSnapshot);
4949
5007
  },
4950
5008
  onPersist: (favoriteIds) => {
4951
- void this.persistFavoritePatterns(favoriteIds, allModels).then(() => {
5009
+ void this.applyFavoriteSelection(favoriteIds, allModels, true, favoritePatternSnapshot).then(() => {
4952
5010
  this.showStatus("Favorite models saved to settings");
4953
5011
  });
4954
5012
  },
@@ -5030,8 +5088,7 @@ export class InteractiveMode {
5030
5088
  this.ui.requestRender();
5031
5089
  },
5032
5090
  });
5033
- void this.session.modelRuntime
5034
- .refresh({ signal: controller.signal })
5091
+ void refreshModelCatalogs(this.session.modelRuntime, controller.signal)
5035
5092
  .then((result) => {
5036
5093
  if (disposed)
5037
5094
  return;
@@ -5588,7 +5645,7 @@ export class InteractiveMode {
5588
5645
  this.ui.requestRender();
5589
5646
  };
5590
5647
  const dialog = new LoginDialogComponent(this.ui, providerOption.id, () => restoreEditor(), providerOption.name, `${providerOption.name} setup`);
5591
- dialog.showInfo(`${providerOption.method?.name ?? "Authentication"} is configured outside pi.`, [], true);
5648
+ dialog.showInfo(`${providerOption.method?.name ?? "Authentication"} is configured outside ${APP_NAME}.`, [], true);
5592
5649
  this.editorContainer.clear();
5593
5650
  this.editorContainer.addChild(dialog);
5594
5651
  this.ui.setFocus(dialog);
@@ -5842,7 +5899,9 @@ export class InteractiveMode {
5842
5899
  this.showStatus(`Session exported to: ${filePath}`);
5843
5900
  }
5844
5901
  else {
5845
- const filePath = await this.session.exportToHtml(outputPath);
5902
+ const filePath = await this.session.exportToHtml(outputPath, {
5903
+ themeName: theme.name,
5904
+ });
5846
5905
  this.showStatus(`Session exported to: ${filePath}`);
5847
5906
  }
5848
5907
  }
@@ -5933,7 +5992,7 @@ export class InteractiveMode {
5933
5992
  // Export to a temp file
5934
5993
  const tmpFile = path.join(os.tmpdir(), "session.html");
5935
5994
  try {
5936
- await this.session.exportToHtml(tmpFile);
5995
+ await this.session.exportToHtml(tmpFile, { themeName: theme.name });
5937
5996
  }
5938
5997
  catch (error) {
5939
5998
  this.showError(`Failed to export session: ${error instanceof Error ? error.message : "Unknown error"}`);
@@ -6385,7 +6444,7 @@ export class InteractiveMode {
6385
6444
  // Ignore, will be emitted as an event
6386
6445
  }
6387
6446
  }
6388
- stop() {
6447
+ stop(fullscreenExitOutput) {
6389
6448
  InteractiveMode.restoreCompactionEscapeOverride(this);
6390
6449
  this.streamingReveal.stop();
6391
6450
  this.toolResultReveal.stop();
@@ -6407,7 +6466,7 @@ export class InteractiveMode {
6407
6466
  }
6408
6467
  if (this.isInitialized) {
6409
6468
  try {
6410
- this.stopInteractiveTui();
6469
+ this.stopInteractiveTui(fullscreenExitOutput ?? this.settingsManager.getFullscreenExitOutput());
6411
6470
  }
6412
6471
  finally {
6413
6472
  this.isInitialized = false;