pi-kot 0.1.20 → 0.1.21

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 (330) hide show
  1. package/README.md +253 -17
  2. package/package.json +8 -60
  3. package/bin/pi-kot.mjs +0 -148
  4. package/dist/client/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  5. package/dist/client/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  6. package/dist/client/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  7. package/dist/client/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  8. package/dist/client/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  9. package/dist/client/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  10. package/dist/client/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  11. package/dist/client/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  12. package/dist/client/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  13. package/dist/client/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  14. package/dist/client/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  15. package/dist/client/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  16. package/dist/client/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  17. package/dist/client/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  18. package/dist/client/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  19. package/dist/client/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  20. package/dist/client/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  21. package/dist/client/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  22. package/dist/client/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  23. package/dist/client/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  24. package/dist/client/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  25. package/dist/client/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  26. package/dist/client/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  27. package/dist/client/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  28. package/dist/client/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  29. package/dist/client/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  30. package/dist/client/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  31. package/dist/client/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  32. package/dist/client/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  33. package/dist/client/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  34. package/dist/client/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  35. package/dist/client/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  36. package/dist/client/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  37. package/dist/client/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  38. package/dist/client/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  39. package/dist/client/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  40. package/dist/client/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  41. package/dist/client/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  42. package/dist/client/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  43. package/dist/client/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  44. package/dist/client/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  45. package/dist/client/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  46. package/dist/client/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  47. package/dist/client/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  48. package/dist/client/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  49. package/dist/client/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  50. package/dist/client/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  51. package/dist/client/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  52. package/dist/client/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  53. package/dist/client/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  54. package/dist/client/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  55. package/dist/client/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  56. package/dist/client/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  57. package/dist/client/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  58. package/dist/client/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  59. package/dist/client/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  60. package/dist/client/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  61. package/dist/client/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  62. package/dist/client/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  63. package/dist/client/assets/index-C5quN7Km.js +0 -448
  64. package/dist/client/assets/index-C5quN7Km.js.map +0 -1
  65. package/dist/client/assets/index-CuQOwQs1.css +0 -1
  66. package/dist/client/index.html +0 -14
  67. package/dist/server/ask-user-question/envelope.d.ts +0 -11
  68. package/dist/server/ask-user-question/envelope.d.ts.map +0 -1
  69. package/dist/server/ask-user-question/envelope.js +0 -41
  70. package/dist/server/ask-user-question/envelope.js.map +0 -1
  71. package/dist/server/ask-user-question/plan-mode-question-tool.d.ts +0 -26
  72. package/dist/server/ask-user-question/plan-mode-question-tool.d.ts.map +0 -1
  73. package/dist/server/ask-user-question/plan-mode-question-tool.js +0 -273
  74. package/dist/server/ask-user-question/plan-mode-question-tool.js.map +0 -1
  75. package/dist/server/ask-user-question/prompt-strings.d.ts +0 -4
  76. package/dist/server/ask-user-question/prompt-strings.d.ts.map +0 -1
  77. package/dist/server/ask-user-question/prompt-strings.js +0 -18
  78. package/dist/server/ask-user-question/prompt-strings.js.map +0 -1
  79. package/dist/server/ask-user-question/registry.d.ts +0 -39
  80. package/dist/server/ask-user-question/registry.d.ts.map +0 -1
  81. package/dist/server/ask-user-question/registry.js +0 -124
  82. package/dist/server/ask-user-question/registry.js.map +0 -1
  83. package/dist/server/ask-user-question/tool.d.ts +0 -4
  84. package/dist/server/ask-user-question/tool.d.ts.map +0 -1
  85. package/dist/server/ask-user-question/tool.js +0 -68
  86. package/dist/server/ask-user-question/tool.js.map +0 -1
  87. package/dist/server/ask-user-question/types.d.ts +0 -50
  88. package/dist/server/ask-user-question/types.d.ts.map +0 -1
  89. package/dist/server/ask-user-question/types.js +0 -7
  90. package/dist/server/ask-user-question/types.js.map +0 -1
  91. package/dist/server/ask-user-question/validate.d.ts +0 -3
  92. package/dist/server/ask-user-question/validate.d.ts.map +0 -1
  93. package/dist/server/ask-user-question/validate.js +0 -67
  94. package/dist/server/ask-user-question/validate.js.map +0 -1
  95. package/dist/server/compaction-continuation.d.ts +0 -113
  96. package/dist/server/compaction-continuation.d.ts.map +0 -1
  97. package/dist/server/compaction-continuation.js +0 -65
  98. package/dist/server/compaction-continuation.js.map +0 -1
  99. package/dist/server/compaction-history.d.ts +0 -62
  100. package/dist/server/compaction-history.d.ts.map +0 -1
  101. package/dist/server/compaction-history.js +0 -180
  102. package/dist/server/compaction-history.js.map +0 -1
  103. package/dist/server/config-manager.d.ts +0 -97
  104. package/dist/server/config-manager.d.ts.map +0 -1
  105. package/dist/server/config-manager.js +0 -352
  106. package/dist/server/config-manager.js.map +0 -1
  107. package/dist/server/config.d.ts +0 -24
  108. package/dist/server/config.d.ts.map +0 -1
  109. package/dist/server/config.js +0 -67
  110. package/dist/server/config.js.map +0 -1
  111. package/dist/server/extension-manager.d.ts +0 -116
  112. package/dist/server/extension-manager.d.ts.map +0 -1
  113. package/dist/server/extension-manager.js +0 -586
  114. package/dist/server/extension-manager.js.map +0 -1
  115. package/dist/server/extension-ui-bridge.d.ts +0 -35
  116. package/dist/server/extension-ui-bridge.d.ts.map +0 -1
  117. package/dist/server/extension-ui-bridge.js +0 -228
  118. package/dist/server/extension-ui-bridge.js.map +0 -1
  119. package/dist/server/extensions-discovery.d.ts +0 -26
  120. package/dist/server/extensions-discovery.d.ts.map +0 -1
  121. package/dist/server/extensions-discovery.js +0 -107
  122. package/dist/server/extensions-discovery.js.map +0 -1
  123. package/dist/server/file-manager.d.ts +0 -79
  124. package/dist/server/file-manager.d.ts.map +0 -1
  125. package/dist/server/file-manager.js +0 -535
  126. package/dist/server/file-manager.js.map +0 -1
  127. package/dist/server/file-references.d.ts +0 -5
  128. package/dist/server/file-references.d.ts.map +0 -1
  129. package/dist/server/file-references.js +0 -249
  130. package/dist/server/file-references.js.map +0 -1
  131. package/dist/server/file-searcher.d.ts +0 -29
  132. package/dist/server/file-searcher.d.ts.map +0 -1
  133. package/dist/server/file-searcher.js +0 -318
  134. package/dist/server/file-searcher.js.map +0 -1
  135. package/dist/server/git-clone.d.ts +0 -56
  136. package/dist/server/git-clone.d.ts.map +0 -1
  137. package/dist/server/git-clone.js +0 -173
  138. package/dist/server/git-clone.js.map +0 -1
  139. package/dist/server/git-hunk-stager.d.ts +0 -56
  140. package/dist/server/git-hunk-stager.d.ts.map +0 -1
  141. package/dist/server/git-hunk-stager.js +0 -137
  142. package/dist/server/git-hunk-stager.js.map +0 -1
  143. package/dist/server/git-runner.d.ts +0 -346
  144. package/dist/server/git-runner.d.ts.map +0 -1
  145. package/dist/server/git-runner.js +0 -884
  146. package/dist/server/git-runner.js.map +0 -1
  147. package/dist/server/index.d.ts +0 -22
  148. package/dist/server/index.d.ts.map +0 -1
  149. package/dist/server/index.js +0 -262
  150. package/dist/server/index.js.map +0 -1
  151. package/dist/server/lifecycle-notifications.d.ts +0 -28
  152. package/dist/server/lifecycle-notifications.d.ts.map +0 -1
  153. package/dist/server/lifecycle-notifications.js +0 -38
  154. package/dist/server/lifecycle-notifications.js.map +0 -1
  155. package/dist/server/mcp/config.d.ts +0 -23
  156. package/dist/server/mcp/config.d.ts.map +0 -1
  157. package/dist/server/mcp/config.js +0 -139
  158. package/dist/server/mcp/config.js.map +0 -1
  159. package/dist/server/mcp/manager.d.ts +0 -40
  160. package/dist/server/mcp/manager.d.ts.map +0 -1
  161. package/dist/server/mcp/manager.js +0 -435
  162. package/dist/server/mcp/manager.js.map +0 -1
  163. package/dist/server/mcp/stdio-trust.d.ts +0 -5
  164. package/dist/server/mcp/stdio-trust.d.ts.map +0 -1
  165. package/dist/server/mcp/stdio-trust.js +0 -78
  166. package/dist/server/mcp/stdio-trust.js.map +0 -1
  167. package/dist/server/mcp/tool-bridge.d.ts +0 -33
  168. package/dist/server/mcp/tool-bridge.d.ts.map +0 -1
  169. package/dist/server/mcp/tool-bridge.js +0 -138
  170. package/dist/server/mcp/tool-bridge.js.map +0 -1
  171. package/dist/server/orchestration/config.d.ts +0 -5
  172. package/dist/server/orchestration/config.d.ts.map +0 -1
  173. package/dist/server/orchestration/config.js +0 -35
  174. package/dist/server/orchestration/config.js.map +0 -1
  175. package/dist/server/orchestration/event-bridge.d.ts +0 -32
  176. package/dist/server/orchestration/event-bridge.d.ts.map +0 -1
  177. package/dist/server/orchestration/event-bridge.js +0 -110
  178. package/dist/server/orchestration/event-bridge.js.map +0 -1
  179. package/dist/server/orchestration/inbox.d.ts +0 -9
  180. package/dist/server/orchestration/inbox.d.ts.map +0 -1
  181. package/dist/server/orchestration/inbox.js +0 -186
  182. package/dist/server/orchestration/inbox.js.map +0 -1
  183. package/dist/server/orchestration/init.d.ts +0 -2
  184. package/dist/server/orchestration/init.d.ts.map +0 -1
  185. package/dist/server/orchestration/init.js +0 -22
  186. package/dist/server/orchestration/init.js.map +0 -1
  187. package/dist/server/orchestration/store.d.ts +0 -33
  188. package/dist/server/orchestration/store.d.ts.map +0 -1
  189. package/dist/server/orchestration/store.js +0 -331
  190. package/dist/server/orchestration/store.js.map +0 -1
  191. package/dist/server/orchestration/tools.d.ts +0 -15
  192. package/dist/server/orchestration/tools.d.ts.map +0 -1
  193. package/dist/server/orchestration/tools.js +0 -621
  194. package/dist/server/orchestration/tools.js.map +0 -1
  195. package/dist/server/orchestration/types.d.ts +0 -68
  196. package/dist/server/orchestration/types.d.ts.map +0 -1
  197. package/dist/server/orchestration/types.js +0 -43
  198. package/dist/server/orchestration/types.js.map +0 -1
  199. package/dist/server/orchestration/worker-lifecycle.d.ts +0 -15
  200. package/dist/server/orchestration/worker-lifecycle.d.ts.map +0 -1
  201. package/dist/server/orchestration/worker-lifecycle.js +0 -45
  202. package/dist/server/orchestration/worker-lifecycle.js.map +0 -1
  203. package/dist/server/project-manager.d.ts +0 -25
  204. package/dist/server/project-manager.d.ts.map +0 -1
  205. package/dist/server/project-manager.js +0 -157
  206. package/dist/server/project-manager.js.map +0 -1
  207. package/dist/server/pty-manager.d.ts +0 -54
  208. package/dist/server/pty-manager.d.ts.map +0 -1
  209. package/dist/server/pty-manager.js +0 -220
  210. package/dist/server/pty-manager.js.map +0 -1
  211. package/dist/server/routes/_schemas.d.ts +0 -16
  212. package/dist/server/routes/_schemas.d.ts.map +0 -1
  213. package/dist/server/routes/_schemas.js +0 -12
  214. package/dist/server/routes/_schemas.js.map +0 -1
  215. package/dist/server/routes/ask-user-question.d.ts +0 -3
  216. package/dist/server/routes/ask-user-question.d.ts.map +0 -1
  217. package/dist/server/routes/ask-user-question.js +0 -105
  218. package/dist/server/routes/ask-user-question.js.map +0 -1
  219. package/dist/server/routes/auth.d.ts +0 -8
  220. package/dist/server/routes/auth.d.ts.map +0 -1
  221. package/dist/server/routes/auth.js +0 -225
  222. package/dist/server/routes/auth.js.map +0 -1
  223. package/dist/server/routes/config.d.ts +0 -3
  224. package/dist/server/routes/config.d.ts.map +0 -1
  225. package/dist/server/routes/config.js +0 -568
  226. package/dist/server/routes/config.js.map +0 -1
  227. package/dist/server/routes/control.d.ts +0 -3
  228. package/dist/server/routes/control.d.ts.map +0 -1
  229. package/dist/server/routes/control.js +0 -365
  230. package/dist/server/routes/control.js.map +0 -1
  231. package/dist/server/routes/exec.d.ts +0 -3
  232. package/dist/server/routes/exec.d.ts.map +0 -1
  233. package/dist/server/routes/exec.js +0 -426
  234. package/dist/server/routes/exec.js.map +0 -1
  235. package/dist/server/routes/extension-commands.d.ts +0 -22
  236. package/dist/server/routes/extension-commands.d.ts.map +0 -1
  237. package/dist/server/routes/extension-commands.js +0 -178
  238. package/dist/server/routes/extension-commands.js.map +0 -1
  239. package/dist/server/routes/extensions.d.ts +0 -8
  240. package/dist/server/routes/extensions.d.ts.map +0 -1
  241. package/dist/server/routes/extensions.js +0 -414
  242. package/dist/server/routes/extensions.js.map +0 -1
  243. package/dist/server/routes/files.d.ts +0 -3
  244. package/dist/server/routes/files.d.ts.map +0 -1
  245. package/dist/server/routes/files.js +0 -835
  246. package/dist/server/routes/files.js.map +0 -1
  247. package/dist/server/routes/git.d.ts +0 -3
  248. package/dist/server/routes/git.d.ts.map +0 -1
  249. package/dist/server/routes/git.js +0 -1058
  250. package/dist/server/routes/git.js.map +0 -1
  251. package/dist/server/routes/mcp.d.ts +0 -3
  252. package/dist/server/routes/mcp.d.ts.map +0 -1
  253. package/dist/server/routes/mcp.js +0 -403
  254. package/dist/server/routes/mcp.js.map +0 -1
  255. package/dist/server/routes/orchestration.d.ts +0 -3
  256. package/dist/server/routes/orchestration.d.ts.map +0 -1
  257. package/dist/server/routes/orchestration.js +0 -251
  258. package/dist/server/routes/orchestration.js.map +0 -1
  259. package/dist/server/routes/projects.d.ts +0 -3
  260. package/dist/server/routes/projects.d.ts.map +0 -1
  261. package/dist/server/routes/projects.js +0 -421
  262. package/dist/server/routes/projects.js.map +0 -1
  263. package/dist/server/routes/prompt.d.ts +0 -3
  264. package/dist/server/routes/prompt.d.ts.map +0 -1
  265. package/dist/server/routes/prompt.js +0 -311
  266. package/dist/server/routes/prompt.js.map +0 -1
  267. package/dist/server/routes/session-extensions.d.ts +0 -11
  268. package/dist/server/routes/session-extensions.d.ts.map +0 -1
  269. package/dist/server/routes/session-extensions.js +0 -171
  270. package/dist/server/routes/session-extensions.js.map +0 -1
  271. package/dist/server/routes/sessions.d.ts +0 -3
  272. package/dist/server/routes/sessions.d.ts.map +0 -1
  273. package/dist/server/routes/sessions.js +0 -706
  274. package/dist/server/routes/sessions.js.map +0 -1
  275. package/dist/server/routes/skills.d.ts +0 -14
  276. package/dist/server/routes/skills.d.ts.map +0 -1
  277. package/dist/server/routes/skills.js +0 -448
  278. package/dist/server/routes/skills.js.map +0 -1
  279. package/dist/server/routes/stream.d.ts +0 -3
  280. package/dist/server/routes/stream.d.ts.map +0 -1
  281. package/dist/server/routes/stream.js +0 -112
  282. package/dist/server/routes/stream.js.map +0 -1
  283. package/dist/server/routes/terminal.d.ts +0 -28
  284. package/dist/server/routes/terminal.d.ts.map +0 -1
  285. package/dist/server/routes/terminal.js +0 -211
  286. package/dist/server/routes/terminal.js.map +0 -1
  287. package/dist/server/routes/tunnel.d.ts +0 -13
  288. package/dist/server/routes/tunnel.d.ts.map +0 -1
  289. package/dist/server/routes/tunnel.js +0 -231
  290. package/dist/server/routes/tunnel.js.map +0 -1
  291. package/dist/server/session-registry.d.ts +0 -164
  292. package/dist/server/session-registry.d.ts.map +0 -1
  293. package/dist/server/session-registry.js +0 -754
  294. package/dist/server/session-registry.js.map +0 -1
  295. package/dist/server/skill-overrides.d.ts +0 -47
  296. package/dist/server/skill-overrides.d.ts.map +0 -1
  297. package/dist/server/skill-overrides.js +0 -178
  298. package/dist/server/skill-overrides.js.map +0 -1
  299. package/dist/server/sse-bridge.d.ts +0 -31
  300. package/dist/server/sse-bridge.d.ts.map +0 -1
  301. package/dist/server/sse-bridge.js +0 -158
  302. package/dist/server/sse-bridge.js.map +0 -1
  303. package/dist/server/tool-overrides.d.ts +0 -39
  304. package/dist/server/tool-overrides.d.ts.map +0 -1
  305. package/dist/server/tool-overrides.js +0 -121
  306. package/dist/server/tool-overrides.js.map +0 -1
  307. package/dist/server/tunnel/executable-search.d.ts +0 -45
  308. package/dist/server/tunnel/executable-search.d.ts.map +0 -1
  309. package/dist/server/tunnel/executable-search.js +0 -150
  310. package/dist/server/tunnel/executable-search.js.map +0 -1
  311. package/dist/server/tunnel/install-help.d.ts +0 -19
  312. package/dist/server/tunnel/install-help.d.ts.map +0 -1
  313. package/dist/server/tunnel/install-help.js +0 -47
  314. package/dist/server/tunnel/install-help.js.map +0 -1
  315. package/dist/server/tunnel/providers/ngrok.d.ts +0 -34
  316. package/dist/server/tunnel/providers/ngrok.d.ts.map +0 -1
  317. package/dist/server/tunnel/providers/ngrok.js +0 -464
  318. package/dist/server/tunnel/providers/ngrok.js.map +0 -1
  319. package/dist/server/tunnel/registry.d.ts +0 -15
  320. package/dist/server/tunnel/registry.d.ts.map +0 -1
  321. package/dist/server/tunnel/registry.js +0 -58
  322. package/dist/server/tunnel/registry.js.map +0 -1
  323. package/dist/server/tunnel/service.d.ts +0 -15
  324. package/dist/server/tunnel/service.d.ts.map +0 -1
  325. package/dist/server/tunnel/service.js +0 -158
  326. package/dist/server/tunnel/service.js.map +0 -1
  327. package/dist/server/tunnel/types.d.ts +0 -166
  328. package/dist/server/tunnel/types.d.ts.map +0 -1
  329. package/dist/server/tunnel/types.js +0 -217
  330. package/dist/server/tunnel/types.js.map +0 -1
