@earendil-works/pi-coding-agent 0.84.4 → 0.85.0

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 (486) hide show
  1. package/CHANGELOG.md +57 -5
  2. package/README.md +3 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js +10 -7
  5. package/dist/bun/cli.js.map +1 -1
  6. package/dist/bun/runtime-setup.d.ts +2 -0
  7. package/dist/bun/runtime-setup.d.ts.map +1 -0
  8. package/dist/bun/runtime-setup.js +9 -0
  9. package/dist/bun/runtime-setup.js.map +1 -0
  10. package/dist/bundle/chunks/anthropic-messages-QAQLEQIY.js +6 -0
  11. package/dist/bundle/chunks/{azure-openai-responses-5ENVCQ7U.js → azure-openai-responses-Q7MJBRE6.js} +1 -1
  12. package/dist/bundle/chunks/bedrock-converse-stream.js +1 -1
  13. package/dist/bundle/chunks/chunk-7ZC4UXSL.js +2 -0
  14. package/dist/bundle/chunks/chunk-EQ6DR6XK.js +5 -0
  15. package/dist/bundle/chunks/{chunk-MNAIPA3J.js → chunk-IDDQWTHI.js} +1 -1
  16. package/dist/bundle/chunks/chunk-LZKJTKCT.js +2 -0
  17. package/dist/bundle/chunks/{chunk-NBBFIJUL.js → chunk-OUXLLA64.js} +2 -2
  18. package/dist/bundle/chunks/chunk-R7UUJ4C2.js +42 -0
  19. package/dist/bundle/chunks/chunk-USJZMAIR.js +2 -0
  20. package/dist/bundle/chunks/chunk-WBE4J4AU.js +9 -0
  21. package/dist/bundle/chunks/chunk-WZB2R5YO.js +1558 -0
  22. package/dist/bundle/chunks/github-copilot.js +1 -1
  23. package/dist/bundle/chunks/{google-generative-ai-YMUPJBKR.js → google-generative-ai-BSMTYDAM.js} +1 -1
  24. package/dist/bundle/chunks/{google-vertex-MPWMV4OF.js → google-vertex-5C3HASOJ.js} +1 -1
  25. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  26. package/dist/bundle/chunks/{mistral-conversations-Q3AWZJAZ.js → mistral-conversations-4M6BZBX6.js} +1 -1
  27. package/dist/bundle/chunks/node-EM5FIVUN.js +16 -0
  28. package/dist/bundle/chunks/node-TWVVAGPO.js +2 -0
  29. package/dist/bundle/chunks/openai-codex-responses-YJOO52RW.js +10 -0
  30. package/dist/bundle/chunks/{openai-completions-ERMU2SS7.js → openai-completions-QOT3QX7D.js} +3 -3
  31. package/dist/bundle/chunks/openai-responses-U7LNPQN4.js +2 -0
  32. package/dist/bundle/chunks/{pi-messages-TPFH44NP.js → pi-messages-EGZIFQGG.js} +1 -1
  33. package/dist/bundle/cli.js +1 -1
  34. package/dist/bundle/client.js +1 -1
  35. package/dist/bundle/coordinator.js +3 -0
  36. package/dist/bundle/index.js +1 -1
  37. package/dist/bundle/rpc-entry.js +1 -1
  38. package/dist/cli/args.d.ts.map +1 -1
  39. package/dist/cli/args.js +2 -0
  40. package/dist/cli/args.js.map +1 -1
  41. package/dist/cli/config-selector.d.ts.map +1 -1
  42. package/dist/cli/config-selector.js +2 -1
  43. package/dist/cli/config-selector.js.map +1 -1
  44. package/dist/cli/experimental/cli.d.ts +7 -3
  45. package/dist/cli/experimental/cli.d.ts.map +1 -1
  46. package/dist/cli/experimental/cli.js +6 -2
  47. package/dist/cli/experimental/cli.js.map +1 -1
  48. package/dist/cli/experimental/command-options.d.ts +23 -12
  49. package/dist/cli/experimental/command-options.d.ts.map +1 -1
  50. package/dist/cli/experimental/command-options.js +69 -20
  51. package/dist/cli/experimental/command-options.js.map +1 -1
  52. package/dist/cli/experimental/command.d.ts +10 -3
  53. package/dist/cli/experimental/command.d.ts.map +1 -1
  54. package/dist/cli/experimental/command.js +28 -14
  55. package/dist/cli/experimental/command.js.map +1 -1
  56. package/dist/cli/experimental/commands/client.d.ts +8 -2
  57. package/dist/cli/experimental/commands/client.d.ts.map +1 -1
  58. package/dist/cli/experimental/commands/client.js +43 -5
  59. package/dist/cli/experimental/commands/client.js.map +1 -1
  60. package/dist/cli/experimental/commands/server.d.ts +7 -3
  61. package/dist/cli/experimental/commands/server.d.ts.map +1 -1
  62. package/dist/cli/experimental/commands/server.js +27 -8
  63. package/dist/cli/experimental/commands/server.js.map +1 -1
  64. package/dist/cli.d.ts.map +1 -1
  65. package/dist/cli.js +23 -14
  66. package/dist/cli.js.map +1 -1
  67. package/dist/client/index.d.ts +1 -2
  68. package/dist/client/index.d.ts.map +1 -1
  69. package/dist/client/index.js +1 -2
  70. package/dist/client/index.js.map +1 -1
  71. package/dist/config.d.ts +1 -0
  72. package/dist/config.d.ts.map +1 -1
  73. package/dist/config.js +1 -0
  74. package/dist/config.js.map +1 -1
  75. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  76. package/dist/core/agent-session-runtime.js +15 -7
  77. package/dist/core/agent-session-runtime.js.map +1 -1
  78. package/dist/core/agent-session.d.ts +2 -6
  79. package/dist/core/agent-session.d.ts.map +1 -1
  80. package/dist/core/agent-session.js +14 -6
  81. package/dist/core/agent-session.js.map +1 -1
  82. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  83. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  84. package/dist/core/compaction/branch-summarization.js +2 -1
  85. package/dist/core/compaction/branch-summarization.js.map +1 -1
  86. package/dist/core/extensions/loader.d.ts.map +1 -1
  87. package/dist/core/extensions/loader.js +1 -2
  88. package/dist/core/extensions/loader.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +8 -2
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/extensions/types.js.map +1 -1
  92. package/dist/core/http-dispatcher.d.ts.map +1 -1
  93. package/dist/core/http-dispatcher.js +2 -0
  94. package/dist/core/http-dispatcher.js.map +1 -1
  95. package/dist/core/messages.d.ts +1 -1
  96. package/dist/core/messages.d.ts.map +1 -1
  97. package/dist/core/messages.js.map +1 -1
  98. package/dist/core/model-config.d.ts +15 -0
  99. package/dist/core/model-config.d.ts.map +1 -1
  100. package/dist/core/model-config.js +3 -0
  101. package/dist/core/model-config.js.map +1 -1
  102. package/dist/core/model-runtime.d.ts +1 -0
  103. package/dist/core/model-runtime.d.ts.map +1 -1
  104. package/dist/core/model-runtime.js +5 -2
  105. package/dist/core/model-runtime.js.map +1 -1
  106. package/dist/core/provider-composer.d.ts.map +1 -1
  107. package/dist/core/provider-composer.js +8 -2
  108. package/dist/core/provider-composer.js.map +1 -1
  109. package/dist/core/session-manager.d.ts +3 -2
  110. package/dist/core/session-manager.d.ts.map +1 -1
  111. package/dist/core/session-manager.js +40 -13
  112. package/dist/core/session-manager.js.map +1 -1
  113. package/dist/core/settings-manager.d.ts.map +1 -1
  114. package/dist/core/settings-manager.js.map +1 -1
  115. package/dist/core/skills.d.ts +1 -1
  116. package/dist/core/skills.d.ts.map +1 -1
  117. package/dist/core/skills.js +4 -2
  118. package/dist/core/skills.js.map +1 -1
  119. package/dist/core/system-prompt.d.ts.map +1 -1
  120. package/dist/core/system-prompt.js +8 -9
  121. package/dist/core/system-prompt.js.map +1 -1
  122. package/dist/core/tools/bash.d.ts.map +1 -1
  123. package/dist/core/tools/bash.js +3 -117
  124. package/dist/core/tools/bash.js.map +1 -1
  125. package/dist/core/tools/edit.d.ts +1 -12
  126. package/dist/core/tools/edit.d.ts.map +1 -1
  127. package/dist/core/tools/edit.js +5 -163
  128. package/dist/core/tools/edit.js.map +1 -1
  129. package/dist/core/tools/find.d.ts.map +1 -1
  130. package/dist/core/tools/find.js +4 -55
  131. package/dist/core/tools/find.js.map +1 -1
  132. package/dist/core/tools/grep.d.ts.map +1 -1
  133. package/dist/core/tools/grep.js +4 -60
  134. package/dist/core/tools/grep.js.map +1 -1
  135. package/dist/core/tools/ls.d.ts.map +1 -1
  136. package/dist/core/tools/ls.js +4 -49
  137. package/dist/core/tools/ls.js.map +1 -1
  138. package/dist/core/tools/read.d.ts.map +1 -1
  139. package/dist/core/tools/read.js +4 -120
  140. package/dist/core/tools/read.js.map +1 -1
  141. package/dist/core/tools/renderers/bash.d.ts +12 -0
  142. package/dist/core/tools/renderers/bash.d.ts.map +1 -0
  143. package/dist/core/tools/renderers/bash.js +130 -0
  144. package/dist/core/tools/renderers/bash.js.map +1 -0
  145. package/dist/core/tools/renderers/edit.d.ts +23 -0
  146. package/dist/core/tools/renderers/edit.d.ts.map +1 -0
  147. package/dist/core/tools/renderers/edit.js +167 -0
  148. package/dist/core/tools/renderers/edit.js.map +1 -0
  149. package/dist/core/tools/renderers/find.d.ts +10 -0
  150. package/dist/core/tools/renderers/find.d.ts.map +1 -0
  151. package/dist/core/tools/renderers/find.js +64 -0
  152. package/dist/core/tools/renderers/find.js.map +1 -0
  153. package/dist/core/tools/renderers/grep.d.ts +10 -0
  154. package/dist/core/tools/renderers/grep.d.ts.map +1 -0
  155. package/dist/core/tools/renderers/grep.js +69 -0
  156. package/dist/core/tools/renderers/grep.js.map +1 -0
  157. package/dist/core/tools/renderers/index.d.ts +28 -0
  158. package/dist/core/tools/renderers/index.d.ts.map +1 -0
  159. package/dist/core/tools/renderers/index.js +47 -0
  160. package/dist/core/tools/renderers/index.js.map +1 -0
  161. package/dist/core/tools/renderers/ls.d.ts +10 -0
  162. package/dist/core/tools/renderers/ls.d.ts.map +1 -0
  163. package/dist/core/tools/renderers/ls.js +58 -0
  164. package/dist/core/tools/renderers/ls.js.map +1 -0
  165. package/dist/core/tools/renderers/read.d.ts +11 -0
  166. package/dist/core/tools/renderers/read.d.ts.map +1 -0
  167. package/dist/core/tools/renderers/read.js +129 -0
  168. package/dist/core/tools/renderers/read.js.map +1 -0
  169. package/dist/core/tools/renderers/write.d.ts +10 -0
  170. package/dist/core/tools/renderers/write.d.ts.map +1 -0
  171. package/dist/core/tools/renderers/write.js +153 -0
  172. package/dist/core/tools/renderers/write.js.map +1 -0
  173. package/dist/core/tools/write.d.ts.map +1 -1
  174. package/dist/core/tools/write.js +5 -146
  175. package/dist/core/tools/write.js.map +1 -1
  176. package/dist/experimental/client-runtime.d.ts +43 -0
  177. package/dist/experimental/client-runtime.d.ts.map +1 -0
  178. package/dist/experimental/client-runtime.js +183 -0
  179. package/dist/experimental/client-runtime.js.map +1 -0
  180. package/dist/experimental/client-tui-chat.d.ts +14 -0
  181. package/dist/experimental/client-tui-chat.d.ts.map +1 -0
  182. package/dist/experimental/client-tui-chat.js +171 -0
  183. package/dist/experimental/client-tui-chat.js.map +1 -0
  184. package/dist/experimental/client-tui.d.ts +37 -0
  185. package/dist/experimental/client-tui.d.ts.map +1 -0
  186. package/dist/experimental/client-tui.js +702 -0
  187. package/dist/experimental/client-tui.js.map +1 -0
  188. package/dist/experimental/client.d.ts +25 -0
  189. package/dist/experimental/client.d.ts.map +1 -0
  190. package/dist/experimental/client.js +99 -0
  191. package/dist/experimental/client.js.map +1 -0
  192. package/dist/experimental/coordinator-entry.d.ts +3 -0
  193. package/dist/experimental/coordinator-entry.d.ts.map +1 -0
  194. package/dist/experimental/coordinator-entry.js +11 -0
  195. package/dist/experimental/coordinator-entry.js.map +1 -0
  196. package/dist/experimental/coordinator.d.ts +38 -0
  197. package/dist/experimental/coordinator.d.ts.map +1 -0
  198. package/dist/experimental/coordinator.js +570 -0
  199. package/dist/experimental/coordinator.js.map +1 -0
  200. package/dist/experimental/mini/main.d.ts +7 -0
  201. package/dist/experimental/mini/main.d.ts.map +1 -0
  202. package/dist/experimental/mini/main.js +21 -0
  203. package/dist/experimental/mini/main.js.map +1 -0
  204. package/dist/experimental/mini/server/entry.d.ts +3 -0
  205. package/dist/experimental/mini/server/entry.d.ts.map +1 -0
  206. package/dist/experimental/mini/server/entry.js +11 -0
  207. package/dist/experimental/mini/server/entry.js.map +1 -0
  208. package/dist/experimental/mini/server/run.d.ts +13 -0
  209. package/dist/experimental/mini/server/run.d.ts.map +1 -0
  210. package/dist/experimental/mini/server/run.js +150 -0
  211. package/dist/experimental/mini/server/run.js.map +1 -0
  212. package/dist/experimental/mini/shared/protocol.d.ts +127 -0
  213. package/dist/experimental/mini/shared/protocol.d.ts.map +1 -0
  214. package/dist/experimental/mini/shared/protocol.js +13 -0
  215. package/dist/experimental/mini/shared/protocol.js.map +1 -0
  216. package/dist/experimental/mini/shared/rpc.d.ts +49 -0
  217. package/dist/experimental/mini/shared/rpc.d.ts.map +1 -0
  218. package/dist/experimental/mini/shared/rpc.js +171 -0
  219. package/dist/experimental/mini/shared/rpc.js.map +1 -0
  220. package/dist/experimental/mini/shared/transport.d.ts +35 -0
  221. package/dist/experimental/mini/shared/transport.d.ts.map +1 -0
  222. package/dist/experimental/mini/shared/transport.js +94 -0
  223. package/dist/experimental/mini/shared/transport.js.map +1 -0
  224. package/dist/experimental/mini/tui/run.d.ts +9 -0
  225. package/dist/experimental/mini/tui/run.d.ts.map +1 -0
  226. package/dist/experimental/mini/tui/run.js +62 -0
  227. package/dist/experimental/mini/tui/run.js.map +1 -0
  228. package/dist/experimental/mini/tui/session.d.ts +26 -0
  229. package/dist/experimental/mini/tui/session.d.ts.map +1 -0
  230. package/dist/experimental/mini/tui/session.js +94 -0
  231. package/dist/experimental/mini/tui/session.js.map +1 -0
  232. package/dist/experimental/mini/tui/view.d.ts +10 -0
  233. package/dist/experimental/mini/tui/view.d.ts.map +1 -0
  234. package/dist/experimental/mini/tui/view.js +459 -0
  235. package/dist/experimental/mini/tui/view.js.map +1 -0
  236. package/dist/experimental/mini/worker/entry.d.ts +3 -0
  237. package/dist/experimental/mini/worker/entry.d.ts.map +1 -0
  238. package/dist/experimental/mini/worker/entry.js +10 -0
  239. package/dist/experimental/mini/worker/entry.js.map +1 -0
  240. package/dist/experimental/mini/worker/lane-service.d.ts +44 -0
  241. package/dist/experimental/mini/worker/lane-service.d.ts.map +1 -0
  242. package/dist/experimental/mini/worker/lane-service.js +97 -0
  243. package/dist/experimental/mini/worker/lane-service.js.map +1 -0
  244. package/dist/experimental/mini/worker/models-service.d.ts +19 -0
  245. package/dist/experimental/mini/worker/models-service.d.ts.map +1 -0
  246. package/dist/experimental/mini/worker/models-service.js +136 -0
  247. package/dist/experimental/mini/worker/models-service.js.map +1 -0
  248. package/dist/experimental/mini/worker/run.d.ts +14 -0
  249. package/dist/experimental/mini/worker/run.d.ts.map +1 -0
  250. package/dist/experimental/mini/worker/run.js +88 -0
  251. package/dist/experimental/mini/worker/run.js.map +1 -0
  252. package/dist/experimental/plugin.d.ts +4 -0
  253. package/dist/experimental/plugin.d.ts.map +1 -0
  254. package/dist/experimental/plugin.js +4 -0
  255. package/dist/experimental/plugin.js.map +1 -0
  256. package/dist/experimental/plugins/bundled.d.ts +7 -0
  257. package/dist/experimental/plugins/bundled.d.ts.map +1 -0
  258. package/dist/experimental/plugins/bundled.js +48 -0
  259. package/dist/experimental/plugins/bundled.js.map +1 -0
  260. package/dist/experimental/plugins/package.d.ts +18 -0
  261. package/dist/experimental/plugins/package.d.ts.map +1 -0
  262. package/dist/experimental/plugins/package.js +113 -0
  263. package/dist/experimental/plugins/package.js.map +1 -0
  264. package/dist/experimental/process.d.ts +20 -0
  265. package/dist/experimental/process.d.ts.map +1 -0
  266. package/dist/experimental/process.js +85 -0
  267. package/dist/experimental/process.js.map +1 -0
  268. package/dist/experimental/radius-auth.d.ts +17 -0
  269. package/dist/experimental/radius-auth.d.ts.map +1 -0
  270. package/dist/experimental/radius-auth.js +52 -0
  271. package/dist/experimental/radius-auth.js.map +1 -0
  272. package/dist/experimental/radius-relay.d.ts +90 -0
  273. package/dist/experimental/radius-relay.d.ts.map +1 -0
  274. package/dist/experimental/radius-relay.js +582 -0
  275. package/dist/experimental/radius-relay.js.map +1 -0
  276. package/dist/experimental/server.d.ts +75 -0
  277. package/dist/experimental/server.d.ts.map +1 -0
  278. package/dist/experimental/server.js +682 -0
  279. package/dist/experimental/server.js.map +1 -0
  280. package/dist/experimental/services/agent-controller-provider.d.ts +4 -0
  281. package/dist/experimental/services/agent-controller-provider.d.ts.map +1 -0
  282. package/dist/experimental/services/agent-controller-provider.js +84 -0
  283. package/dist/experimental/services/agent-controller-provider.js.map +1 -0
  284. package/dist/experimental/services/agent-controller.d.ts +57 -0
  285. package/dist/experimental/services/agent-controller.d.ts.map +1 -0
  286. package/dist/experimental/services/agent-controller.js +3 -0
  287. package/dist/experimental/services/agent-controller.js.map +1 -0
  288. package/dist/experimental/services/connection.d.ts +40 -0
  289. package/dist/experimental/services/connection.d.ts.map +1 -0
  290. package/dist/experimental/services/connection.js +300 -0
  291. package/dist/experimental/services/connection.js.map +1 -0
  292. package/dist/experimental/services/models-provider.d.ts +16 -0
  293. package/dist/experimental/services/models-provider.d.ts.map +1 -0
  294. package/dist/experimental/services/models-provider.js +116 -0
  295. package/dist/experimental/services/models-provider.js.map +1 -0
  296. package/dist/experimental/services/models.d.ts +36 -0
  297. package/dist/experimental/services/models.d.ts.map +1 -0
  298. package/dist/experimental/services/models.js +3 -0
  299. package/dist/experimental/services/models.js.map +1 -0
  300. package/dist/experimental/services/plugins.d.ts +16 -0
  301. package/dist/experimental/services/plugins.d.ts.map +1 -0
  302. package/dist/experimental/services/plugins.js +4 -0
  303. package/dist/experimental/services/plugins.js.map +1 -0
  304. package/dist/experimental/services/presentation-ui.d.ts +13 -0
  305. package/dist/experimental/services/presentation-ui.d.ts.map +1 -0
  306. package/dist/experimental/services/presentation-ui.js +3 -0
  307. package/dist/experimental/services/presentation-ui.js.map +1 -0
  308. package/dist/experimental/services/server.d.ts +19 -0
  309. package/dist/experimental/services/server.d.ts.map +1 -0
  310. package/dist/experimental/services/server.js +104 -0
  311. package/dist/experimental/services/server.js.map +1 -0
  312. package/dist/experimental/services/sessions.d.ts +28 -0
  313. package/dist/experimental/services/sessions.d.ts.map +1 -0
  314. package/dist/experimental/services/sessions.js +4 -0
  315. package/dist/experimental/services/sessions.js.map +1 -0
  316. package/dist/experimental/services/slash-commands-provider.d.ts +14 -0
  317. package/dist/experimental/services/slash-commands-provider.d.ts.map +1 -0
  318. package/dist/experimental/services/slash-commands-provider.js +200 -0
  319. package/dist/experimental/services/slash-commands-provider.js.map +1 -0
  320. package/dist/experimental/services/slash-commands.d.ts +24 -0
  321. package/dist/experimental/services/slash-commands.d.ts.map +1 -0
  322. package/dist/experimental/services/slash-commands.js +3 -0
  323. package/dist/experimental/services/slash-commands.js.map +1 -0
  324. package/dist/experimental/services/transcript-provider.d.ts +12 -0
  325. package/dist/experimental/services/transcript-provider.d.ts.map +1 -0
  326. package/dist/experimental/services/transcript-provider.js +109 -0
  327. package/dist/experimental/services/transcript-provider.js.map +1 -0
  328. package/dist/experimental/services/transcript.d.ts +13 -0
  329. package/dist/experimental/services/transcript.d.ts.map +1 -0
  330. package/dist/experimental/services/transcript.js +3 -0
  331. package/dist/experimental/services/transcript.js.map +1 -0
  332. package/dist/experimental/services/worker.d.ts +28 -0
  333. package/dist/experimental/services/worker.d.ts.map +1 -0
  334. package/dist/experimental/services/worker.js +107 -0
  335. package/dist/experimental/services/worker.js.map +1 -0
  336. package/dist/experimental/session-worker-manager.d.ts +24 -0
  337. package/dist/experimental/session-worker-manager.d.ts.map +1 -0
  338. package/dist/experimental/session-worker-manager.js +691 -0
  339. package/dist/experimental/session-worker-manager.js.map +1 -0
  340. package/dist/experimental/session-worker.d.ts +188 -0
  341. package/dist/experimental/session-worker.d.ts.map +1 -0
  342. package/dist/experimental/session-worker.js +785 -0
  343. package/dist/experimental/session-worker.js.map +1 -0
  344. package/dist/experimental/source-resolver.d.ts +2 -0
  345. package/dist/experimental/source-resolver.d.ts.map +1 -0
  346. package/dist/experimental/source-resolver.js +71 -0
  347. package/dist/experimental/source-resolver.js.map +1 -0
  348. package/dist/index.d.ts +1 -1
  349. package/dist/index.d.ts.map +1 -1
  350. package/dist/index.js.map +1 -1
  351. package/dist/main.d.ts.map +1 -1
  352. package/dist/main.js +126 -1
  353. package/dist/main.js.map +1 -1
  354. package/dist/modes/interactive/chat-viewport.d.ts +20 -0
  355. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
  356. package/dist/modes/interactive/chat-viewport.js +28 -0
  357. package/dist/modes/interactive/chat-viewport.js.map +1 -0
  358. package/dist/modes/interactive/components/assistant-message.d.ts +1 -0
  359. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  360. package/dist/modes/interactive/components/assistant-message.js +18 -10
  361. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  362. package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
  363. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/custom-editor.js +39 -1
  365. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  366. package/dist/modes/interactive/components/index.d.ts +1 -1
  367. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  368. package/dist/modes/interactive/components/index.js.map +1 -1
  369. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  370. package/dist/modes/interactive/components/model-selector.js +5 -14
  371. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  372. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  373. package/dist/modes/interactive/components/scoped-models-selector.js +13 -15
  374. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  375. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  376. package/dist/modes/interactive/components/settings-selector.js +14 -10
  377. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  378. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  379. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  380. package/dist/modes/interactive/components/status-indicator.js +10 -3
  381. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  382. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  383. package/dist/modes/interactive/components/thinking-selector.js +2 -2
  384. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  385. package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
  386. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  387. package/dist/modes/interactive/components/tool-execution.js +35 -33
  388. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  389. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  390. package/dist/modes/interactive/components/trust-selector.js +2 -2
  391. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  392. package/dist/modes/interactive/interactive-mode.d.ts +8 -15
  393. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  394. package/dist/modes/interactive/interactive-mode.js +95 -80
  395. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  396. package/dist/modes/interactive/session-share.d.ts.map +1 -1
  397. package/dist/modes/interactive/session-share.js +8 -12
  398. package/dist/modes/interactive/session-share.js.map +1 -1
  399. package/dist/modes/interactive/theme/dark.json +2 -1
  400. package/dist/modes/interactive/theme/light.json +2 -1
  401. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
  402. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  403. package/dist/modes/interactive/theme/theme-controller.js +5 -0
  404. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  405. package/dist/modes/interactive/theme/theme-json.d.ts +84 -0
  406. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -0
  407. package/dist/modes/interactive/theme/theme-json.js +130 -0
  408. package/dist/modes/interactive/theme/theme-json.js.map +1 -0
  409. package/dist/modes/interactive/theme/theme-schema.json +6 -2
  410. package/dist/modes/interactive/theme/theme.d.ts +14 -5
  411. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  412. package/dist/modes/interactive/theme/theme.js +18 -119
  413. package/dist/modes/interactive/theme/theme.js.map +1 -1
  414. package/dist/modes/interactive/tui-renderer.d.ts +21 -0
  415. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
  416. package/dist/modes/interactive/tui-renderer.js +66 -0
  417. package/dist/modes/interactive/tui-renderer.js.map +1 -0
  418. package/dist/utils/exif-orientation.d.ts.map +1 -1
  419. package/dist/utils/exif-orientation.js +2 -3
  420. package/dist/utils/exif-orientation.js.map +1 -1
  421. package/dist/utils/tools-manager.d.ts +1 -0
  422. package/dist/utils/tools-manager.d.ts.map +1 -1
  423. package/dist/utils/tools-manager.js +41 -19
  424. package/dist/utils/tools-manager.js.map +1 -1
  425. package/docs/environment-variables.md +2 -0
  426. package/docs/extensions.md +5 -2
  427. package/docs/keybindings.md +3 -1
  428. package/docs/models.md +3 -0
  429. package/docs/rpc.md +1 -1
  430. package/docs/sdk.md +5 -0
  431. package/docs/settings.md +5 -5
  432. package/docs/skills.md +1 -1
  433. package/docs/terminal-setup.md +15 -0
  434. package/docs/themes.md +8 -6
  435. package/docs/tui.md +20 -1
  436. package/examples/README.md +3 -0
  437. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  438. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  439. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  440. package/examples/extensions/dynamic-resources/dynamic.json +2 -0
  441. package/examples/extensions/gondolin/package-lock.json +2 -2
  442. package/examples/extensions/gondolin/package.json +1 -1
  443. package/examples/extensions/sandbox/package-lock.json +2 -2
  444. package/examples/extensions/sandbox/package.json +1 -1
  445. package/examples/extensions/with-deps/package-lock.json +2 -2
  446. package/examples/extensions/with-deps/package.json +1 -1
  447. package/examples/plugins/pi-example-plugin/README.md +38 -0
  448. package/examples/plugins/pi-example-plugin/package.json +10 -0
  449. package/examples/plugins/pi-example-plugin/src/contract.ts +13 -0
  450. package/examples/plugins/pi-example-plugin/src/session.ts +23 -0
  451. package/examples/plugins/pi-example-plugin/src/tui.ts +31 -0
  452. package/npm-shrinkwrap.json +523 -28
  453. package/package.json +12 -6
  454. package/dist/bun/register-bedrock.d.ts +0 -2
  455. package/dist/bun/register-bedrock.d.ts.map +0 -1
  456. package/dist/bun/register-bedrock.js +0 -4
  457. package/dist/bun/register-bedrock.js.map +0 -1
  458. package/dist/bundle/chunks/anthropic-messages-JWX2WP65.js +0 -45
  459. package/dist/bundle/chunks/chunk-JUUC5AZY.js +0 -2
  460. package/dist/bundle/chunks/chunk-OMWWHBTG.js +0 -1548
  461. package/dist/bundle/chunks/openai-codex-responses-GJVBJXLB.js +0 -8
  462. package/dist/bundle/chunks/openai-responses-BSOJMSEV.js +0 -2
  463. package/dist/cli/experimental/auth.d.ts +0 -16
  464. package/dist/cli/experimental/auth.d.ts.map +0 -1
  465. package/dist/cli/experimental/auth.js +0 -13
  466. package/dist/cli/experimental/auth.js.map +0 -1
  467. package/dist/cli/experimental/commands/pi.d.ts +0 -15
  468. package/dist/cli/experimental/commands/pi.d.ts.map +0 -1
  469. package/dist/cli/experimental/commands/pi.js +0 -28
  470. package/dist/cli/experimental/commands/pi.js.map +0 -1
  471. package/dist/cli/experimental/transport-address.d.ts +0 -10
  472. package/dist/cli/experimental/transport-address.d.ts.map +0 -1
  473. package/dist/cli/experimental/transport-address.js +0 -38
  474. package/dist/cli/experimental/transport-address.js.map +0 -1
  475. package/dist/client/remote-session.d.ts +0 -53
  476. package/dist/client/remote-session.d.ts.map +0 -1
  477. package/dist/client/remote-session.js +0 -340
  478. package/dist/client/remote-session.js.map +0 -1
  479. package/dist/client/transcript.d.ts +0 -12
  480. package/dist/client/transcript.d.ts.map +0 -1
  481. package/dist/client/transcript.js +0 -98
  482. package/dist/client/transcript.js.map +0 -1
  483. package/dist/server/create-harness.d.ts +0 -26
  484. package/dist/server/create-harness.d.ts.map +0 -1
  485. package/dist/server/create-harness.js +0 -106
  486. package/dist/server/create-harness.js.map +0 -1
