@kvman/kvcoder 0.1.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 (409) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/dist/api.d.ts +386 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +2 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/artifacts/artifact-format.d.ts +9 -0
  8. package/dist/artifacts/artifact-format.d.ts.map +1 -0
  9. package/dist/artifacts/artifact-format.js +32 -0
  10. package/dist/artifacts/artifact-format.js.map +1 -0
  11. package/dist/artifacts/artifact-records.d.ts +12 -0
  12. package/dist/artifacts/artifact-records.d.ts.map +1 -0
  13. package/dist/artifacts/artifact-records.js +17 -0
  14. package/dist/artifacts/artifact-records.js.map +1 -0
  15. package/dist/artifacts/register-artifacts.d.ts +3 -0
  16. package/dist/artifacts/register-artifacts.d.ts.map +1 -0
  17. package/dist/artifacts/register-artifacts.js +37 -0
  18. package/dist/artifacts/register-artifacts.js.map +1 -0
  19. package/dist/calls/binary-checks.d.ts +8 -0
  20. package/dist/calls/binary-checks.d.ts.map +1 -0
  21. package/dist/calls/binary-checks.js +12 -0
  22. package/dist/calls/binary-checks.js.map +1 -0
  23. package/dist/calls/connector-help.d.ts +3 -0
  24. package/dist/calls/connector-help.d.ts.map +1 -0
  25. package/dist/calls/connector-help.js +73 -0
  26. package/dist/calls/connector-help.js.map +1 -0
  27. package/dist/calls/help-text.d.ts +19 -0
  28. package/dist/calls/help-text.d.ts.map +1 -0
  29. package/dist/calls/help-text.js +22 -0
  30. package/dist/calls/help-text.js.map +1 -0
  31. package/dist/calls/line-run.d.ts +33 -0
  32. package/dist/calls/line-run.d.ts.map +1 -0
  33. package/dist/calls/line-run.js +56 -0
  34. package/dist/calls/line-run.js.map +1 -0
  35. package/dist/calls/run-shell.d.ts +12 -0
  36. package/dist/calls/run-shell.d.ts.map +1 -0
  37. package/dist/calls/run-shell.js +88 -0
  38. package/dist/calls/run-shell.js.map +1 -0
  39. package/dist/calls/run-tool.d.ts +49 -0
  40. package/dist/calls/run-tool.d.ts.map +1 -0
  41. package/dist/calls/run-tool.js +66 -0
  42. package/dist/calls/run-tool.js.map +1 -0
  43. package/dist/calls/shell-command.d.ts +25 -0
  44. package/dist/calls/shell-command.d.ts.map +1 -0
  45. package/dist/calls/shell-command.js +31 -0
  46. package/dist/calls/shell-command.js.map +1 -0
  47. package/dist/calls/shell-program.d.ts +5 -0
  48. package/dist/calls/shell-program.d.ts.map +1 -0
  49. package/dist/calls/shell-program.js +8 -0
  50. package/dist/calls/shell-program.js.map +1 -0
  51. package/dist/connector-call.d.ts +66 -0
  52. package/dist/connector-call.d.ts.map +1 -0
  53. package/dist/connector-call.js +133 -0
  54. package/dist/connector-call.js.map +1 -0
  55. package/dist/connectors/artifact.d.ts +51 -0
  56. package/dist/connectors/artifact.d.ts.map +1 -0
  57. package/dist/connectors/artifact.js +101 -0
  58. package/dist/connectors/artifact.js.map +1 -0
  59. package/dist/connectors/ask.d.ts +58 -0
  60. package/dist/connectors/ask.d.ts.map +1 -0
  61. package/dist/connectors/ask.js +85 -0
  62. package/dist/connectors/ask.js.map +1 -0
  63. package/dist/connectors/background.d.ts +29 -0
  64. package/dist/connectors/background.d.ts.map +1 -0
  65. package/dist/connectors/background.js +56 -0
  66. package/dist/connectors/background.js.map +1 -0
  67. package/dist/connectors/binary.d.ts +5 -0
  68. package/dist/connectors/binary.d.ts.map +1 -0
  69. package/dist/connectors/binary.js +27 -0
  70. package/dist/connectors/binary.js.map +1 -0
  71. package/dist/connectors/builtin-connectors.d.ts +217 -0
  72. package/dist/connectors/builtin-connectors.d.ts.map +1 -0
  73. package/dist/connectors/builtin-connectors.js +49 -0
  74. package/dist/connectors/builtin-connectors.js.map +1 -0
  75. package/dist/connectors/connector-command.d.ts +26 -0
  76. package/dist/connectors/connector-command.d.ts.map +1 -0
  77. package/dist/connectors/connector-command.js +17 -0
  78. package/dist/connectors/connector-command.js.map +1 -0
  79. package/dist/connectors/delegate.d.ts +32 -0
  80. package/dist/connectors/delegate.d.ts.map +1 -0
  81. package/dist/connectors/delegate.js +82 -0
  82. package/dist/connectors/delegate.js.map +1 -0
  83. package/dist/connectors/fs.d.ts +60 -0
  84. package/dist/connectors/fs.d.ts.map +1 -0
  85. package/dist/connectors/fs.js +132 -0
  86. package/dist/connectors/fs.js.map +1 -0
  87. package/dist/connectors/mcp.d.ts +37 -0
  88. package/dist/connectors/mcp.d.ts.map +1 -0
  89. package/dist/connectors/mcp.js +69 -0
  90. package/dist/connectors/mcp.js.map +1 -0
  91. package/dist/connectors/payload-fields.d.ts +9 -0
  92. package/dist/connectors/payload-fields.d.ts.map +1 -0
  93. package/dist/connectors/payload-fields.js +13 -0
  94. package/dist/connectors/payload-fields.js.map +1 -0
  95. package/dist/connectors/shell.d.ts +19 -0
  96. package/dist/connectors/shell.d.ts.map +1 -0
  97. package/dist/connectors/shell.js +22 -0
  98. package/dist/connectors/shell.js.map +1 -0
  99. package/dist/delay.d.ts +3 -0
  100. package/dist/delay.d.ts.map +1 -0
  101. package/dist/delay.js +11 -0
  102. package/dist/delay.js.map +1 -0
  103. package/dist/delegate/approved-run.d.ts +13 -0
  104. package/dist/delegate/approved-run.d.ts.map +1 -0
  105. package/dist/delegate/approved-run.js +54 -0
  106. package/dist/delegate/approved-run.js.map +1 -0
  107. package/dist/delegate/programs.d.ts +32 -0
  108. package/dist/delegate/programs.d.ts.map +1 -0
  109. package/dist/delegate/programs.js +67 -0
  110. package/dist/delegate/programs.js.map +1 -0
  111. package/dist/delegate/register-worker-run.d.ts +9 -0
  112. package/dist/delegate/register-worker-run.d.ts.map +1 -0
  113. package/dist/delegate/register-worker-run.js +70 -0
  114. package/dist/delegate/register-worker-run.js.map +1 -0
  115. package/dist/delegate/run-program.d.ts +9 -0
  116. package/dist/delegate/run-program.d.ts.map +1 -0
  117. package/dist/delegate/run-program.js +59 -0
  118. package/dist/delegate/run-program.js.map +1 -0
  119. package/dist/delegate/runs.d.ts +27 -0
  120. package/dist/delegate/runs.d.ts.map +1 -0
  121. package/dist/delegate/runs.js +68 -0
  122. package/dist/delegate/runs.js.map +1 -0
  123. package/dist/delegate/workers.d.ts +266 -0
  124. package/dist/delegate/workers.d.ts.map +1 -0
  125. package/dist/delegate/workers.js +80 -0
  126. package/dist/delegate/workers.js.map +1 -0
  127. package/dist/docs.d.ts +14 -0
  128. package/dist/docs.d.ts.map +1 -0
  129. package/dist/docs.js +59 -0
  130. package/dist/docs.js.map +1 -0
  131. package/dist/files/edit-text.d.ts +13 -0
  132. package/dist/files/edit-text.d.ts.map +1 -0
  133. package/dist/files/edit-text.js +46 -0
  134. package/dist/files/edit-text.js.map +1 -0
  135. package/dist/files/file-queue.d.ts +3 -0
  136. package/dist/files/file-queue.d.ts.map +1 -0
  137. package/dist/files/file-queue.js +17 -0
  138. package/dist/files/file-queue.js.map +1 -0
  139. package/dist/files/list-entries.d.ts +14 -0
  140. package/dist/files/list-entries.d.ts.map +1 -0
  141. package/dist/files/list-entries.js +40 -0
  142. package/dist/files/list-entries.js.map +1 -0
  143. package/dist/files/read-file.d.ts +17 -0
  144. package/dist/files/read-file.d.ts.map +1 -0
  145. package/dist/files/read-file.js +53 -0
  146. package/dist/files/read-file.js.map +1 -0
  147. package/dist/files/search-text.d.ts +14 -0
  148. package/dist/files/search-text.d.ts.map +1 -0
  149. package/dist/files/search-text.js +62 -0
  150. package/dist/files/search-text.js.map +1 -0
  151. package/dist/files/workspace-path.d.ts +5 -0
  152. package/dist/files/workspace-path.d.ts.map +1 -0
  153. package/dist/files/workspace-path.js +37 -0
  154. package/dist/files/workspace-path.js.map +1 -0
  155. package/dist/index.d.ts +6 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +68 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/jobs/job-rows.d.ts +24 -0
  160. package/dist/jobs/job-rows.d.ts.map +1 -0
  161. package/dist/jobs/job-rows.js +74 -0
  162. package/dist/jobs/job-rows.js.map +1 -0
  163. package/dist/jobs/process-handlers.d.ts +8 -0
  164. package/dist/jobs/process-handlers.d.ts.map +1 -0
  165. package/dist/jobs/process-handlers.js +43 -0
  166. package/dist/jobs/process-handlers.js.map +1 -0
  167. package/dist/jobs/process-records.d.ts +15 -0
  168. package/dist/jobs/process-records.d.ts.map +1 -0
  169. package/dist/jobs/process-records.js +30 -0
  170. package/dist/jobs/process-records.js.map +1 -0
  171. package/dist/jobs/process-report.d.ts +8 -0
  172. package/dist/jobs/process-report.d.ts.map +1 -0
  173. package/dist/jobs/process-report.js +44 -0
  174. package/dist/jobs/process-report.js.map +1 -0
  175. package/dist/jobs/process-run.d.ts +26 -0
  176. package/dist/jobs/process-run.d.ts.map +1 -0
  177. package/dist/jobs/process-run.js +70 -0
  178. package/dist/jobs/process-run.js.map +1 -0
  179. package/dist/jobs/process-text.d.ts +5 -0
  180. package/dist/jobs/process-text.d.ts.map +1 -0
  181. package/dist/jobs/process-text.js +11 -0
  182. package/dist/jobs/process-text.js.map +1 -0
  183. package/dist/jobs/register-jobs.d.ts +3 -0
  184. package/dist/jobs/register-jobs.d.ts.map +1 -0
  185. package/dist/jobs/register-jobs.js +61 -0
  186. package/dist/jobs/register-jobs.js.map +1 -0
  187. package/dist/mcp/command-transport.d.ts +17 -0
  188. package/dist/mcp/command-transport.d.ts.map +1 -0
  189. package/dist/mcp/command-transport.js +60 -0
  190. package/dist/mcp/command-transport.js.map +1 -0
  191. package/dist/mcp/connect.d.ts +12 -0
  192. package/dist/mcp/connect.d.ts.map +1 -0
  193. package/dist/mcp/connect.js +54 -0
  194. package/dist/mcp/connect.js.map +1 -0
  195. package/dist/mcp/oauth-provider.d.ts +25 -0
  196. package/dist/mcp/oauth-provider.d.ts.map +1 -0
  197. package/dist/mcp/oauth-provider.js +59 -0
  198. package/dist/mcp/oauth-provider.js.map +1 -0
  199. package/dist/mcp/register-mcp.d.ts +3 -0
  200. package/dist/mcp/register-mcp.d.ts.map +1 -0
  201. package/dist/mcp/register-mcp.js +61 -0
  202. package/dist/mcp/register-mcp.js.map +1 -0
  203. package/dist/mcp/secrets.d.ts +7 -0
  204. package/dist/mcp/secrets.d.ts.map +1 -0
  205. package/dist/mcp/secrets.js +20 -0
  206. package/dist/mcp/secrets.js.map +1 -0
  207. package/dist/mcp/servers.d.ts +33 -0
  208. package/dist/mcp/servers.d.ts.map +1 -0
  209. package/dist/mcp/servers.js +31 -0
  210. package/dist/mcp/servers.js.map +1 -0
  211. package/dist/mcp/sign-in-record.d.ts +10 -0
  212. package/dist/mcp/sign-in-record.d.ts.map +1 -0
  213. package/dist/mcp/sign-in-record.js +4 -0
  214. package/dist/mcp/sign-in-record.js.map +1 -0
  215. package/dist/mcp/sign-in.d.ts +12 -0
  216. package/dist/mcp/sign-in.d.ts.map +1 -0
  217. package/dist/mcp/sign-in.js +75 -0
  218. package/dist/mcp/sign-in.js.map +1 -0
  219. package/dist/mcp/tools.d.ts +19 -0
  220. package/dist/mcp/tools.d.ts.map +1 -0
  221. package/dist/mcp/tools.js +31 -0
  222. package/dist/mcp/tools.js.map +1 -0
  223. package/dist/messages/attachments.d.ts +8 -0
  224. package/dist/messages/attachments.d.ts.map +1 -0
  225. package/dist/messages/attachments.js +48 -0
  226. package/dist/messages/attachments.js.map +1 -0
  227. package/dist/messages/receive-message.d.ts +15 -0
  228. package/dist/messages/receive-message.d.ts.map +1 -0
  229. package/dist/messages/receive-message.js +60 -0
  230. package/dist/messages/receive-message.js.map +1 -0
  231. package/dist/messages/register-messages.d.ts +3 -0
  232. package/dist/messages/register-messages.d.ts.map +1 -0
  233. package/dist/messages/register-messages.js +63 -0
  234. package/dist/messages/register-messages.js.map +1 -0
  235. package/dist/problems.d.ts +8 -0
  236. package/dist/problems.d.ts.map +1 -0
  237. package/dist/problems.js +14 -0
  238. package/dist/problems.js.map +1 -0
  239. package/dist/prompt/build-prompt.d.ts +29 -0
  240. package/dist/prompt/build-prompt.d.ts.map +1 -0
  241. package/dist/prompt/build-prompt.js +60 -0
  242. package/dist/prompt/build-prompt.js.map +1 -0
  243. package/dist/prompt/register-prompt.d.ts +3 -0
  244. package/dist/prompt/register-prompt.d.ts.map +1 -0
  245. package/dist/prompt/register-prompt.js +29 -0
  246. package/dist/prompt/register-prompt.js.map +1 -0
  247. package/dist/prompt/session-prompt.d.ts +24 -0
  248. package/dist/prompt/session-prompt.d.ts.map +1 -0
  249. package/dist/prompt/session-prompt.js +50 -0
  250. package/dist/prompt/session-prompt.js.map +1 -0
  251. package/dist/prompt/working-method.d.ts +7 -0
  252. package/dist/prompt/working-method.d.ts.map +1 -0
  253. package/dist/prompt/working-method.js +51 -0
  254. package/dist/prompt/working-method.js.map +1 -0
  255. package/dist/register-settings.d.ts +142 -0
  256. package/dist/register-settings.d.ts.map +1 -0
  257. package/dist/register-settings.js +51 -0
  258. package/dist/register-settings.js.map +1 -0
  259. package/dist/registry/loaded.d.ts +32 -0
  260. package/dist/registry/loaded.d.ts.map +1 -0
  261. package/dist/registry/loaded.js +41 -0
  262. package/dist/registry/loaded.js.map +1 -0
  263. package/dist/registry/register-connectors.d.ts +32 -0
  264. package/dist/registry/register-connectors.d.ts.map +1 -0
  265. package/dist/registry/register-connectors.js +126 -0
  266. package/dist/registry/register-connectors.js.map +1 -0
  267. package/dist/registry/register-sections.d.ts +18 -0
  268. package/dist/registry/register-sections.d.ts.map +1 -0
  269. package/dist/registry/register-sections.js +99 -0
  270. package/dist/registry/register-sections.js.map +1 -0
  271. package/dist/registry/session-points.d.ts +11 -0
  272. package/dist/registry/session-points.d.ts.map +1 -0
  273. package/dist/registry/session-points.js +89 -0
  274. package/dist/registry/session-points.js.map +1 -0
  275. package/dist/result-text.d.ts +11 -0
  276. package/dist/result-text.d.ts.map +1 -0
  277. package/dist/result-text.js +21 -0
  278. package/dist/result-text.js.map +1 -0
  279. package/dist/schemas/records.d.ts +357 -0
  280. package/dist/schemas/records.d.ts.map +1 -0
  281. package/dist/schemas/records.js +159 -0
  282. package/dist/schemas/records.js.map +1 -0
  283. package/dist/schemas/registry.d.ts +160 -0
  284. package/dist/schemas/registry.d.ts.map +1 -0
  285. package/dist/schemas/registry.js +37 -0
  286. package/dist/schemas/registry.js.map +1 -0
  287. package/dist/sessions/new-session.d.ts +6 -0
  288. package/dist/sessions/new-session.d.ts.map +1 -0
  289. package/dist/sessions/new-session.js +52 -0
  290. package/dist/sessions/new-session.js.map +1 -0
  291. package/dist/sessions/register-fork-export.d.ts +5 -0
  292. package/dist/sessions/register-fork-export.d.ts.map +1 -0
  293. package/dist/sessions/register-fork-export.js +62 -0
  294. package/dist/sessions/register-fork-export.js.map +1 -0
  295. package/dist/sessions/register-lifecycle.d.ts +3 -0
  296. package/dist/sessions/register-lifecycle.d.ts.map +1 -0
  297. package/dist/sessions/register-lifecycle.js +59 -0
  298. package/dist/sessions/register-lifecycle.js.map +1 -0
  299. package/dist/sessions/register-sessions.d.ts +3 -0
  300. package/dist/sessions/register-sessions.d.ts.map +1 -0
  301. package/dist/sessions/register-sessions.js +93 -0
  302. package/dist/sessions/register-sessions.js.map +1 -0
  303. package/dist/sessions/session-lookup.d.ts +10 -0
  304. package/dist/sessions/session-lookup.d.ts.map +1 -0
  305. package/dist/sessions/session-lookup.js +25 -0
  306. package/dist/sessions/session-lookup.js.map +1 -0
  307. package/dist/sessions/session-view.d.ts +118 -0
  308. package/dist/sessions/session-view.d.ts.map +1 -0
  309. package/dist/sessions/session-view.js +105 -0
  310. package/dist/sessions/session-view.js.map +1 -0
  311. package/dist/store/collections.d.ts +471 -0
  312. package/dist/store/collections.d.ts.map +1 -0
  313. package/dist/store/collections.js +46 -0
  314. package/dist/store/collections.js.map +1 -0
  315. package/dist/turns/background.d.ts +6 -0
  316. package/dist/turns/background.d.ts.map +1 -0
  317. package/dist/turns/background.js +27 -0
  318. package/dist/turns/background.js.map +1 -0
  319. package/dist/turns/cancel-turn.d.ts +3 -0
  320. package/dist/turns/cancel-turn.d.ts.map +1 -0
  321. package/dist/turns/cancel-turn.js +31 -0
  322. package/dist/turns/cancel-turn.js.map +1 -0
  323. package/dist/turns/compaction.d.ts +12 -0
  324. package/dist/turns/compaction.d.ts.map +1 -0
  325. package/dist/turns/compaction.js +55 -0
  326. package/dist/turns/compaction.js.map +1 -0
  327. package/dist/turns/end-turn.d.ts +15 -0
  328. package/dist/turns/end-turn.d.ts.map +1 -0
  329. package/dist/turns/end-turn.js +67 -0
  330. package/dist/turns/end-turn.js.map +1 -0
  331. package/dist/turns/history.d.ts +28 -0
  332. package/dist/turns/history.d.ts.map +1 -0
  333. package/dist/turns/history.js +47 -0
  334. package/dist/turns/history.js.map +1 -0
  335. package/dist/turns/lost-reply.d.ts +31 -0
  336. package/dist/turns/lost-reply.d.ts.map +1 -0
  337. package/dist/turns/lost-reply.js +43 -0
  338. package/dist/turns/lost-reply.js.map +1 -0
  339. package/dist/turns/message-blocks.d.ts +9 -0
  340. package/dist/turns/message-blocks.d.ts.map +1 -0
  341. package/dist/turns/message-blocks.js +25 -0
  342. package/dist/turns/message-blocks.js.map +1 -0
  343. package/dist/turns/model-context.d.ts +81 -0
  344. package/dist/turns/model-context.d.ts.map +1 -0
  345. package/dist/turns/model-context.js +46 -0
  346. package/dist/turns/model-context.js.map +1 -0
  347. package/dist/turns/model-info.d.ts +7 -0
  348. package/dist/turns/model-info.d.ts.map +1 -0
  349. package/dist/turns/model-info.js +10 -0
  350. package/dist/turns/model-info.js.map +1 -0
  351. package/dist/turns/model-retry.d.ts +3 -0
  352. package/dist/turns/model-retry.d.ts.map +1 -0
  353. package/dist/turns/model-retry.js +23 -0
  354. package/dist/turns/model-retry.js.map +1 -0
  355. package/dist/turns/register-interruptions.d.ts +3 -0
  356. package/dist/turns/register-interruptions.d.ts.map +1 -0
  357. package/dist/turns/register-interruptions.js +31 -0
  358. package/dist/turns/register-interruptions.js.map +1 -0
  359. package/dist/turns/register-turns.d.ts +3 -0
  360. package/dist/turns/register-turns.d.ts.map +1 -0
  361. package/dist/turns/register-turns.js +66 -0
  362. package/dist/turns/register-turns.js.map +1 -0
  363. package/dist/turns/resolve.d.ts +7 -0
  364. package/dist/turns/resolve.d.ts.map +1 -0
  365. package/dist/turns/resolve.js +29 -0
  366. package/dist/turns/resolve.js.map +1 -0
  367. package/dist/turns/run-calls.d.ts +34 -0
  368. package/dist/turns/run-calls.d.ts.map +1 -0
  369. package/dist/turns/run-calls.js +99 -0
  370. package/dist/turns/run-calls.js.map +1 -0
  371. package/dist/turns/run-command.d.ts +26 -0
  372. package/dist/turns/run-command.d.ts.map +1 -0
  373. package/dist/turns/run-command.js +118 -0
  374. package/dist/turns/run-command.js.map +1 -0
  375. package/dist/turns/settle-calls.d.ts +17 -0
  376. package/dist/turns/settle-calls.d.ts.map +1 -0
  377. package/dist/turns/settle-calls.js +98 -0
  378. package/dist/turns/settle-calls.js.map +1 -0
  379. package/dist/turns/start-turn.d.ts +87 -0
  380. package/dist/turns/start-turn.d.ts.map +1 -0
  381. package/dist/turns/start-turn.js +40 -0
  382. package/dist/turns/start-turn.js.map +1 -0
  383. package/dist/turns/step.d.ts +8 -0
  384. package/dist/turns/step.d.ts.map +1 -0
  385. package/dist/turns/step.js +168 -0
  386. package/dist/turns/step.js.map +1 -0
  387. package/dist/ui/register-ui.d.ts +3 -0
  388. package/dist/ui/register-ui.d.ts.map +1 -0
  389. package/dist/ui/register-ui.js +75 -0
  390. package/dist/ui/register-ui.js.map +1 -0
  391. package/dist/web/components/call.css +2 -0
  392. package/dist/web/components/call.js +386 -0
  393. package/dist/web/components/connectors.css +2 -0
  394. package/dist/web/components/connectors.js +2403 -0
  395. package/dist/web/components/conversation.css +2 -0
  396. package/dist/web/components/conversation.js +4319 -0
  397. package/dist/web/components/mcp-sign-in.css +2 -0
  398. package/dist/web/components/mcp-sign-in.js +265 -0
  399. package/dist/web/components/model.css +2 -0
  400. package/dist/web/components/model.js +545 -0
  401. package/dist/web/components/question.css +2 -0
  402. package/dist/web/components/question.js +321 -0
  403. package/dist/web/components/sessions.css +2 -0
  404. package/dist/web/components/sessions.js +264 -0
  405. package/docs/connectors.md +86 -0
  406. package/docs/sections.md +27 -0
  407. package/locales/ar.json +418 -0
  408. package/locales/en.json +418 -0
  409. package/package.json +70 -0