@@ -1,706 +0,0 @@
1
- import { buildCompactionHistory } from "../compaction-history.js";
2
- import { createSession, disposeSession, listSessions, listSessionsForProject, getSession, renameSession, archiveSession, unarchiveSession, listArchivedSessions, resumeSessionById, forkSession, } from "../session-registry.js";
3
- import { getProject } from "../project-manager.js";
4
- import { bridgeWorkerDeleted } from "../orchestration/event-bridge.js";
5
- import { getSupervisorIdForWorker } from "../orchestration/store.js";
6
- import { buildSnapshot } from "../sse-bridge.js";
7
- export const sessionRoutes = async (fastify) => {
8
- // POST /api/v1/sessions — create a new session
9
- fastify.post("/sessions", {
10
- schema: {
11
- description: "Create a new session.",
12
- tags: ["sessions"],
13
- body: {
14
- type: "object",
15
- properties: {
16
- projectId: { type: "string", description: "Project ID (default: 'default')" },
17
- workspacePath: { type: "string", description: "Working directory (default: config.workspacePath)" },
18
- },
19
- },
20
- response: {
21
- 201: {
22
- type: "object",
23
- required: ["sessionId"],
24
- properties: {
25
- sessionId: { type: "string" },
26
- projectId: { type: "string" },
27
- createdAt: { type: "string" },
28
- },
29
- },
30
- },
31
- },
32
- }, async (req, reply) => {
33
- let projectId = req.body.projectId ?? "default";
34
- // Backward compat: resolve "default" to the Default project's UUID
35
- if (projectId === "default") {
36
- const { listProjects } = await import("../project-manager.js");
37
- const projects = await listProjects();
38
- if (projects.length > 0) {
39
- projectId = projects[0].id;
40
- }
41
- }
42
- // Resolve the project to get its path as workspacePath
43
- const { getProject } = await import("../project-manager.js");
44
- const project = await getProject(projectId);
45
- if (project === undefined) {
46
- return reply.code(404).send({ error: "project_not_found" });
47
- }
48
- const workspacePath = req.body.workspacePath ?? project.path;
49
- const live = await createSession(projectId, workspacePath);
50
- return reply.code(201).send({
51
- sessionId: live.sessionId,
52
- projectId: live.projectId,
53
- createdAt: live.createdAt.toISOString(),
54
- });
55
- });
56
- // GET /api/v1/sessions — list sessions, optionally filtered by projectId.
57
- // When projectId is specified, returns unified view (live + disk).
58
- // When omitted, returns only live sessions (backward compat).
59
- // When archived=true is set (requires projectId), returns archived sessions.
60
- fastify.get("/sessions", {
61
- schema: {
62
- description: "List sessions. When projectId is specified, returns " +
63
- "both live and disk sessions with names and message counts. " +
64
- "When omitted, returns only live sessions. " +
65
- "Use ?archived=true to list archived (soft-deleted) sessions.",
66
- tags: ["sessions"],
67
- querystring: {
68
- type: "object",
69
- properties: {
70
- projectId: { type: "string" },
71
- archived: { type: "string" },
72
- },
73
- },
74
- response: {
75
- 200: {
76
- type: "object",
77
- required: ["sessions"],
78
- properties: {
79
- sessions: {
80
- type: "array",
81
- items: {
82
- type: "object",
83
- required: ["sessionId", "projectId", "isLive", "createdAt", "lastActivityAt"],
84
- properties: {
85
- sessionId: { type: "string" },
86
- projectId: { type: "string" },
87
- isLive: { type: "boolean" },
88
- name: { type: "string" },
89
- createdAt: { type: "string" },
90
- lastActivityAt: { type: "string" },
91
- messageCount: { type: "integer" },
92
- supervisorId: { type: "string" },
93
- },
94
- },
95
- },
96
- },
97
- },
98
- },
99
- },
100
- }, async (req) => {
101
- let { projectId, archived } = req.query;
102
- // Backward compat: resolve "default" to the Default project's UUID
103
- if (projectId === "default") {
104
- const { listProjects } = await import("../project-manager.js");
105
- const projects = await listProjects();
106
- if (projects.length > 0) {
107
- projectId = projects[0].id;
108
- }
109
- }
110
- if (projectId !== undefined) {
111
- const { config } = await import("../config.js");
112
- const project = await getProject(projectId);
113
- const workspacePath = project?.path ?? config.workspacePath;
114
- // If archived=true, list archived sessions
115
- if (archived === "true") {
116
- const archivedSessions = await listArchivedSessions(projectId, workspacePath);
117
- const sessions = await Promise.all(archivedSessions.map(async (s) => ({
118
- sessionId: s.sessionId,
119
- projectId: s.projectId,
120
- isLive: s.isLive,
121
- name: s.name,
122
- createdAt: s.createdAt.toISOString(),
123
- lastActivityAt: s.lastActivityAt.toISOString(),
124
- messageCount: s.messageCount,
125
- supervisorId: (await getSupervisorIdForWorker(s.sessionId)) ?? undefined,
126
- })));
127
- return { sessions };
128
- }
129
- // Unified view: live + disk sessions for this project
130
- const unified = await listSessionsForProject(projectId, workspacePath);
131
- const unifiedSessions = await Promise.all(unified.map(async (s) => ({
132
- sessionId: s.sessionId,
133
- projectId: s.projectId,
134
- isLive: s.isLive,
135
- name: s.name,
136
- createdAt: s.createdAt.toISOString(),
137
- lastActivityAt: s.lastActivityAt.toISOString(),
138
- messageCount: s.messageCount,
139
- supervisorId: (await getSupervisorIdForWorker(s.sessionId)) ?? undefined,
140
- })));
141
- return { sessions: unifiedSessions };
142
- }
143
- // Backward compat: only live sessions
144
- const liveSessions = listSessions();
145
- const liveWithSupervisors = await Promise.all(liveSessions.map(async (s) => ({
146
- sessionId: s.sessionId,
147
- projectId: s.projectId,
148
- isLive: true,
149
- name: s.name ?? s.session.sessionName,
150
- createdAt: s.createdAt.toISOString(),
151
- lastActivityAt: s.lastActivityAt.toISOString(),
152
- messageCount: s.session.messages.length,
153
- supervisorId: (await getSupervisorIdForWorker(s.sessionId)) ?? undefined,
154
- })));
155
- return { sessions: liveWithSupervisors };
156
- });
157
- // GET /api/v1/sessions/:id/messages — get messages for a session
158
- fastify.get("/sessions/:id/messages", {
159
- schema: {
160
- description: "Get message history for a session.",
161
- tags: ["sessions"],
162
- params: {
163
- type: "object",
164
- required: ["id"],
165
- properties: { id: { type: "string" } },
166
- },
167
- response: {
168
- 200: {
169
- type: "object",
170
- required: ["messages"],
171
- properties: {
172
- messages: { type: "array" },
173
- },
174
- },
175
- 404: {
176
- type: "object",
177
- properties: { error: { type: "string" } },
178
- },
179
- },
180
- },
181
- }, async (req, reply) => {
182
- const { SessionManager } = await import("@earendil-works/pi-coding-agent");
183
- // Try live registry first
184
- const live = getSession(req.params.id);
185
- if (live !== undefined) {
186
- return { messages: live.session.messages };
187
- }
188
- // Search for the session file on disk across all projects
189
- const { readdir } = await import("node:fs/promises");
190
- const { join } = await import("node:path");
191
- const { config } = await import("../config.js");
192
- try {
193
- const projectDirs = await readdir(config.sessionDir, { withFileTypes: true });
194
- for (const dir of projectDirs) {
195
- if (!dir.isDirectory())
196
- continue;
197
- const projectDir = join(config.sessionDir, dir.name);
198
- const files = await readdir(projectDir);
199
- const matchFile = files.find((f) => f.endsWith(".jsonl") && f.includes(req.params.id));
200
- if (matchFile) {
201
- const sessionPath = join(projectDir, matchFile);
202
- const sm = SessionManager.open(sessionPath);
203
- const ctx = sm.buildSessionContext();
204
- return { messages: ctx.messages };
205
- }
206
- }
207
- }
208
- catch {
209
- // Session not found on disk either
210
- }
211
- return reply.code(404).send({ error: "session_not_found" });
212
- });
213
- // PATCH /api/v1/sessions/:id/name — rename a session
214
- fastify.patch("/sessions/:id/name", {
215
- schema: {
216
- description: "Rename a session. Persists to disk via SessionManager.appendSessionInfo.",
217
- tags: ["sessions"],
218
- params: {
219
- type: "object",
220
- required: ["id"],
221
- properties: { id: { type: "string" } },
222
- },
223
- body: {
224
- type: "object",
225
- required: ["name"],
226
- properties: { name: { type: "string", minLength: 1 } },
227
- },
228
- response: {
229
- 200: {
230
- type: "object",
231
- required: ["renamed"],
232
- properties: { renamed: { type: "boolean" } },
233
- },
234
- 404: {
235
- type: "object",
236
- properties: { error: { type: "string" } },
237
- },
238
- },
239
- },
240
- }, async (req, reply) => {
241
- const ok = renameSession(req.params.id, req.body.name);
242
- if (!ok) {
243
- return reply.code(404).send({ error: "session_not_found" });
244
- }
245
- return { renamed: true };
246
- });
247
- // POST /api/v1/sessions/:id/archive — archive a session (moves JSONL to _archived/)
248
- fastify.post("/sessions/:id/archive", {
249
- schema: {
250
- description: "Archive a session: moves the JSONL file to an _archived/ subfolder " +
251
- "and removes from the live registry. The session data is preserved " +
252
- "and can be restored later via POST /sessions/:id/unarchive. " +
253
- "For disk-only sessions, provide { projectId } in the body.",
254
- tags: ["sessions"],
255
- params: {
256
- type: "object",
257
- required: ["id"],
258
- properties: { id: { type: "string" } },
259
- },
260
- body: {
261
- type: "object",
262
- properties: { projectId: { type: "string" } },
263
- },
264
- response: {
265
- 200: {
266
- type: "object",
267
- required: ["archived"],
268
- properties: { archived: { type: "boolean" } },
269
- },
270
- 404: {
271
- type: "object",
272
- properties: { error: { type: "string" } },
273
- },
274
- },
275
- },
276
- }, async (req, reply) => {
277
- const projectId = req.body?.projectId;
278
- const archived = await archiveSession(req.params.id, projectId);
279
- if (!archived) {
280
- return reply.code(404).send({ error: "session_not_found" });
281
- }
282
- return { archived: true };
283
- });
284
- // POST /api/v1/sessions/:id/unarchive — restore an archived session
285
- fastify.post("/sessions/:id/unarchive", {
286
- schema: {
287
- description: "Restore an archived session: moves the JSONL file back from " +
288
- "_archived/ to the main session directory. The session will appear " +
289
- "again on the next SSE connect or page refresh.",
290
- tags: ["sessions"],
291
- params: {
292
- type: "object",
293
- required: ["id"],
294
- properties: { id: { type: "string" } },
295
- },
296
- body: {
297
- type: "object",
298
- required: ["projectId"],
299
- properties: { projectId: { type: "string" } },
300
- },
301
- response: {
302
- 200: {
303
- type: "object",
304
- required: ["unarchived"],
305
- properties: { unarchived: { type: "boolean" } },
306
- },
307
- 404: {
308
- type: "object",
309
- properties: { error: { type: "string" } },
310
- },
311
- },
312
- },
313
- }, async (req, reply) => {
314
- const unarchived = await unarchiveSession(req.params.id, req.body.projectId);
315
- if (!unarchived) {
316
- return reply.code(404).send({ error: "archived_session_not_found" });
317
- }
318
- return { unarchived: true };
319
- });
320
- // DELETE /api/v1/sessions/:id — dispose a session (remove from registry)
321
- fastify.delete("/sessions/:id", {
322
- schema: {
323
- description: "Dispose a session (remove from registry). The JSONL file stays on disk.",
324
- tags: ["sessions"],
325
- params: {
326
- type: "object",
327
- required: ["id"],
328
- properties: { id: { type: "string" } },
329
- },
330
- response: {
331
- 200: {
332
- type: "object",
333
- required: ["disposed"],
334
- properties: { disposed: { type: "boolean" } },
335
- },
336
- },
337
- },
338
- }, async (req) => {
339
- const sessionId = req.params.id;
340
- const disposed = await disposeSession(sessionId);
341
- // Fire worker.deleted if this session was an orchestration worker
342
- void bridgeWorkerDeleted(sessionId, { wasLive: disposed }).catch(() => undefined);
343
- return { disposed };
344
- });
345
- // ── Session Tree ──
346
- // GET /sessions/:id/tree — branching history, lazy-resumes cold sessions
347
- fastify.get("/sessions/:id/tree", {
348
- schema: {
349
- description: "Branching history of the session. Returns every entry on the " +
350
- "tree (across all branches) plus the current leaf id and the " +
351
- "set of entry ids on the active branch path. Lazy-resumes cold " +
352
- "sessions on demand.",
353
- tags: ["sessions"],
354
- params: {
355
- type: "object",
356
- required: ["id"],
357
- properties: { id: { type: "string" } },
358
- },
359
- response: {
360
- 200: {
361
- type: "object",
362
- required: ["leafId", "branchIds", "entries"],
363
- properties: {
364
- leafId: { type: ["string", "null"] },
365
- branchIds: { type: "array", items: { type: "string" } },
366
- entries: {
367
- type: "array",
368
- items: {
369
- type: "object",
370
- required: ["id", "parentId", "type", "timestamp"],
371
- properties: {
372
- id: { type: "string" },
373
- parentId: { type: ["string", "null"] },
374
- type: { type: "string" },
375
- timestamp: { type: "string" },
376
- role: { type: "string" },
377
- preview: { type: "string" },
378
- label: { type: "string" },
379
- },
380
- },
381
- },
382
- },
383
- },
384
- 404: {
385
- type: "object",
386
- properties: { error: { type: "string" } },
387
- },
388
- },
389
- },
390
- }, async (req, reply) => {
391
- let live = getSession(req.params.id);
392
- if (live === undefined) {
393
- try {
394
- live = await resumeSessionById(req.params.id);
395
- }
396
- catch {
397
- return reply.code(404).send({ error: "session_not_found" });
398
- }
399
- }
400
- const sm = live.sessionManager;
401
- const all = sm.getEntries();
402
- const leafId = sm.getLeafId();
403
- const branchIds = sm.getBranch().map((e) => e.id);
404
- const entries = all.map((e) => {
405
- const out = {
406
- id: e.id,
407
- parentId: e.parentId,
408
- type: e.type,
409
- timestamp: e.timestamp,
410
- };
411
- const label = sm.getLabel(e.id);
412
- if (label !== undefined)
413
- out.label = label;
414
- if (e.type === "message" && e.message !== undefined) {
415
- const m = e.message;
416
- if (typeof m.role === "string")
417
- out.role = m.role;
418
- const preview = previewOfMessageContent(m.content);
419
- if (preview !== undefined)
420
- out.preview = preview;
421
- }
422
- return out;
423
- });
424
- return { leafId, branchIds, entries };
425
- });
426
- // ── Session Navigate ──
427
- // POST /sessions/:id/navigate — navigate to a different tree leaf
428
- fastify.post("/sessions/:id/navigate", {
429
- schema: {
430
- description: "Navigate the session leaf to a different entry on its tree. " +
431
- "Operates IN-PLACE on the same session file (unlike fork which " +
432
- "creates a new file). Session must be live.",
433
- tags: ["sessions"],
434
- params: {
435
- type: "object",
436
- required: ["id"],
437
- properties: { id: { type: "string" } },
438
- },
439
- body: {
440
- type: "object",
441
- required: ["entryId"],
442
- properties: {
443
- entryId: { type: "string" },
444
- summarize: { type: "boolean" },
445
- customInstructions: { type: "string" },
446
- label: { type: "string" },
447
- },
448
- },
449
- response: {
450
- 200: {
451
- type: "object",
452
- required: ["cancelled"],
453
- properties: {
454
- cancelled: { type: "boolean" },
455
- aborted: { type: "boolean" },
456
- editorText: { type: "string" },
457
- },
458
- },
459
- 404: {
460
- type: "object",
461
- properties: { error: { type: "string" } },
462
- },
463
- },
464
- },
465
- }, async (req, reply) => {
466
- const live = getSession(req.params.id);
467
- if (live === undefined) {
468
- return reply.code(404).send({ error: "session_not_found" });
469
- }
470
- const opts = {};
471
- if (req.body.summarize !== undefined)
472
- opts.summarize = req.body.summarize;
473
- if (req.body.customInstructions !== undefined)
474
- opts.customInstructions = req.body.customInstructions;
475
- if (req.body.label !== undefined)
476
- opts.label = req.body.label;
477
- try {
478
- const result = await live.session.navigateTree(req.body.entryId, opts);
479
- const out = { cancelled: result.cancelled };
480
- if (result.aborted !== undefined)
481
- out.aborted = result.aborted;
482
- if (result.editorText !== undefined)
483
- out.editorText = result.editorText;
484
- // Emit snapshot to all connected SSE clients so the chat UI
485
- // reflects the new session leaf without a client-triggered refetch.
486
- for (const client of live.clients) {
487
- try {
488
- client.send(buildSnapshot(live));
489
- }
490
- catch {
491
- live.clients.delete(client);
492
- }
493
- }
494
- return out;
495
- }
496
- catch (err) {
497
- return reply.code(400).send({ error: "navigate_failed", message: err instanceof Error ? err.message : String(err) });
498
- }
499
- });
500
- // ── Session Fork ──
501
- // POST /sessions/:id/fork — fork into a new session
502
- fastify.post("/sessions/:id/fork", {
503
- schema: {
504
- description: "Create a new session from an entry on the current session's " +
505
- "tree. Writes a new .jsonl file containing the path-to-leaf and " +
506
- "registers it as a fresh live session in the same project. The " +
507
- "source session is left live and untouched.",
508
- tags: ["sessions"],
509
- params: {
510
- type: "object",
511
- required: ["id"],
512
- properties: { id: { type: "string" } },
513
- },
514
- body: {
515
- type: "object",
516
- required: ["entryId"],
517
- properties: { entryId: { type: "string" } },
518
- },
519
- response: {
520
- 201: {
521
- type: "object",
522
- required: ["sessionId", "projectId"],
523
- properties: {
524
- sessionId: { type: "string" },
525
- projectId: { type: "string" },
526
- },
527
- },
528
- 400: {
529
- type: "object",
530
- properties: { error: { type: "string" } },
531
- },
532
- 404: {
533
- type: "object",
534
- properties: { error: { type: "string" } },
535
- },
536
- },
537
- },
538
- }, async (req, reply) => {
539
- try {
540
- const forked = await forkSession(req.params.id, req.body.entryId);
541
- return reply.code(201).send({
542
- sessionId: forked.sessionId,
543
- projectId: forked.projectId,
544
- });
545
- }
546
- catch (err) {
547
- if (err instanceof Error && err.message?.startsWith("session_not_found")) {
548
- return reply.code(404).send({ error: "session_not_found" });
549
- }
550
- return reply.code(400).send({ error: "fork_failed", message: err instanceof Error ? err.message : String(err) });
551
- }
552
- });
553
- // GET /api/v1/sessions/:id/context — context usage telemetry + session stats
554
- fastify.get("/sessions/:id/context", {
555
- schema: {
556
- description: "Get context usage telemetry and session statistics.",
557
- tags: ["sessions"],
558
- params: {
559
- type: "object",
560
- required: ["id"],
561
- properties: { id: { type: "string" } },
562
- },
563
- response: {
564
- 200: {
565
- type: "object",
566
- properties: {
567
- contextUsage: {
568
- type: "object",
569
- properties: {
570
- contextWindow: { type: "number" },
571
- tokens: { type: "number", nullable: true },
572
- percent: { type: "number", nullable: true },
573
- },
574
- },
575
- stats: {
576
- type: "object",
577
- properties: {
578
- userMessages: { type: "number" },
579
- assistantMessages: { type: "number" },
580
- toolCalls: { type: "number" },
581
- toolResults: { type: "number" },
582
- totalMessages: { type: "number" },
583
- tokens: {
584
- type: "object",
585
- properties: {
586
- input: { type: "number" },
587
- output: { type: "number" },
588
- cacheRead: { type: "number" },
589
- cacheWrite: { type: "number" },
590
- total: { type: "number" },
591
- },
592
- },
593
- cost: { type: "number" },
594
- },
595
- },
596
- },
597
- },
598
- 404: {
599
- type: "object",
600
- properties: { error: { type: "string" } },
601
- },
602
- },
603
- },
604
- }, async (req, reply) => {
605
- const live = getSession(req.params.id);
606
- if (live === undefined) {
607
- return reply.code(404).send({ error: "session_not_found" });
608
- }
609
- const usage = live.session.getContextUsage();
610
- const stats = live.session.getSessionStats();
611
- return { contextUsage: usage ?? null, stats };
612
- });
613
- // ── GET /sessions/:id/compactions — compaction history ──────────
614
- // Returns the per-compaction archive that the SDK strips out of
615
- // `live.session.messages` after each compact() call, so the chat
616
- // view can render a "compacted N messages → Y tokens" card at each
617
- // compaction point with the archived messages one click away.
618
- // Server-side derivation keeps the entry-id arithmetic out of the
619
- // client. See packages/server/src/compaction-history.ts for the
620
- // shape contract.
621
- fastify.get("/sessions/:id/compactions", {
622
- schema: {
623
- description: "Per-compaction archive for the live session. Each entry " +
624
- "carries the SDK-generated summary, the pre-compaction " +
625
- "token count, and the AgentMessage[] that was archived (no " +
626
- "longer in the LLM's context window). `insertBeforeIndex` " +
627
- "tells the client where to splice a card into the post-" +
628
- "compaction `messages` array.",
629
- tags: ["sessions"],
630
- params: {
631
- type: "object",
632
- required: ["id"],
633
- properties: { id: { type: "string" } },
634
- },
635
- response: {
636
- 200: {
637
- type: "object",
638
- required: ["compactions"],
639
- properties: {
640
- compactions: {
641
- type: "array",
642
- items: {
643
- type: "object",
644
- required: [
645
- "id",
646
- "timestamp",
647
- "summary",
648
- "tokensBefore",
649
- "insertBeforeIndex",
650
- "archivedMessages",
651
- ],
652
- properties: {
653
- id: { type: "string" },
654
- timestamp: { type: "string" },
655
- summary: { type: "string" },
656
- tokensBefore: { type: "integer" },
657
- insertBeforeIndex: { type: "integer" },
658
- archivedMessages: { type: "array" },
659
- },
660
- },
661
- },
662
- },
663
- },
664
- 404: {
665
- type: "object",
666
- properties: { error: { type: "string" } },
667
- },
668
- },
669
- },
670
- }, async (req, reply) => {
671
- const live = getSession(req.params.id);
672
- if (live === undefined) {
673
- return reply.code(404).send({ error: "session_not_found" });
674
- }
675
- return { compactions: buildCompactionHistory(live.session) };
676
- });
677
- };
678
- /**
679
- * Truncated text preview of a message's content for the session tree.
680
- */
681
- const PREVIEW_MAX_CHARS = 200;
682
- function previewOfMessageContent(content) {
683
- let text;
684
- if (typeof content === "string") {
685
- text = content;
686
- }
687
- else if (Array.isArray(content)) {
688
- const parts = [];
689
- for (const c of content) {
690
- const o = c;
691
- if (o.type === "text" && typeof o.text === "string")
692
- parts.push(o.text);
693
- }
694
- text = parts.join("\n");
695
- }
696
- else {
697
- return undefined;
698
- }
699
- text = text.trim();
700
- if (text.length === 0)
701
- return undefined;
702
- if (text.length <= PREVIEW_MAX_CHARS)
703
- return text;
704
- return text.slice(0, PREVIEW_MAX_CHARS - 1) + "…";
705
- }
706
- //# sourceMappingURL=sessions.js.map