@@ -0,0 +1,785 @@
1
+ import { createConnection } from "node:net";
2
+ import { isAbsolute } from "node:path";
3
+ import { isJsonValue, parseServiceProviderUpdate, REMOTE_SERVICE_ERROR_CODES, RemoteServiceError, } from "@earendil-works/chord";
4
+ import { AgentHarness, BACKGROUND_CONTEXT, createBashTool, createReadTool, createWriteTool, JsonlSessionRepo, TODO_CONTEXT, withCancel, } from "@earendil-works/pi-agent-core";
5
+ import { NodeExecutionEnv } from "@earendil-works/pi-agent-core/node";
6
+ import lockfile from "proper-lockfile";
7
+ import Type from "typebox";
8
+ import { Check } from "typebox/value";
9
+ import { findInitialModel, resolveCliModel } from "../core/model-resolver.js";
10
+ import { ModelRuntime } from "../core/model-runtime.js";
11
+ import { SettingsManager } from "../core/settings-manager.js";
12
+ import { COORDINATOR_PROTOCOL_VERSION } from "./coordinator.js";
13
+ import { createSessionPluginFacetLoader } from "./plugins/bundled.js";
14
+ import { consumeInternalProcessRole, encodeControlLine, isDirectInternalProcessEntry, MAX_CONTROL_LINE_BYTES, } from "./process.js";
15
+ import { createSessionWorkerServices, } from "./services/worker.js";
16
+ const StrictObject = (properties) => Type.Object(properties, { additionalProperties: false });
17
+ const OpaqueJsonValueSchema = Type.Unsafe(Type.Unknown());
18
+ const ServiceCallSchema = Type.Unsafe(StrictObject({
19
+ serviceId: Type.String({ minLength: 1 }),
20
+ instance: Type.Optional(StrictObject({ key: Type.String({ minLength: 1 }), generation: Type.Integer({ minimum: 1 }) })),
21
+ member: Type.String({ minLength: 1 }),
22
+ args: Type.Array(Type.Unknown()),
23
+ }));
24
+ const RemoteServiceErrorCodeSchema = Type.Unsafe(Type.String({ pattern: `^(?:${REMOTE_SERVICE_ERROR_CODES.join("|")})$` }));
25
+ export const SESSION_WORKER_CONTROL_ADDRESS_ENV = "PI_SESSION_WORKER_CONTROL_ADDRESS";
26
+ export const SESSION_WORKER_CONTROL_TOKEN_ENV = "PI_SESSION_WORKER_CONTROL_TOKEN";
27
+ export const SESSION_WORKER_SESSION_KEY_ENV = "PI_SESSION_WORKER_SESSION_KEY_BASE64";
28
+ export const SESSION_WORKER_PEER_ID_ENV = "PI_SESSION_WORKER_PEER_ID";
29
+ export const SessionWorkerMetadataSchema = StrictObject({
30
+ id: Type.String({ minLength: 1 }),
31
+ createdAt: Type.Integer(),
32
+ storageVersion: Type.Integer(),
33
+ cwd: Type.String(),
34
+ path: Type.String(),
35
+ modifiedAt: Type.Number(),
36
+ parentSessionId: Type.Optional(Type.String()),
37
+ });
38
+ export const SessionWorkerOptionsSchema = StrictObject({
39
+ sessionDir: Type.String({ minLength: 1 }),
40
+ metadata: SessionWorkerMetadataSchema,
41
+ provider: Type.Optional(Type.String({ minLength: 1 })),
42
+ model: Type.Optional(Type.String({ minLength: 1 })),
43
+ pluginManifestPaths: Type.Array(Type.String({ minLength: 1 })),
44
+ });
45
+ export const WorkerOperationScopeSchema = StrictObject({
46
+ serverConnectionId: Type.String(),
47
+ attachmentId: Type.String(),
48
+ });
49
+ export const WorkerOperationRequestSchema = StrictObject({
50
+ type: Type.Literal("operation"),
51
+ requestId: Type.String({ minLength: 1 }),
52
+ scope: WorkerOperationScopeSchema,
53
+ call: ServiceCallSchema,
54
+ });
55
+ export const WorkerOperationResponseSchema = Type.Union([
56
+ StrictObject({
57
+ type: Type.Literal("operation_result"),
58
+ requestId: Type.String({ minLength: 1 }),
59
+ scope: WorkerOperationScopeSchema,
60
+ result: Type.Optional(OpaqueJsonValueSchema),
61
+ }),
62
+ StrictObject({
63
+ type: Type.Literal("operation_error"),
64
+ requestId: Type.String({ minLength: 1 }),
65
+ scope: WorkerOperationScopeSchema,
66
+ code: Type.Optional(RemoteServiceErrorCodeSchema),
67
+ message: Type.String(),
68
+ }),
69
+ ]);
70
+ export const SessionWorkerCommandSchema = Type.Union([
71
+ Type.Object({ type: Type.Literal("shutdown") }),
72
+ Type.Object({ type: Type.Literal("discover_workers") }),
73
+ Type.Object({
74
+ type: Type.Literal("session_demand"),
75
+ serverConnectionId: Type.String(),
76
+ requestId: Type.String(),
77
+ attachmentId: Type.String(),
78
+ attached: Type.Boolean(),
79
+ }),
80
+ WorkerOperationRequestSchema,
81
+ StrictObject({
82
+ type: Type.Literal("operation_cancel"),
83
+ requestId: Type.String({ minLength: 1 }),
84
+ scope: WorkerOperationScopeSchema,
85
+ }),
86
+ ]);
87
+ export const SessionWorkerEventSchema = Type.Union([
88
+ Type.Object({
89
+ type: Type.Literal("worker_ready"),
90
+ token: Type.String(),
91
+ sessionKey: Type.String(),
92
+ sessionId: Type.String(),
93
+ pid: Type.Integer({ minimum: 1 }),
94
+ metadata: SessionWorkerMetadataSchema,
95
+ pluginManifestPaths: Type.Array(Type.String({ minLength: 1 })),
96
+ }),
97
+ Type.Object({
98
+ type: Type.Literal("worker_failed"),
99
+ token: Type.String(),
100
+ sessionKey: Type.String(),
101
+ message: Type.String(),
102
+ }),
103
+ Type.Object({
104
+ type: Type.Literal("demand_applied"),
105
+ token: Type.String(),
106
+ sessionKey: Type.String(),
107
+ requestId: Type.String(),
108
+ attachmentId: Type.String(),
109
+ attached: Type.Boolean(),
110
+ }),
111
+ Type.Object({
112
+ type: Type.Literal("demand_rejected"),
113
+ token: Type.String(),
114
+ sessionKey: Type.String(),
115
+ requestId: Type.String(),
116
+ message: Type.String(),
117
+ }),
118
+ Type.Object({
119
+ type: Type.Literal("operation_response"),
120
+ token: Type.String(),
121
+ sessionKey: Type.String(),
122
+ response: WorkerOperationResponseSchema,
123
+ }),
124
+ Type.Object({
125
+ type: Type.Literal("service_update"),
126
+ token: Type.String(),
127
+ sessionKey: Type.String(),
128
+ scope: WorkerOperationScopeSchema,
129
+ subscriptionId: Type.String({ minLength: 1 }),
130
+ update: Type.Unknown(),
131
+ }),
132
+ ]);
133
+ /** Worker-local reconciliation of server-generation demand and Harness activity. */
134
+ export class WorkerLifecycle {
135
+ #initialDemandGraceMs;
136
+ #orphanDemandGraceMs;
137
+ #onRetire;
138
+ #demands = new Map();
139
+ #activeOperations = new Set();
140
+ #currentServerConnectionId;
141
+ #initialTimer;
142
+ #demandInitialized;
143
+ #retirementHolds = 0;
144
+ #retiring = false;
145
+ constructor(options) {
146
+ this.#currentServerConnectionId = options.initialServerConnectionId;
147
+ this.#initialDemandGraceMs = options.initialDemandGraceMs;
148
+ this.#orphanDemandGraceMs = options.orphanDemandGraceMs;
149
+ this.#onRetire = options.onRetire;
150
+ this.#demandInitialized = false;
151
+ this.#initialTimer = setTimeout(() => {
152
+ this.#initialTimer = undefined;
153
+ this.#demandInitialized = true;
154
+ this.#reconcile();
155
+ }, this.#initialDemandGraceMs);
156
+ this.#initialTimer.unref();
157
+ }
158
+ serverConnected(serverConnectionId) {
159
+ this.#currentServerConnectionId = serverConnectionId;
160
+ for (const demand of this.#demands.values()) {
161
+ if (demand.serverConnectionId !== serverConnectionId || !demand.timer)
162
+ continue;
163
+ clearTimeout(demand.timer);
164
+ delete demand.timer;
165
+ }
166
+ }
167
+ serverDisconnected(serverConnectionId) {
168
+ if (this.#currentServerConnectionId === serverConnectionId)
169
+ this.#currentServerConnectionId = undefined;
170
+ for (const [key, demand] of this.#demands) {
171
+ if (demand.serverConnectionId !== serverConnectionId || demand.timer)
172
+ continue;
173
+ demand.timer = setTimeout(() => {
174
+ if (this.#demands.get(key) !== demand)
175
+ return;
176
+ this.#demands.delete(key);
177
+ this.#reconcile();
178
+ }, this.#orphanDemandGraceMs);
179
+ demand.timer.unref();
180
+ }
181
+ }
182
+ beginRequest(serverConnectionId, attachmentId) {
183
+ if (this.#retiring)
184
+ throw new Error("Session worker is retiring");
185
+ if (serverConnectionId !== this.#currentServerConnectionId) {
186
+ throw new Error("Session worker received a request from a stale server generation");
187
+ }
188
+ const demand = this.#demands.get(demandKey(serverConnectionId, attachmentId));
189
+ if (!demand || demand.timer) {
190
+ throw new Error("Session worker request does not match the active attachment");
191
+ }
192
+ return this.holdRetirement();
193
+ }
194
+ holdRetirement() {
195
+ this.#retirementHolds += 1;
196
+ let released = false;
197
+ return () => {
198
+ if (released)
199
+ return;
200
+ released = true;
201
+ this.#retirementHolds -= 1;
202
+ this.#reconcile();
203
+ };
204
+ }
205
+ setDemand(serverConnectionId, attachmentId, attached) {
206
+ if (this.#retiring)
207
+ throw new Error("Session worker is retiring");
208
+ if (serverConnectionId !== this.#currentServerConnectionId) {
209
+ throw new Error("Session worker received demand from a stale server generation");
210
+ }
211
+ this.#demandInitialized = true;
212
+ if (this.#initialTimer) {
213
+ clearTimeout(this.#initialTimer);
214
+ this.#initialTimer = undefined;
215
+ }
216
+ const key = demandKey(serverConnectionId, attachmentId);
217
+ const previous = this.#demands.get(key);
218
+ if (previous?.timer)
219
+ clearTimeout(previous.timer);
220
+ if (attached)
221
+ this.#demands.set(key, { serverConnectionId, attachmentId });
222
+ else
223
+ this.#demands.delete(key);
224
+ this.#reconcile();
225
+ }
226
+ operationStarted(kind, lane, operationId) {
227
+ this.#activeOperations.add(`${kind}\0${lane}\0${operationId}`);
228
+ }
229
+ operationStopped(kind, lane, operationId) {
230
+ this.#activeOperations.delete(`${kind}\0${lane}\0${operationId}`);
231
+ this.#reconcile();
232
+ }
233
+ close() {
234
+ if (this.#initialTimer)
235
+ clearTimeout(this.#initialTimer);
236
+ for (const demand of this.#demands.values()) {
237
+ if (demand.timer)
238
+ clearTimeout(demand.timer);
239
+ }
240
+ this.#demands.clear();
241
+ }
242
+ #reconcile() {
243
+ if (this.#retiring ||
244
+ !this.#demandInitialized ||
245
+ this.#retirementHolds !== 0 ||
246
+ this.#activeOperations.size !== 0 ||
247
+ this.#demands.size !== 0) {
248
+ return;
249
+ }
250
+ this.#retiring = true;
251
+ this.#onRetire();
252
+ }
253
+ }
254
+ const DEFAULT_INITIAL_DEMAND_GRACE_MS = 10_000;
255
+ const DEFAULT_ORPHAN_DEMAND_GRACE_MS = 30_000;
256
+ export const SESSION_WORKER_INITIAL_DEMAND_GRACE_ENV = "__PI_SESSION_WORKER_INITIAL_DEMAND_GRACE_MS";
257
+ export const SESSION_WORKER_ORPHAN_DEMAND_GRACE_ENV = "__PI_SESSION_WORKER_ORPHAN_DEMAND_GRACE_MS";
258
+ const CoordinatorInputSchema = Type.Union([
259
+ Type.Object({
260
+ type: Type.Literal("peer_registered"),
261
+ peerId: Type.String(),
262
+ serverConnectionId: Type.Optional(Type.String()),
263
+ }),
264
+ Type.Object({ type: Type.Literal("server_connected"), serverConnectionId: Type.String() }),
265
+ Type.Object({ type: Type.Literal("server_disconnected"), serverConnectionId: Type.String() }),
266
+ Type.Object({ type: Type.Literal("message"), from: Type.Literal("server"), payload: Type.Unknown() }),
267
+ ]);
268
+ let failureControl;
269
+ async function connectControl() {
270
+ const address = process.env[SESSION_WORKER_CONTROL_ADDRESS_ENV];
271
+ const token = process.env[SESSION_WORKER_CONTROL_TOKEN_ENV];
272
+ const encodedSessionKey = process.env[SESSION_WORKER_SESSION_KEY_ENV];
273
+ if (!address || !token || !encodedSessionKey)
274
+ throw new Error("Session worker requires a control address");
275
+ const peerId = process.env[SESSION_WORKER_PEER_ID_ENV];
276
+ if (!peerId)
277
+ throw new Error("Session worker requires a peer ID");
278
+ const socket = createConnection(address);
279
+ await new Promise((resolve, reject) => {
280
+ socket.once("connect", resolve);
281
+ socket.once("error", reject);
282
+ });
283
+ const messages = createJsonLineMessages(socket);
284
+ await writeJsonLine(socket, { type: "register_peer", protocol: COORDINATOR_PROTOCOL_VERSION, peerId });
285
+ const registered = await messages[Symbol.asyncIterator]().next();
286
+ if (registered.done ||
287
+ !Check(CoordinatorInputSchema, registered.value) ||
288
+ registered.value.type !== "peer_registered") {
289
+ throw new Error("Coordinator rejected the session worker registration");
290
+ }
291
+ return {
292
+ ...(registered.value.serverConnectionId === undefined
293
+ ? {}
294
+ : { initialServerConnectionId: registered.value.serverConnectionId }),
295
+ messages,
296
+ socket,
297
+ send: (event) => writeJsonLine(socket, { type: "send", to: "server", payload: event }),
298
+ };
299
+ }
300
+ async function readCommands(control, handlers) {
301
+ for await (const value of control.messages) {
302
+ if (!Check(CoordinatorInputSchema, value)) {
303
+ control.socket.destroy(new Error("Coordinator sent an invalid worker message"));
304
+ return;
305
+ }
306
+ const message = value;
307
+ if (message.type === "server_connected") {
308
+ handlers.onServerConnected(message.serverConnectionId);
309
+ continue;
310
+ }
311
+ if (message.type === "server_disconnected") {
312
+ handlers.onServerDisconnected(message.serverConnectionId);
313
+ continue;
314
+ }
315
+ if (message.type !== "message" || !Check(SessionWorkerCommandSchema, message.payload))
316
+ continue;
317
+ const command = message.payload;
318
+ if (command.type === "shutdown")
319
+ handlers.onShutdown();
320
+ else if (command.type === "discover_workers")
321
+ handlers.onDiscovery();
322
+ else if (command.type === "session_demand")
323
+ await handlers.onDemand(command);
324
+ else if (command.type === "operation_cancel")
325
+ handlers.onOperationCancel(command);
326
+ else
327
+ handlers.onOperation(command);
328
+ }
329
+ }
330
+ function createJsonLineMessages(socket) {
331
+ const queued = [];
332
+ const waiters = [];
333
+ let buffered = "";
334
+ socket.setEncoding("utf8");
335
+ socket.on("data", (chunk) => {
336
+ buffered += chunk;
337
+ if (Buffer.byteLength(buffered) > MAX_CONTROL_LINE_BYTES) {
338
+ socket.destroy(new Error("Session worker control message is too large"));
339
+ return;
340
+ }
341
+ while (true) {
342
+ const newline = buffered.indexOf("\n");
343
+ if (newline === -1)
344
+ return;
345
+ const line = buffered.slice(0, newline);
346
+ buffered = buffered.slice(newline + 1);
347
+ try {
348
+ const value = JSON.parse(line);
349
+ const waiter = waiters.shift();
350
+ if (waiter)
351
+ waiter(value);
352
+ else
353
+ queued.push(value);
354
+ }
355
+ catch {
356
+ socket.destroy(new Error("Session worker received invalid control JSON"));
357
+ return;
358
+ }
359
+ }
360
+ });
361
+ return {
362
+ [Symbol.asyncIterator]() {
363
+ return {
364
+ next: async () => {
365
+ const value = queued.shift() ?? (await new Promise((resolve) => waiters.push(resolve)));
366
+ return { done: false, value };
367
+ },
368
+ };
369
+ },
370
+ };
371
+ }
372
+ function writeJsonLine(socket, message) {
373
+ return new Promise((resolve, reject) => {
374
+ socket.write(encodeControlLine(message), (error) => {
375
+ if (error)
376
+ reject(error);
377
+ else
378
+ resolve();
379
+ });
380
+ });
381
+ }
382
+ function toWorkerServiceUpdate(update) {
383
+ if (!isJsonValue(update))
384
+ throw new Error("Service produced a non-JSON update");
385
+ return parseServiceProviderUpdate(update);
386
+ }
387
+ function demandKey(serverConnectionId, attachmentId) {
388
+ return `${serverConnectionId}\0${attachmentId}`;
389
+ }
390
+ function sameScope(left, right) {
391
+ return left.serverConnectionId === right.serverConnectionId && left.attachmentId === right.attachmentId;
392
+ }
393
+ function lifecycleDelay(name, fallback) {
394
+ const value = process.env[name];
395
+ if (value === undefined)
396
+ return fallback;
397
+ const parsed = Number(value);
398
+ if (!Number.isSafeInteger(parsed) || parsed < 0)
399
+ throw new Error(`${name} must be a non-negative safe integer`);
400
+ return parsed;
401
+ }
402
+ async function closeResources(resources) {
403
+ const errors = [];
404
+ try {
405
+ await resources.services?.dispose();
406
+ }
407
+ catch (error) {
408
+ errors.push(error);
409
+ }
410
+ try {
411
+ if (resources.harness)
412
+ await resources.harness.close(TODO_CONTEXT);
413
+ else
414
+ await resources.session?.close(TODO_CONTEXT);
415
+ }
416
+ catch (error) {
417
+ errors.push(error);
418
+ }
419
+ try {
420
+ await resources.repo.close(TODO_CONTEXT);
421
+ }
422
+ catch (error) {
423
+ errors.push(error);
424
+ }
425
+ try {
426
+ await resources.executionEnv.cleanup(TODO_CONTEXT);
427
+ }
428
+ catch (error) {
429
+ errors.push(error);
430
+ }
431
+ try {
432
+ await resources.releaseOwnership();
433
+ }
434
+ catch (error) {
435
+ errors.push(error);
436
+ }
437
+ if (errors.length === 1)
438
+ throw errors[0];
439
+ if (errors.length > 1)
440
+ throw new AggregateError(errors, "Session worker cleanup failed");
441
+ }
442
+ async function run(options, createHarness) {
443
+ const { sessionDir, metadata } = options;
444
+ const sessionId = metadata.id;
445
+ const control = await connectControl();
446
+ const token = process.env[SESSION_WORKER_CONTROL_TOKEN_ENV];
447
+ const sessionKey = Buffer.from(process.env[SESSION_WORKER_SESSION_KEY_ENV], "base64url").toString();
448
+ failureControl = control;
449
+ const pluginManifestPaths = options.pluginManifestPaths;
450
+ const releaseOwnership = await lockfile.lock(metadata.path, {
451
+ realpath: true,
452
+ stale: 2_000,
453
+ update: 1_000,
454
+ retries: { retries: 320, factor: 1, minTimeout: 25, maxTimeout: 25, maxRetryTime: 8_000 },
455
+ });
456
+ const executionEnv = new NodeExecutionEnv({ cwd: metadata.cwd });
457
+ const repo = new JsonlSessionRepo({ fileSystem: executionEnv, sessionsRoot: sessionDir });
458
+ let session;
459
+ let harness;
460
+ let lane;
461
+ let services;
462
+ try {
463
+ session = await repo.open(metadata, TODO_CONTEXT);
464
+ const runtime = await createHarness(session, options, executionEnv);
465
+ harness = runtime.harness;
466
+ lane = runtime.lane ?? (await harness.lane("main", TODO_CONTEXT));
467
+ services = await createSessionWorkerServices({
468
+ lane,
469
+ modelRuntime: runtime.modelRuntime,
470
+ settingsManager: runtime.settingsManager,
471
+ facetLoader: runtime.facetLoader,
472
+ publish: (scope, subscriptionId, update) => control.send({
473
+ type: "service_update",
474
+ token,
475
+ sessionKey,
476
+ scope,
477
+ subscriptionId,
478
+ update: toWorkerServiceUpdate(update),
479
+ }),
480
+ });
481
+ }
482
+ catch (error) {
483
+ try {
484
+ await closeResources({ harness, services, session, repo, executionEnv, releaseOwnership });
485
+ }
486
+ catch (cleanupError) {
487
+ throw new AggregateError([error, cleanupError], "Session worker startup and cleanup failed");
488
+ }
489
+ throw error;
490
+ }
491
+ const activeRequests = new Map();
492
+ let lifecycle;
493
+ let removeLifecycleListeners = [];
494
+ let closing;
495
+ const close = () => {
496
+ if (closing)
497
+ return closing;
498
+ lifecycle?.close();
499
+ services.removeSubscriptions(() => true);
500
+ for (const request of activeRequests.values())
501
+ request.cancel(new Error("Session worker is closing"));
502
+ activeRequests.clear();
503
+ for (const remove of removeLifecycleListeners)
504
+ remove();
505
+ removeLifecycleListeners = [];
506
+ closing = closeResources({ harness, services, repo, executionEnv, releaseOwnership });
507
+ return closing;
508
+ };
509
+ const closeAndExit = () => {
510
+ void close().then(() => process.exit(0), (error) => {
511
+ console.error(error);
512
+ process.exit(1);
513
+ });
514
+ };
515
+ lifecycle = new WorkerLifecycle({
516
+ initialServerConnectionId: control.initialServerConnectionId,
517
+ initialDemandGraceMs: lifecycleDelay(SESSION_WORKER_INITIAL_DEMAND_GRACE_ENV, DEFAULT_INITIAL_DEMAND_GRACE_MS),
518
+ orphanDemandGraceMs: lifecycleDelay(SESSION_WORKER_ORPHAN_DEMAND_GRACE_ENV, DEFAULT_ORPHAN_DEMAND_GRACE_MS),
519
+ onRetire: closeAndExit,
520
+ });
521
+ removeLifecycleListeners = [
522
+ harness.events.on("run_start", (event) => lifecycle?.operationStarted("run", event.lane, event.runId)),
523
+ harness.events.on("run_resume", (event) => lifecycle?.operationStarted("run", event.lane, event.runId)),
524
+ harness.events.on("run_suspend", (event) => lifecycle?.operationStopped("run", event.lane, event.runId)),
525
+ harness.events.on("run_end", (event) => lifecycle?.operationStopped("run", event.lane, event.runId)),
526
+ harness.events.on("compaction_start", (event) => lifecycle?.operationStarted("compaction", event.lane, event.runId)),
527
+ harness.events.on("compaction_end", (event) => lifecycle?.operationStopped("compaction", event.lane, event.runId)),
528
+ harness.events.on("navigation_start", (event) => lifecycle?.operationStarted("navigation", event.lane, event.runId)),
529
+ harness.events.on("navigation_end", (event) => lifecycle?.operationStopped("navigation", event.lane, event.runId)),
530
+ harness.events.on("fault", closeAndExit),
531
+ ];
532
+ const handleOperation = async (request) => {
533
+ let releaseRequest = () => { };
534
+ const cancellable = withCancel(BACKGROUND_CONTEXT);
535
+ try {
536
+ releaseRequest = lifecycle.beginRequest(request.scope.serverConnectionId, request.scope.attachmentId);
537
+ activeRequests.set(request.requestId, { scope: request.scope, cancel: cancellable.cancel });
538
+ const result = await services.invoke(request.call, request.scope, cancellable.context);
539
+ if (result !== undefined && !isJsonValue(result))
540
+ throw new Error("Service produced a non-JSON result");
541
+ await control.send({
542
+ type: "operation_response",
543
+ token,
544
+ sessionKey,
545
+ response: {
546
+ type: "operation_result",
547
+ requestId: request.requestId,
548
+ scope: request.scope,
549
+ ...(result === undefined ? {} : { result }),
550
+ },
551
+ });
552
+ }
553
+ catch (error) {
554
+ let code;
555
+ if (error instanceof RemoteServiceError) {
556
+ code = error.code;
557
+ }
558
+ else if (error instanceof Error && "code" in error) {
559
+ const candidate = error.code;
560
+ if (Check(RemoteServiceErrorCodeSchema, candidate))
561
+ code = candidate;
562
+ }
563
+ await control.send({
564
+ type: "operation_response",
565
+ token,
566
+ sessionKey,
567
+ response: {
568
+ type: "operation_error",
569
+ requestId: request.requestId,
570
+ scope: request.scope,
571
+ ...(code === undefined ? {} : { code }),
572
+ message: error instanceof Error ? error.message : String(error),
573
+ },
574
+ });
575
+ }
576
+ finally {
577
+ if (activeRequests.get(request.requestId)?.cancel === cancellable.cancel) {
578
+ activeRequests.delete(request.requestId);
579
+ }
580
+ releaseRequest();
581
+ }
582
+ };
583
+ let ready = false;
584
+ const announce = () => {
585
+ if (!ready)
586
+ return;
587
+ void control
588
+ .send({
589
+ type: "worker_ready",
590
+ token,
591
+ sessionKey,
592
+ sessionId,
593
+ pid: process.pid,
594
+ metadata,
595
+ pluginManifestPaths: [...pluginManifestPaths],
596
+ })
597
+ .catch(() => closeAndExit());
598
+ };
599
+ void readCommands(control, {
600
+ onShutdown: closeAndExit,
601
+ onDiscovery: announce,
602
+ onDemand: async (command) => {
603
+ const releaseRetirement = lifecycle?.holdRetirement() ?? (() => { });
604
+ try {
605
+ try {
606
+ if (!command.attached) {
607
+ const matches = (scope) => scope.serverConnectionId === command.serverConnectionId &&
608
+ scope.attachmentId === command.attachmentId;
609
+ services.removeSubscriptions(matches);
610
+ }
611
+ lifecycle?.setDemand(command.serverConnectionId, command.attachmentId, command.attached);
612
+ }
613
+ catch (error) {
614
+ await control.send({
615
+ type: "demand_rejected",
616
+ token,
617
+ sessionKey,
618
+ requestId: command.requestId,
619
+ message: error instanceof Error ? error.message : String(error),
620
+ });
621
+ return;
622
+ }
623
+ await control.send({
624
+ type: "demand_applied",
625
+ token,
626
+ sessionKey,
627
+ requestId: command.requestId,
628
+ attachmentId: command.attachmentId,
629
+ attached: command.attached,
630
+ });
631
+ }
632
+ finally {
633
+ releaseRetirement();
634
+ }
635
+ },
636
+ onOperation: (request) => {
637
+ void handleOperation(request).catch(() => closeAndExit());
638
+ },
639
+ onOperationCancel: (command) => {
640
+ const active = activeRequests.get(command.requestId);
641
+ if (active !== undefined && sameScope(active.scope, command.scope)) {
642
+ active.cancel(new DOMException("Service operation cancelled", "AbortError"));
643
+ }
644
+ },
645
+ onServerConnected: (serverConnectionId) => lifecycle?.serverConnected(serverConnectionId),
646
+ onServerDisconnected: (serverConnectionId) => {
647
+ const matches = (scope) => scope.serverConnectionId === serverConnectionId;
648
+ services.removeSubscriptions(matches);
649
+ for (const request of activeRequests.values()) {
650
+ if (matches(request.scope))
651
+ request.cancel(new Error("Server disconnected"));
652
+ }
653
+ lifecycle?.serverDisconnected(serverConnectionId);
654
+ },
655
+ }).catch(() => closeAndExit());
656
+ control.socket.once("close", closeAndExit);
657
+ control.socket.once("error", () => closeAndExit());
658
+ process.once("SIGTERM", closeAndExit);
659
+ process.once("SIGINT", closeAndExit);
660
+ try {
661
+ ready = true;
662
+ await control.send({
663
+ type: "worker_ready",
664
+ token,
665
+ sessionKey,
666
+ sessionId,
667
+ pid: process.pid,
668
+ metadata,
669
+ pluginManifestPaths: [...pluginManifestPaths],
670
+ });
671
+ }
672
+ catch (error) {
673
+ try {
674
+ await close();
675
+ }
676
+ catch (cleanupError) {
677
+ throw new AggregateError([error, cleanupError], "Session worker readiness and cleanup failed");
678
+ }
679
+ throw error;
680
+ }
681
+ }
682
+ export async function runSessionWorkerWithHarness(args, createHarness) {
683
+ try {
684
+ if (args.length !== 1)
685
+ throw new Error("Session worker requires one options argument");
686
+ let options;
687
+ try {
688
+ options = JSON.parse(args[0]);
689
+ }
690
+ catch (error) {
691
+ throw new Error("Session worker received invalid options", { cause: error });
692
+ }
693
+ if (!Check(SessionWorkerOptionsSchema, options) ||
694
+ !isAbsolute(options.sessionDir) ||
695
+ !isAbsolute(options.metadata.cwd) ||
696
+ !isAbsolute(options.metadata.path) ||
697
+ (options.provider !== undefined && options.model === undefined)) {
698
+ throw new Error("Session worker received invalid options");
699
+ }
700
+ await run(options, createHarness);
701
+ }
702
+ catch (error) {
703
+ const message = error instanceof Error ? error.message : String(error);
704
+ const token = process.env[SESSION_WORKER_CONTROL_TOKEN_ENV];
705
+ const encodedSessionKey = process.env[SESSION_WORKER_SESSION_KEY_ENV];
706
+ if (token && encodedSessionKey) {
707
+ const sessionKey = Buffer.from(encodedSessionKey, "base64url").toString();
708
+ await failureControl?.send({ type: "worker_failed", token, sessionKey, message }).catch(() => { });
709
+ }
710
+ throw error;
711
+ }
712
+ }
713
+ async function createCodingAgentHarness(session, options, executionEnv) {
714
+ const modelRuntime = await ModelRuntime.create();
715
+ const settingsManager = SettingsManager.create(session.metadata.cwd);
716
+ let resolved;
717
+ if (options.model === undefined) {
718
+ resolved = await findInitialModel({
719
+ scopedModels: [],
720
+ isContinuing: true,
721
+ defaultProvider: settingsManager.getDefaultProvider(),
722
+ defaultModelId: settingsManager.getDefaultModel(),
723
+ defaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),
724
+ modelRuntime,
725
+ });
726
+ }
727
+ else {
728
+ resolved = resolveCliModel({
729
+ cliProvider: options.provider,
730
+ cliModel: options.model,
731
+ modelRuntime,
732
+ });
733
+ if (resolved.error)
734
+ throw new Error(`Session worker could not resolve model: ${resolved.error}`);
735
+ }
736
+ if (!resolved.model)
737
+ throw new Error("Session worker could not resolve a model");
738
+ const tools = [createReadTool(), createWriteTool(), createBashTool()];
739
+ const activeToolNames = tools.map((tool) => tool.name);
740
+ const harness = (await AgentHarness.create({
741
+ session,
742
+ models: modelRuntime,
743
+ model: resolved.model,
744
+ thinkingLevel: resolved.thinkingLevel,
745
+ tools,
746
+ activeToolNames,
747
+ toolContext: { env: executionEnv },
748
+ resources: {},
749
+ }, TODO_CONTEXT)).harness;
750
+ try {
751
+ const lane = await harness.lane("main", TODO_CONTEXT);
752
+ const currentActiveToolNames = await lane.getActiveTools(TODO_CONTEXT);
753
+ if (currentActiveToolNames.length !== activeToolNames.length ||
754
+ currentActiveToolNames.some((name, index) => name !== activeToolNames[index])) {
755
+ await lane.setActiveTools(activeToolNames, TODO_CONTEXT);
756
+ }
757
+ return {
758
+ harness,
759
+ lane,
760
+ modelRuntime,
761
+ settingsManager,
762
+ facetLoader: createSessionPluginFacetLoader(options.pluginManifestPaths),
763
+ };
764
+ }
765
+ catch (error) {
766
+ try {
767
+ await harness.close(TODO_CONTEXT);
768
+ }
769
+ catch (cleanupError) {
770
+ throw new AggregateError([error, cleanupError], "Session worker model selection and cleanup failed");
771
+ }
772
+ throw error;
773
+ }
774
+ }
775
+ export function runSessionWorkerProcess(args) {
776
+ return runSessionWorkerWithHarness(args, createCodingAgentHarness);
777
+ }
778
+ if (isDirectInternalProcessEntry(import.meta.url)) {
779
+ const role = consumeInternalProcessRole();
780
+ if (role !== "session-worker") {
781
+ throw new Error("Session worker entrypoint requires an internal session-worker invocation");
782
+ }
783
+ void runSessionWorkerProcess(process.argv.slice(2)).catch(() => process.exit(1));
784
+ }
785
+ //# sourceMappingURL=session-worker.js.map