@code-yeongyu/senpi 2026.8.11-2 → 2026.8.11-4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/dist/cli-main.d.ts +1 -1
  3. package/dist/cli-main.d.ts.map +1 -1
  4. package/dist/cli-main.js +1 -0
  5. package/dist/cli-main.js.map +1 -1
  6. package/dist/cli.d.ts +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +1 -0
  9. package/dist/cli.js.map +1 -1
  10. package/dist/core/agent-session.d.ts +8 -2
  11. package/dist/core/agent-session.d.ts.map +1 -1
  12. package/dist/core/agent-session.js +63 -7
  13. package/dist/core/agent-session.js.map +1 -1
  14. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts +2 -0
  15. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.d.ts.map +1 -0
  16. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js +24 -0
  17. package/dist/core/extensions/builtin/claude-sdk-oauth/availability.js.map +1 -0
  18. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts +4 -0
  19. package/dist/core/extensions/builtin/claude-sdk-oauth/index.d.ts.map +1 -1
  20. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js +5 -2
  21. package/dist/core/extensions/builtin/claude-sdk-oauth/index.js.map +1 -1
  22. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts +6 -1
  23. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.d.ts.map +1 -1
  24. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js +16 -0
  25. package/dist/core/extensions/builtin/claude-sdk-oauth/oauth-login.js.map +1 -1
  26. package/dist/core/extensions/builtin/goal/transitions.js +2 -1
  27. package/dist/core/extensions/builtin/goal/transitions.js.map +1 -1
  28. package/dist/core/extensions/builtin/imagegen/auth.d.ts +45 -0
  29. package/dist/core/extensions/builtin/imagegen/auth.d.ts.map +1 -0
  30. package/dist/core/extensions/builtin/imagegen/auth.js +137 -0
  31. package/dist/core/extensions/builtin/imagegen/auth.js.map +1 -0
  32. package/dist/core/extensions/builtin/imagegen/index.d.ts +5 -0
  33. package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -0
  34. package/dist/core/extensions/builtin/imagegen/index.js +46 -0
  35. package/dist/core/extensions/builtin/imagegen/index.js.map +1 -0
  36. package/dist/core/extensions/builtin/imagegen/paths.d.ts +26 -0
  37. package/dist/core/extensions/builtin/imagegen/paths.d.ts.map +1 -0
  38. package/dist/core/extensions/builtin/imagegen/paths.js +52 -0
  39. package/dist/core/extensions/builtin/imagegen/paths.js.map +1 -0
  40. package/dist/core/extensions/builtin/imagegen/skill/SKILL.md +67 -0
  41. package/dist/core/extensions/builtin/imagegen/state.d.ts +26 -0
  42. package/dist/core/extensions/builtin/imagegen/state.d.ts.map +1 -0
  43. package/dist/core/extensions/builtin/imagegen/state.js +35 -0
  44. package/dist/core/extensions/builtin/imagegen/state.js.map +1 -0
  45. package/dist/core/extensions/builtin/imagegen/tool.d.ts +31 -0
  46. package/dist/core/extensions/builtin/imagegen/tool.d.ts.map +1 -0
  47. package/dist/core/extensions/builtin/imagegen/tool.js +174 -0
  48. package/dist/core/extensions/builtin/imagegen/tool.js.map +1 -0
  49. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/index.js +9 -1
  51. package/dist/core/extensions/builtin/index.js.map +1 -1
  52. package/dist/core/extensions/builtin/mcp/control-inventory.d.ts +14 -0
  53. package/dist/core/extensions/builtin/mcp/control-inventory.d.ts.map +1 -0
  54. package/dist/core/extensions/builtin/mcp/control-inventory.js +22 -0
  55. package/dist/core/extensions/builtin/mcp/control-inventory.js.map +1 -0
  56. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts +2 -44
  57. package/dist/core/extensions/builtin/mcp/expose/native-search.d.ts.map +1 -1
  58. package/dist/core/extensions/builtin/mcp/expose/native-search.js +3 -97
  59. package/dist/core/extensions/builtin/mcp/expose/native-search.js.map +1 -1
  60. package/dist/core/extensions/builtin/mcp/expose/proxy.d.ts.map +1 -1
  61. package/dist/core/extensions/builtin/mcp/expose/proxy.js +15 -4
  62. package/dist/core/extensions/builtin/mcp/expose/proxy.js.map +1 -1
  63. package/dist/core/extensions/builtin/mcp/expose/session.d.ts +2 -1
  64. package/dist/core/extensions/builtin/mcp/expose/session.d.ts.map +1 -1
  65. package/dist/core/extensions/builtin/mcp/expose/session.js +2 -2
  66. package/dist/core/extensions/builtin/mcp/expose/session.js.map +1 -1
  67. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts +13 -11
  68. package/dist/core/extensions/builtin/mcp/expose/tier-b.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/mcp/expose/tier-b.js +58 -59
  70. package/dist/core/extensions/builtin/mcp/expose/tier-b.js.map +1 -1
  71. package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
  72. package/dist/core/extensions/builtin/mcp/index.js +28 -36
  73. package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
  74. package/dist/core/extensions/builtin/mcp/service-register.d.ts +2 -1
  75. package/dist/core/extensions/builtin/mcp/service-register.d.ts.map +1 -1
  76. package/dist/core/extensions/builtin/mcp/service-register.js +2 -2
  77. package/dist/core/extensions/builtin/mcp/service-register.js.map +1 -1
  78. package/dist/core/extensions/builtin/mcp/service-types.d.ts +4 -0
  79. package/dist/core/extensions/builtin/mcp/service-types.d.ts.map +1 -1
  80. package/dist/core/extensions/builtin/mcp/service-types.js.map +1 -1
  81. package/dist/core/extensions/builtin/mcp/service.d.ts +6 -11
  82. package/dist/core/extensions/builtin/mcp/service.d.ts.map +1 -1
  83. package/dist/core/extensions/builtin/mcp/service.js +79 -41
  84. package/dist/core/extensions/builtin/mcp/service.js.map +1 -1
  85. package/dist/core/extensions/builtin/mcp/wrap.d.ts +2 -0
  86. package/dist/core/extensions/builtin/mcp/wrap.d.ts.map +1 -1
  87. package/dist/core/extensions/builtin/mcp/wrap.js +3 -0
  88. package/dist/core/extensions/builtin/mcp/wrap.js.map +1 -1
  89. package/dist/core/extensions/builtin/openai-image-gen/externalize.d.ts +27 -0
  90. package/dist/core/extensions/builtin/openai-image-gen/externalize.d.ts.map +1 -0
  91. package/dist/core/extensions/builtin/openai-image-gen/externalize.js +133 -0
  92. package/dist/core/extensions/builtin/openai-image-gen/externalize.js.map +1 -0
  93. package/dist/core/extensions/builtin/openai-image-gen/gate.d.ts +21 -0
  94. package/dist/core/extensions/builtin/openai-image-gen/gate.d.ts.map +1 -0
  95. package/dist/core/extensions/builtin/openai-image-gen/gate.js +63 -0
  96. package/dist/core/extensions/builtin/openai-image-gen/gate.js.map +1 -0
  97. package/dist/core/extensions/builtin/openai-image-gen/index.d.ts +14 -0
  98. package/dist/core/extensions/builtin/openai-image-gen/index.d.ts.map +1 -0
  99. package/dist/core/extensions/builtin/openai-image-gen/index.js +77 -0
  100. package/dist/core/extensions/builtin/openai-image-gen/index.js.map +1 -0
  101. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts +15 -0
  102. package/dist/core/extensions/builtin/openai-image-gen/inject.d.ts.map +1 -0
  103. package/dist/core/extensions/builtin/openai-image-gen/inject.js +42 -0
  104. package/dist/core/extensions/builtin/openai-image-gen/inject.js.map +1 -0
  105. package/dist/core/extensions/builtin/terminal/monitor-notify.d.ts.map +1 -1
  106. package/dist/core/extensions/builtin/terminal/monitor-notify.js +8 -1
  107. package/dist/core/extensions/builtin/terminal/monitor-notify.js.map +1 -1
  108. package/dist/core/extensions/builtin/terminal/notify.d.ts +3 -1
  109. package/dist/core/extensions/builtin/terminal/notify.d.ts.map +1 -1
  110. package/dist/core/extensions/builtin/terminal/notify.js +4 -1
  111. package/dist/core/extensions/builtin/terminal/notify.js.map +1 -1
  112. package/dist/core/extensions/builtin/tool-search/engine/bm25.d.ts +22 -0
  113. package/dist/core/extensions/builtin/tool-search/engine/bm25.d.ts.map +1 -0
  114. package/dist/core/extensions/builtin/{mcp/expose → tool-search/engine}/bm25.js +16 -31
  115. package/dist/core/extensions/builtin/tool-search/engine/bm25.js.map +1 -0
  116. package/dist/core/extensions/builtin/tool-search/engine/document.d.ts +14 -0
  117. package/dist/core/extensions/builtin/tool-search/engine/document.d.ts.map +1 -0
  118. package/dist/core/extensions/builtin/tool-search/engine/document.js +2 -0
  119. package/dist/core/extensions/builtin/tool-search/engine/document.js.map +1 -0
  120. package/dist/core/extensions/builtin/tool-search/engine/marker.d.ts +55 -0
  121. package/dist/core/extensions/builtin/tool-search/engine/marker.d.ts.map +1 -0
  122. package/dist/core/extensions/builtin/tool-search/engine/marker.js +189 -0
  123. package/dist/core/extensions/builtin/tool-search/engine/marker.js.map +1 -0
  124. package/dist/core/extensions/builtin/tool-search/index.d.ts +7 -0
  125. package/dist/core/extensions/builtin/tool-search/index.d.ts.map +1 -0
  126. package/dist/core/extensions/builtin/tool-search/index.js +71 -0
  127. package/dist/core/extensions/builtin/tool-search/index.js.map +1 -0
  128. package/dist/core/extensions/builtin/tool-search/native-search.d.ts +52 -0
  129. package/dist/core/extensions/builtin/tool-search/native-search.d.ts.map +1 -0
  130. package/dist/core/extensions/builtin/tool-search/native-search.js +116 -0
  131. package/dist/core/extensions/builtin/tool-search/native-search.js.map +1 -0
  132. package/dist/core/extensions/builtin/tool-search/service.d.ts +38 -0
  133. package/dist/core/extensions/builtin/tool-search/service.d.ts.map +1 -0
  134. package/dist/core/extensions/builtin/tool-search/service.js +200 -0
  135. package/dist/core/extensions/builtin/tool-search/service.js.map +1 -0
  136. package/dist/core/extensions/builtin/tool-search/tool.d.ts +21 -0
  137. package/dist/core/extensions/builtin/tool-search/tool.d.ts.map +1 -0
  138. package/dist/core/extensions/builtin/tool-search/tool.js +95 -0
  139. package/dist/core/extensions/builtin/tool-search/tool.js.map +1 -0
  140. package/dist/core/extensions/loader.d.ts.map +1 -1
  141. package/dist/core/extensions/loader.js +3 -0
  142. package/dist/core/extensions/loader.js.map +1 -1
  143. package/dist/core/extensions/types.d.ts +44 -4
  144. package/dist/core/extensions/types.d.ts.map +1 -1
  145. package/dist/core/extensions/types.js +11 -0
  146. package/dist/core/extensions/types.js.map +1 -1
  147. package/dist/core/provider-composer.d.ts +10 -1
  148. package/dist/core/provider-composer.d.ts.map +1 -1
  149. package/dist/core/provider-composer.js +9 -0
  150. package/dist/core/provider-composer.js.map +1 -1
  151. package/dist/core/resource-loader.d.ts.map +1 -1
  152. package/dist/core/resource-loader.js +17 -5
  153. package/dist/core/resource-loader.js.map +1 -1
  154. package/dist/modes/provider-native-rendering.d.ts.map +1 -1
  155. package/dist/modes/provider-native-rendering.js +33 -0
  156. package/dist/modes/provider-native-rendering.js.map +1 -1
  157. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  158. package/dist/modes/rpc/connection-handler.js +130 -4
  159. package/dist/modes/rpc/connection-handler.js.map +1 -1
  160. package/dist/modes/rpc/rpc-types.d.ts +31 -0
  161. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  162. package/dist/modes/rpc/rpc-types.js.map +1 -1
  163. package/dist/senpi +1 -0
  164. package/dist/valid-cwd.d.ts +2 -0
  165. package/dist/valid-cwd.d.ts.map +1 -0
  166. package/dist/valid-cwd.js +14 -0
  167. package/dist/valid-cwd.js.map +1 -0
  168. package/docs/environment-variables.md +7 -0
  169. package/docs/extensions.md +50 -13
  170. package/docs/mcp.md +2 -0
  171. package/docs/rpc.md +54 -0
  172. package/docs/skills.md +8 -0
  173. package/examples/extensions/searchable-tools.ts +49 -0
  174. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +29 -0
  175. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  176. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/kernel.ts +14 -1
  177. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/kernel.ts +14 -1
  178. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/runtime-asset.ts +31 -0
  179. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  180. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +5 -1
  181. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  182. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +4 -1
  183. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  184. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -0
  185. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  186. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +9 -0
  187. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  188. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  189. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  190. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  191. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +7 -3
  192. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  193. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts +8 -0
  194. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.d.ts.map +1 -0
  195. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js +222 -0
  196. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.js.map +1 -0
  197. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.d.ts +3 -0
  198. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.d.ts.map +1 -0
  199. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.js +10 -0
  200. package/node_modules/@earendil-works/pi-ai/dist/api/openai-images.lazy.js.map +1 -0
  201. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  202. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +113 -4
  203. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  204. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  205. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +1 -0
  206. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  207. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts +5 -0
  208. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  209. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +2 -1
  210. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  211. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +10 -0
  212. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  213. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  214. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +32 -0
  215. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  216. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +32 -0
  217. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  218. package/node_modules/@earendil-works/pi-ai/dist/models.d.ts.map +1 -1
  219. package/node_modules/@earendil-works/pi-ai/dist/models.js +36 -13
  220. package/node_modules/@earendil-works/pi-ai/dist/models.js.map +1 -1
  221. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.d.ts +2 -0
  222. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.d.ts.map +1 -1
  223. package/node_modules/@earendil-works/pi-ai/dist/openai-responses-compat.js.map +1 -1
  224. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  225. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js +2 -1
  226. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  227. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  228. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  229. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  230. package/node_modules/@earendil-works/pi-ai/dist/providers/data/google.json +1 -1
  231. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  232. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  233. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  234. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts +1 -0
  235. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.d.ts.map +1 -1
  236. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js +18 -0
  237. package/node_modules/@earendil-works/pi-ai/dist/providers/images/register-builtins.js.map +1 -1
  238. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.d.ts +3 -0
  239. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.d.ts.map +1 -0
  240. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.js +16 -0
  241. package/node_modules/@earendil-works/pi-ai/dist/providers/openai-images.js.map +1 -0
  242. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +1 -1
  243. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  244. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  245. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  246. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +7 -0
  247. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  248. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  249. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  250. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  251. package/package.json +9 -9
  252. package/dist/core/extensions/builtin/mcp/expose/bm25.d.ts +0 -30
  253. package/dist/core/extensions/builtin/mcp/expose/bm25.d.ts.map +0 -1
  254. package/dist/core/extensions/builtin/mcp/expose/bm25.js.map +0 -1
  255. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.d.ts +0 -15
  256. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.d.ts.map +0 -1
  257. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.js +0 -33
  258. package/dist/core/extensions/builtin/mcp/expose/lazy-activate.js.map +0 -1
  259. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts +0 -43
  260. package/dist/core/extensions/builtin/mcp/expose/tool-search.d.ts.map +0 -1
  261. package/dist/core/extensions/builtin/mcp/expose/tool-search.js +0 -125
  262. package/dist/core/extensions/builtin/mcp/expose/tool-search.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"provider-native-rendering.js","sourceRoot":"","sources":["../../src/modes/provider-native-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, ProviderNativeContent } from \"@earendil-works/pi-ai\";\n\ntype NativeRecord = Record<string, unknown>;\n\ninterface SearchSource {\n\ttitle?: string;\n\turl?: string;\n\tsnippet?: string;\n\tstatus?: string;\n}\n\nfunction isRecord(value: unknown): value is NativeRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readRecord(record: NativeRecord | undefined, key: string): NativeRecord | undefined {\n\tconst value = record?.[key];\n\treturn isRecord(value) ? value : undefined;\n}\n\nfunction readArray(record: NativeRecord | undefined, key: string): unknown[] {\n\tconst value = record?.[key];\n\treturn Array.isArray(value) ? value : [];\n}\n\nfunction readString(record: NativeRecord | undefined, key: string): string | undefined {\n\tconst value = record?.[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction readStringArray(record: NativeRecord | undefined, key: string): string[] {\n\treturn readArray(record, key).filter((value): value is string => typeof value === \"string\");\n}\n\nfunction formatProviderName(message: AssistantMessage): string {\n\treturn message.provider ? `${message.provider} · ` : \"\";\n}\n\nfunction pluralize(count: number, singular: string, plural = `${singular}s`): string {\n\treturn `${count} ${count === 1 ? singular : plural}`;\n}\n\nfunction shorten(value: string, max: number): string {\n\treturn value.length <= max ? value : `${value.slice(0, max - 1)}…`;\n}\n\nfunction quoted(value: string): string {\n\treturn JSON.stringify(value);\n}\n\nfunction unique(values: string[]): string[] {\n\treturn [...new Set(values)];\n}\n\nfunction getWebSearchResults(raw: unknown): NativeRecord[] | undefined {\n\tif (!isRecord(raw) || !Array.isArray(raw.content)) {\n\t\treturn undefined;\n\t}\n\n\treturn raw.content.filter(isRecord).filter((item) => readString(item, \"type\") === \"web_search_result\");\n}\n\nfunction sourceFromRecord(record: NativeRecord | undefined): SearchSource | undefined {\n\tif (!record) return undefined;\n\tconst title = readString(record, \"title\") ?? readString(record, \"name\");\n\tconst url =\n\t\treadString(record, \"url\") ??\n\t\treadString(record, \"uri\") ??\n\t\treadString(record, \"retrievedUrl\") ??\n\t\treadString(record, \"sourceUrl\");\n\tconst snippet =\n\t\treadString(record, \"snippet\") ??\n\t\treadString(record, \"text\") ??\n\t\treadString(record, \"summary\") ??\n\t\treadString(record, \"page_age\");\n\tconst status = readString(record, \"status\") ?? readString(record, \"urlRetrievalStatus\");\n\tif (!title && !url && !snippet && !status) return undefined;\n\treturn { ...(title && { title }), ...(url && { url }), ...(snippet && { snippet }), ...(status && { status }) };\n}\n\nfunction sourceFromGoogleGroundingChunk(record: NativeRecord): SearchSource | undefined {\n\treturn sourceFromRecord(readRecord(record, \"web\") ?? record);\n}\n\nfunction formatQueries(queries: string[]): string[] {\n\tconst values = unique(queries);\n\tif (values.length === 0) return [];\n\tif (values.length === 1) return [`query: ${quoted(values[0])}`];\n\treturn [\"queries:\", ...values.map((query) => `- ${quoted(query)}`)];\n}\n\nfunction formatSources(sources: SearchSource[], label: \"result\" | \"source\" | \"url\", expanded: boolean): string[] {\n\tif (sources.length === 0) return [];\n\n\tconst visibleSources = expanded ? sources : sources.slice(0, 3);\n\tconst lines = [pluralize(sources.length, label)];\n\tfor (const source of visibleSources) {\n\t\tconst title = source.title ? shorten(source.title, 100) : undefined;\n\t\tconst url = source.url ? shorten(source.url, 120) : undefined;\n\t\tconst status = source.status ? ` (${source.status})` : \"\";\n\t\tif (title && url) {\n\t\t\tlines.push(`${title} ${url}${status}`);\n\t\t} else if (title) {\n\t\t\tlines.push(`${title}${status}`);\n\t\t} else if (url) {\n\t\t\tlines.push(`${url}${status}`);\n\t\t} else if (source.status) {\n\t\t\tlines.push(source.status);\n\t\t}\n\t\tif (source.snippet) {\n\t\t\tlines.push(` ${shorten(source.snippet, 160)}`);\n\t\t}\n\t}\n\tif (!expanded && sources.length > visibleSources.length) {\n\t\tlines.push(`… ${sources.length - visibleSources.length} more ${label}s`);\n\t}\n\treturn lines;\n}\n\nfunction formatServerToolUseBody(raw: unknown): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tconst input = readRecord(record, \"input\");\n\tconst query = readString(input, \"query\");\n\tif (query) {\n\t\treturn `query: ${quoted(query)}`;\n\t}\n\tconst name = readString(record, \"name\");\n\tif (name) {\n\t\treturn `name: ${name}`;\n\t}\n\treturn undefined;\n}\n\nfunction formatAnthropicWebSearchResultBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst results = getWebSearchResults(raw);\n\tif (!results) {\n\t\treturn undefined;\n\t}\n\tif (results.length === 0) {\n\t\treturn \"0 results\";\n\t}\n\n\tconst sources = results.flatMap((result) => {\n\t\tconst source = sourceFromRecord(result);\n\t\treturn source ? [source] : [];\n\t});\n\treturn formatSources(sources, \"result\", expanded).join(\"\\n\");\n}\n\nfunction formatOpenAiWebSearchCallBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst action = readRecord(record, \"action\");\n\tconst status = readString(record, \"status\");\n\tconst queries = [\n\t\t...(readString(action, \"query\") ? [readString(action, \"query\") as string] : []),\n\t\t...readStringArray(action, \"queries\"),\n\t];\n\tconst sources = readArray(action, \"sources\").flatMap((rawSource) => {\n\t\tconst source = sourceFromRecord(isRecord(rawSource) ? rawSource : undefined);\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = [\n\t\t...(status ? [`status: ${status}`] : []),\n\t\t...formatQueries(queries),\n\t\t...formatSources(sources, \"source\", expanded),\n\t];\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatGoogleGroundingMetadataBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst queries = readStringArray(record, \"webSearchQueries\");\n\tconst sources = readArray(record, \"groundingChunks\").flatMap((rawChunk) => {\n\t\tconst source = isRecord(rawChunk) ? sourceFromGoogleGroundingChunk(rawChunk) : undefined;\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = [...formatQueries(queries), ...formatSources(sources, \"source\", expanded)];\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatGoogleUrlContextMetadataBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst sources = readArray(record, \"urlMetadata\").flatMap((rawUrl) => {\n\t\tconst source = sourceFromRecord(isRecord(rawUrl) ? rawUrl : undefined);\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = formatSources(sources, \"url\", expanded);\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatSpecializedProviderNativeSummary(\n\tmessage: AssistantMessage,\n\tcontent: ProviderNativeContent,\n\texpanded: boolean,\n): string | undefined {\n\tconst provider = formatProviderName(message);\n\tconst marker = expanded ? \"▾\" : \"▸\";\n\tif (content.subtype === \"server_tool_use\") {\n\t\tconst raw = isRecord(content.raw) ? content.raw : undefined;\n\t\tconst name = readString(raw, \"name\");\n\t\tif (name) {\n\t\t\treturn `${marker} ${provider}${name} · server_tool_use`;\n\t\t}\n\t}\n\tif (content.subtype === \"web_search_tool_result\") {\n\t\treturn `${marker} ${provider}web_search results`;\n\t}\n\tif (content.subtype === \"web_search_call\") {\n\t\tconst raw = isRecord(content.raw) ? content.raw : undefined;\n\t\tconst status = readString(raw, \"status\");\n\t\treturn `${marker} ${provider}web_search${status ? ` · ${status}` : \" · web_search_call\"}`;\n\t}\n\tif (content.subtype === \"groundingMetadata\") {\n\t\tconst body = formatGoogleGroundingMetadataBody(content.raw, expanded);\n\t\tif (body) {\n\t\t\treturn `${marker} ${provider}google_search results`;\n\t\t}\n\t}\n\tif (content.subtype === \"urlContextMetadata\") {\n\t\tconst body = formatGoogleUrlContextMetadataBody(content.raw, expanded);\n\t\tif (body) {\n\t\t\treturn `${marker} ${provider}url_context results`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction formatSpecializedProviderNativeBody(content: ProviderNativeContent, expanded: boolean): string | undefined {\n\tif (content.subtype === \"server_tool_use\") {\n\t\treturn formatServerToolUseBody(content.raw);\n\t}\n\tif (content.subtype === \"web_search_tool_result\") {\n\t\treturn formatAnthropicWebSearchResultBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"web_search_call\") {\n\t\treturn formatOpenAiWebSearchCallBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"groundingMetadata\") {\n\t\treturn formatGoogleGroundingMetadataBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"urlContextMetadata\") {\n\t\treturn formatGoogleUrlContextMetadataBody(content.raw, expanded);\n\t}\n\treturn undefined;\n}\n\nexport function stringifyProviderNative(raw: unknown): string {\n\ttry {\n\t\treturn JSON.stringify(raw, null, 2) ?? \"null\";\n\t} catch {\n\t\treturn String(raw);\n\t}\n}\n\nexport function formatProviderNativeSummary(\n\tmessage: AssistantMessage,\n\tcontent: ProviderNativeContent,\n\texpanded: boolean,\n): string {\n\tconst specialized = formatSpecializedProviderNativeSummary(message, content, expanded);\n\tif (specialized) {\n\t\treturn specialized;\n\t}\n\n\tconst provider = formatProviderName(message);\n\tconst marker = expanded ? \"▾\" : \"▸\";\n\treturn `${marker} ${provider}providerNative · ${content.subtype}`;\n}\n\nexport function formatProviderNativeBody(content: ProviderNativeContent, expanded: boolean): string {\n\tconst specialized = formatSpecializedProviderNativeBody(content, expanded);\n\tif (specialized) {\n\t\treturn specialized;\n\t}\n\n\tconst rawJson = stringifyProviderNative(content.raw);\n\tif (expanded || rawJson.length <= 2000) {\n\t\treturn rawJson;\n\t}\n\treturn `${rawJson.slice(0, 2000)}…`;\n}\n"]}
