@code-yeongyu/senpi 2026.8.10 → 2026.8.11-3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (440) hide show
  1. package/CHANGELOG.md +119 -0
  2. package/dist/brand-dir-migration.d.ts +28 -0
  3. package/dist/brand-dir-migration.d.ts.map +1 -0
  4. package/dist/brand-dir-migration.js +77 -0
  5. package/dist/brand-dir-migration.js.map +1 -0
  6. package/dist/cli/grok-neo-gate.d.ts +0 -8
  7. package/dist/cli/grok-neo-gate.d.ts.map +1 -1
  8. package/dist/cli/grok-neo-gate.js +4 -2
  9. package/dist/cli/grok-neo-gate.js.map +1 -1
  10. package/dist/cli-main.d.ts +1 -1
  11. package/dist/cli-main.d.ts.map +1 -1
  12. package/dist/cli-main.js +4 -0
  13. package/dist/cli-main.js.map +1 -1
  14. package/dist/cli.d.ts +1 -1
  15. package/dist/cli.d.ts.map +1 -1
  16. package/dist/cli.js +3 -2
  17. package/dist/cli.js.map +1 -1
  18. package/dist/config.d.ts +27 -1
  19. package/dist/config.d.ts.map +1 -1
  20. package/dist/config.js +41 -9
  21. package/dist/config.js.map +1 -1
  22. package/dist/core/agent-session.d.ts +8 -2
  23. package/dist/core/agent-session.d.ts.map +1 -1
  24. package/dist/core/agent-session.js +65 -8
  25. package/dist/core/agent-session.js.map +1 -1
  26. package/dist/core/brand.d.ts +79 -0
  27. package/dist/core/brand.d.ts.map +1 -0
  28. package/dist/core/brand.js +141 -0
  29. package/dist/core/brand.js.map +1 -0
  30. package/dist/core/dynamic-prompt/identity.d.ts.map +1 -1
  31. package/dist/core/dynamic-prompt/identity.js +2 -1
  32. package/dist/core/dynamic-prompt/identity.js.map +1 -1
  33. package/dist/core/experimental.d.ts.map +1 -1
  34. package/dist/core/experimental.js +2 -1
  35. package/dist/core/experimental.js.map +1 -1
  36. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +2 -0
  37. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -0
  38. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +24 -0
  39. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -0
  40. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts +4 -0
  41. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +1 -1
  42. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js +5 -2
  43. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -1
  44. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts +6 -1
  45. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
  46. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +16 -0
  47. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
  48. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.d.ts.map +1 -1
  49. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js +10 -1
  50. package/dist/core/extensions/builtin/claude-sdk-oauth/session-commit-boundary.js.map +1 -1
  51. package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
  52. package/dist/core/extensions/builtin/compaction/log.js +2 -1
  53. package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
  54. package/dist/core/extensions/builtin/config-reload/generated-shim-filter.d.ts.map +1 -1
  55. package/dist/core/extensions/builtin/config-reload/generated-shim-filter.js +4 -4
  56. package/dist/core/extensions/builtin/config-reload/generated-shim-filter.js.map +1 -1
  57. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/goal/index.js +5 -0
  59. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  60. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +2 -2
  61. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  62. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +3 -3
  63. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  64. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/goal/monitor-continuation.js +6 -0
  66. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  67. package/dist/core/extensions/builtin/goal/store.d.ts +3 -2
  68. package/dist/core/extensions/builtin/goal/store.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/goal/store.js +128 -101
  70. package/dist/core/extensions/builtin/goal/store.js.map +1 -1
  71. package/dist/core/extensions/builtin/goal/transitions.js +2 -1
  72. package/dist/core/extensions/builtin/goal/transitions.js.map +1 -1
  73. package/dist/core/extensions/builtin/help/index.d.ts.map +1 -1
  74. package/dist/core/extensions/builtin/help/index.js +3 -2
  75. package/dist/core/extensions/builtin/help/index.js.map +1 -1
  76. package/dist/core/extensions/builtin/imagegen/auth.d.ts +45 -0
  77. package/dist/core/extensions/builtin/imagegen/auth.d.ts.map +1 -0
  78. package/dist/core/extensions/builtin/imagegen/auth.js +137 -0
  79. package/dist/core/extensions/builtin/imagegen/auth.js.map +1 -0
  80. package/dist/core/extensions/builtin/imagegen/index.d.ts +5 -0
  81. package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -0
  82. package/dist/core/extensions/builtin/imagegen/index.js +46 -0
  83. package/dist/core/extensions/builtin/imagegen/index.js.map +1 -0
  84. package/dist/core/extensions/builtin/imagegen/paths.d.ts +26 -0
  85. package/dist/core/extensions/builtin/imagegen/paths.d.ts.map +1 -0
  86. package/dist/core/extensions/builtin/imagegen/paths.js +52 -0
  87. package/dist/core/extensions/builtin/imagegen/paths.js.map +1 -0
  88. package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +67 -0
  89. package/dist/core/extensions/builtin/imagegen/state.d.ts +26 -0
  90. package/dist/core/extensions/builtin/imagegen/state.d.ts.map +1 -0
  91. package/dist/core/extensions/builtin/imagegen/state.js +35 -0
  92. package/dist/core/extensions/builtin/imagegen/state.js.map +1 -0
  93. package/dist/core/extensions/builtin/imagegen/tool.d.ts +31 -0
  94. package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -0
  95. package/dist/core/extensions/builtin/imagegen/tool.js +174 -0
  96. package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -0
  97. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  98. package/dist/core/extensions/builtin/index.js +9 -1
  99. package/dist/core/extensions/builtin/index.js.map +1 -1
  100. package/dist/core/extensions/builtin/mcp/control-inventory.d.ts +14 -0
  101. package/dist/core/extensions/builtin/mcp/control-inventory.d.ts.map +1 -0
  102. package/dist/core/extensions/builtin/mcp/control-inventory.js +22 -0
  103. package/dist/core/extensions/builtin/mcp/control-inventory.js.map +1 -0
  104. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts +2 -44
  105. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts.map +1 -1
  106. package/dist/core/extensions/builtin/mcp/expose/native-search.js +3 -97
  107. package/dist/core/extensions/builtin/mcp/expose/native-search.js.map +1 -1
  108. package/dist/core/extensions/builtin/mcp/expose/proxy.d.ts.map +1 -1
  109. package/dist/core/extensions/builtin/mcp/expose/proxy.js +15 -4
  110. package/dist/core/extensions/builtin/mcp/expose/proxy.js.map +1 -1
  111. package/dist/core/extensions/builtin/mcp/expose/session.d.ts +2 -1
  112. package/dist/core/extensions/builtin/mcp/expose/session.d.ts.map +1 -1
  113. package/dist/core/extensions/builtin/mcp/expose/session.js +2 -2
  114. package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
  115. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts +13 -11
  116. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts.map +1 -1
  117. package/dist/core/extensions/builtin/mcp/expose/tier-b.js +58 -59
  118. package/dist/core/extensions/builtin/mcp/expose/tier-b.js.map +1 -1
  119. package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
  120. package/dist/core/extensions/builtin/mcp/index.js +28 -36
  121. package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
  122. package/dist/core/extensions/builtin/mcp/service-register.d.ts +2 -1
  123. package/dist/core/extensions/builtin/mcp/service-register.d.ts.map +1 -1
  124. package/dist/core/extensions/builtin/mcp/service-register.js +2 -2
  125. package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
  126. package/dist/core/extensions/builtin/mcp/service-types.d.ts +4 -0
  127. package/dist/core/extensions/builtin/mcp/service-types.d.ts.map +1 -1
  128. package/dist/core/extensions/builtin/mcp/service-types.js.map +1 -1
  129. package/dist/core/extensions/builtin/mcp/service.d.ts +6 -11
  130. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  131. package/dist/core/extensions/builtin/mcp/service.js +79 -41
  132. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  133. package/dist/core/extensions/builtin/mcp/wrap.d.ts +2 -0
  134. package/dist/core/extensions/builtin/mcp/wrap.d.ts.map +1 -1
  135. package/dist/core/extensions/builtin/mcp/wrap.js +3 -0
  136. package/dist/core/extensions/builtin/mcp/wrap.js.map +1 -1
  137. package/dist/core/extensions/builtin/openai-image-gen/externalize.d.ts +27 -0
  138. package/dist/core/extensions/builtin/openai-image-gen/externalize.d.ts.map +1 -0
  139. package/dist/core/extensions/builtin/openai-image-gen/externalize.js +133 -0
  140. package/dist/core/extensions/builtin/openai-image-gen/externalize.js.map +1 -0
  141. package/dist/core/extensions/builtin/openai-image-gen/gate.d.ts +21 -0
  142. package/dist/core/extensions/builtin/openai-image-gen/gate.d.ts.map +1 -0
  143. package/dist/core/extensions/builtin/openai-image-gen/gate.js +63 -0
  144. package/dist/core/extensions/builtin/openai-image-gen/gate.js.map +1 -0
  145. package/dist/core/extensions/builtin/openai-image-gen/index.d.ts +14 -0
  146. package/dist/core/extensions/builtin/openai-image-gen/index.d.ts.map +1 -0
  147. package/dist/core/extensions/builtin/openai-image-gen/index.js +77 -0
  148. package/dist/core/extensions/builtin/openai-image-gen/index.js.map +1 -0
  149. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts +15 -0
  150. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts.map +1 -0
  151. package/dist/core/extensions/builtin/openai-image-gen/inject.js +42 -0
  152. package/dist/core/extensions/builtin/openai-image-gen/inject.js.map +1 -0
  153. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.d.ts.map +1 -1
  154. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +2 -1
  155. package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
  156. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.d.ts.map +1 -1
  157. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js +2 -1
  158. package/dist/core/extensions/builtin/prompt-preset/claude-opus-5.js.map +1 -1
  159. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.d.ts.map +1 -1
  160. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +2 -1
  161. package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
  162. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  163. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +2 -1
  164. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  165. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.d.ts.map +1 -1
  166. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js +6 -5
  167. package/dist/core/extensions/builtin/prompt-preset/grok-4.5.js.map +1 -1
  168. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -1
  169. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +2 -1
  170. package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -1
  171. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  172. package/dist/core/extensions/builtin/terminal/monitor-notify.js +8 -1
  173. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  174. package/dist/core/extensions/builtin/terminal/notify.d.ts +3 -1
  175. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  176. package/dist/core/extensions/builtin/terminal/notify.js +4 -1
  177. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  178. package/dist/core/extensions/builtin/tool-search/engine/bm25.d.ts +22 -0
  179. package/dist/core/extensions/builtin/tool-search/engine/bm25.d.ts.map +1 -0
  180. package/dist/core/extensions/builtin/{mcp/expose → tool-search/engine}/bm25.js +16 -31
  181. package/dist/core/extensions/builtin/tool-search/engine/bm25.js.map +1 -0
  182. package/dist/core/extensions/builtin/tool-search/engine/document.d.ts +14 -0
  183. package/dist/core/extensions/builtin/tool-search/engine/document.d.ts.map +1 -0
  184. package/dist/core/extensions/builtin/tool-search/engine/document.js +2 -0
  185. package/dist/core/extensions/builtin/tool-search/engine/document.js.map +1 -0
  186. package/dist/core/extensions/builtin/tool-search/engine/marker.d.ts +55 -0
  187. package/dist/core/extensions/builtin/tool-search/engine/marker.d.ts.map +1 -0
  188. package/dist/core/extensions/builtin/tool-search/engine/marker.js +189 -0
  189. package/dist/core/extensions/builtin/tool-search/engine/marker.js.map +1 -0
  190. package/dist/core/extensions/builtin/tool-search/index.d.ts +7 -0
  191. package/dist/core/extensions/builtin/tool-search/index.d.ts.map +1 -0
  192. package/dist/core/extensions/builtin/tool-search/index.js +71 -0
  193. package/dist/core/extensions/builtin/tool-search/index.js.map +1 -0
  194. package/dist/core/extensions/builtin/tool-search/native-search.d.ts +52 -0
  195. package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -0
  196. package/dist/core/extensions/builtin/tool-search/native-search.js +116 -0
  197. package/dist/core/extensions/builtin/tool-search/native-search.js.map +1 -0
  198. package/dist/core/extensions/builtin/tool-search/service.d.ts +38 -0
  199. package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -0
  200. package/dist/core/extensions/builtin/tool-search/service.js +200 -0
  201. package/dist/core/extensions/builtin/tool-search/service.js.map +1 -0
  202. package/dist/core/extensions/builtin/tool-search/tool.d.ts +21 -0
  203. package/dist/core/extensions/builtin/tool-search/tool.d.ts.map +1 -0
  204. package/dist/core/extensions/builtin/tool-search/tool.js +95 -0
  205. package/dist/core/extensions/builtin/tool-search/tool.js.map +1 -0
  206. package/dist/core/extensions/loader.d.ts.map +1 -1
  207. package/dist/core/extensions/loader.js +3 -0
  208. package/dist/core/extensions/loader.js.map +1 -1
  209. package/dist/core/extensions/types.d.ts +44 -4
  210. package/dist/core/extensions/types.d.ts.map +1 -1
  211. package/dist/core/extensions/types.js +11 -0
  212. package/dist/core/extensions/types.js.map +1 -1
  213. package/dist/core/footer-data-provider.d.ts +1 -4
  214. package/dist/core/footer-data-provider.d.ts.map +1 -1
  215. package/dist/core/footer-data-provider.js +0 -7
  216. package/dist/core/footer-data-provider.js.map +1 -1
  217. package/dist/core/generated-shim-banner.d.ts +15 -0
  218. package/dist/core/generated-shim-banner.d.ts.map +1 -0
  219. package/dist/core/generated-shim-banner.js +26 -0
  220. package/dist/core/generated-shim-banner.js.map +1 -0
  221. package/dist/core/model-runtime.d.ts.map +1 -1
  222. package/dist/core/model-runtime.js +7 -3
  223. package/dist/core/model-runtime.js.map +1 -1
  224. package/dist/core/package-manager.d.ts.map +1 -1
  225. package/dist/core/package-manager.js +2 -1
  226. package/dist/core/package-manager.js.map +1 -1
  227. package/dist/core/provider-composer.d.ts +10 -1
  228. package/dist/core/provider-composer.d.ts.map +1 -1
  229. package/dist/core/provider-composer.js +9 -0
  230. package/dist/core/provider-composer.js.map +1 -1
  231. package/dist/core/resource-loader.d.ts.map +1 -1
  232. package/dist/core/resource-loader.js +3 -5
  233. package/dist/core/resource-loader.js.map +1 -1
  234. package/dist/core/session-log.d.ts.map +1 -1
  235. package/dist/core/session-log.js +4 -2
  236. package/dist/core/session-log.js.map +1 -1
  237. package/dist/core/settings-manager.d.ts.map +1 -1
  238. package/dist/core/settings-manager.js +3 -2
  239. package/dist/core/settings-manager.js.map +1 -1
  240. package/dist/core/telemetry.d.ts.map +1 -1
  241. package/dist/core/telemetry.js +2 -1
  242. package/dist/core/telemetry.js.map +1 -1
  243. package/dist/core/timings.d.ts +0 -4
  244. package/dist/core/timings.d.ts.map +1 -1
  245. package/dist/core/timings.js +2 -1
  246. package/dist/core/timings.js.map +1 -1
  247. package/dist/inspector-policy.d.ts.map +1 -1
  248. package/dist/inspector-policy.js +2 -1
  249. package/dist/inspector-policy.js.map +1 -1
  250. package/dist/main.d.ts.map +1 -1
  251. package/dist/main.js +5 -4
  252. package/dist/main.js.map +1 -1
  253. package/dist/migrations.d.ts.map +1 -1
  254. package/dist/migrations.js +4 -0
  255. package/dist/migrations.js.map +1 -1
  256. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  257. package/dist/modes/interactive/components/footer.js +1 -8
  258. package/dist/modes/interactive/components/footer.js.map +1 -1
  259. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  260. package/dist/modes/interactive/interactive-mode.js +6 -7
  261. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  262. package/dist/modes/interactive/tips/catalog/cli-tips.d.ts.map +1 -1
  263. package/dist/modes/interactive/tips/catalog/cli-tips.js +2 -1
  264. package/dist/modes/interactive/tips/catalog/cli-tips.js.map +1 -1
  265. package/dist/modes/interactive/tips/catalog/ethos-tips.d.ts.map +1 -1
  266. package/dist/modes/interactive/tips/catalog/ethos-tips.js +4 -3
  267. package/dist/modes/interactive/tips/catalog/ethos-tips.js.map +1 -1
  268. package/dist/modes/interactive/tips/catalog/model-tips.d.ts.map +1 -1
  269. package/dist/modes/interactive/tips/catalog/model-tips.js +2 -1
  270. package/dist/modes/interactive/tips/catalog/model-tips.js.map +1 -1
  271. package/dist/modes/interactive/tips/catalog/session-tips.d.ts.map +1 -1
  272. package/dist/modes/interactive/tips/catalog/session-tips.js +2 -1
  273. package/dist/modes/interactive/tips/catalog/session-tips.js.map +1 -1
  274. package/dist/modes/interactive/tips/catalog/settings-tips.d.ts.map +1 -1
  275. package/dist/modes/interactive/tips/catalog/settings-tips.js +3 -2
  276. package/dist/modes/interactive/tips/catalog/settings-tips.js.map +1 -1
  277. package/dist/modes/interactive/tips/catalog/workspace-tips.d.ts.map +1 -1
  278. package/dist/modes/interactive/tips/catalog/workspace-tips.js +4 -3
  279. package/dist/modes/interactive/tips/catalog/workspace-tips.js.map +1 -1
  280. package/dist/modes/provider-native-rendering.d.ts.map +1 -1
  281. package/dist/modes/provider-native-rendering.js +33 -0
  282. package/dist/modes/provider-native-rendering.js.map +1 -1
  283. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  284. package/dist/modes/rpc/connection-handler.js +130 -4
  285. package/dist/modes/rpc/connection-handler.js.map +1 -1
  286. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  287. package/dist/modes/rpc/rpc-mode.js +2 -1
  288. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  289. package/dist/modes/rpc/rpc-types.d.ts +31 -0
  290. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  291. package/dist/modes/rpc/rpc-types.js.map +1 -1
  292. package/dist/nearest-parent-config.d.ts +6 -1
  293. package/dist/nearest-parent-config.d.ts.map +1 -1
  294. package/dist/nearest-parent-config.js +18 -2
  295. package/dist/nearest-parent-config.js.map +1 -1
  296. package/dist/package-manager-cli.d.ts.map +1 -1
  297. package/dist/package-manager-cli.js +13 -1
  298. package/dist/package-manager-cli.js.map +1 -1
  299. package/dist/rpc-entry.js +2 -0
  300. package/dist/rpc-entry.js.map +1 -1
  301. package/dist/self-update-bootstrap.d.ts.map +1 -1
  302. package/dist/self-update-bootstrap.js +6 -0
  303. package/dist/self-update-bootstrap.js.map +1 -1
  304. package/dist/senpi +3 -2
  305. package/dist/utils/pi-user-agent.d.ts +1 -1
  306. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  307. package/dist/utils/pi-user-agent.js +4 -3
  308. package/dist/utils/pi-user-agent.js.map +1 -1
  309. package/dist/utils/tools-manager.d.ts.map +1 -1
  310. package/dist/utils/tools-manager.js +2 -1
  311. package/dist/utils/tools-manager.js.map +1 -1
  312. package/dist/utils/version-check.d.ts +3 -0
  313. package/dist/utils/version-check.d.ts.map +1 -1
  314. package/dist/utils/version-check.js +37 -6
  315. package/dist/utils/version-check.js.map +1 -1
  316. package/dist/valid-cwd.d.ts +2 -0
  317. package/dist/valid-cwd.d.ts.map +1 -0
  318. package/dist/valid-cwd.js +14 -0
  319. package/dist/valid-cwd.js.map +1 -0
  320. package/docs/environment-variables.md +7 -0
  321. package/docs/extensions.md +50 -13
  322. package/docs/mcp.md +2 -0
  323. package/docs/rpc.md +54 -0
  324. package/docs/skills.md +8 -0
  325. package/examples/extensions/searchable-tools.ts +49 -0
  326. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +36 -0
  327. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  328. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  329. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +5 -1
  330. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  331. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +4 -1
  332. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  333. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -0
  334. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  335. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +9 -0
  336. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  337. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  338. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  339. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  340. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +4 -2
  341. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  342. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  343. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +7 -3
  344. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  345. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +8 -0
  346. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -0
  347. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +222 -0
  348. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -0
  349. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.d.ts +3 -0
  350. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.d.ts.map +1 -0
  351. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.js +10 -0
  352. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.js.map +1 -0
  353. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  354. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +113 -4
  355. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  356. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  357. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -0
  358. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  359. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts +5 -0
  360. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  361. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +2 -1
  362. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  363. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.d.ts.map +1 -1
  364. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js +2 -1
  365. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/openai-codex.js.map +1 -1
  366. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +10 -0
  367. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  368. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  369. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +32 -0
  370. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  371. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +32 -0
  372. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  373. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  374. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  375. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  376. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  377. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  378. package/node_modules/@earendil-works/pi-ai/dist/models.js +36 -13
  379. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  380. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.d.ts +2 -0
  381. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.d.ts.map +1 -1
  382. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.js.map +1 -1
  383. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  384. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -1
  385. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  386. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  387. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  388. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  389. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  390. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  391. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  392. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  393. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts +1 -0
  394. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts.map +1 -1
  395. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js +18 -0
  396. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -1
  397. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.d.ts +3 -0
  398. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.d.ts.map +1 -0
  399. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.js +16 -0
  400. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.js.map +1 -0
  401. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +1 -1
  402. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  403. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  404. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  405. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +7 -0
  406. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  407. package/node_modules/@earendil-works/pi-ai/dist/wire-identity.d.ts +14 -0
  408. package/node_modules/@earendil-works/pi-ai/dist/wire-identity.d.ts.map +1 -0
  409. package/node_modules/@earendil-works/pi-ai/dist/wire-identity.js +24 -0
  410. package/node_modules/@earendil-works/pi-ai/dist/wire-identity.js.map +1 -0
  411. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  412. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.d.ts.map +1 -1
  413. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js +11 -3
  414. package/node_modules/@earendil-works/pi-pty/dist/pipe-fallback.js.map +1 -1
  415. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  416. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  417. package/package.json +8 -8
  418. package/dist/core/extensions/builtin/mcp/expose/bm25.d.ts +0 -30
  419. package/dist/core/extensions/builtin/mcp/expose/bm25.d.ts.map +0 -1
  420. package/dist/core/extensions/builtin/mcp/expose/bm25.js.map +0 -1
  421. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.d.ts +0 -15
  422. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.d.ts.map +0 -1
  423. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.js +0 -33
  424. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.js.map +0 -1
  425. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts +0 -43
  426. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts.map +0 -1
  427. package/dist/core/extensions/builtin/mcp/expose/tool-search.js +0 -125
  428. package/dist/core/extensions/builtin/mcp/expose/tool-search.js.map +0 -1
  429. package/dist/core/omo-native-detect.d.ts +0 -3
  430. package/dist/core/omo-native-detect.d.ts.map +0 -1
  431. package/dist/core/omo-native-detect.js +0 -64
  432. package/dist/core/omo-native-detect.js.map +0 -1
  433. package/dist/core/omo-native-detect.test.d.ts +0 -2
  434. package/dist/core/omo-native-detect.test.d.ts.map +0 -1
  435. package/dist/core/omo-native-detect.test.js +0 -47
  436. package/dist/core/omo-native-detect.test.js.map +0 -1
  437. package/dist/modes/interactive/components/footer-omo-native-badge.test.d.ts +0 -2
  438. package/dist/modes/interactive/components/footer-omo-native-badge.test.d.ts.map +0 -1
  439. package/dist/modes/interactive/components/footer-omo-native-badge.test.js +0 -52
  440. package/dist/modes/interactive/components/footer-omo-native-badge.test.js.map +0 -1
