@code-yeongyu/senpi 2026.9.15 → 2026.9.16-2

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 (333) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +1 -1
  3. package/dist/core/agent-session.d.ts +28 -0
  4. package/dist/core/agent-session.d.ts.map +1 -1
  5. package/dist/core/agent-session.js +111 -13
  6. package/dist/core/agent-session.js.map +1 -1
  7. package/dist/core/compaction/compaction.d.ts.map +1 -1
  8. package/dist/core/compaction/compaction.js +4 -2
  9. package/dist/core/compaction/compaction.js.map +1 -1
  10. package/dist/core/compaction/stream-watchdog.d.ts +56 -2
  11. package/dist/core/compaction/stream-watchdog.d.ts.map +1 -1
  12. package/dist/core/compaction/stream-watchdog.js +93 -15
  13. package/dist/core/compaction/stream-watchdog.js.map +1 -1
  14. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts +6 -0
  15. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.d.ts.map +1 -1
  16. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js +17 -0
  17. package/dist/core/extensions/builtin/claude-sdk-oauth/session-binding.js.map +1 -1
  18. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts +4 -1
  19. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +1 -1
  20. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js +31 -0
  21. package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +1 -1
  22. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts +2 -0
  23. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
  24. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +16 -0
  25. package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
  26. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.d.ts.map +1 -1
  27. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js +19 -8
  28. package/dist/core/extensions/builtin/claude-sdk-oauth/session-registry-wiring.js.map +1 -1
  29. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.d.ts.map +1 -1
  30. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js +2 -1
  31. package/dist/core/extensions/builtin/claude-sdk-oauth/session-stream.js.map +1 -1
  32. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts +13 -1
  33. package/dist/core/extensions/builtin/compaction/deterministic-fallback.d.ts.map +1 -1
  34. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js +66 -2
  35. package/dist/core/extensions/builtin/compaction/deterministic-fallback.js.map +1 -1
  36. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  37. package/dist/core/extensions/builtin/compaction/index.js +16 -10
  38. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  39. package/dist/core/extensions/builtin/compaction/speculative-summary.d.ts.map +1 -1
  40. package/dist/core/extensions/builtin/compaction/speculative-summary.js +4 -2
  41. package/dist/core/extensions/builtin/compaction/speculative-summary.js.map +1 -1
  42. package/dist/core/extensions/builtin/compaction/speculative.d.ts +8 -1
  43. package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/compaction/speculative.js +31 -7
  45. package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
  46. package/dist/core/extensions/builtin/compaction/transient-failure.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/compaction/transient-failure.js +6 -3
  48. package/dist/core/extensions/builtin/compaction/transient-failure.js.map +1 -1
  49. package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/config-reload/index.js +25 -8
  51. package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
  52. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +4 -5
  53. package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
  54. package/dist/core/extensions/builtin/config-reload/watch-engine.js +14 -18
  55. package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -1
  56. package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts.map +1 -1
  57. package/dist/core/extensions/builtin/config-reload/watch-event-source.js +32 -9
  58. package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
  59. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.d.ts +23 -0
  60. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.d.ts.map +1 -0
  61. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.js +48 -0
  62. package/dist/core/extensions/builtin/cursor-cli-oauth/catalog-refresh.js.map +1 -0
  63. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.d.ts +13 -0
  64. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.d.ts.map +1 -0
  65. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.js +24 -0
  66. package/dist/core/extensions/builtin/cursor-cli-oauth/environment.js.map +1 -0
  67. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts +1 -0
  68. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.d.ts.map +1 -1
  69. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js +7 -1
  70. package/dist/core/extensions/builtin/cursor-cli-oauth/executable.js.map +1 -1
  71. package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts +2 -0
  72. package/dist/core/extensions/builtin/cursor-cli-oauth/index.d.ts.map +1 -1
  73. package/dist/core/extensions/builtin/cursor-cli-oauth/index.js +11 -9
  74. package/dist/core/extensions/builtin/cursor-cli-oauth/index.js.map +1 -1
  75. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.d.ts +18 -0
  76. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.d.ts.map +1 -0
  77. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.js +61 -0
  78. package/dist/core/extensions/builtin/cursor-cli-oauth/models-probe.js.map +1 -0
  79. package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts +4 -1
  80. package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
  81. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +1 -44
  82. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
  83. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts +22 -0
  84. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.d.ts.map +1 -1
  85. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js +1 -1
  86. package/dist/core/extensions/builtin/cursor-cli-oauth/oauth-login.js.map +1 -1
  87. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.d.ts.map +1 -1
  88. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js +2 -13
  89. package/dist/core/extensions/builtin/cursor-cli-oauth/transport.js.map +1 -1
  90. package/dist/core/extensions/builtin/terminal/monitor-file-digest.d.ts +3 -0
  91. package/dist/core/extensions/builtin/terminal/monitor-file-digest.d.ts.map +1 -0
  92. package/dist/core/extensions/builtin/terminal/monitor-file-digest.js +25 -0
  93. package/dist/core/extensions/builtin/terminal/monitor-file-digest.js.map +1 -0
  94. package/dist/core/extensions/builtin/terminal/monitor-file-watch.d.ts +9 -0
  95. package/dist/core/extensions/builtin/terminal/monitor-file-watch.d.ts.map +1 -0
  96. package/dist/core/extensions/builtin/terminal/monitor-file-watch.js +33 -0
  97. package/dist/core/extensions/builtin/terminal/monitor-file-watch.js.map +1 -0
  98. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.d.ts +6 -0
  99. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.d.ts.map +1 -0
  100. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.js +22 -0
  101. package/dist/core/extensions/builtin/terminal/monitor-line-buffer.js.map +1 -0
  102. package/dist/core/extensions/builtin/terminal/monitor-registry.d.ts.map +1 -1
  103. package/dist/core/extensions/builtin/terminal/monitor-registry.js +14 -35
  104. package/dist/core/extensions/builtin/terminal/monitor-registry.js.map +1 -1
  105. package/dist/core/extensions/kernel-tools-context.d.ts +13 -0
  106. package/dist/core/extensions/kernel-tools-context.d.ts.map +1 -0
  107. package/dist/core/extensions/kernel-tools-context.js +3 -0
  108. package/dist/core/extensions/kernel-tools-context.js.map +1 -0
  109. package/dist/core/extensions/runner.d.ts +19 -0
  110. package/dist/core/extensions/runner.d.ts.map +1 -1
  111. package/dist/core/extensions/runner.js +103 -1
  112. package/dist/core/extensions/runner.js.map +1 -1
  113. package/dist/core/extensions/types.d.ts +21 -0
  114. package/dist/core/extensions/types.d.ts.map +1 -1
  115. package/dist/core/extensions/types.js.map +1 -1
  116. package/dist/core/keybindings.d.ts +5 -0
  117. package/dist/core/keybindings.d.ts.map +1 -1
  118. package/dist/core/keybindings.js +1 -0
  119. package/dist/core/keybindings.js.map +1 -1
  120. package/dist/core/resource-loader.d.ts.map +1 -1
  121. package/dist/core/resource-loader.js +9 -17
  122. package/dist/core/resource-loader.js.map +1 -1
  123. package/dist/core/retry-fallback/settings.d.ts +3 -0
  124. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  125. package/dist/core/retry-fallback/settings.js.map +1 -1
  126. package/dist/core/sdk.d.ts.map +1 -1
  127. package/dist/core/sdk.js +1 -0
  128. package/dist/core/sdk.js.map +1 -1
  129. package/dist/core/session-manager.d.ts +30 -1
  130. package/dist/core/session-manager.d.ts.map +1 -1
  131. package/dist/core/session-manager.js +92 -5
  132. package/dist/core/session-manager.js.map +1 -1
  133. package/dist/core/session-resident-store.d.ts +33 -7
  134. package/dist/core/session-resident-store.d.ts.map +1 -1
  135. package/dist/core/session-resident-store.js +163 -14
  136. package/dist/core/session-resident-store.js.map +1 -1
  137. package/dist/core/session-write-reservation.d.ts +6 -0
  138. package/dist/core/session-write-reservation.d.ts.map +1 -1
  139. package/dist/core/session-write-reservation.js +19 -0
  140. package/dist/core/session-write-reservation.js.map +1 -1
  141. package/dist/core/settings-manager.d.ts +35 -1
  142. package/dist/core/settings-manager.d.ts.map +1 -1
  143. package/dist/core/settings-manager.js +62 -0
  144. package/dist/core/settings-manager.js.map +1 -1
  145. package/dist/core/slash-commands.d.ts.map +1 -1
  146. package/dist/core/slash-commands.js +2 -1
  147. package/dist/core/slash-commands.js.map +1 -1
  148. package/dist/core/tools/index.d.ts +1 -1
  149. package/dist/core/tools/index.d.ts.map +1 -1
  150. package/dist/core/tools/index.js +4 -3
  151. package/dist/core/tools/index.js.map +1 -1
  152. package/dist/core/tools/read.d.ts +3 -1
  153. package/dist/core/tools/read.d.ts.map +1 -1
  154. package/dist/core/tools/read.js +16 -2
  155. package/dist/core/tools/read.js.map +1 -1
  156. package/dist/index.d.ts +1 -0
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +1 -0
  159. package/dist/index.js.map +1 -1
  160. package/dist/modes/interactive/components/assistant-render-descriptors.d.ts.map +1 -1
  161. package/dist/modes/interactive/components/assistant-render-descriptors.js +12 -5
  162. package/dist/modes/interactive/components/assistant-render-descriptors.js.map +1 -1
  163. package/dist/modes/interactive/components/extension-input.d.ts +2 -0
  164. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  165. package/dist/modes/interactive/components/extension-input.js +5 -0
  166. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  167. package/dist/modes/interactive/interactive-mode.d.ts +19 -2
  168. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  169. package/dist/modes/interactive/interactive-mode.js +69 -17
  170. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  171. package/dist/modes/interactive/tips/catalog/session-tips.js +1 -1
  172. package/dist/modes/interactive/tips/catalog/session-tips.js.map +1 -1
  173. package/dist/modes/interactive/working-status.d.ts +3 -2
  174. package/dist/modes/interactive/working-status.d.ts.map +1 -1
  175. package/dist/modes/interactive/working-status.js +17 -4
  176. package/dist/modes/interactive/working-status.js.map +1 -1
  177. package/dist/modes/print-mode.d.ts +1 -1
  178. package/dist/modes/print-mode.d.ts.map +1 -1
  179. package/dist/modes/print-mode.js +5 -1
  180. package/dist/modes/print-mode.js.map +1 -1
  181. package/dist/modes/rpc/host-watchdog.d.ts.map +1 -1
  182. package/dist/modes/rpc/host-watchdog.js +5 -24
  183. package/dist/modes/rpc/host-watchdog.js.map +1 -1
  184. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  185. package/dist/modes/rpc/rpc-mode.js +3 -8
  186. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  187. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  188. package/dist/modes/rpc/session-command-router.js +3 -0
  189. package/dist/modes/rpc/session-command-router.js.map +1 -1
  190. package/dist/modes/rpc/session-worker-client.d.ts +3 -0
  191. package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
  192. package/dist/modes/rpc/session-worker-client.js +17 -6
  193. package/dist/modes/rpc/session-worker-client.js.map +1 -1
  194. package/dist/modes/rpc/shutdown.d.ts +3 -0
  195. package/dist/modes/rpc/shutdown.d.ts.map +1 -0
  196. package/dist/modes/rpc/shutdown.js +17 -0
  197. package/dist/modes/rpc/shutdown.js.map +1 -0
  198. package/docs/extensions.md +5 -2
  199. package/docs/keybindings.md +1 -0
  200. package/docs/session-format.md +1 -1
  201. package/docs/sessions.md +3 -3
  202. package/docs/settings.md +31 -1
  203. package/docs/usage.md +1 -1
  204. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +50 -0
  205. package/node_modules/@code-yeongyu/senpi-codemode/README.md +24 -0
  206. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  207. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/http-server.ts +7 -1
  208. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/kernel-tools-protocol.ts +85 -0
  209. package/node_modules/@code-yeongyu/senpi-codemode/src/bridge/protocol.ts +6 -0
  210. package/node_modules/@code-yeongyu/senpi-codemode/src/bridges/agent-bridge.ts +30 -11
  211. package/node_modules/@code-yeongyu/senpi-codemode/src/extension/session-manager.ts +11 -0
  212. package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +10 -0
  213. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/prelude.jl +46 -0
  214. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/runner.jl +1 -1
  215. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +58 -10
  216. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-contract.ts +12 -0
  217. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.d.ts +13 -0
  218. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-context.js +7 -0
  219. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.d.ts +10 -0
  220. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-define.js +12 -0
  221. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.js +22 -0
  222. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-errors.ts +26 -0
  223. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-host.ts +134 -0
  224. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-naming.js +28 -0
  225. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.d.ts +5 -0
  226. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-parse.js +255 -0
  227. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-pump.js +105 -0
  228. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.d.ts +27 -0
  229. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-registry.js +127 -0
  230. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-schema.js +69 -0
  231. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/kernel-tools-types.ts +42 -0
  232. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/prelude.ts +2 -0
  233. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-core.js +26 -3
  234. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-runtime.js +20 -8
  235. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-slot.ts +6 -1
  236. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +9 -7
  237. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/workpool.js +37 -0
  238. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/kernel-tools-unavailable.ts +5 -0
  239. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/kernel.ts +13 -0
  240. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/prelude.py +57 -3
  241. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/prelude.rb +13 -2
  242. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/workpool.rb +38 -0
  243. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-kernel.ts +13 -0
  244. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/subprocess-queue.ts +9 -1
  245. package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt-template.ts +4 -2
  246. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/cell-handler.ts +31 -3
  247. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/detached-cell-manager.ts +36 -71
  248. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image-resize.ts +52 -0
  249. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/image.ts +37 -72
  250. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/managed-cell.ts +78 -0
  251. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +30 -5
  252. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/run-eval-cell.ts +52 -30
  253. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/terminal-snapshot-store.ts +35 -0
  254. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/tool-result-marshal.ts +23 -0
  255. package/node_modules/@code-yeongyu/senpi-codemode/src/tool/types.ts +2 -0
  256. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  257. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +30 -3
  258. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  259. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts +5 -0
  260. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  261. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +2 -0
  262. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  263. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.d.ts.map +1 -1
  264. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js +51 -12
  265. package/node_modules/@earendil-works/pi-agent-core/dist/empty-assistant-recovery.js.map +1 -1
  266. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts +3 -0
  267. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.d.ts.map +1 -1
  268. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js +18 -3
  269. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/read.js.map +1 -1
  270. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts +4 -0
  271. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.d.ts.map +1 -0
  272. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js +268 -0
  273. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/brace-scanner.js.map +1 -0
  274. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts +18 -0
  275. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.d.ts.map +1 -0
  276. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js +69 -0
  277. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/header-protection.js.map +1 -0
  278. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts +27 -0
  279. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.d.ts.map +1 -0
  280. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js +118 -0
  281. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/index.js.map +1 -0
  282. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts +21 -0
  283. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.d.ts.map +1 -0
  284. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js +24 -0
  285. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-context.js.map +1 -0
  286. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts +12 -0
  287. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.d.ts.map +1 -0
  288. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js +92 -0
  289. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/lexical-spans.js.map +1 -0
  290. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts +47 -0
  291. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.d.ts.map +1 -0
  292. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js +8 -0
  293. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/read-folders/types.js.map +1 -0
  294. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts +52 -0
  295. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.d.ts.map +1 -0
  296. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js +155 -0
  297. package/node_modules/@earendil-works/pi-agent-core/dist/harness/utils/segmented-read-view.js.map +1 -0
  298. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts +4 -0
  299. package/node_modules/@earendil-works/pi-agent-core/dist/index.d.ts.map +1 -1
  300. package/node_modules/@earendil-works/pi-agent-core/dist/index.js +3 -0
  301. package/node_modules/@earendil-works/pi-agent-core/dist/index.js.map +1 -1
  302. package/node_modules/@earendil-works/pi-agent-core/dist/stream-throughput-watchdog.d.ts +101 -0
  303. package/node_modules/@earendil-works/pi-agent-core/dist/stream-throughput-watchdog.d.ts.map +1 -0
  304. package/node_modules/@earendil-works/pi-agent-core/dist/stream-throughput-watchdog.js +178 -0
  305. package/node_modules/@earendil-works/pi-agent-core/dist/stream-throughput-watchdog.js.map +1 -0
  306. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +9 -0
  307. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  308. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  309. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  310. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -0
  311. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  312. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -0
  313. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  314. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  315. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  316. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  317. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  318. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  319. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  320. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  321. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts +15 -0
  322. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.d.ts.map +1 -0
  323. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js +15 -0
  324. package/node_modules/@earendil-works/pi-ai/dist/utils/empty-response-errors.js.map +1 -0
  325. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts +24 -0
  326. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  327. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +92 -0
  328. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  329. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  330. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  331. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  332. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  333. package/package.json +7 -7