1
+ {"version":3,"file":"provider-native-rendering.js","sourceRoot":"","sources":["../../src/modes/provider-native-rendering.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, ProviderNativeContent } from \"@earendil-works/pi-ai\";\n\ntype NativeRecord = Record<string, unknown>;\n\ninterface SearchSource {\n\ttitle?: string;\n\turl?: string;\n\tsnippet?: string;\n\tstatus?: string;\n}\n\nfunction isRecord(value: unknown): value is NativeRecord {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readRecord(record: NativeRecord | undefined, key: string): NativeRecord | undefined {\n\tconst value = record?.[key];\n\treturn isRecord(value) ? value : undefined;\n}\n\nfunction readArray(record: NativeRecord | undefined, key: string): unknown[] {\n\tconst value = record?.[key];\n\treturn Array.isArray(value) ? value : [];\n}\n\nfunction readString(record: NativeRecord | undefined, key: string): string | undefined {\n\tconst value = record?.[key];\n\treturn typeof value === \"string\" ? value : undefined;\n}\n\nfunction readStringArray(record: NativeRecord | undefined, key: string): string[] {\n\treturn readArray(record, key).filter((value): value is string => typeof value === \"string\");\n}\n\nfunction formatProviderName(message: AssistantMessage): string {\n\treturn message.provider ? `${message.provider} · ` : \"\";\n}\n\nfunction pluralize(count: number, singular: string, plural = `${singular}s`): string {\n\treturn `${count} ${count === 1 ? singular : plural}`;\n}\n\nfunction shorten(value: string, max: number): string {\n\treturn value.length <= max ? value : `${value.slice(0, max - 1)}…`;\n}\n\nfunction quoted(value: string): string {\n\treturn JSON.stringify(value);\n}\n\nfunction unique(values: string[]): string[] {\n\treturn [...new Set(values)];\n}\n\nfunction getWebSearchResults(raw: unknown): NativeRecord[] | undefined {\n\tif (!isRecord(raw) || !Array.isArray(raw.content)) {\n\t\treturn undefined;\n\t}\n\n\treturn raw.content.filter(isRecord).filter((item) => readString(item, \"type\") === \"web_search_result\");\n}\n\nfunction sourceFromRecord(record: NativeRecord | undefined): SearchSource | undefined {\n\tif (!record) return undefined;\n\tconst title = readString(record, \"title\") ?? readString(record, \"name\");\n\tconst url =\n\t\treadString(record, \"url\") ??\n\t\treadString(record, \"uri\") ??\n\t\treadString(record, \"retrievedUrl\") ??\n\t\treadString(record, \"sourceUrl\");\n\tconst snippet =\n\t\treadString(record, \"snippet\") ??\n\t\treadString(record, \"text\") ??\n\t\treadString(record, \"summary\") ??\n\t\treadString(record, \"page_age\");\n\tconst status = readString(record, \"status\") ?? readString(record, \"urlRetrievalStatus\");\n\tif (!title && !url && !snippet && !status) return undefined;\n\treturn { ...(title && { title }), ...(url && { url }), ...(snippet && { snippet }), ...(status && { status }) };\n}\n\nfunction sourceFromGoogleGroundingChunk(record: NativeRecord): SearchSource | undefined {\n\treturn sourceFromRecord(readRecord(record, \"web\") ?? record);\n}\n\nfunction formatQueries(queries: string[]): string[] {\n\tconst values = unique(queries);\n\tif (values.length === 0) return [];\n\tif (values.length === 1) return [`query: ${quoted(values[0])}`];\n\treturn [\"queries:\", ...values.map((query) => `- ${quoted(query)}`)];\n}\n\nfunction formatSources(sources: SearchSource[], label: \"result\" | \"source\" | \"url\", expanded: boolean): string[] {\n\tif (sources.length === 0) return [];\n\n\tconst visibleSources = expanded ? sources : sources.slice(0, 3);\n\tconst lines = [pluralize(sources.length, label)];\n\tfor (const source of visibleSources) {\n\t\tconst title = source.title ? shorten(source.title, 100) : undefined;\n\t\tconst url = source.url ? shorten(source.url, 120) : undefined;\n\t\tconst status = source.status ? ` (${source.status})` : \"\";\n\t\tif (title && url) {\n\t\t\tlines.push(`${title} ${url}${status}`);\n\t\t} else if (title) {\n\t\t\tlines.push(`${title}${status}`);\n\t\t} else if (url) {\n\t\t\tlines.push(`${url}${status}`);\n\t\t} else if (source.status) {\n\t\t\tlines.push(source.status);\n\t\t}\n\t\tif (source.snippet) {\n\t\t\tlines.push(` ${shorten(source.snippet, 160)}`);\n\t\t}\n\t}\n\tif (!expanded && sources.length > visibleSources.length) {\n\t\tlines.push(`… ${sources.length - visibleSources.length} more ${label}s`);\n\t}\n\treturn lines;\n}\n\n/** Decoded size of a base64 payload, computed without allocating the bytes. */\nfunction base64ByteLength(value: string): number {\n\tconst padding = value.endsWith(\"==\") ? 2 : value.endsWith(\"=\") ? 1 : 0;\n\treturn Math.max(0, Math.floor(value.length / 4) * 3 - padding);\n}\n\n/**\n * Renders an OpenAI `image_generation_call` without ever echoing the payload.\n * The base64 result is deliberately reduced to a byte count, and no path is shown:\n * the file only exists once the message_end externalization pass has replaced this\n * block with text, which this renderer never sees.\n */\nfunction formatImageGenerationCallBody(raw: unknown): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst status = readString(record, \"status\");\n\tconst result = readString(record, \"result\");\n\tconst revisedPrompt = readString(record, \"revised_prompt\");\n\tconst lines = [\n\t\t...(status ? [`status: ${status}`] : []),\n\t\t...(result ? [`${base64ByteLength(result)} bytes`] : []),\n\t\t...(revisedPrompt?.trim() ? [`revised prompt: ${shorten(revisedPrompt, 200)}`] : []),\n\t];\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatServerToolUseBody(raw: unknown): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tconst input = readRecord(record, \"input\");\n\tconst query = readString(input, \"query\");\n\tif (query) {\n\t\treturn `query: ${quoted(query)}`;\n\t}\n\tconst name = readString(record, \"name\");\n\tif (name) {\n\t\treturn `name: ${name}`;\n\t}\n\treturn undefined;\n}\n\nfunction formatAnthropicWebSearchResultBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst results = getWebSearchResults(raw);\n\tif (!results) {\n\t\treturn undefined;\n\t}\n\tif (results.length === 0) {\n\t\treturn \"0 results\";\n\t}\n\n\tconst sources = results.flatMap((result) => {\n\t\tconst source = sourceFromRecord(result);\n\t\treturn source ? [source] : [];\n\t});\n\treturn formatSources(sources, \"result\", expanded).join(\"\\n\");\n}\n\nfunction formatOpenAiWebSearchCallBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst action = readRecord(record, \"action\");\n\tconst status = readString(record, \"status\");\n\tconst queries = [\n\t\t...(readString(action, \"query\") ? [readString(action, \"query\") as string] : []),\n\t\t...readStringArray(action, \"queries\"),\n\t];\n\tconst sources = readArray(action, \"sources\").flatMap((rawSource) => {\n\t\tconst source = sourceFromRecord(isRecord(rawSource) ? rawSource : undefined);\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = [\n\t\t...(status ? [`status: ${status}`] : []),\n\t\t...formatQueries(queries),\n\t\t...formatSources(sources, \"source\", expanded),\n\t];\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatGoogleGroundingMetadataBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst queries = readStringArray(record, \"webSearchQueries\");\n\tconst sources = readArray(record, \"groundingChunks\").flatMap((rawChunk) => {\n\t\tconst source = isRecord(rawChunk) ? sourceFromGoogleGroundingChunk(rawChunk) : undefined;\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = [...formatQueries(queries), ...formatSources(sources, \"source\", expanded)];\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatGoogleUrlContextMetadataBody(raw: unknown, expanded: boolean): string | undefined {\n\tconst record = isRecord(raw) ? raw : undefined;\n\tif (!record) return undefined;\n\n\tconst sources = readArray(record, \"urlMetadata\").flatMap((rawUrl) => {\n\t\tconst source = sourceFromRecord(isRecord(rawUrl) ? rawUrl : undefined);\n\t\treturn source ? [source] : [];\n\t});\n\n\tconst lines = formatSources(sources, \"url\", expanded);\n\treturn lines.length > 0 ? lines.join(\"\\n\") : undefined;\n}\n\nfunction formatSpecializedProviderNativeSummary(\n\tmessage: AssistantMessage,\n\tcontent: ProviderNativeContent,\n\texpanded: boolean,\n): string | undefined {\n\tconst provider = formatProviderName(message);\n\tconst marker = expanded ? \"▾\" : \"▸\";\n\tif (content.subtype === \"server_tool_use\") {\n\t\tconst raw = isRecord(content.raw) ? content.raw : undefined;\n\t\tconst name = readString(raw, \"name\");\n\t\tif (name) {\n\t\t\treturn `${marker} ${provider}${name} · server_tool_use`;\n\t\t}\n\t}\n\tif (content.subtype === \"web_search_tool_result\") {\n\t\treturn `${marker} ${provider}web_search results`;\n\t}\n\tif (content.subtype === \"web_search_call\") {\n\t\tconst raw = isRecord(content.raw) ? content.raw : undefined;\n\t\tconst status = readString(raw, \"status\");\n\t\treturn `${marker} ${provider}web_search${status ? ` · ${status}` : \" · web_search_call\"}`;\n\t}\n\tif (content.subtype === \"image_generation_call\") {\n\t\tconst raw = isRecord(content.raw) ? content.raw : undefined;\n\t\tconst status = readString(raw, \"status\");\n\t\treturn `${marker} ${provider}image_generation${status ? ` · ${status}` : \" · image_generation_call\"}`;\n\t}\n\tif (content.subtype === \"groundingMetadata\") {\n\t\tconst body = formatGoogleGroundingMetadataBody(content.raw, expanded);\n\t\tif (body) {\n\t\t\treturn `${marker} ${provider}google_search results`;\n\t\t}\n\t}\n\tif (content.subtype === \"urlContextMetadata\") {\n\t\tconst body = formatGoogleUrlContextMetadataBody(content.raw, expanded);\n\t\tif (body) {\n\t\t\treturn `${marker} ${provider}url_context results`;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction formatSpecializedProviderNativeBody(content: ProviderNativeContent, expanded: boolean): string | undefined {\n\tif (content.subtype === \"server_tool_use\") {\n\t\treturn formatServerToolUseBody(content.raw);\n\t}\n\tif (content.subtype === \"web_search_tool_result\") {\n\t\treturn formatAnthropicWebSearchResultBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"web_search_call\") {\n\t\treturn formatOpenAiWebSearchCallBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"image_generation_call\") {\n\t\treturn formatImageGenerationCallBody(content.raw);\n\t}\n\tif (content.subtype === \"groundingMetadata\") {\n\t\treturn formatGoogleGroundingMetadataBody(content.raw, expanded);\n\t}\n\tif (content.subtype === \"urlContextMetadata\") {\n\t\treturn formatGoogleUrlContextMetadataBody(content.raw, expanded);\n\t}\n\treturn undefined;\n}\n\nexport function stringifyProviderNative(raw: unknown): string {\n\ttry {\n\t\treturn JSON.stringify(raw, null, 2) ?? \"null\";\n\t} catch {\n\t\treturn String(raw);\n\t}\n}\n\nexport function formatProviderNativeSummary(\n\tmessage: AssistantMessage,\n\tcontent: ProviderNativeContent,\n\texpanded: boolean,\n): string {\n\tconst specialized = formatSpecializedProviderNativeSummary(message, content, expanded);\n\tif (specialized) {\n\t\treturn specialized;\n\t}\n\n\tconst provider = formatProviderName(message);\n\tconst marker = expanded ? \"▾\" : \"▸\";\n\treturn `${marker} ${provider}providerNative · ${content.subtype}`;\n}\n\nexport function formatProviderNativeBody(content: ProviderNativeContent, expanded: boolean): string {\n\tconst specialized = formatSpecializedProviderNativeBody(content, expanded);\n\tif (specialized) {\n\t\treturn specialized;\n\t}\n\n\tconst rawJson = stringifyProviderNative(content.raw);\n\tif (expanded || rawJson.length <= 2000) {\n\t\treturn rawJson;\n\t}\n\treturn `${rawJson.slice(0, 2000)}…`;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"connection-handler.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/connection-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAiC/E,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACpC,mFAAmF;IACnF,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC;IAC/B,iFAAiF;IACjF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,mBAAmB,EAChC,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,oBAAyB,GAChC,oBAAoB,CAu4BtB"}
1
+ {"version":3,"file":"connection-handler.d.ts","sourceRoot":"","sources":["../../../src/modes/rpc/connection-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AA2C/E,kFAAkF;AAClF,MAAM,WAAW,oBAAoB;IACpC,mFAAmF;IACnF,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,0DAA0D;IAC1D,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kFAAkF;IAClF,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,oBAAoB;IACpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,sEAAsE;IACtE,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC;IAC/B,iFAAiF;IACjF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAsDD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACzC,WAAW,EAAE,mBAAmB,EAChC,IAAI,EAAE,iBAAiB,EACvB,OAAO,GAAE,oBAAyB,GAChC,oBAAoB,CAg+BtB"}
@@ -15,14 +15,64 @@
15
15
  * (and whether) to end the process.
16
16
  */
17
17
  import * as crypto from "node:crypto";
18
+ import { basename, dirname, extname } from "node:path";
18
19
  import { buildLoginProviderInfos } from "../../core/auth-providers.js";
19
20
  import { emitProviderAccountsChanged, subscribeProviderAccountEvents, } from "../../core/extensions/builtin/claude-sdk-oauth/account-events.js";
20
21
  import { CLAUDE_SDK_OAUTH_PROVIDER_ID, getProviderAccounts, pinProviderAccount, removeProviderAccount, } from "../../core/extensions/builtin/claude-sdk-oauth/account-management.js";
22
+ import { isMcpControlInventoryChanged, MCP_CONTROL_INVENTORY_CHANGED_EVENT, MCP_CONTROL_INVENTORY_REQUEST_EVENT, } from "../../core/extensions/builtin/mcp/control-inventory.js";
21
23
  import { getSupportedThinkingLevels } from "../../core/thinking-levels.js";
22
24
  import { theme } from "../interactive/theme/theme.js";
23
25
  import { buildCustomUnsupportedRequest, DEFAULT_CUSTOM_EXTENSION_LABEL } from "./custom-capability.js";
24
26
  import { createRpcEventOutputBuffer } from "./event-output-buffer.js";
25
27
  import { SessionExtensionUiRequests } from "./session-extension-ui-requests.js";
28
+ function loadedExtensionName(path) {
29
+ const synthetic = /^<(?:builtin|inline):([^>]+)>$/.exec(path);
30
+ if (synthetic)
31
+ return synthetic[1];
32
+ const withoutExtension = basename(path, extname(path));
33
+ if (withoutExtension !== "index")
34
+ return withoutExtension;
35
+ const parent = dirname(path);
36
+ const parentName = basename(parent);
37
+ return parentName === "src" || parentName === "dist" ? basename(dirname(parent)) : parentName;
38
+ }
39
+ function loadedExtensions(session) {
40
+ return session.resourceLoader.getExtensions().extensions.map((extension) => ({
41
+ name: loadedExtensionName(extension.path),
42
+ path: extension.path,
43
+ sourceInfo: extension.sourceInfo,
44
+ enabled: true,
45
+ }));
46
+ }
47
+ function loadedMcpStatus(server) {
48
+ if (server.status !== undefined)
49
+ return server.status;
50
+ if (server.serverInfo !== null)
51
+ return "connected";
52
+ if (server.authStatus === "notLoggedIn")
53
+ return "needs_auth";
54
+ return "enabled";
55
+ }
56
+ function loadedMcpServers(snapshot) {
57
+ return snapshot.servers.map((server) => ({
58
+ name: server.name,
59
+ toolCount: server.tools.length,
60
+ status: loadedMcpStatus(server),
61
+ authStatus: server.authStatus,
62
+ }));
63
+ }
64
+ function loadedSurfacesFingerprint(session, extensions, mcpServers) {
65
+ return JSON.stringify({
66
+ skills: session.resourceLoader.getSkills().skills.map((skill) => ({
67
+ name: skill.name,
68
+ path: skill.filePath,
69
+ sourceInfo: skill.sourceInfo,
70
+ enabled: !skill.disableModelInvocation,
71
+ })),
72
+ extensions,
73
+ mcpServers,
74
+ });
75
+ }
26
76
  /**
27
77
  * Create a per-connection RPC handler bound to one runtime host and one sink.
28
78
  *
@@ -36,6 +86,10 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
36
86
  let session = runtimeHost.session;
37
87
  let unsubscribe;
38
88
  let unsubscribeBackpressure;
89
+ let unsubscribeLoadedSurfaces;
90
+ let mcpWireStatus = { servers: [] };
91
+ let loadedSurfacesDigest;
92
+ let suppressLoadedSurfaceEvents = false;
39
93
  const eventOutput = createRpcEventOutputBuffer(sink.writeRaw);
40
94
  const tagSessionRecord = (value) => routingSessionId === undefined ? value : { ...value, sessionId: routingSessionId };
41
95
  const output = (obj) => {
@@ -44,6 +98,44 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
44
98
  const outputEvent = (event) => {
45
99
  eventOutput.enqueueEvent(tagSessionRecord(event));
46
100
  };
101
+ const currentLoadedSurfaces = () => {
102
+ const extensions = loadedExtensions(session);
103
+ const mcpServers = loadedMcpServers(mcpWireStatus);
104
+ return {
105
+ data: { extensions, mcpServers },
106
+ digest: loadedSurfacesFingerprint(session, extensions, mcpServers),
107
+ };
108
+ };
109
+ const recordLoadedSurfaces = (emitChange) => {
110
+ const current = currentLoadedSurfaces();
111
+ const changed = loadedSurfacesDigest !== undefined && loadedSurfacesDigest !== current.digest;
112
+ loadedSurfacesDigest = current.digest;
113
+ if (emitChange && changed && !suppressLoadedSurfaceEvents) {
114
+ outputEvent({ type: "loaded_surfaces_changed" });
115
+ }
116
+ return current;
117
+ };
118
+ const requestMcpWireStatus = async () => {
119
+ let response;
120
+ const request = {
121
+ sessionId: session.sessionId,
122
+ respond(snapshot) {
123
+ response ??= snapshot;
124
+ },
125
+ };
126
+ session.resourceLoader.emitExtensionEvent?.(MCP_CONTROL_INVENTORY_REQUEST_EVENT, request);
127
+ mcpWireStatus = response === undefined ? { servers: [] } : await response;
128
+ };
129
+ const subscribeLoadedSurfaceEvents = () => {
130
+ unsubscribeLoadedSurfaces?.();
131
+ unsubscribeLoadedSurfaces = session.resourceLoader.onExtensionEvent?.(MCP_CONTROL_INVENTORY_CHANGED_EVENT, (data) => {
132
+ if (!isMcpControlInventoryChanged(data) || data.sessionId !== session.sessionId)
133
+ return;
134
+ mcpWireStatus = data.snapshot;
135
+ if (!suppressLoadedSurfaceEvents)
136
+ recordLoadedSurfaces(true);
137
+ });
138
+ };
47
139
  const unsubscribeProviderAccountEvents = subscribeProviderAccountEvents((event) => {
48
140
  if (event.type === "accounts_changed") {
49
141
  outputEvent({ type: "auth_accounts_changed", provider: event.provider });
@@ -267,12 +359,32 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
267
359
  // Tool expansion not supported in RPC mode - no TUI
268
360
  },
269
361
  });
362
+ const refreshLoadedSurfacesAfter = async (operation, resetMcp) => {
363
+ const previousDigest = loadedSurfacesDigest;
364
+ const wasSuppressed = suppressLoadedSurfaceEvents;
365
+ suppressLoadedSurfaceEvents = true;
366
+ if (resetMcp)
367
+ mcpWireStatus = { servers: [] };
368
+ try {
369
+ await operation();
370
+ await requestMcpWireStatus();
371
+ loadedSurfacesDigest = currentLoadedSurfaces().digest;
372
+ }
373
+ finally {
374
+ suppressLoadedSurfaceEvents = wasSuppressed;
375
+ }
376
+ if (!wasSuppressed && previousDigest !== undefined && previousDigest !== loadedSurfacesDigest) {
377
+ outputEvent({ type: "loaded_surfaces_changed" });
378
+ }
379
+ };
270
380
  runtimeHost.setRebindSession(async () => {
271
381
  await rebindSession();
272
382
  });
273
383
  const rebindSession = async () => {
384
+ unsubscribeLoadedSurfaces?.();
274
385
  session = runtimeHost.session;
275
- await session.bindExtensions({
386
+ subscribeLoadedSurfaceEvents();
387
+ await refreshLoadedSurfacesAfter(() => session.bindExtensions({
276
388
  uiContext: createExtensionUIContext(),
277
389
  mode: "rpc",
278
390
  commandContextActions: {
@@ -295,7 +407,9 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
295
407
  return runtimeHost.switchSession(sessionPath, options);
296
408
  },
297
409
  reload: async () => {
298
- await session.reload();
410
+ await refreshLoadedSurfacesAfter(async () => {
411
+ await session.reload();
412
+ }, false);
299
413
  },
300
414
  },
301
415
  shutdownHandler: () => {
@@ -307,9 +421,14 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
307
421
  }
308
422
  },
309
423
  onError: (err) => {
310
- output({ type: "extension_error", extensionPath: err.extensionPath, event: err.event, error: err.error });
424
+ output({
425
+ type: "extension_error",
426
+ extensionPath: err.extensionPath,
427
+ event: err.event,
428
+ error: err.error,
429
+ });
311
430
  },
312
- });
431
+ }), true);
313
432
  unsubscribe?.();
314
433
  unsubscribeBackpressure?.();
315
434
  unsubscribe = session.subscribe((event) => {
@@ -669,6 +788,11 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
669
788
  }
670
789
  return success(id, "get_commands", { commands });
671
790
  }
791
+ case "get_loaded_surfaces": {
792
+ await requestMcpWireStatus();
793
+ const inventory = recordLoadedSurfaces(true);
794
+ return success(id, "get_loaded_surfaces", inventory.data);
795
+ }
672
796
  // =================================================================
673
797
  // Auth (task 13)
674
798
  // =================================================================
@@ -766,8 +890,10 @@ export function createRpcConnectionHandler(runtimeHost, sink, options = {}) {
766
890
  unsubscribeProviderAccountEvents();
767
891
  unsubscribe?.();
768
892
  unsubscribeBackpressure?.();
893
+ unsubscribeLoadedSurfaces?.();
769
894
  unsubscribe = undefined;
770
895
  unsubscribeBackpressure = undefined;
896
+ unsubscribeLoadedSurfaces = undefined;
771
897
  if (options.disposeRuntime !== false) {
772
898
  await runtimeHost.dispose();
773
899
  }