@@ -1,3 +1,6 @@
1
+ import { type BrandUpdateChannel } from "../core/brand.ts";
2
+ /** Reads the available version out of whichever registry document was fetched. */
3
+ export declare function readAvailableVersion(payload: unknown, channel: BrandUpdateChannel | undefined): string | undefined;
1
4
  export interface LatestPiRelease {
2
5
  version: string;
3
6
  packageName?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAUD,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoBpG;AAED,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAM/F;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED,wBAAsB,kBAAkB,CACvC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAoBtC;AAED,wBAAsB,kBAAkB,CACvC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE7B;AAED,wBAAsB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAYvG"}
1
+ {"version":3,"file":"version-check.d.ts","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAA0B,MAAM,kBAAkB,CAAC;AAanF,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKlH;AAMD,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAUD,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAoBpG;AAED,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAM/F;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ9D;AAED,wBAAsB,kBAAkB,CACvC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA+BtC;AAED,wBAAsB,kBAAkB,CACvC,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE7B;AAED,wBAAsB,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAYvG"}
@@ -1,7 +1,23 @@
1
1
  import { compare, valid } from "semver";
2
2
  import { PACKAGE_NAME } from "../config.js";
3
+ import { brandProfile, envValue } from "../core/brand.js";
3
4
  import { getPiUserAgent } from "./pi-user-agent.js";
4
- const LATEST_VERSION_URL = `https://registry.npmjs.org/${encodeURIComponent(PACKAGE_NAME)}/latest`;
5
+ const REGISTRY_BASE_URL = "https://registry.npmjs.org";
6
+ const LATEST_VERSION_URL = `${REGISTRY_BASE_URL}/${encodeURIComponent(PACKAGE_NAME)}/latest`;
7
+ /** Registry endpoint answering "what version does this product publish right now?". */
8
+ function latestVersionUrl(channel) {
9
+ return channel
10
+ ? `${REGISTRY_BASE_URL}/-/package/${encodeURIComponent(channel.packageName)}/dist-tags`
11
+ : LATEST_VERSION_URL;
12
+ }
13
+ /** Reads the available version out of whichever registry document was fetched. */
14
+ export function readAvailableVersion(payload, channel) {
15
+ if (typeof payload !== "object" || payload === null)
16
+ return undefined;
17
+ const source = payload;
18
+ const raw = channel ? source[channel.distTag] : source.version;
19
+ return typeof raw === "string" && raw.trim() ? raw.trim() : undefined;
20
+ }
5
21
  const DEFAULT_VERSION_CHECK_TIMEOUT_MS = 10000;
6
22
  const RELEASE_CHANGELOG_BASE_URL = "https://github.com/code-yeongyu/senpi/blob";
7
23
  const RELEASE_CHANGELOG_PATH = "packages/coding-agent/CHANGELOG.md";
@@ -42,13 +58,24 @@ export function isNewerPackageVersion(candidateVersion, currentVersion) {
42
58
  }
43
59
  export function getReleaseChangelogUrl(version) {
44
60
  const trimmedVersion = version.trim();
61
+ const channel = brandProfile()?.update;
62
+ if (channel?.changelogUrl) {
63
+ return channel.changelogUrl.replace("{version}", trimmedVersion);
64
+ }
45
65
  const tag = trimmedVersion.startsWith("v") ? trimmedVersion : `v${trimmedVersion}`;
46
66
  return `${RELEASE_CHANGELOG_BASE_URL}/${tag}/${RELEASE_CHANGELOG_PATH}`;
47
67
  }
48
68
  export async function getLatestPiRelease(currentVersion, options = {}) {
49
- if (process.env.PI_OFFLINE)
69
+ if (envValue("OFFLINE"))
50
70
  return undefined;
51
- const response = await fetch(LATEST_VERSION_URL, {
71
+ const brand = brandProfile();
72
+ const channel = brand?.update;
73
+ if (brand && !channel) {
74
+ // The engine's own releases are not installable from inside a branded distribution, so
75
+ // advertising them would send the user after an update they cannot apply.
76
+ return undefined;
77
+ }
78
+ const response = await fetch(latestVersionUrl(channel), {
52
79
  headers: {
53
80
  "User-Agent": getPiUserAgent(currentVersion),
54
81
  accept: "application/json",
@@ -58,18 +85,22 @@ export async function getLatestPiRelease(currentVersion, options = {}) {
58
85
  if (!response.ok)
59
86
  return undefined;
60
87
  const data = (await response.json());
61
- if (typeof data.version !== "string" || !data.version.trim()) {
88
+ const availableVersion = readAvailableVersion(data, channel);
89
+ if (!availableVersion) {
62
90
  return undefined;
63
91
  }
92
+ if (channel) {
93
+ return { version: availableVersion, packageName: channel.packageName };
94
+ }
64
95
  const packageName = typeof data.packageName === "string" && data.packageName.trim() ? data.packageName.trim() : undefined;
65
96
  const note = typeof data.note === "string" && data.note.trim() ? data.note.trim() : undefined;
66
- return { version: data.version.trim(), packageName, note };
97
+ return { version: availableVersion, packageName, note };
67
98
  }
68
99
  export async function getLatestPiVersion(currentVersion, options = {}) {
69
100
  return (await getLatestPiRelease(currentVersion, options))?.version;
70
101
  }
71
102
  export async function checkForNewPiVersion(currentVersion) {
72
- if (process.env.PI_SKIP_VERSION_CHECK)
103
+ if (envValue("SKIP_VERSION_CHECK"))
73
104
  return undefined;
74
105
  try {
75
106
  const latestRelease = await getLatestPiRelease(currentVersion);
@@ -1 +1 @@
1
- {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"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","sourcesContent":["import { compare, valid } from \"semver\";\nimport { PACKAGE_NAME } from \"../config.ts\";\nimport { getPiUserAgent } from \"./pi-user-agent.ts\";\n\nconst LATEST_VERSION_URL = `https://registry.npmjs.org/${encodeURIComponent(PACKAGE_NAME)}/latest`;\nconst DEFAULT_VERSION_CHECK_TIMEOUT_MS = 10000;\nconst RELEASE_CHANGELOG_BASE_URL = \"https://github.com/code-yeongyu/senpi/blob\";\nconst RELEASE_CHANGELOG_PATH = \"packages/coding-agent/CHANGELOG.md\";\nconst SENPI_CALVER_PATTERN = /^(\\d{4})\\.(\\d{1,2})\\.(\\d{1,2})(?:-([2-9]\\d*))?$/;\n\nexport interface LatestPiRelease {\n\tversion: string;\n\tpackageName?: string;\n\tnote?: string;\n}\n\nfunction parseSenpiCalVer(version: string): readonly [number, number, number, number] | undefined {\n\tconst match = SENPI_CALVER_PATTERN.exec(version);\n\tif (!match) {\n\t\treturn undefined;\n\t}\n\treturn [Number(match[1]), Number(match[2]), Number(match[3]), Number(match[4] ?? 1)];\n}\n\nexport function comparePackageVersions(leftVersion: string, rightVersion: string): number | undefined {\n\tconst leftTrimmed = leftVersion.trim();\n\tconst rightTrimmed = rightVersion.trim();\n\tconst leftCalVer = parseSenpiCalVer(leftTrimmed);\n\tconst rightCalVer = parseSenpiCalVer(rightTrimmed);\n\tif (leftCalVer && rightCalVer) {\n\t\tfor (let index = 0; index < leftCalVer.length; index++) {\n\t\t\tif (leftCalVer[index] !== rightCalVer[index]) {\n\t\t\t\treturn leftCalVer[index] < rightCalVer[index] ? -1 : 1;\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t}\n\n\tconst left = valid(leftTrimmed);\n\tconst right = valid(rightTrimmed);\n\tif (!left || !right) {\n\t\treturn undefined;\n\t}\n\treturn compare(left, right);\n}\n\nexport function isNewerPackageVersion(candidateVersion: string, currentVersion: string): boolean {\n\tconst comparison = comparePackageVersions(candidateVersion, currentVersion);\n\tif (comparison !== undefined) {\n\t\treturn comparison > 0;\n\t}\n\treturn candidateVersion.trim() !== currentVersion.trim();\n}\n\nexport function getReleaseChangelogUrl(version: string): string {\n\tconst trimmedVersion = version.trim();\n\tconst tag = trimmedVersion.startsWith(\"v\") ? trimmedVersion : `v${trimmedVersion}`;\n\treturn `${RELEASE_CHANGELOG_BASE_URL}/${tag}/${RELEASE_CHANGELOG_PATH}`;\n}\n\nexport async function getLatestPiRelease(\n\tcurrentVersion: string,\n\toptions: { timeoutMs?: number } = {},\n): Promise<LatestPiRelease | undefined> {\n\tif (process.env.PI_OFFLINE) return undefined;\n\n\tconst response = await fetch(LATEST_VERSION_URL, {\n\t\theaders: {\n\t\t\t\"User-Agent\": getPiUserAgent(currentVersion),\n\t\t\taccept: \"application/json\",\n\t\t},\n\t\tsignal: AbortSignal.timeout(options.timeoutMs ?? DEFAULT_VERSION_CHECK_TIMEOUT_MS),\n\t});\n\tif (!response.ok) return undefined;\n\n\tconst data = (await response.json()) as { packageName?: unknown; version?: unknown; note?: unknown };\n\tif (typeof data.version !== \"string\" || !data.version.trim()) {\n\t\treturn undefined;\n\t}\n\tconst packageName =\n\t\ttypeof data.packageName === \"string\" && data.packageName.trim() ? data.packageName.trim() : undefined;\n\tconst note = typeof data.note === \"string\" && data.note.trim() ? data.note.trim() : undefined;\n\treturn { version: data.version.trim(), packageName, note };\n}\n\nexport async function getLatestPiVersion(\n\tcurrentVersion: string,\n\toptions: { timeoutMs?: number } = {},\n): Promise<string | undefined> {\n\treturn (await getLatestPiRelease(currentVersion, options))?.version;\n}\n\nexport async function checkForNewPiVersion(currentVersion: string): Promise<LatestPiRelease | undefined> {\n\tif (process.env.PI_SKIP_VERSION_CHECK) return undefined;\n\n\ttry {\n\t\tconst latestRelease = await getLatestPiRelease(currentVersion);\n\t\tif (latestRelease && isNewerPackageVersion(latestRelease.version, currentVersion)) {\n\t\t\treturn latestRelease;\n\t\t}\n\t\treturn undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"version-check.js","sourceRoot":"","sources":["../../src/utils/version-check.ts"],"names":[],"mappings":"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","sourcesContent":["import { compare, valid } from \"semver\";\nimport { PACKAGE_NAME } from \"../config.ts\";\nimport { type BrandUpdateChannel, brandProfile, envValue } from \"../core/brand.ts\";\nimport { getPiUserAgent } from \"./pi-user-agent.ts\";\n\nconst REGISTRY_BASE_URL = \"https://registry.npmjs.org\";\nconst LATEST_VERSION_URL = `${REGISTRY_BASE_URL}/${encodeURIComponent(PACKAGE_NAME)}/latest`;\n\n/** Registry endpoint answering \"what version does this product publish right now?\". */\nfunction latestVersionUrl(channel: BrandUpdateChannel | undefined): string {\n\treturn channel\n\t\t? `${REGISTRY_BASE_URL}/-/package/${encodeURIComponent(channel.packageName)}/dist-tags`\n\t\t: LATEST_VERSION_URL;\n}\n\n/** Reads the available version out of whichever registry document was fetched. */\nexport function readAvailableVersion(payload: unknown, channel: BrandUpdateChannel | undefined): string | undefined {\n\tif (typeof payload !== \"object\" || payload === null) return undefined;\n\tconst source = payload as Record<string, unknown>;\n\tconst raw = channel ? source[channel.distTag] : source.version;\n\treturn typeof raw === \"string\" && raw.trim() ? raw.trim() : undefined;\n}\nconst DEFAULT_VERSION_CHECK_TIMEOUT_MS = 10000;\nconst RELEASE_CHANGELOG_BASE_URL = \"https://github.com/code-yeongyu/senpi/blob\";\nconst RELEASE_CHANGELOG_PATH = \"packages/coding-agent/CHANGELOG.md\";\nconst SENPI_CALVER_PATTERN = /^(\\d{4})\\.(\\d{1,2})\\.(\\d{1,2})(?:-([2-9]\\d*))?$/;\n\nexport interface LatestPiRelease {\n\tversion: string;\n\tpackageName?: string;\n\tnote?: string;\n}\n\nfunction parseSenpiCalVer(version: string): readonly [number, number, number, number] | undefined {\n\tconst match = SENPI_CALVER_PATTERN.exec(version);\n\tif (!match) {\n\t\treturn undefined;\n\t}\n\treturn [Number(match[1]), Number(match[2]), Number(match[3]), Number(match[4] ?? 1)];\n}\n\nexport function comparePackageVersions(leftVersion: string, rightVersion: string): number | undefined {\n\tconst leftTrimmed = leftVersion.trim();\n\tconst rightTrimmed = rightVersion.trim();\n\tconst leftCalVer = parseSenpiCalVer(leftTrimmed);\n\tconst rightCalVer = parseSenpiCalVer(rightTrimmed);\n\tif (leftCalVer && rightCalVer) {\n\t\tfor (let index = 0; index < leftCalVer.length; index++) {\n\t\t\tif (leftCalVer[index] !== rightCalVer[index]) {\n\t\t\t\treturn leftCalVer[index] < rightCalVer[index] ? -1 : 1;\n\t\t\t}\n\t\t}\n\t\treturn 0;\n\t}\n\n\tconst left = valid(leftTrimmed);\n\tconst right = valid(rightTrimmed);\n\tif (!left || !right) {\n\t\treturn undefined;\n\t}\n\treturn compare(left, right);\n}\n\nexport function isNewerPackageVersion(candidateVersion: string, currentVersion: string): boolean {\n\tconst comparison = comparePackageVersions(candidateVersion, currentVersion);\n\tif (comparison !== undefined) {\n\t\treturn comparison > 0;\n\t}\n\treturn candidateVersion.trim() !== currentVersion.trim();\n}\n\nexport function getReleaseChangelogUrl(version: string): string {\n\tconst trimmedVersion = version.trim();\n\tconst channel = brandProfile()?.update;\n\tif (channel?.changelogUrl) {\n\t\treturn channel.changelogUrl.replace(\"{version}\", trimmedVersion);\n\t}\n\tconst tag = trimmedVersion.startsWith(\"v\") ? trimmedVersion : `v${trimmedVersion}`;\n\treturn `${RELEASE_CHANGELOG_BASE_URL}/${tag}/${RELEASE_CHANGELOG_PATH}`;\n}\n\nexport async function getLatestPiRelease(\n\tcurrentVersion: string,\n\toptions: { timeoutMs?: number } = {},\n): Promise<LatestPiRelease | undefined> {\n\tif (envValue(\"OFFLINE\")) return undefined;\n\n\tconst brand = brandProfile();\n\tconst channel = brand?.update;\n\tif (brand && !channel) {\n\t\t// The engine's own releases are not installable from inside a branded distribution, so\n\t\t// advertising them would send the user after an update they cannot apply.\n\t\treturn undefined;\n\t}\n\tconst response = await fetch(latestVersionUrl(channel), {\n\t\theaders: {\n\t\t\t\"User-Agent\": getPiUserAgent(currentVersion),\n\t\t\taccept: \"application/json\",\n\t\t},\n\t\tsignal: AbortSignal.timeout(options.timeoutMs ?? DEFAULT_VERSION_CHECK_TIMEOUT_MS),\n\t});\n\tif (!response.ok) return undefined;\n\n\tconst data = (await response.json()) as { packageName?: unknown; version?: unknown; note?: unknown };\n\tconst availableVersion = readAvailableVersion(data, channel);\n\tif (!availableVersion) {\n\t\treturn undefined;\n\t}\n\tif (channel) {\n\t\treturn { version: availableVersion, packageName: channel.packageName };\n\t}\n\tconst packageName =\n\t\ttypeof data.packageName === \"string\" && data.packageName.trim() ? data.packageName.trim() : undefined;\n\tconst note = typeof data.note === \"string\" && data.note.trim() ? data.note.trim() : undefined;\n\treturn { version: availableVersion, packageName, note };\n}\n\nexport async function getLatestPiVersion(\n\tcurrentVersion: string,\n\toptions: { timeoutMs?: number } = {},\n): Promise<string | undefined> {\n\treturn (await getLatestPiRelease(currentVersion, options))?.version;\n}\n\nexport async function checkForNewPiVersion(currentVersion: string): Promise<LatestPiRelease | undefined> {\n\tif (envValue(\"SKIP_VERSION_CHECK\")) return undefined;\n\n\ttry {\n\t\tconst latestRelease = await getLatestPiRelease(currentVersion);\n\t\tif (latestRelease && isNewerPackageVersion(latestRelease.version, currentVersion)) {\n\t\t\treturn latestRelease;\n\t\t}\n\t\treturn undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=valid-cwd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-cwd.d.ts","sourceRoot":"","sources":["../src/valid-cwd.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import { homedir } from "node:os";
2
+ // A shell whose working directory was deleted (a removed worktree or checkout) still starts this
3
+ // process: Node boots with the stale handle and only throws `uv_cwd` when something evaluates
4
+ // process.cwd(). The bundled agent SDK does that during module evaluation, before any user code
5
+ // can recover, so the guard must run before every other import - keep it dependency-free.
6
+ try {
7
+ process.cwd();
8
+ }
9
+ catch {
10
+ const fallback = homedir();
11
+ process.chdir(fallback);
12
+ console.error(`the current working directory no longer exists; continuing from ${fallback}`);
13
+ }
14
+ //# sourceMappingURL=valid-cwd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"valid-cwd.js","sourceRoot":"","sources":["../src/valid-cwd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,iGAAiG;AACjG,8FAA8F;AAC9F,gGAAgG;AAChG,0FAA0F;AAC1F,IAAI,CAAC;IACJ,OAAO,CAAC,GAAG,EAAE,CAAC;AACf,CAAC;AAAC,MAAM,CAAC;IACR,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxB,OAAO,CAAC,KAAK,CAAC,mEAAmE,QAAQ,EAAE,CAAC,CAAC;AAC9F,CAAC","sourcesContent":["import { homedir } from \"node:os\";\n\n// A shell whose working directory was deleted (a removed worktree or checkout) still starts this\n// process: Node boots with the stale handle and only throws `uv_cwd` when something evaluates\n// process.cwd(). The bundled agent SDK does that during module evaluation, before any user code\n// can recover, so the guard must run before every other import - keep it dependency-free.\ntry {\n\tprocess.cwd();\n} catch {\n\tconst fallback = homedir();\n\tprocess.chdir(fallback);\n\tconsole.error(`the current working directory no longer exists; continuing from ${fallback}`);\n}\n"]}
@@ -86,4 +86,11 @@ These variables are read by Pi itself:
86
86
  | `VISUAL`, `EDITOR` | External editor fallback when `externalEditor` is unset |
87
87
  | `HTTP_PROXY`, `HTTPS_PROXY` | Proxy outbound HTTP requests |
88
88
 
89
+ ### Image Generation
90
+
91
+ | Variable | Description |
92
+ |----------|-------------|
93
+ | `PI_OPENAI_IMAGE_GEN` | Enable or disable native `image_generation` server-tool injection on OpenAI Responses models. Accepts `1`/`true`/`yes` (default) or `0`/`false`/`no`. When disabled, the client-side `generate_image` tool is used instead |
94
+ | `PI_IMAGE_GEN_PROVIDER` | Pin a specific configured gateway provider for image generation (for example `quotio-openai`). The provider must have a resolvable API key and base URL in `models.json`. When unset, the credential resolver picks the best available source automatically |
95
+
89
96
  Provider credentials such as `ANTHROPIC_API_KEY`, `OPENAI_API_KEY`, and cloud-provider configuration are listed in [Providers](providers.md#environment-variables-or-auth-file).
@@ -135,6 +135,16 @@ Run `/fallback` without arguments in the TUI for a menu that can:
135
135
 
136
136
  Use quick-set in non-TUI modes; the no-argument menu requires interactive UI. Pass `--no-model-fallback` or set `SENPI_NO_FALLBACK=1` to disable fallback for that process without modifying saved settings.
137
137
 
138
+ ## Built-in Native Capabilities
139
+
140
+ Senpi ships built-in extensions that inject provider-native server tools when the active model supports them. These run as ordinary extensions internally but are always loaded and require no user configuration beyond having valid credentials.
141
+
142
+ **openai-image-gen** injects the OpenAI Responses `image_generation` server tool when the model uses `openai-responses` on `api.openai.com`. It arbitrates against the client-side `generate_image` function tool so exactly one image surface is offered per request. A `message_end` handler decodes completed image results, writes them to `generated-images/`, and replaces the provider-native block with a text path reference before session persistence, so base64 payloads never reach the session file. Set `PI_OPENAI_IMAGE_GEN=false` to force the client tool path. Azure Responses endpoints default to the client tool unless `compat.supportsImageGeneration` opts in.
143
+
144
+ **openai-web-search** injects the OpenAI Responses `web_search_preview` server tool following the same pattern: credential-gated, stripped on unsupported endpoints, arbitrated against its client-side counterpart.
145
+
146
+ Both builtins use `before_provider_request` to mutate the outgoing payload and re-evaluate their gate on every `model_select`, so mid-session model switches flip between native and client tools without a restart.
147
+
138
148
  ## Extension Locations
139
149
 
140
150
  > **Security:** Extensions run with your full system permissions and can execute arbitrary code. Only install from sources you trust.
@@ -2159,6 +2169,11 @@ pi.registerTool({
2159
2169
  name: "my_tool",
2160
2170
  label: "My Tool",
2161
2171
  description: "What this tool does (shown to LLM)",
2172
+ exposure: "search",
2173
+ searchText: "Look up items in the project todo list",
2174
+ searchKeywords: ["todo", "task", "planning"],
2175
+ searchGroup: "my_extension",
2176
+ allowLazyActivation: true,
2162
2177
  promptSnippet: "List or add items in the project todo list",
2163
2178
  promptGuidelines: [
2164
2179
  "Use my_tool for todo planning instead of direct file edits when the user asks for a task list."
@@ -2559,19 +2574,43 @@ If a slot renderer is not defined or throws:
2559
2574
 
2560
2575
  ### Dynamic Tool Loading
2561
2576
 
2562
- Extensions can register many tools while keeping only a small initial set active. A tool can then add more tools with `pi.setActiveTools()` during execution. Pi detects purely additive changes, records the newly available tool names on that tool result, and applies the updated active set before the next model request.
2577
+ Extensions can ship large tool catalogs without bloating the model's context window by opting into declarative search exposure. A tool declared with `exposure: "search"` is indexed in the shared `tool_search` catalog and remains inactive (costing zero prompt tokens) until the model searches for it.
2578
+
2579
+ The declarative API handles the entire lifecycle:
2580
+ 1. Register tools with `exposure: "search"`. The tools stay out of the initial active set.
2581
+ 2. The shared `tool_search` builtin (always active) indexes their `name`, `label`, `description`, `searchText`, and `searchKeywords`.
2582
+ 3. When the model needs a capability, it calls `tool_search`.
2583
+ 4. Pi automatically promotes matching tools to the active set for the next model request.
2584
+ 5. On supported models (Anthropic, OpenAI), this promotion uses native deferred loading protocols to preserve prompt cache stability.
2585
+
2586
+ Tools promoted via search are tied to your extension's identity. If your extension is reloaded, they stay active; if your extension is removed, they are cleaned up.
2563
2587
 
2564
- This works with every model. Models with native deferred-loading support preserve the stable prompt prefix and load the new definitions at the tool-result position. Other models use the fallback described below.
2588
+ #### Declarative Fields
2565
2589
 
2566
- The lifecycle is:
2590
+ Add these fields to `pi.registerTool(...)`:
2567
2591
 
2568
- 1. Register every tool with `pi.registerTool()` so it appears in `pi.getAllTools()`.
2569
- 2. Keep loader tools, such as `search_tools`, active and leave searchable tools inactive.
2570
- 3. During loader execution, call `pi.setActiveTools([...currentTools, ...matchingTools])`. The change must be additive: do not remove currently active tools in the same call.
2571
- 4. Pi records which tools were added on the loader's tool result.
2572
- 5. Before the next model response, Pi exposes the added definitions using native deferred loading when supported, or the normal active tool list otherwise.
2592
+ - **`exposure`**: `"direct" | "search"`. Default is `"direct"` (tool is auto-activated immediately). Use `"search"` for large catalogs.
2593
+ - **`searchText`**: Supplemental text indexed by `tool_search`. Never sent to the model. Useful for domain terms that don't belong in the tool description.
2594
+ - **`searchKeywords`**: Synonyms or domain terms, indexed with the same weight as the tool name. Never sent to the model.
2595
+ - **`searchGroup`**: Organizational filter group. Defaults to your extension's label.
2596
+ - **`allowLazyActivation`**: Default `true`. If `false`, the tool is hidden from `tool_search` completely and cannot be lazily activated during code mode execution. Explicit activation via `pi.setActiveTools()` is still allowed.
2573
2597
 
2574
- You do not need to return provider-specific tool references or mark the loader as a special search tool. The active-tool change is the signal. Names passed to `pi.setActiveTools()` must already be registered; unknown names are ignored.
2598
+ **Important:** You cannot register a tool named `tool_search` yourself; it is a reserved name.
2599
+
2600
+ #### Prompt Cache Warning
2601
+
2602
+ Activating a tool that includes `promptSnippet` or `promptGuidelines` rebuilds the system prompt. Even when the provider supports deferred schemas, changing the system prompt may invalidate the cached prefix. Lazily loaded tools should usually rely on their `description` and omit active-only prompt metadata to get the best cache performance.
2603
+
2604
+ #### Advanced: DIY Dynamic Loading
2605
+
2606
+ For advanced use cases like project-specific routing or custom remote catalogs, extensions can skip `exposure: "search"` and manage the active set imperatively. A tool can add more tools with `pi.setActiveTools()` during execution. Pi detects purely additive changes, records the newly available tool names on that tool result, and applies the updated active set before the next model request.
2607
+
2608
+ The DIY lifecycle is:
2609
+
2610
+ 1. Register every tool with `exposure: "direct"` (or omit it) but explicitly remove them from the active set during `session_start` using `pi.setActiveTools()`.
2611
+ 2. Keep your custom loader tool active.
2612
+ 3. During loader execution, call `pi.setActiveTools([...currentTools, ...matchingTools])`. The change must be additive.
2613
+ 4. Pi exposes the added definitions before the next model response.
2575
2614
 
2576
2615
  #### Models with native deferred loading
2577
2616
 
@@ -2590,11 +2629,9 @@ For all other models and providers, dynamic activation still works: Pi sends the
2590
2629
 
2591
2630
  Pi also uses this safe fallback when the active set is not purely additive, such as replacing one group of tools with another. Tool removals therefore work, but they do not use deferred loading.
2592
2631
 
2593
- For the best cache behavior, keep the loader tool active for the whole session and add tools instead of replacing the active set. Also note that activating a tool with `promptSnippet` or `promptGuidelines` rebuilds the system prompt; that system-prompt change can invalidate the prefix even when the provider supports deferred schemas. Lazily loaded tools should usually rely on their tool `description` and omit active-only prompt metadata.
2594
-
2595
- #### Search tool example
2632
+ #### DIY Custom Search Tool Example
2596
2633
 
2597
- The following extension registers two searchable tools, removes them from the initial active set, and keeps only `search_tools` as their loader. The example uses simple keyword matching, but the search implementation could use BM25, embeddings, a remote catalog, or project-specific routing.
2634
+ The following extension registers two tools, removes them from the initial active set, and keeps only a custom `search_tools` as their loader. The example uses simple keyword matching, but the search implementation could use embeddings or a remote catalog.
2598
2635
 
2599
2636
  ```typescript
2600
2637
  import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
package/docs/mcp.md CHANGED
@@ -147,6 +147,8 @@ local `tool_search` for the session.
147
147
 
148
148
  ## Exposure tiers
149
149
 
150
+ > **Note:** `tool_search` is a shared catalog tool that covers both MCP servers and native extension tools. When filtering searches, the legacy MCP `server` parameter is mapped to the shared `group` parameter.
151
+
150
152
  | Tier | When | Cost profile |
151
153
  |---|---|---|
152
154
  | direct | `exposure:"direct"`, `directTools:true`, or `auto` at/below `searchThreshold` | Every tool schema on every request |
package/docs/rpc.md CHANGED
@@ -889,6 +889,51 @@ Each command has:
889
889
 
890
890
  **Note**: Built-in TUI commands (`/settings`, `/hotkeys`, etc.) are not included. They are handled only in interactive mode and would not execute if sent via `prompt`.
891
891
 
892
+ #### get_loaded_surfaces
893
+
894
+ Get the extensions and MCP servers loaded by the active runtime. Skills remain available through `get_commands`, where each loaded skill is represented by one `source: "skill"` row.
895
+
896
+ ```json
897
+ {"type": "get_loaded_surfaces"}
898
+ ```
899
+
900
+ Response:
901
+
902
+ ```json
903
+ {
904
+ "type": "response",
905
+ "command": "get_loaded_surfaces",
906
+ "success": true,
907
+ "data": {
908
+ "extensions": [
909
+ {
910
+ "name": "my-extension",
911
+ "path": "/home/user/.senpi/agent/extensions/my-extension.ts",
912
+ "sourceInfo": {
913
+ "path": "/home/user/.senpi/agent/extensions/my-extension.ts",
914
+ "source": "auto",
915
+ "scope": "user",
916
+ "origin": "top-level"
917
+ },
918
+ "enabled": true
919
+ }
920
+ ],
921
+ "mcpServers": [
922
+ {
923
+ "name": "filesystem",
924
+ "toolCount": 12,
925
+ "status": "connected",
926
+ "authStatus": "unsupported"
927
+ }
928
+ ]
929
+ }
930
+ }
931
+ ```
932
+
933
+ Extension rows come directly from the session's loaded resource inventory, not from registered slash commands. A commandless extension therefore appears once, and an extension registering several commands is not duplicated. MCP rows come from the live session-owned MCP service and expose its current server state, listed tool count, and non-secret auth status.
934
+
935
+ In multi-session mode this is a session-scoped command and requires the routing `sessionId`.
936
+
892
937
  ## Events
893
938
 
894
939
  Events are streamed to stdout as JSON lines during agent operation. Events do not generally include an `id` field; `bash_execution_update` includes the `id` of its originating `bash` command when one was provided.
@@ -918,6 +963,7 @@ Events are streamed to stdout as JSON lines during agent operation. Events do no
918
963
  | `summarization_retry_attempt_start` | Retried summarization request starts |
919
964
  | `summarization_retry_finished` | Summarization retry loop completes |
920
965
  | `extension_error` | Extension threw an error |
966
+ | `loaded_surfaces_changed` | Loaded skills, extensions, or MCP inventory changed; re-read `get_commands` and `get_loaded_surfaces` |
921
967
 
922
968
  ### agent_start
923
969
 
@@ -1187,6 +1233,14 @@ For branch summaries, `source` is `"branchSummary"` and no `reason` is present.
1187
1233
  }
1188
1234
  ```
1189
1235
 
1236
+ ### loaded_surfaces_changed
1237
+
1238
+ Emitted without a request id when the loaded skill, extension, or MCP inventory changes. The event carries no inventory payload; clients re-read `get_commands` for skills and `get_loaded_surfaces` for extensions/MCP, mirroring the app-server `skills/changed` invalidation model.
1239
+
1240
+ ```json
1241
+ {"type": "loaded_surfaces_changed"}
1242
+ ```
1243
+
1190
1244
  ### extension_error
1191
1245
 
1192
1246
  Emitted when an extension throws an error.
package/docs/skills.md CHANGED
@@ -254,6 +254,14 @@ cd /path/to/brave-search && npm install
254
254
  ```
255
255
  ````
256
256
 
257
+ ## Bundled Skills
258
+
259
+ Senpi contributes built-in skills conditionally based on available credentials and capabilities.
260
+
261
+ **gpt-image-gen** is contributed by the `imagegen` builtin extension when image-generation credentials exist (a stored OpenAI key, `OPENAI_API_KEY`, or a configured OpenAI-compatible gateway). It provides a prompt-crafting guide for `gpt-image-2`, covering detail-maxxing techniques, verbatim quoted render text, revised-prompt feedback loops, and routing guidance for the native server tool vs. the client `generate_image` tool. The skill is absent from `<available_skills>` when no credentials are configured.
262
+
263
+ Skill visibility refreshes at startup and on `/reload`. Mid-session credential changes (login, environment variable updates) take effect on the tool and injector immediately but are reflected in the skill list only after the next reload.
264
+
257
265
  ## Skill Repositories
258
266
 
259
267
  - [Anthropic Skills](https://github.com/anthropics/skills) - Document processing (docx, pdf, pptx, xlsx), web development
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Searchable Tools Example
3
+ * Demonstrates declarative search exposure for large tool catalogs.
4
+ */
5
+
6
+ import { defineTool, type ExtensionAPI } from "@code-yeongyu/senpi";
7
+ import { Type } from "typebox";
8
+
9
+ const dictionaryLookup = defineTool({
10
+ name: "lookup_dictionary",
11
+ label: "Dictionary Lookup",
12
+ description: "Look up definitions of words",
13
+ exposure: "search",
14
+ searchText: "Find meanings and definitions of English words",
15
+ searchKeywords: ["dictionary", "meaning", "definition"],
16
+ allowLazyActivation: true,
17
+ parameters: Type.Object({
18
+ word: Type.String(),
19
+ }),
20
+ async execute(_id, params) {
21
+ return {
22
+ content: [{ type: "text", text: `Definition for ${params.word}: [example definition]` }],
23
+ details: {},
24
+ };
25
+ },
26
+ });
27
+
28
+ const privateDatabaseQuery = defineTool({
29
+ name: "query_private_db",
30
+ label: "Query Private DB",
31
+ description: "Query the sensitive private database",
32
+ exposure: "search",
33
+ searchText: "Access protected company records",
34
+ allowLazyActivation: false, // Cannot be lazily activated; must be explicitly enabled
35
+ parameters: Type.Object({
36
+ query: Type.String(),
37
+ }),
38
+ async execute(_id, params) {
39
+ return {
40
+ content: [{ type: "text", text: `Results for ${params.query}: [secret data]` }],
41
+ details: {},
42
+ };
43
+ },
44
+ });
45
+
46
+ export default function (pi: ExtensionAPI) {
47
+ pi.registerTool(dictionaryLookup);
48
+ pi.registerTool(privateDatabaseQuery);
49
+ }
@@ -12,6 +12,42 @@
12
12
 
13
13
  ### Removed
14
14
 
15
+ ## [2026.8.11-3] - 2026-08-11
16
+
17
+ ### Breaking Changes
18
+
19
+ ### Added
20
+
21
+ ### Changed
22
+
23
+ ### Fixed
24
+
25
+ ### Removed
26
+
27
+ ## [2026.8.11-2] - 2026-08-10
28
+
29
+ ### Breaking Changes
30
+
31
+ ### Added
32
+
33
+ ### Changed
34
+
35
+ ### Fixed
36
+
37
+ ### Removed
38
+
39
+ ## [2026.8.11] - 2026-08-10
40
+
41
+ ### Breaking Changes
42
+
43
+ ### Added
44
+
45
+ ### Changed
46
+
47
+ ### Fixed
48
+
49
+ ### Removed
50
+
15
51
  ## [2026.8.10] - 2026-08-10
16
52
 
17
53
  ### Breaking Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-codemode",
3
- "version": "2026.8.10",
3
+ "version": "2026.8.11-3",
4
4
  "description": "Source-only senpi extension package for codemode evaluation tools",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -30,14 +30,14 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@babel/parser": "8.0.4",
33
- "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.8.10",
33
+ "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.8.11-3",
34
34
  "typebox": "1.3.8"
35
35
  },
36
36
  "peerDependencies": {
37
- "@code-yeongyu/senpi": "2026.8.10"
37
+ "@code-yeongyu/senpi": "2026.8.11-3"
38
38
  },
39
39
  "devDependencies": {
40
- "@code-yeongyu/senpi": "2026.8.10"
40
+ "@code-yeongyu/senpi": "2026.8.11-3"
41
41
  },
42
42
  "keywords": [
43
43
  "senpi",
@@ -1 +1 @@
1
- {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIN,WAAW,EAGX,MAAM,uBAAuB,CAAC;AAO/B,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EAEf,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,QAAQ,EACR,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAiBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAwBzC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AAwwBD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,aAAa,CAYrG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,qBAAqB,CAOpG"}
1
+ {"version":3,"file":"agent-loop.d.ts","sourceRoot":"","sources":["../src/agent-loop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAIN,WAAW,EAGX,MAAM,uBAAuB,CAAC;AAO/B,OAAO,KAAK,EACX,YAAY,EACZ,UAAU,EACV,eAAe,EAEf,YAAY,EACZ,SAAS,EACT,aAAa,EAEb,QAAQ,EACR,MAAM,YAAY,CAAC;AAEpB,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEzE;;;GAGG;AACH,wBAAgB,SAAS,CACxB,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAiBzC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,WAAW,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAwBzC;AAED,wBAAsB,YAAY,CACjC,OAAO,EAAE,YAAY,EAAE,EACvB,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAgBzB;AAED,wBAAsB,oBAAoB,CACzC,OAAO,EAAE,YAAY,EACrB,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,QAAQ,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiBzB;AAywBD,MAAM,WAAW,qBAAqB;IACrC,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;CACd;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,aAAa,CAYrG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,qBAAqB,CAOpG"}
@@ -232,6 +232,7 @@ async function runLoop(initialContext, newMessages, initialConfig, signal, emit,
232
232
  : nextTurnSnapshot.thinkingLevel === "off"
233
233
  ? undefined
234
234
  : nextTurnSnapshot.thinkingLevel,
235
+ abortServerSideFallback: nextTurnSnapshot.abortServerSideFallback ?? config.abortServerSideFallback,
235
236
  };
236
237
  }
237
238
  if (signal?.aborted) {
@@ -689,7 +690,10 @@ async function prepareToolCall(currentContext, assistantMessage, toolCall, confi
689
690
  isError: true,
690
691
  };
691
692
  }
692
- const tool = currentContext.tools?.find((t) => t.name === toolCall.name);
693
+ let tool = currentContext.tools?.find((candidate) => candidate.name === toolCall.name);
694
+ if (!tool && config.resolveUnknownToolCall) {
695
+ tool = await config.resolveUnknownToolCall(toolCall.name, currentContext);
696
+ }
693
697
  if (!tool) {
694
698
  const hint = config.removedToolHints?.[toolCall.name];
695
699
  return {