@@ -0,0 +1,74 @@
1
+ import { stopRun } from "../delegate/runs.js";
2
+ import { records } from "../store/collections.js";
3
+ import { cancelTurn } from "../turns/cancel-turn.js";
4
+ import { appendBackground, backgroundText } from "../turns/background.js";
5
+ import { childResult } from "../turns/end-turn.js";
6
+ import { processStatus, sessionProcess } from "./process-records.js";
7
+ import { outputTail } from "./process-report.js";
8
+ import { stopProcess } from "./process-run.js";
9
+ import { localLinks } from "./process-text.js";
10
+ const outputLines = 100;
11
+ async function subagentRow(ctx, entry) {
12
+ const store = records(ctx.store);
13
+ const child = await store.sessions.get(entry.ref);
14
+ const [turn] = await store.turns.find({ sessionId: entry.ref }, { limit: 1, order: 'desc' });
15
+ const outcome = turn?.outcome ?? null;
16
+ const status = child === undefined || outcome === null ? 'running' : outcome === 'done' ? 'succeeded' : outcome === 'cancelled' ? 'cancelled' : 'failed';
17
+ const row = { id: entry.ref, kind: 'subagent', title: entry.call, call: entry.call, status, startedAt: entry.startedAt, ...(turn?.endedAt === null || turn === undefined ? {} : { endedAt: turn.endedAt }) };
18
+ return { row, detail: outcome === null ? {} : { output: (await childResult(ctx, entry.ref, outcome)).text } };
19
+ }
20
+ async function processRow(ctx, id, sessionId) {
21
+ const doc = await sessionProcess(ctx, sessionId, id);
22
+ if (doc === undefined)
23
+ return undefined;
24
+ const row = { id: doc.id, kind: 'process', title: doc.title, call: doc.call, status: processStatus(doc), startedAt: doc.startedAt, ...(doc.endedAt === undefined ? {} : { endedAt: doc.endedAt }), ...(typeof doc.exitCode === 'number' ? { exitCode: doc.exitCode } : {}) };
25
+ return { row, detail: { output: await outputTail(ctx, doc.id, outputLines) } };
26
+ }
27
+ // A program worker's run (ADR 0021, 33): its output is what the call returned, once it has ended.
28
+ function runRow(run) {
29
+ const row = { id: run.id, kind: 'worker', title: run.worker, call: run.call, status: run.status, startedAt: run.startedAt, ...(run.endedAt === null ? {} : { endedAt: run.endedAt }), ...(run.exitCode === null ? {} : { exitCode: run.exitCode }) };
30
+ return { row, detail: run.output === null ? {} : { output: run.output } };
31
+ }
32
+ /** One job of the session by its id, with its output or problem; `undefined` when the session started no such job. */
33
+ export async function jobDetail(ctx, sessionId, id) {
34
+ const process = await processRow(ctx, id, sessionId);
35
+ if (process !== undefined)
36
+ return process;
37
+ const run = await records(ctx.store).runs.get(id);
38
+ if (run !== undefined)
39
+ return run.sessionId === sessionId ? runRow(run) : undefined;
40
+ const [entry] = await records(ctx.store).background.find({ sessionId, ref: id }, { limit: 1 });
41
+ return entry === undefined || entry.kind !== 'subagent' ? undefined : subagentRow(ctx, entry);
42
+ }
43
+ /** The session's newest 50 jobs, newest first. */
44
+ export async function jobRows(ctx, sessionId) {
45
+ const store = records(ctx.store);
46
+ const [entries, processes, runs] = await Promise.all([store.background.find({ sessionId }, { limit: 50, order: 'desc' }), store.processes.find({ sessionId }, { limit: 50, order: 'desc' }), store.runs.find({ sessionId }, { limit: 50, order: 'desc' })]);
47
+ const newest = [...entries.map((entry) => ({ id: entry.ref, startedAt: entry.startedAt })), ...[...processes, ...runs].map((doc) => ({ id: doc.id, startedAt: doc.startedAt }))].sort((a, b) => b.startedAt.localeCompare(a.startedAt)).slice(0, 50);
48
+ const found = await Promise.all(newest.map((job) => jobDetail(ctx, sessionId, job.id)));
49
+ return found.flatMap((job) => (job === undefined ? [] : [job.row]));
50
+ }
51
+ /** What the person's list adds to a row: the localhost links in a process's output. */
52
+ export async function linksOf(ctx, sessionId, row) {
53
+ if (row.kind !== 'process')
54
+ return [];
55
+ const doc = await sessionProcess(ctx, sessionId, row.id);
56
+ return doc === undefined ? [] : localLinks(await outputTail(ctx, doc.id, outputLines));
57
+ }
58
+ /** Stops a process or a run, or cancels a subagent and tells the session; `false` for a process or a run that had ended already. */
59
+ export async function cancelJob(ctx, sessionId, row, by) {
60
+ if (row.kind === 'worker') {
61
+ const run = await records(ctx.store).runs.get(row.id);
62
+ return run !== undefined && stopRun(ctx, run);
63
+ }
64
+ if (row.kind === 'process') {
65
+ const doc = await sessionProcess(ctx, sessionId, row.id);
66
+ return doc !== undefined && stopProcess(ctx, doc, by);
67
+ }
68
+ if (await cancelTurn(ctx, row.id, false)) {
69
+ const result = await childResult(ctx, row.id, 'cancelled');
70
+ await appendBackground(ctx, sessionId, { kind: 'subagent', sessionId: row.id }, backgroundText(row.call, row.id, result.text), false);
71
+ }
72
+ return true;
73
+ }
74
+ //# sourceMappingURL=job-rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-rows.js","sourceRoot":"","sources":["../../src/jobs/job-rows.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type Ctx } from '@kvman/sdk';
2
+ import type { ProcessDoc } from '../schemas/records.ts';
3
+ /** An exit gets a background message only past the startup second; an earlier one reaches the model in the start result (ADR 0012, 8). */
4
+ export declare function exitIsReported(doc: Pick<ProcessDoc, 'starting'>): boolean;
5
+ /** Marks the records of processes that no longer run, such as after kvman died; a hot reload leaves running ones alone. */
6
+ export declare function interruptLeftovers(ctx: Ctx): Promise<void>;
7
+ export declare function registerProcessHandlers(ctx: Ctx): void;
8
+ //# sourceMappingURL=process-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-handlers.d.ts","sourceRoot":"","sources":["../../src/jobs/process-handlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAWxD,0IAA0I;AAC1I,wBAAgB,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,OAAO,CAEzE;AAWD,2HAA2H;AAC3H,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAGhE;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CActD"}
@@ -0,0 +1,43 @@
1
+ import { z } from '@kvman/sdk';
2
+ import { records } from "../store/collections.js";
3
+ import { markEnd, ownerName, processId, processName } from "./process-records.js";
4
+ import { reportEnd } from "./process-report.js";
5
+ // How kvcoder learns that a background process ended without its own doing (ADR 0009, 150): `kernel.process.exited` for
6
+ // an exit by itself, `kernel.stopping` as kvman stops, and `kernel.started` for a kvman that died. The last two run in
7
+ // Home, so they only record the end; the chat is told at its next message (`reportInterrupted`).
8
+ const runningProcessesSchema = z.array(z.object({ extension: z.string(), name: z.string() }));
9
+ /** An exit gets a background message only past the startup second; an earlier one reaches the model in the start result (ADR 0012, 8). */
10
+ export function exitIsReported(doc) {
11
+ return doc.starting !== true;
12
+ }
13
+ async function interrupt(ctx, ids) {
14
+ for (const id of ids)
15
+ await markEnd(ctx, id, { end: 'interrupted', reported: false });
16
+ }
17
+ async function runningIds(ctx) {
18
+ const docs = await records(ctx.store).processes.find({}, { limit: 1000 });
19
+ return docs.filter((doc) => doc.end === undefined).map((doc) => doc.id);
20
+ }
21
+ /** Marks the records of processes that no longer run, such as after kvman died; a hot reload leaves running ones alone. */
22
+ export async function interruptLeftovers(ctx) {
23
+ const alive = new Set(runningProcessesSchema.parse(await ctx.exec('kernel.processes.list', {})).filter((process) => process.extension === ownerName).map((process) => process.name));
24
+ await interrupt(ctx, (await runningIds(ctx)).filter((id) => !alive.has(processName(id))));
25
+ }
26
+ export function registerProcessHandlers(ctx) {
27
+ ctx.registerHandler('kernel.process.exited', {
28
+ description: 'Records how a background process of a chat exited by itself, and tells the chat.',
29
+ handle: async ({ extension, name, exitCode, signal }) => {
30
+ const id = processId(name);
31
+ if (extension !== ownerName || id === undefined)
32
+ return;
33
+ const ended = await markEnd(ctx, id, { end: 'exited', exitCode, signal, reported: true });
34
+ if (ended !== undefined && exitIsReported(ended))
35
+ await reportEnd(ctx, ended);
36
+ },
37
+ });
38
+ ctx.registerHandler('kernel.stopping', {
39
+ description: 'Marks the background processes of chats interrupted, as kvman stops them.',
40
+ handle: async () => interrupt(ctx, await runningIds(ctx)),
41
+ });
42
+ }
43
+ //# sourceMappingURL=process-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-handlers.js","sourceRoot":"","sources":["../../src/jobs/process-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Ctx, Stored } from '@kvman/sdk';
2
+ import type { ProcessDoc } from '../schemas/records.ts';
3
+ /** The extension name the kernel's process service records for kvcoder's processes. */
4
+ export declare const ownerName = "@kvman/kvcoder";
5
+ export declare const processName: (id: string) => string;
6
+ /** The record id a process name `job-<id>` stands for, or `undefined` for another name. */
7
+ export declare const processId: (name: string) => string | undefined;
8
+ export type ProcessStatus = 'running' | 'succeeded' | 'failed' | 'cancelled' | 'interrupted';
9
+ export declare function processStatus(doc: ProcessDoc): ProcessStatus;
10
+ export type EndPatch = Pick<ProcessDoc, 'end' | 'reported'> & Partial<Pick<ProcessDoc, 'exitCode' | 'signal'>>;
11
+ /** Records how a process ended, once: the record when this call set the end, `undefined` when it had ended already. */
12
+ export declare function markEnd(ctx: Ctx, id: string, patch: EndPatch): Promise<Stored<ProcessDoc> | undefined>;
13
+ /** A session's process, or `undefined` when the session has none with that id. */
14
+ export declare function sessionProcess(ctx: Ctx, sessionId: string, id: string): Promise<Stored<ProcessDoc> | undefined>;
15
+ //# sourceMappingURL=process-records.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-records.d.ts","sourceRoot":"","sources":["../../src/jobs/process-records.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMxD,uFAAuF;AACvF,eAAO,MAAM,SAAS,mBAAmB,CAAC;AAE1C,eAAO,MAAM,WAAW,GAAI,IAAI,MAAM,KAAG,MAAqB,CAAC;AAE/D,2FAA2F;AAC3F,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAA8E,CAAC;AAEjI,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,aAAa,CAAC;AAE7F,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,aAAa,CAI5D;AAED,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC;AAE/G,uHAAuH;AACvH,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,CAM5G;AAED,kFAAkF;AAClF,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,CAGrH"}
@@ -0,0 +1,30 @@
1
+ import { now } from "../sessions/session-lookup.js";
2
+ import { records, txRecords } from "../store/collections.js";
3
+ // A background process's record (ADR 0009, 150): its name in the kernel's process service, how it ends, and its status.
4
+ /** The extension name the kernel's process service records for kvcoder's processes. */
5
+ export const ownerName = '@kvman/kvcoder';
6
+ export const processName = (id) => `job-${id}`;
7
+ /** The record id a process name `job-<id>` stands for, or `undefined` for another name. */
8
+ export const processId = (name) => (name.startsWith('job-') ? name.slice('job-'.length) : undefined);
9
+ export function processStatus(doc) {
10
+ if (doc.end === undefined)
11
+ return 'running';
12
+ if (doc.end === 'exited')
13
+ return doc.exitCode === 0 ? 'succeeded' : 'failed';
14
+ return doc.end === 'interrupted' ? 'interrupted' : 'cancelled';
15
+ }
16
+ /** Records how a process ended, once: the record when this call set the end, `undefined` when it had ended already. */
17
+ export async function markEnd(ctx, id, patch) {
18
+ return ctx.store.transaction((tx) => {
19
+ const doc = txRecords(tx).processes.get(id);
20
+ if (doc === undefined || doc.end !== undefined)
21
+ return undefined;
22
+ return txRecords(tx).processes.update(id, { ...patch, endedAt: now() });
23
+ });
24
+ }
25
+ /** A session's process, or `undefined` when the session has none with that id. */
26
+ export async function sessionProcess(ctx, sessionId, id) {
27
+ const doc = await records(ctx.store).processes.get(id);
28
+ return doc?.sessionId === sessionId ? doc : undefined;
29
+ }
30
+ //# sourceMappingURL=process-records.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-records.js","sourceRoot":"","sources":["../../src/jobs/process-records.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE7D,wHAAwH;AAExH,uFAAuF;AACvF,MAAM,CAAC,MAAM,SAAS,GAAG,gBAAgB,CAAC;AAE1C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAU,EAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;AAE/D,2FAA2F;AAC3F,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAsB,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAIjI,MAAM,UAAU,aAAa,CAAC,GAAe;IAC3C,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7E,OAAO,GAAG,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;AACjE,CAAC;AAID,uHAAuH;AACvH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAQ,EAAE,EAAU,EAAE,KAAe;IACjE,OAAO,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE;QAClC,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACjE,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAQ,EAAE,SAAiB,EAAE,EAAU;IAC1E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvD,OAAO,GAAG,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type Ctx, type Stored } from '@kvman/sdk';
2
+ import type { ProcessDoc } from '../schemas/records.ts';
3
+ /** A process's last lines of output; none when it left no log. */
4
+ export declare function outputTail(ctx: Ctx, id: string, lines: number): Promise<string>;
5
+ export declare function reportEnd(ctx: Ctx, doc: Stored<ProcessDoc>): Promise<void>;
6
+ /** Reports the endings no handler could write into this session (kvman stopped or died), once each. */
7
+ export declare function reportInterrupted(ctx: Ctx, sessionId: string): Promise<void>;
8
+ //# sourceMappingURL=process-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-report.d.ts","sourceRoot":"","sources":["../../src/jobs/process-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAWxD,kEAAkE;AAClE,wBAAsB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOrF;AASD,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhF;AAED,uGAAuG;AACvG,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlF"}
@@ -0,0 +1,44 @@
1
+ import { ProblemError } from '@kvman/sdk';
2
+ import { appendBackground, backgroundText } from "../turns/background.js";
3
+ import { records } from "../store/collections.js";
4
+ import { processName } from "./process-records.js";
5
+ import { lastLines } from "./process-text.js";
6
+ // Telling a session how a background process ended (ADR 0009, 150): one background message with the outcome and the
7
+ // last 20 lines of output. It never starts a turn, since a handler's jobs carry the `fromHandler` mark.
8
+ const reportLines = 20;
9
+ /** A process's last lines of output; none when it left no log. */
10
+ export async function outputTail(ctx, id, lines) {
11
+ try {
12
+ return lastLines(await ctx.processes.log(processName(id), { tail: lines }), lines);
13
+ }
14
+ catch (error) {
15
+ if (error instanceof ProblemError && error.problem.code === 'NOT_FOUND')
16
+ return '';
17
+ throw error;
18
+ }
19
+ }
20
+ function outcome(doc) {
21
+ if (doc.end === 'person')
22
+ return 'was stopped by the person.';
23
+ if (doc.end === 'interrupted')
24
+ return 'was interrupted because kvman stopped.';
25
+ if (doc.end === 'exited' && doc.exitCode !== null && doc.exitCode !== undefined)
26
+ return `exited with code ${String(doc.exitCode)}.`;
27
+ return `was killed by ${doc.signal ?? 'a signal'}.`;
28
+ }
29
+ export async function reportEnd(ctx, doc) {
30
+ const tail = await outputTail(ctx, doc.id, reportLines);
31
+ const text = `The process ${outcome(doc)}${tail === '' ? '' : `\nIts last output:\n${tail}`}`;
32
+ await appendBackground(ctx, doc.sessionId, { kind: 'job', jobId: doc.id }, backgroundText(doc.call, doc.id, text), false);
33
+ }
34
+ /** Reports the endings no handler could write into this session (kvman stopped or died), once each. */
35
+ export async function reportInterrupted(ctx, sessionId) {
36
+ const store = records(ctx.store);
37
+ for (const doc of await store.processes.find({ sessionId, reported: false }, { limit: 1000 })) {
38
+ if (doc.end === undefined)
39
+ continue;
40
+ await store.processes.update(doc.id, { reported: true });
41
+ await reportEnd(ctx, doc);
42
+ }
43
+ }
44
+ //# sourceMappingURL=process-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-report.js","sourceRoot":"","sources":["../../src/jobs/process-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,YAAY,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,oHAAoH;AACpH,wGAAwG;AAExG,MAAM,WAAW,GAAG,EAAE,CAAC;AAEvB,kEAAkE;AAClE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAQ,EAAE,EAAU,EAAE,KAAa;IAClE,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO,EAAE,CAAC;QACnF,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,GAAe;IAC9B,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ;QAAE,OAAO,4BAA4B,CAAC;IAC9D,IAAI,GAAG,CAAC,GAAG,KAAK,aAAa;QAAE,OAAO,wCAAwC,CAAC;IAC/E,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,oBAAoB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;IACpI,OAAO,iBAAiB,GAAG,CAAC,MAAM,IAAI,UAAU,GAAG,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAQ,EAAE,GAAuB;IAC/D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,eAAe,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,IAAI,EAAE,EAAE,CAAC;IAC9F,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5H,CAAC;AAED,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAQ,EAAE,SAAiB;IACjE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC9F,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;YAAE,SAAS;QACpC,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type Ctx, type Stored } from '@kvman/sdk';
2
+ import type { ShellCommand } from '../calls/shell-command.ts';
3
+ import type { ProcessDoc } from '../schemas/records.ts';
4
+ export type StartedProcess = {
5
+ output: string;
6
+ jobId: string;
7
+ ended: boolean;
8
+ exitCode: number | null;
9
+ signal: string | null;
10
+ };
11
+ /** How a start reads from its process record: running, or how it ended (ADR 0012, 7 and 9). */
12
+ export declare function startedOutcome(doc: Pick<ProcessDoc, 'end' | 'exitCode' | 'signal'>): {
13
+ ended: boolean;
14
+ exitCode: number | null;
15
+ signal: string | null;
16
+ };
17
+ /** Starts `line` in the real shell for a session; a line that can't start fails `VALIDATION_FAILED` and leaves no record. */
18
+ export declare function startProcess(ctx: Ctx, sessionId: string, shell: ShellCommand, labelled: {
19
+ title: string;
20
+ line: string;
21
+ }): Promise<StartedProcess>;
22
+ /** Stops a running process for `by`; `false` when it had ended already. The person's stop is reported to the session. */
23
+ export declare function stopProcess(ctx: Ctx, doc: Stored<ProcessDoc>, by: 'agent' | 'person'): Promise<boolean>;
24
+ /** Stops every process a session still runs, and forgets all of them (the chat is deleted). */
25
+ export declare function dropProcesses(ctx: Ctx, sessionId: string): Promise<void>;
26
+ //# sourceMappingURL=process-run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-run.d.ts","sourceRoot":"","sources":["../../src/jobs/process-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAK9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AASxD,MAAM,MAAM,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE/H,+FAA+F;AAC/F,wBAAgB,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAOvJ;AAED,6HAA6H;AAC7H,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAkBvJ;AAED,yHAAyH;AACzH,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7G;AAED,+FAA+F;AAC/F,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM9E"}
@@ -0,0 +1,70 @@
1
+ import { ProblemError } from '@kvman/sdk';
2
+ import { delay } from "../delay.js";
3
+ import { now } from "../sessions/session-lookup.js";
4
+ import { records, txRecords } from "../store/collections.js";
5
+ import { markEnd, processName } from "./process-records.js";
6
+ import { outputTail, reportEnd } from "./process-report.js";
7
+ // A background shell line (ADR 0009, 149): it runs in the kernel's process service, and the call returns its id and the
8
+ // first second of its output. Stopping one is kvcoder's own call, since the kernel reports no event for a stop.
9
+ /** How long a background call waits for the first output. */
10
+ const startupWindowMs = 1_000;
11
+ const firstOutputLines = 100;
12
+ /** How a start reads from its process record: running, or how it ended (ADR 0012, 7 and 9). */
13
+ export function startedOutcome(doc) {
14
+ if (doc.end === undefined)
15
+ return { ended: false, exitCode: null, signal: null };
16
+ if (doc.end === 'exited') {
17
+ if (typeof doc.exitCode === 'number')
18
+ return { ended: true, exitCode: doc.exitCode, signal: null };
19
+ return { ended: true, exitCode: null, signal: doc.signal ?? 'a signal' };
20
+ }
21
+ return { ended: true, exitCode: null, signal: null };
22
+ }
23
+ /** Starts `line` in the real shell for a session; a line that can't start fails `VALIDATION_FAILED` and leaves no record. */
24
+ export async function startProcess(ctx, sessionId, shell, labelled) {
25
+ const store = records(ctx.store);
26
+ const doc = await store.processes.insert({ workspaceId: ctx.job.workspace.id, sessionId, title: labelled.title, call: labelled.line, startedAt: now(), reported: false, starting: true });
27
+ try {
28
+ await ctx.processes.start(processName(doc.id), { command: shell.program, args: shell.args(labelled.line) });
29
+ }
30
+ catch (error) {
31
+ await store.processes.delete(doc.id);
32
+ throw error;
33
+ }
34
+ await delay(startupWindowMs, ctx.job.signal);
35
+ const output = await outputTail(ctx, doc.id, firstOutputLines);
36
+ // The record alone decides: a process that died without its end recorded still counts as running (ADR 0012, 9).
37
+ const settled = await ctx.store.transaction((tx) => {
38
+ const current = txRecords(tx).processes.get(doc.id);
39
+ if (current === undefined)
40
+ return undefined;
41
+ return current.end === undefined ? txRecords(tx).processes.update(doc.id, { starting: false }) : current;
42
+ });
43
+ return { output, jobId: doc.id, ...startedOutcome(settled ?? doc) };
44
+ }
45
+ /** Stops a running process for `by`; `false` when it had ended already. The person's stop is reported to the session. */
46
+ export async function stopProcess(ctx, doc, by) {
47
+ const ended = await markEnd(ctx, doc.id, { end: by, reported: by === 'person' });
48
+ if (ended === undefined)
49
+ return false;
50
+ try {
51
+ await ctx.processes.stop(processName(doc.id));
52
+ }
53
+ catch (error) {
54
+ if (!(error instanceof ProblemError) || error.problem.code !== 'NOT_FOUND')
55
+ throw error;
56
+ }
57
+ if (by === 'person')
58
+ await reportEnd(ctx, ended);
59
+ return true;
60
+ }
61
+ /** Stops every process a session still runs, and forgets all of them (the chat is deleted). */
62
+ export async function dropProcesses(ctx, sessionId) {
63
+ const store = records(ctx.store);
64
+ for (const doc of await store.processes.find({ sessionId }, { limit: 1000 })) {
65
+ if (doc.end === undefined)
66
+ await stopProcess(ctx, doc, 'agent');
67
+ await store.processes.delete(doc.id);
68
+ }
69
+ }
70
+ //# sourceMappingURL=process-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-run.js","sourceRoot":"","sources":["../../src/jobs/process-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAyB,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAG5D,wHAAwH;AACxH,gHAAgH;AAEhH,6DAA6D;AAC7D,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAI7B,+FAA+F;AAC/F,MAAM,UAAU,cAAc,CAAC,GAAoD;IACjF,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACjF,IAAI,GAAG,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACnG,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACvD,CAAC;AAED,6HAA6H;AAC7H,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAQ,EAAE,SAAiB,EAAE,KAAmB,EAAE,QAAyC;IAC5H,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1L,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9G,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAC/D,gHAAgH;IAChH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE;QACjD,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC5C,OAAO,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3G,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,cAAc,CAAC,OAAO,IAAI,GAAG,CAAC,EAAE,CAAC;AACtE,CAAC;AAED,yHAAyH;AACzH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAQ,EAAE,GAAuB,EAAE,EAAsB;IACzF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,QAAQ,EAAE,CAAC,CAAC;IACjF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,YAAY,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,MAAM,KAAK,CAAC;IAC1F,CAAC;IACD,IAAI,EAAE,KAAK,QAAQ;QAAE,MAAM,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAQ,EAAE,SAAiB;IAC7D,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,MAAM,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC7E,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS;YAAE,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QAChE,MAAM,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ /** The last `count` lines of a log. */
2
+ export declare function lastLines(text: string, count: number): string;
3
+ /** The `http://127.0.0.1:<port>` and `http://localhost:<port>` URLs in a text, each once, without trailing punctuation. */
4
+ export declare function localLinks(text: string): string[];
5
+ //# sourceMappingURL=process-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-text.d.ts","sourceRoot":"","sources":["../../src/jobs/process-text.ts"],"names":[],"mappings":"AAEA,uCAAuC;AACvC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAID,2HAA2H;AAC3H,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjD"}
@@ -0,0 +1,11 @@
1
+ // What the model and the person read of a background process's output (ADR 0009, 150 and 152).
2
+ /** The last `count` lines of a log. */
3
+ export function lastLines(text, count) {
4
+ return text.replace(/[\r\n]+$/, '').split(/\r?\n/).slice(-count).join('\n');
5
+ }
6
+ const localUrl = /http:\/\/(?:127\.0\.0\.1|localhost):\d+[^\s"'`<>()[\]{}]*/g;
7
+ /** The `http://127.0.0.1:<port>` and `http://localhost:<port>` URLs in a text, each once, without trailing punctuation. */
8
+ export function localLinks(text) {
9
+ return [...new Set((text.match(localUrl) ?? []).map((url) => url.replace(/[.,;:!?]+$/, '')))];
10
+ }
11
+ //# sourceMappingURL=process-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-text.js","sourceRoot":"","sources":["../../src/jobs/process-text.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,uCAAuC;AACvC,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAa;IACnD,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,QAAQ,GAAG,4DAA4D,CAAC;AAE9E,2HAA2H;AAC3H,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAChG,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Ctx } from '@kvman/sdk';
2
+ export declare function registerJobs(ctx: Ctx): void;
3
+ //# sourceMappingURL=register-jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-jobs.d.ts","sourceRoot":"","sources":["../../src/jobs/register-jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAK,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAqBzC,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAwC3C"}
@@ -0,0 +1,61 @@
1
+ import { z } from '@kvman/sdk';
2
+ import { findSession, userOnly } from "../sessions/session-lookup.js";
3
+ import { cancelJob, jobDetail, jobRows, linksOf } from "./job-rows.js";
4
+ // The person's view of a session's background jobs (ADR 0009, 152): list, read, and cancel, for the Running chip.
5
+ const sessionJobSchema = z.object({ sessionId: z.string(), id: z.string() });
6
+ const rowSchema = z.object({
7
+ id: z.string(),
8
+ kind: z.enum(['process', 'subagent', 'worker']),
9
+ title: z.string(),
10
+ call: z.string(),
11
+ status: z.string(),
12
+ startedAt: z.string(),
13
+ endedAt: z.string().exactOptional(),
14
+ exitCode: z.number().int().exactOptional(),
15
+ links: z.array(z.string()),
16
+ });
17
+ const withLinks = async (ctx, sessionId, row) => ({ ...row, links: await linksOf(ctx, sessionId, row) });
18
+ export function registerJobs(ctx) {
19
+ ctx.registerQuery('kvcoder.job.list', {
20
+ description: "A chat's newest 50 background jobs (processes, subagents, and program workers' runs), running ones first.",
21
+ input: z.object({ sessionId: z.string() }),
22
+ output: z.array(rowSchema),
23
+ public: true,
24
+ handle: async ({ sessionId }) => {
25
+ userOnly(ctx, 'kvcoder.job.list');
26
+ await findSession(ctx, sessionId);
27
+ const rows = await Promise.all((await jobRows(ctx, sessionId)).map((row) => withLinks(ctx, sessionId, row)));
28
+ return [...rows.filter((row) => row.status === 'running'), ...rows.filter((row) => row.status !== 'running')];
29
+ },
30
+ });
31
+ ctx.registerQuery('kvcoder.job.get', {
32
+ description: "One background job of a chat with its output: a process's last 100 lines, a subagent's result, or what a program worker's run returned.",
33
+ input: sessionJobSchema,
34
+ output: rowSchema.extend({ output: z.json().exactOptional(), problem: z.json().exactOptional() }),
35
+ public: true,
36
+ handle: async ({ sessionId, id }) => {
37
+ userOnly(ctx, 'kvcoder.job.get');
38
+ await findSession(ctx, sessionId);
39
+ const found = await jobDetail(ctx, sessionId, id);
40
+ if (found === undefined)
41
+ throw ctx.problem('kvcoder/JOB_NOT_FOUND', { sessionId, id });
42
+ return { ...(await withLinks(ctx, sessionId, found.row)), ...found.detail };
43
+ },
44
+ });
45
+ ctx.registerCommand('kvcoder.job.cancel', {
46
+ description: "Stops a running background process or program worker's run of a chat, or cancels its background subagent.",
47
+ input: sessionJobSchema,
48
+ output: z.object({}),
49
+ public: true,
50
+ handle: async ({ sessionId, id }) => {
51
+ userOnly(ctx, 'kvcoder.job.cancel');
52
+ await findSession(ctx, sessionId);
53
+ const found = await jobDetail(ctx, sessionId, id);
54
+ if (found === undefined)
55
+ throw ctx.problem('kvcoder/JOB_NOT_FOUND', { sessionId, id });
56
+ await cancelJob(ctx, sessionId, found.row, 'person');
57
+ return {};
58
+ },
59
+ });
60
+ }
61
+ //# sourceMappingURL=register-jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-jobs.js","sourceRoot":"","sources":["../../src/jobs/register-jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { SpawnOptions } from 'node:child_process';
2
+ import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
3
+ import type { Platform } from '../calls/shell-command.ts';
4
+ export type CommandStart = {
5
+ command: string;
6
+ args: readonly string[];
7
+ cwd: string;
8
+ env: Readonly<Record<string, string>>;
9
+ };
10
+ /** A command's transport, and the last of what the command wrote to its error output. */
11
+ export type CommandTransport = Transport & {
12
+ errorOutput(): string;
13
+ };
14
+ /** How the command is started on each OS: in its own group where the group is what gets killed. */
15
+ export declare function commandSpawn(platform: Platform, start: CommandStart, environment: NodeJS.ProcessEnv): SpawnOptions;
16
+ export declare function commandTransport(start: CommandStart): CommandTransport;
17
+ //# sourceMappingURL=command-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-transport.d.ts","sourceRoot":"","sources":["../../src/mcp/command-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAE/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAM1D,MAAM,MAAM,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAE5H,yFAAyF;AACzF,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG;IAAE,WAAW,IAAI,MAAM,CAAA;CAAE,CAAC;AAErE,mGAAmG;AACnG,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,CAAC,UAAU,GAAG,YAAY,CAElH;AAID,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,gBAAgB,CAiDtE"}
@@ -0,0 +1,60 @@
1
+ import spawn from 'cross-spawn';
2
+ import { ReadBuffer, serializeMessage } from '@modelcontextprotocol/sdk/shared/stdio.js';
3
+ import { killTree } from "../calls/run-shell.js";
4
+ /** How the command is started on each OS: in its own group where the group is what gets killed. */
5
+ export function commandSpawn(platform, start, environment) {
6
+ return { cwd: start.cwd, env: { ...environment, ...start.env }, stdio: ['pipe', 'pipe', 'pipe'], detached: platform !== 'win32', windowsHide: true };
7
+ }
8
+ const errorOutputKept = 2_000;
9
+ export function commandTransport(start) {
10
+ const buffer = new ReadBuffer();
11
+ let child;
12
+ let closed = Promise.resolve();
13
+ let errors = Buffer.alloc(0);
14
+ const transport = {
15
+ errorOutput: () => errors.toString('utf8').trim(),
16
+ start: () => new Promise((resolve, reject) => {
17
+ const started = spawn(start.command, [...start.args], commandSpawn(process.platform, start, process.env));
18
+ child = started;
19
+ closed = new Promise((done) => started.once('exit', () => done()));
20
+ started.once('error', (error) => {
21
+ reject(error);
22
+ transport.onerror?.(error);
23
+ });
24
+ started.once('spawn', () => resolve());
25
+ started.once('exit', () => transport.onclose?.());
26
+ started.stdin?.on('error', (error) => transport.onerror?.(error));
27
+ started.stderr?.on('data', (chunk) => (errors = Buffer.concat([errors, chunk]).subarray(-errorOutputKept)));
28
+ started.stdout?.on('data', (chunk) => {
29
+ buffer.append(chunk);
30
+ try {
31
+ for (let message = buffer.readMessage(); message !== null; message = buffer.readMessage())
32
+ transport.onmessage?.(message);
33
+ }
34
+ catch (error) {
35
+ transport.onerror?.(error instanceof Error ? error : new Error(String(error)));
36
+ }
37
+ });
38
+ }),
39
+ send: (message) => new Promise((resolve, reject) => {
40
+ const input = child?.stdin;
41
+ if (input === undefined || input === null || !input.writable)
42
+ return reject(new Error('The server has exited.'));
43
+ input.write(serializeMessage(message), (error) => (error === null || error === undefined ? resolve() : reject(error)));
44
+ }),
45
+ // A command that never started has no pid and nothing to wait for. A process that left the group may still hold
46
+ // the pipes, so the wait is for the command's exit, and the pipes are then dropped.
47
+ close: async () => {
48
+ const pid = child?.pid;
49
+ if (pid === undefined)
50
+ return;
51
+ killTree(pid);
52
+ await closed;
53
+ child?.stdout?.destroy();
54
+ child?.stderr?.destroy();
55
+ buffer.clear();
56
+ },
57
+ };
58
+ return transport;
59
+ }
60
+ //# sourceMappingURL=command-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command-transport.js","sourceRoot":"","sources":["../../src/mcp/command-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type Ctx } from '@kvman/sdk';
2
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
3
+ import type { RequestOptions } from '@modelcontextprotocol/sdk/shared/protocol.js';
4
+ import type { McpServer } from './servers.ts';
5
+ /** What the work gets: the connected client, and the options every request of this connection takes. */
6
+ export type Connection = {
7
+ client: Client;
8
+ request: RequestOptions;
9
+ };
10
+ /** Connects to a server, runs `work`, and closes the connection; a failure is a Problem with the reason. */
11
+ export declare function withServer<Result>(ctx: Ctx, server: McpServer, timeoutMs: number, work: (connection: Connection) => Promise<Result>): Promise<Result>;
12
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/mcp/connect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8CAA8C,CAAC;AAKnF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C,wGAAwG;AACxG,MAAM,MAAM,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,CAAC;AA8BrE,4GAA4G;AAC5G,wBAAsB,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB3J"}