@@ -6,6 +6,14 @@ export type ToolCallMessage = Extract<KernelToHostMessage, { type: "tool-call" }
6
6
 
7
7
  export type JavaScriptKernelMode = "worker" | "inline";
8
8
 
9
+ /** Snapshot or live provider consulted when the worker registry checks collisions. */
10
+ export type KernelToolNameSource = readonly string[] | (() => readonly string[]);
11
+
12
+ export function resolveKernelToolNameSource(names?: KernelToolNameSource): string[] {
13
+ if (typeof names === "function") return [...names()];
14
+ return names === undefined ? [] : [...names];
15
+ }
16
+
9
17
  export interface JavaScriptKernelOptions {
10
18
  readonly sessionId: string;
11
19
  readonly cwd: string;
@@ -14,6 +22,10 @@ export interface JavaScriptKernelOptions {
14
22
  readonly workerEntryUrl?: URL;
15
23
  /** Per-session PI_* values applied to the worker environment before the first cell runs. */
16
24
  readonly sessionEnv?: SessionEnvironment;
25
+ /** Host tool names denied as JS kernel-tool identifiers (init protocol). */
26
+ readonly hostToolNames?: KernelToolNameSource;
27
+ /** Tool names registered in another kernel language, denied as JS kernel-tool identifiers. */
28
+ readonly foreignLanguageNames?: KernelToolNameSource;
17
29
  }
18
30
 
19
31
  export interface JavaScriptRunInput {
@@ -0,0 +1,13 @@
1
+ export const kernelToolCallContext: {
2
+ run<T>(store: KernelToolCallStore, fn: () => T): T;
3
+ getStore(): KernelToolCallStore | undefined;
4
+ };
5
+
6
+ export type KernelToolCallStore = {
7
+ readonly pendingTools: Map<string, { resolve: (value: unknown) => void; reject: (error: Error) => void }>;
8
+ readonly callId: string;
9
+ readonly generation: number;
10
+ readonly signal: AbortSignal;
11
+ };
12
+
13
+ export function inKernelToolInvoke(): boolean;
@@ -0,0 +1,7 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+
3
+ export const kernelToolCallContext = new AsyncLocalStorage();
4
+
5
+ export function inKernelToolInvoke() {
6
+ return kernelToolCallContext.getStore() != null;
7
+ }
@@ -0,0 +1,10 @@
1
+ export type KernelToolFunction = {
2
+ readonly name: string;
3
+ };
4
+
5
+ export function createToolNamespace(
6
+ define: (fn: KernelToolFunction, metadata?: unknown) => unknown,
7
+ callHost: (name: string, args: unknown) => Promise<unknown>,
8
+ ): ((fn: KernelToolFunction, metadata?: unknown) => unknown) & {
9
+ readonly [name: string]: (args?: unknown) => Promise<unknown>;
10
+ };
@@ -0,0 +1,12 @@
1
+ export function createToolNamespace(define, callHost) {
2
+ const registrar = function tool(fn, metadata) {
3
+ return define(fn, metadata);
4
+ };
5
+ return new Proxy(registrar, {
6
+ get(target, prop) {
7
+ if (typeof prop !== "string") return undefined;
8
+ if (prop in Function.prototype || prop === "arguments" || prop === "caller") return target[prop];
9
+ return async (args) => await callHost(prop, args ?? {});
10
+ },
11
+ });
12
+ }
@@ -0,0 +1,22 @@
1
+ export const KERNEL_TOOL_ERROR_CODES = Object.freeze([
2
+ "tools_unavailable",
3
+ "invalid_tool_definition",
4
+ "reserved_tool_name",
5
+ "tool_name_collision",
6
+ "kernel_tool_stale",
7
+ "kernel_tool_missing",
8
+ "kernel_tool_failed",
9
+ "kernel_tool_recursion",
10
+ ]);
11
+
12
+ export class KernelToolError extends Error {
13
+ constructor(code, message) {
14
+ super(message);
15
+ this.name = "KernelToolError";
16
+ this.code = code;
17
+ }
18
+ }
19
+
20
+ export function kernelToolError(code, message) {
21
+ return new KernelToolError(code, message);
22
+ }
@@ -0,0 +1,26 @@
1
+ export const KERNEL_TOOL_ERROR_CODES = [
2
+ "tools_unavailable",
3
+ "invalid_tool_definition",
4
+ "reserved_tool_name",
5
+ "tool_name_collision",
6
+ "kernel_tool_stale",
7
+ "kernel_tool_missing",
8
+ "kernel_tool_failed",
9
+ "kernel_tool_recursion",
10
+ ] as const;
11
+
12
+ export type KernelToolErrorCode = (typeof KERNEL_TOOL_ERROR_CODES)[number];
13
+
14
+ export class KernelToolError extends Error {
15
+ readonly name = "KernelToolError";
16
+ readonly code: KernelToolErrorCode;
17
+
18
+ constructor(code: KernelToolErrorCode, message: string) {
19
+ super(message);
20
+ this.code = code;
21
+ }
22
+ }
23
+
24
+ export function kernelToolError(code: KernelToolErrorCode, message: string): KernelToolError {
25
+ return new KernelToolError(code, message);
26
+ }
@@ -0,0 +1,134 @@
1
+ import type { HostToKernelMessage, KernelToHostMessage } from "../../bridge/protocol.ts";
2
+ import { generateCorrelationId } from "../../bridge/protocol.ts";
3
+ import { RESERVED_AGENT_TOOL } from "../../bridge/reserved.ts";
4
+ import { kernelToolError } from "./kernel-tools-errors.ts";
5
+ import type { KernelToolsDescribeResult, KernelToolsInvokeRequest } from "./kernel-tools-types.ts";
6
+
7
+ type KernelToolReply = Extract<
8
+ KernelToHostMessage,
9
+ { type: "kernel-tool-describe-reply" } | { type: "kernel-tool-invoke-reply" }
10
+ >;
11
+
12
+ type Waiter = {
13
+ readonly resolve: (message: KernelToolReply) => void;
14
+ readonly reject: (error: Error) => void;
15
+ };
16
+
17
+ export class KernelToolHostPump {
18
+ readonly events = new EventTarget();
19
+ readonly #waiters = new Map<string, Waiter>();
20
+ readonly #post: (message: HostToKernelMessage) => void;
21
+ readonly #isOpen: () => boolean;
22
+
23
+ constructor(post: (message: HostToKernelMessage) => void, isOpen: () => boolean) {
24
+ this.#post = post;
25
+ this.#isOpen = isOpen;
26
+ }
27
+
28
+ consume(message: KernelToHostMessage): boolean {
29
+ if (message.type === "tool-call" && message.toolName === RESERVED_AGENT_TOOL) {
30
+ this.events.dispatchEvent(new Event("outerAwaitingAgent"));
31
+ }
32
+ if (message.type !== "kernel-tool-describe-reply" && message.type !== "kernel-tool-invoke-reply") return false;
33
+ const waiter = this.#waiters.get(message.requestId);
34
+ if (!waiter) return true;
35
+ this.#waiters.delete(message.requestId);
36
+ waiter.resolve(message);
37
+ return true;
38
+ }
39
+
40
+ rejectAll(error: Error): void {
41
+ for (const [requestId, waiter] of this.#waiters) {
42
+ this.#waiters.delete(requestId);
43
+ waiter.reject(error);
44
+ }
45
+ }
46
+
47
+ async describe(names: readonly string[]): Promise<KernelToolsDescribeResult> {
48
+ const reply = await this.#request({
49
+ type: "kernel-tool-describe",
50
+ requestId: generateCorrelationId(),
51
+ names: [...names],
52
+ });
53
+ if (reply.type !== "kernel-tool-describe-reply") {
54
+ throw kernelToolError("kernel_tool_failed", "unexpected kernel-tool describe reply");
55
+ }
56
+ if (!reply.ok) {
57
+ throw kernelToolError(codeOf(reply.error.code), reply.error.message);
58
+ }
59
+ return { results: reply.results as KernelToolsDescribeResult["results"] };
60
+ }
61
+
62
+ async invoke(request: KernelToolsInvokeRequest, signal?: AbortSignal): Promise<unknown> {
63
+ this.events.dispatchEvent(new Event("nestedInvoke"));
64
+ const reply = await this.#request(
65
+ {
66
+ type: "kernel-tool-invoke",
67
+ requestId: generateCorrelationId(),
68
+ name: request.name,
69
+ kernel_generation: request.kernel_generation,
70
+ definition_revision: request.definition_revision,
71
+ args: request.args,
72
+ call_id: request.call_id,
73
+ },
74
+ signal,
75
+ );
76
+ if (reply.type !== "kernel-tool-invoke-reply") {
77
+ throw kernelToolError("kernel_tool_failed", "unexpected kernel-tool invoke reply");
78
+ }
79
+ if (!reply.ok) throw kernelToolError(codeOf(reply.error.code), reply.error.message);
80
+ return reply.value;
81
+ }
82
+
83
+ #request(
84
+ message: Extract<HostToKernelMessage, { requestId: string }>,
85
+ signal?: AbortSignal,
86
+ ): Promise<KernelToolReply> {
87
+ if (!this.#isOpen()) throw kernelToolError("tools_unavailable", "JavaScript worker is not available");
88
+ return new Promise((resolve, reject) => {
89
+ const onAbort = (): void => {
90
+ if (!this.#waiters.delete(message.requestId)) return;
91
+ this.#post({ type: "kernel-tool-cancel", requestId: message.requestId });
92
+ reject(kernelToolError("kernel_tool_stale", "Kernel tool call cancelled"));
93
+ };
94
+ const cleanup = (): void => signal?.removeEventListener("abort", onAbort);
95
+ this.#waiters.set(message.requestId, {
96
+ resolve: (reply) => {
97
+ cleanup();
98
+ resolve(reply);
99
+ },
100
+ reject: (error) => {
101
+ cleanup();
102
+ reject(error);
103
+ },
104
+ });
105
+ if (signal?.aborted) {
106
+ onAbort();
107
+ return;
108
+ }
109
+ signal?.addEventListener("abort", onAbort, { once: true });
110
+ this.#post(message);
111
+ });
112
+ }
113
+ }
114
+
115
+ function codeOf(
116
+ code: string | undefined,
117
+ ):
118
+ | "kernel_tool_failed"
119
+ | "kernel_tool_stale"
120
+ | "kernel_tool_missing"
121
+ | "kernel_tool_recursion"
122
+ | "tools_unavailable"
123
+ | "invalid_tool_definition" {
124
+ if (
125
+ code === "kernel_tool_stale" ||
126
+ code === "kernel_tool_missing" ||
127
+ code === "kernel_tool_recursion" ||
128
+ code === "tools_unavailable" ||
129
+ code === "invalid_tool_definition"
130
+ ) {
131
+ return code;
132
+ }
133
+ return "kernel_tool_failed";
134
+ }
@@ -0,0 +1,28 @@
1
+ /** MCP name rules from coding-agent mcp/expose/naming.ts, applied explicitly for kernel tools. */
2
+ export const MCP_TOOL_NAME_MAX_LENGTH = 64;
3
+
4
+ export function sanitizeNamePart(name) {
5
+ return name.replace(/[^a-zA-Z0-9_-]/g, "_");
6
+ }
7
+
8
+ export function matcherKey(name) {
9
+ return name.replace(/-/g, "_");
10
+ }
11
+
12
+ export function ellipsizeMiddle(value, maxLength) {
13
+ if (value.length <= maxLength) return value;
14
+ if (maxLength <= 3) return value.slice(0, maxLength);
15
+ const marker = "...";
16
+ const remaining = maxLength - marker.length;
17
+ const prefixLength = Math.ceil(remaining / 2);
18
+ const suffixLength = Math.floor(remaining / 2);
19
+ return `${value.slice(0, prefixLength)}${marker}${value.slice(value.length - suffixLength)}`;
20
+ }
21
+
22
+ export function normalizeKernelToolName(name) {
23
+ return ellipsizeMiddle(sanitizeNamePart(name), MCP_TOOL_NAME_MAX_LENGTH);
24
+ }
25
+
26
+ export function kernelToolKey(name) {
27
+ return matcherKey(normalizeKernelToolName(name));
28
+ }
@@ -0,0 +1,5 @@
1
+ export function parseToolFunction(fn: unknown): {
2
+ readonly name: string;
3
+ readonly params: readonly string[];
4
+ readonly async: boolean;
5
+ };
@@ -0,0 +1,255 @@
1
+ import { kernelToolError } from "./kernel-tools-errors.js";
2
+
3
+ const IDENT = /^[\p{ID_Start}$_][\p{ID_Continue}$\u200c\u200d]*$/u;
4
+ const RESERVED = new Set(
5
+ "await break case catch class const continue debugger default delete do else enum export extends false finally for function if implements import in instanceof interface let new null package private protected public return static super switch this throw true try typeof var void while with yield".split(
6
+ " ",
7
+ ),
8
+ );
9
+
10
+ export function parseToolFunction(fn) {
11
+ if (typeof fn !== "function") fail();
12
+ const source = fn.toString();
13
+ if (source.includes("[native code]")) fail("tool() cannot wrap native functions");
14
+ return parseHead(source);
15
+ }
16
+
17
+ function parseHead(source) {
18
+ const pos = { i: 0, source };
19
+ skipTrivia(pos);
20
+ if (keyword(pos, "class")) fail();
21
+ let async = false;
22
+ if (keyword(pos, "async")) {
23
+ skipTrivia(pos);
24
+ if (!keyword(pos, "function")) fail();
25
+ async = true;
26
+ } else if (!keyword(pos, "function")) fail();
27
+ skipTrivia(pos);
28
+ if (peek(pos) === "*") fail();
29
+ const name = ident(pos);
30
+ if (!name) fail();
31
+ skipTrivia(pos);
32
+ if (peek(pos) !== "(") fail();
33
+ return { name, params: readParams(pos), async };
34
+ }
35
+
36
+ function readParams(pos) {
37
+ const parts = splitTopLevel(extractParenInner(pos));
38
+ if (parts.length === 1 && plainIdent(parts[0]) === "") return [];
39
+ return parts.map((part) => {
40
+ const name = plainIdent(part);
41
+ if (!name) fail("tool() requires simple identifier parameters");
42
+ return name;
43
+ });
44
+ }
45
+
46
+ function plainIdent(part) {
47
+ const pos = { i: 0, source: part };
48
+ skipTrivia(pos);
49
+ if (eof(pos)) return "";
50
+ const name = ident(pos);
51
+ if (!name) return null;
52
+ skipTrivia(pos);
53
+ return eof(pos) ? name : null;
54
+ }
55
+
56
+ function splitTopLevel(source) {
57
+ const parts = [];
58
+ let current = "";
59
+ const pos = { i: 0, source };
60
+ let paren = 0;
61
+ let square = 0;
62
+ let curly = 0;
63
+ while (!eof(pos)) {
64
+ const start = pos.i;
65
+ if (skipValue(pos)) {
66
+ current += source.slice(start, pos.i);
67
+ continue;
68
+ }
69
+ const ch = source[pos.i];
70
+ pos.i += 1;
71
+ if (ch === "(") paren += 1;
72
+ else if (ch === ")") paren -= 1;
73
+ else if (ch === "[") square += 1;
74
+ else if (ch === "]") square -= 1;
75
+ else if (ch === "{") curly += 1;
76
+ else if (ch === "}") curly -= 1;
77
+ if (ch === "," && paren === 0 && square === 0 && curly === 0) {
78
+ parts.push(current);
79
+ current = "";
80
+ } else current += ch;
81
+ }
82
+ parts.push(current);
83
+ return parts;
84
+ }
85
+
86
+ function extractParenInner(pos) {
87
+ const source = pos.source;
88
+ if (source[pos.i] !== "(") fail();
89
+ pos.i += 1;
90
+ const start = pos.i;
91
+ let paren = 1;
92
+ while (pos.i < source.length && paren > 0) {
93
+ const before = pos.i;
94
+ if (skipValue(pos)) continue;
95
+ if (pos.i !== before) continue;
96
+ const ch = source[pos.i];
97
+ pos.i += 1;
98
+ if (ch === "(") paren += 1;
99
+ else if (ch === ")") paren -= 1;
100
+ }
101
+ if (paren !== 0) fail();
102
+ return source.slice(start, pos.i - 1);
103
+ }
104
+
105
+ function skipValue(pos) {
106
+ const ch = peek(pos);
107
+ if (ch === "'" || ch === '"') {
108
+ pos.i = skipString(pos.source, pos.i);
109
+ return true;
110
+ }
111
+ if (ch === "`") {
112
+ pos.i = skipTemplate(pos.source, pos.i);
113
+ return true;
114
+ }
115
+ if (ch === "/" && pos.source[pos.i + 1] === "/") {
116
+ pos.i = skipLineComment(pos.source, pos.i);
117
+ return true;
118
+ }
119
+ if (ch === "/" && pos.source[pos.i + 1] === "*") {
120
+ pos.i = skipBlockComment(pos.source, pos.i);
121
+ return true;
122
+ }
123
+ return false;
124
+ }
125
+
126
+ function skipTrivia(pos) {
127
+ while (!eof(pos)) {
128
+ if (/\s/u.test(peek(pos))) {
129
+ pos.i += 1;
130
+ continue;
131
+ }
132
+ if (peek(pos) === "/" && pos.source[pos.i + 1] === "/") {
133
+ pos.i = skipLineComment(pos.source, pos.i);
134
+ continue;
135
+ }
136
+ if (peek(pos) === "/" && pos.source[pos.i + 1] === "*") {
137
+ pos.i = skipBlockComment(pos.source, pos.i);
138
+ continue;
139
+ }
140
+ return;
141
+ }
142
+ }
143
+
144
+ function keyword(pos, word) {
145
+ if (!pos.source.startsWith(word, pos.i)) return false;
146
+ const next = pos.source[pos.i + word.length];
147
+ if (next !== undefined && isContinue(next)) return false;
148
+ pos.i += word.length;
149
+ return true;
150
+ }
151
+
152
+ function ident(pos) {
153
+ if (eof(pos) || !isStart(peek(pos))) return null;
154
+ const start = pos.i;
155
+ pos.i += 1;
156
+ while (!eof(pos) && isContinue(peek(pos))) pos.i += 1;
157
+ const value = pos.source.slice(start, pos.i);
158
+ if (!IDENT.test(value) || RESERVED.has(value)) {
159
+ pos.i = start;
160
+ return null;
161
+ }
162
+ return value;
163
+ }
164
+
165
+ function peek(pos) {
166
+ return pos.source[pos.i];
167
+ }
168
+
169
+ function eof(pos) {
170
+ return pos.i >= pos.source.length;
171
+ }
172
+
173
+ function fail(message = "tool() requires a named function") {
174
+ throw kernelToolError("invalid_tool_definition", message);
175
+ }
176
+
177
+ function isStart(ch) {
178
+ return /[\p{ID_Start}$_]/u.test(ch);
179
+ }
180
+
181
+ function isContinue(ch) {
182
+ return /[\p{ID_Continue}$\u200c\u200d]/u.test(ch);
183
+ }
184
+
185
+ function skipLineComment(source, i) {
186
+ i += 2;
187
+ while (i < source.length && source[i] !== "\n" && source[i] !== "\r" && source[i] !== "\u2028" && source[i] !== "\u2029") i += 1;
188
+ return i;
189
+ }
190
+
191
+ function skipBlockComment(source, i) {
192
+ const end = source.indexOf("*/", i + 2);
193
+ if (end < 0) fail();
194
+ return end + 2;
195
+ }
196
+
197
+ function skipString(source, i) {
198
+ const quote = source[i];
199
+ i += 1;
200
+ while (i < source.length) {
201
+ if (source[i] === "\\") {
202
+ i += 2;
203
+ continue;
204
+ }
205
+ if (source[i] === quote) return i + 1;
206
+ i += 1;
207
+ }
208
+ fail();
209
+ }
210
+
211
+ function skipTemplate(source, i) {
212
+ i += 1;
213
+ while (i < source.length) {
214
+ if (source[i] === "\\") {
215
+ i += 2;
216
+ continue;
217
+ }
218
+ if (source[i] === "`") return i + 1;
219
+ if (source[i] === "$" && source[i + 1] === "{") {
220
+ i = skipTemplateExpr(source, i + 2);
221
+ continue;
222
+ }
223
+ i += 1;
224
+ }
225
+ fail();
226
+ }
227
+
228
+ function skipTemplateExpr(source, i) {
229
+ let curly = 1;
230
+ while (i < source.length && curly > 0) {
231
+ if (source[i] === "'" || source[i] === '"') {
232
+ i = skipString(source, i);
233
+ continue;
234
+ }
235
+ if (source[i] === "`") {
236
+ i = skipTemplate(source, i);
237
+ continue;
238
+ }
239
+ if (source[i] === "/" && source[i + 1] === "/") {
240
+ i = skipLineComment(source, i);
241
+ continue;
242
+ }
243
+ if (source[i] === "/" && source[i + 1] === "*") {
244
+ i = skipBlockComment(source, i);
245
+ continue;
246
+ }
247
+ if (source[i] === "{") curly += 1;
248
+ else if (source[i] === "}") {
249
+ curly -= 1;
250
+ if (curly === 0) return i + 1;
251
+ }
252
+ i += 1;
253
+ }
254
+ fail();
255
+ }
@@ -0,0 +1,105 @@
1
+ import { kernelToolCallContext } from "./kernel-tools-context.js";
2
+ import { kernelToolError } from "./kernel-tools-errors.js";
3
+
4
+ export function createKernelToolPump({ getRuntime, emit, nestedInvokes }) {
5
+ async function describe(message) {
6
+ try {
7
+ const runtime = getRuntime();
8
+ if (!runtime?.kernelTools) throw kernelToolError("tools_unavailable", "JS runtime not initialized");
9
+ const results = runtime.kernelTools.describe(message.names).results;
10
+ emit({ type: "kernel-tool-describe-reply", requestId: message.requestId, ok: true, results });
11
+ } catch (error) {
12
+ emit({ type: "kernel-tool-describe-reply", requestId: message.requestId, ok: false, error: pumpError(error) });
13
+ }
14
+ }
15
+
16
+ async function invoke(message) {
17
+ const pendingTools = new Map();
18
+ const controller = new AbortController();
19
+ nestedInvokes.set(message.requestId, { pendingTools, controller });
20
+ try {
21
+ const runtime = getRuntime();
22
+ if (!runtime?.kernelTools) throw kernelToolError("tools_unavailable", "JS runtime not initialized");
23
+ const value = await kernelToolCallContext.run(
24
+ { pendingTools, callId: message.call_id, generation: message.kernel_generation, signal: controller.signal },
25
+ () =>
26
+ runtime.kernelTools.invoke(
27
+ {
28
+ name: message.name,
29
+ kernel_generation: message.kernel_generation,
30
+ definition_revision: message.definition_revision,
31
+ args: message.args,
32
+ call_id: message.call_id,
33
+ },
34
+ controller.signal,
35
+ ),
36
+ );
37
+ emit({ type: "kernel-tool-invoke-reply", requestId: message.requestId, ok: true, value });
38
+ } catch (error) {
39
+ emit({ type: "kernel-tool-invoke-reply", requestId: message.requestId, ok: false, error: pumpError(error) });
40
+ } finally {
41
+ nestedInvokes.delete(message.requestId);
42
+ }
43
+ }
44
+
45
+ return {
46
+ handle(message) {
47
+ if (message.type === "kernel-tool-describe") {
48
+ void describe(message);
49
+ return true;
50
+ }
51
+ if (message.type === "kernel-tool-invoke") {
52
+ void invoke(message);
53
+ return true;
54
+ }
55
+ if (message.type === "kernel-tool-cancel") {
56
+ const nested = nestedInvokes.get(message.requestId);
57
+ if (nested) abortNested(nested, kernelToolError("kernel_tool_stale", "Kernel tool call cancelled"));
58
+ return true;
59
+ }
60
+ return false;
61
+ },
62
+ abortAll(error) {
63
+ for (const nested of nestedInvokes.values()) abortNested(nested, error);
64
+ },
65
+ settleToolReply(message) {
66
+ for (const nested of nestedInvokes.values()) {
67
+ const pending = nested.pendingTools.get(message.callId);
68
+ if (!pending) continue;
69
+ nested.pendingTools.delete(message.callId);
70
+ if (message.ok) pending.resolve(message.value);
71
+ else pending.reject(errorFrom(message.error));
72
+ return true;
73
+ }
74
+ return false;
75
+ },
76
+ };
77
+ }
78
+
79
+ function abortNested(nested, error) {
80
+ nested.controller.abort(error);
81
+ for (const [callId, pending] of nested.pendingTools) {
82
+ nested.pendingTools.delete(callId);
83
+ pending.reject(error);
84
+ }
85
+ }
86
+
87
+ function pumpError(error) {
88
+ if (error instanceof Error) {
89
+ return {
90
+ name: error.name,
91
+ message: error.message,
92
+ stack: error.stack,
93
+ ...(typeof error.code === "string" ? { code: error.code } : {}),
94
+ };
95
+ }
96
+ return { message: String(error) };
97
+ }
98
+
99
+ function errorFrom(error) {
100
+ const result = new Error(error.message);
101
+ if (error.name) result.name = error.name;
102
+ if (error.stack) result.stack = error.stack;
103
+ if (typeof error.code === "string") result.code = error.code;
104
+ return result;
105
+ }
@@ -0,0 +1,27 @@
1
+ export { createToolNamespace } from "./kernel-tools-define.js";
2
+
3
+ export type KernelToolRegistryOptions = {
4
+ readonly generation?: number;
5
+ readonly language?: "js" | "py" | "rb" | "jl";
6
+ readonly hostToolNames?: readonly string[] | (() => readonly string[]);
7
+ readonly foreignLanguageNames?: readonly string[] | (() => readonly string[]);
8
+ readonly reservedNames?: readonly string[];
9
+ };
10
+
11
+ export function createKernelToolRegistry(options?: KernelToolRegistryOptions): {
12
+ readonly generation: number;
13
+ define(fn: { readonly name: string }, metadata?: unknown): unknown;
14
+ describe(names: readonly string[]): unknown;
15
+ invoke(
16
+ request: {
17
+ readonly name: string;
18
+ readonly kernel_generation: number;
19
+ readonly definition_revision: number;
20
+ readonly args: unknown;
21
+ readonly call_id: string;
22
+ },
23
+ signal?: AbortSignal,
24
+ ): Promise<unknown>;
25
+ bumpGeneration(): number;
26
+ setCollisionNames(hostToolNames?: readonly string[], foreignLanguageNames?: readonly string[]): void;
27
+ };