@kvman/kvcoder 0.1.5 → 0.1.7

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 (388) hide show
  1. package/dist/api.d.ts +49 -3
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/calls/run-shell.d.ts.map +1 -1
  4. package/dist/calls/run-shell.js +39 -9
  5. package/dist/calls/run-shell.js.map +1 -1
  6. package/dist/connector-call.d.ts +1 -1
  7. package/dist/connector-call.d.ts.map +1 -1
  8. package/dist/connector-call.js +4 -2
  9. package/dist/connector-call.js.map +1 -1
  10. package/dist/connectors/artifact.d.ts +1 -1
  11. package/dist/connectors/artifact.d.ts.map +1 -1
  12. package/dist/connectors/artifact.js +4 -4
  13. package/dist/connectors/artifact.js.map +1 -1
  14. package/dist/connectors/ask.d.ts +24 -0
  15. package/dist/connectors/ask.d.ts.map +1 -1
  16. package/dist/connectors/ask.js +20 -11
  17. package/dist/connectors/ask.js.map +1 -1
  18. package/dist/connectors/background.d.ts +14 -1
  19. package/dist/connectors/background.d.ts.map +1 -1
  20. package/dist/connectors/background.js +53 -23
  21. package/dist/connectors/background.js.map +1 -1
  22. package/dist/connectors/builtin-connectors.d.ts +111 -0
  23. package/dist/connectors/builtin-connectors.d.ts.map +1 -1
  24. package/dist/connectors/builtin-connectors.js +4 -1
  25. package/dist/connectors/builtin-connectors.js.map +1 -1
  26. package/dist/connectors/delegate.d.ts +9 -3
  27. package/dist/connectors/delegate.d.ts.map +1 -1
  28. package/dist/connectors/delegate.js +29 -10
  29. package/dist/connectors/delegate.js.map +1 -1
  30. package/dist/connectors/execution-map.d.ts +62 -0
  31. package/dist/connectors/execution-map.d.ts.map +1 -0
  32. package/dist/connectors/execution-map.js +142 -0
  33. package/dist/connectors/execution-map.js.map +1 -0
  34. package/dist/connectors/fs.d.ts +32 -1
  35. package/dist/connectors/fs.d.ts.map +1 -1
  36. package/dist/connectors/fs.js +76 -45
  37. package/dist/connectors/fs.js.map +1 -1
  38. package/dist/connectors/mcp.d.ts +18 -1
  39. package/dist/connectors/mcp.d.ts.map +1 -1
  40. package/dist/connectors/mcp.js +54 -6
  41. package/dist/connectors/mcp.js.map +1 -1
  42. package/dist/connectors/payload-fields.d.ts.map +1 -1
  43. package/dist/connectors/payload-fields.js +1 -1
  44. package/dist/connectors/payload-fields.js.map +1 -1
  45. package/dist/delegate/approved-run.d.ts +4 -6
  46. package/dist/delegate/approved-run.d.ts.map +1 -1
  47. package/dist/delegate/approved-run.js +74 -34
  48. package/dist/delegate/approved-run.js.map +1 -1
  49. package/dist/delegate/git-staging.d.ts +12 -0
  50. package/dist/delegate/git-staging.d.ts.map +1 -0
  51. package/dist/delegate/git-staging.js +54 -0
  52. package/dist/delegate/git-staging.js.map +1 -0
  53. package/dist/delegate/permission.d.ts +240 -0
  54. package/dist/delegate/permission.d.ts.map +1 -0
  55. package/dist/delegate/permission.js +78 -0
  56. package/dist/delegate/permission.js.map +1 -0
  57. package/dist/delegate/program-permission.d.ts +27 -0
  58. package/dist/delegate/program-permission.d.ts.map +1 -0
  59. package/dist/delegate/program-permission.js +53 -0
  60. package/dist/delegate/program-permission.js.map +1 -0
  61. package/dist/delegate/register-worker-run.d.ts.map +1 -1
  62. package/dist/delegate/register-worker-run.js +27 -11
  63. package/dist/delegate/register-worker-run.js.map +1 -1
  64. package/dist/delegate/run-program.d.ts.map +1 -1
  65. package/dist/delegate/run-program.js +29 -8
  66. package/dist/delegate/run-program.js.map +1 -1
  67. package/dist/delegate/runs.d.ts +14 -4
  68. package/dist/delegate/runs.d.ts.map +1 -1
  69. package/dist/delegate/runs.js +49 -19
  70. package/dist/delegate/runs.js.map +1 -1
  71. package/dist/delegate/staging-guard.d.ts +9 -0
  72. package/dist/delegate/staging-guard.d.ts.map +1 -0
  73. package/dist/delegate/staging-guard.js +55 -0
  74. package/dist/delegate/staging-guard.js.map +1 -0
  75. package/dist/delegate/start-background.d.ts +7 -0
  76. package/dist/delegate/start-background.d.ts.map +1 -0
  77. package/dist/delegate/start-background.js +32 -0
  78. package/dist/delegate/start-background.js.map +1 -0
  79. package/dist/delegate/start-pending.d.ts +5 -0
  80. package/dist/delegate/start-pending.d.ts.map +1 -0
  81. package/dist/delegate/start-pending.js +42 -0
  82. package/dist/delegate/start-pending.js.map +1 -0
  83. package/dist/delegate/workers.d.ts +5 -2
  84. package/dist/delegate/workers.d.ts.map +1 -1
  85. package/dist/delegate/workers.js +44 -8
  86. package/dist/delegate/workers.js.map +1 -1
  87. package/dist/files/file-change.d.ts +28 -0
  88. package/dist/files/file-change.d.ts.map +1 -0
  89. package/dist/files/file-change.js +125 -0
  90. package/dist/files/file-change.js.map +1 -0
  91. package/dist/files/file-parts.d.ts +18 -0
  92. package/dist/files/file-parts.d.ts.map +1 -0
  93. package/dist/files/file-parts.js +40 -0
  94. package/dist/files/file-parts.js.map +1 -0
  95. package/dist/files/read-file.d.ts +9 -1
  96. package/dist/files/read-file.d.ts.map +1 -1
  97. package/dist/files/read-file.js +35 -13
  98. package/dist/files/read-file.js.map +1 -1
  99. package/dist/files/search-text.d.ts +12 -2
  100. package/dist/files/search-text.d.ts.map +1 -1
  101. package/dist/files/search-text.js +87 -23
  102. package/dist/files/search-text.js.map +1 -1
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +4 -0
  105. package/dist/index.js.map +1 -1
  106. package/dist/jobs/job-rows.d.ts +11 -2
  107. package/dist/jobs/job-rows.d.ts.map +1 -1
  108. package/dist/jobs/job-rows.js +25 -14
  109. package/dist/jobs/job-rows.js.map +1 -1
  110. package/dist/jobs/process-handlers.d.ts.map +1 -1
  111. package/dist/jobs/process-handlers.js +12 -1
  112. package/dist/jobs/process-handlers.js.map +1 -1
  113. package/dist/jobs/process-report.d.ts.map +1 -1
  114. package/dist/jobs/process-report.js +2 -1
  115. package/dist/jobs/process-report.js.map +1 -1
  116. package/dist/jobs/process-run.d.ts.map +1 -1
  117. package/dist/jobs/process-run.js +2 -1
  118. package/dist/jobs/process-run.js.map +1 -1
  119. package/dist/jobs/register-jobs.d.ts.map +1 -1
  120. package/dist/jobs/register-jobs.js +1 -0
  121. package/dist/jobs/register-jobs.js.map +1 -1
  122. package/dist/maps/map-reminder.d.ts +7 -0
  123. package/dist/maps/map-reminder.d.ts.map +1 -0
  124. package/dist/maps/map-reminder.js +24 -0
  125. package/dist/maps/map-reminder.js.map +1 -0
  126. package/dist/maps/map-rules.d.ts +36 -0
  127. package/dist/maps/map-rules.d.ts.map +1 -0
  128. package/dist/maps/map-rules.js +86 -0
  129. package/dist/maps/map-rules.js.map +1 -0
  130. package/dist/maps/map-schema.d.ts +55 -0
  131. package/dist/maps/map-schema.d.ts.map +1 -0
  132. package/dist/maps/map-schema.js +27 -0
  133. package/dist/maps/map-schema.js.map +1 -0
  134. package/dist/maps/register-maps.d.ts +3 -0
  135. package/dist/maps/register-maps.d.ts.map +1 -0
  136. package/dist/maps/register-maps.js +21 -0
  137. package/dist/maps/register-maps.js.map +1 -0
  138. package/dist/mcp/connect.d.ts +2 -0
  139. package/dist/mcp/connect.d.ts.map +1 -1
  140. package/dist/mcp/connect.js +16 -4
  141. package/dist/mcp/connect.js.map +1 -1
  142. package/dist/mcp/oauth-provider.d.ts +8 -5
  143. package/dist/mcp/oauth-provider.d.ts.map +1 -1
  144. package/dist/mcp/oauth-provider.js +31 -22
  145. package/dist/mcp/oauth-provider.js.map +1 -1
  146. package/dist/mcp/secrets.d.ts +2 -0
  147. package/dist/mcp/secrets.d.ts.map +1 -1
  148. package/dist/mcp/secrets.js +6 -0
  149. package/dist/mcp/secrets.js.map +1 -1
  150. package/dist/mcp/sign-in.d.ts.map +1 -1
  151. package/dist/mcp/sign-in.js +12 -4
  152. package/dist/mcp/sign-in.js.map +1 -1
  153. package/dist/messages/receive-message.d.ts +2 -1
  154. package/dist/messages/receive-message.d.ts.map +1 -1
  155. package/dist/messages/receive-message.js +34 -9
  156. package/dist/messages/receive-message.js.map +1 -1
  157. package/dist/messages/register-messages.d.ts.map +1 -1
  158. package/dist/messages/register-messages.js +13 -8
  159. package/dist/messages/register-messages.js.map +1 -1
  160. package/dist/messages/send-receipt.d.ts +10 -0
  161. package/dist/messages/send-receipt.d.ts.map +1 -0
  162. package/dist/messages/send-receipt.js +14 -0
  163. package/dist/messages/send-receipt.js.map +1 -0
  164. package/dist/prompt/build-prompt.d.ts +1 -0
  165. package/dist/prompt/build-prompt.d.ts.map +1 -1
  166. package/dist/prompt/build-prompt.js +5 -1
  167. package/dist/prompt/build-prompt.js.map +1 -1
  168. package/dist/prompt/project-rules.d.ts +6 -0
  169. package/dist/prompt/project-rules.d.ts.map +1 -0
  170. package/dist/prompt/project-rules.js +37 -0
  171. package/dist/prompt/project-rules.js.map +1 -0
  172. package/dist/prompt/session-grants.d.ts +209 -0
  173. package/dist/prompt/session-grants.d.ts.map +1 -0
  174. package/dist/prompt/session-grants.js +50 -0
  175. package/dist/prompt/session-grants.js.map +1 -0
  176. package/dist/prompt/session-prompt.d.ts +3 -2
  177. package/dist/prompt/session-prompt.d.ts.map +1 -1
  178. package/dist/prompt/session-prompt.js +24 -40
  179. package/dist/prompt/session-prompt.js.map +1 -1
  180. package/dist/prompt/working-method.d.ts.map +1 -1
  181. package/dist/prompt/working-method.js +22 -16
  182. package/dist/prompt/working-method.js.map +1 -1
  183. package/dist/register-settings.d.ts +3 -1
  184. package/dist/register-settings.d.ts.map +1 -1
  185. package/dist/register-settings.js +5 -4
  186. package/dist/register-settings.js.map +1 -1
  187. package/dist/registry/register-connectors.d.ts +9 -0
  188. package/dist/registry/register-connectors.d.ts.map +1 -1
  189. package/dist/registry/register-connectors.js +20 -12
  190. package/dist/registry/register-connectors.js.map +1 -1
  191. package/dist/result-text.d.ts +4 -0
  192. package/dist/result-text.d.ts.map +1 -1
  193. package/dist/result-text.js +9 -0
  194. package/dist/result-text.js.map +1 -1
  195. package/dist/schemas/records.d.ts +142 -0
  196. package/dist/schemas/records.d.ts.map +1 -1
  197. package/dist/schemas/records.js +60 -2
  198. package/dist/schemas/records.js.map +1 -1
  199. package/dist/sessions/execution-root.d.ts +8 -0
  200. package/dist/sessions/execution-root.d.ts.map +1 -0
  201. package/dist/sessions/execution-root.js +25 -0
  202. package/dist/sessions/execution-root.js.map +1 -0
  203. package/dist/sessions/new-session.d.ts +5 -1
  204. package/dist/sessions/new-session.d.ts.map +1 -1
  205. package/dist/sessions/new-session.js +17 -4
  206. package/dist/sessions/new-session.js.map +1 -1
  207. package/dist/sessions/register-context.d.ts.map +1 -1
  208. package/dist/sessions/register-context.js +6 -5
  209. package/dist/sessions/register-context.js.map +1 -1
  210. package/dist/sessions/register-fork-export.d.ts.map +1 -1
  211. package/dist/sessions/register-fork-export.js +5 -3
  212. package/dist/sessions/register-fork-export.js.map +1 -1
  213. package/dist/sessions/register-lifecycle.d.ts.map +1 -1
  214. package/dist/sessions/register-lifecycle.js +14 -5
  215. package/dist/sessions/register-lifecycle.js.map +1 -1
  216. package/dist/sessions/register-sessions.d.ts.map +1 -1
  217. package/dist/sessions/register-sessions.js +0 -2
  218. package/dist/sessions/register-sessions.js.map +1 -1
  219. package/dist/sessions/session-view.d.ts +23 -0
  220. package/dist/sessions/session-view.d.ts.map +1 -1
  221. package/dist/sessions/session-view.js +4 -1
  222. package/dist/sessions/session-view.js.map +1 -1
  223. package/dist/store/all-docs.d.ts +4 -0
  224. package/dist/store/all-docs.d.ts.map +1 -0
  225. package/dist/store/all-docs.js +14 -0
  226. package/dist/store/all-docs.js.map +1 -0
  227. package/dist/store/collections.d.ts +230 -0
  228. package/dist/store/collections.d.ts.map +1 -1
  229. package/dist/store/collections.js +16 -1
  230. package/dist/store/collections.js.map +1 -1
  231. package/dist/turns/answer-fingerprint.d.ts +4 -0
  232. package/dist/turns/answer-fingerprint.d.ts.map +1 -0
  233. package/dist/turns/answer-fingerprint.js +18 -0
  234. package/dist/turns/answer-fingerprint.js.map +1 -0
  235. package/dist/turns/apply-answer.d.ts +19 -0
  236. package/dist/turns/apply-answer.d.ts.map +1 -0
  237. package/dist/turns/apply-answer.js +47 -0
  238. package/dist/turns/apply-answer.js.map +1 -0
  239. package/dist/turns/background.d.ts +3 -0
  240. package/dist/turns/background.d.ts.map +1 -1
  241. package/dist/turns/background.js +13 -12
  242. package/dist/turns/background.js.map +1 -1
  243. package/dist/turns/call-groups.d.ts +9 -0
  244. package/dist/turns/call-groups.d.ts.map +1 -0
  245. package/dist/turns/call-groups.js +18 -0
  246. package/dist/turns/call-groups.js.map +1 -0
  247. package/dist/turns/call-permission.d.ts +22 -0
  248. package/dist/turns/call-permission.d.ts.map +1 -0
  249. package/dist/turns/call-permission.js +49 -0
  250. package/dist/turns/call-permission.js.map +1 -0
  251. package/dist/turns/cancel-step-job.d.ts +14 -0
  252. package/dist/turns/cancel-step-job.d.ts.map +1 -0
  253. package/dist/turns/cancel-step-job.js +35 -0
  254. package/dist/turns/cancel-step-job.js.map +1 -0
  255. package/dist/turns/child-result.d.ts +7 -0
  256. package/dist/turns/child-result.d.ts.map +1 -0
  257. package/dist/turns/child-result.js +24 -0
  258. package/dist/turns/child-result.js.map +1 -0
  259. package/dist/turns/compaction.d.ts +15 -1
  260. package/dist/turns/compaction.d.ts.map +1 -1
  261. package/dist/turns/compaction.js +48 -18
  262. package/dist/turns/compaction.js.map +1 -1
  263. package/dist/turns/end-turn-state.d.ts +42 -0
  264. package/dist/turns/end-turn-state.d.ts.map +1 -0
  265. package/dist/turns/end-turn-state.js +64 -0
  266. package/dist/turns/end-turn-state.js.map +1 -0
  267. package/dist/turns/end-turn.d.ts +7 -8
  268. package/dist/turns/end-turn.d.ts.map +1 -1
  269. package/dist/turns/end-turn.js +52 -55
  270. package/dist/turns/end-turn.js.map +1 -1
  271. package/dist/turns/helper-calls.d.ts +6 -0
  272. package/dist/turns/helper-calls.d.ts.map +1 -0
  273. package/dist/turns/helper-calls.js +8 -0
  274. package/dist/turns/helper-calls.js.map +1 -0
  275. package/dist/turns/history.d.ts +3 -1
  276. package/dist/turns/history.d.ts.map +1 -1
  277. package/dist/turns/history.js +15 -7
  278. package/dist/turns/history.js.map +1 -1
  279. package/dist/turns/lost-reply.d.ts +7 -0
  280. package/dist/turns/lost-reply.d.ts.map +1 -1
  281. package/dist/turns/lost-reply.js +12 -0
  282. package/dist/turns/lost-reply.js.map +1 -1
  283. package/dist/turns/message-blocks.d.ts +2 -0
  284. package/dist/turns/message-blocks.d.ts.map +1 -1
  285. package/dist/turns/message-blocks.js +7 -0
  286. package/dist/turns/message-blocks.js.map +1 -1
  287. package/dist/turns/model-context.d.ts +2 -0
  288. package/dist/turns/model-context.d.ts.map +1 -1
  289. package/dist/turns/model-context.js +29 -5
  290. package/dist/turns/model-context.js.map +1 -1
  291. package/dist/turns/model-retry.d.ts +2 -1
  292. package/dist/turns/model-retry.d.ts.map +1 -1
  293. package/dist/turns/model-retry.js +5 -1
  294. package/dist/turns/model-retry.js.map +1 -1
  295. package/dist/turns/read-only.d.ts +6 -0
  296. package/dist/turns/read-only.d.ts.map +1 -0
  297. package/dist/turns/read-only.js +12 -0
  298. package/dist/turns/read-only.js.map +1 -0
  299. package/dist/turns/receipt-job.d.ts +5 -0
  300. package/dist/turns/receipt-job.d.ts.map +1 -0
  301. package/dist/turns/receipt-job.js +40 -0
  302. package/dist/turns/receipt-job.js.map +1 -0
  303. package/dist/turns/recover-workspace.d.ts +9 -0
  304. package/dist/turns/recover-workspace.d.ts.map +1 -0
  305. package/dist/turns/recover-workspace.js +79 -0
  306. package/dist/turns/recover-workspace.js.map +1 -0
  307. package/dist/turns/recovery-state.d.ts +19 -0
  308. package/dist/turns/recovery-state.d.ts.map +1 -0
  309. package/dist/turns/recovery-state.js +87 -0
  310. package/dist/turns/recovery-state.js.map +1 -0
  311. package/dist/turns/register-interruptions.d.ts.map +1 -1
  312. package/dist/turns/register-interruptions.js +19 -8
  313. package/dist/turns/register-interruptions.js.map +1 -1
  314. package/dist/turns/register-turns.d.ts.map +1 -1
  315. package/dist/turns/register-turns.js +42 -31
  316. package/dist/turns/register-turns.js.map +1 -1
  317. package/dist/turns/resolve.d.ts +4 -0
  318. package/dist/turns/resolve.d.ts.map +1 -1
  319. package/dist/turns/resolve.js +19 -17
  320. package/dist/turns/resolve.js.map +1 -1
  321. package/dist/turns/retry-turn.d.ts +4 -0
  322. package/dist/turns/retry-turn.d.ts.map +1 -0
  323. package/dist/turns/retry-turn.js +20 -0
  324. package/dist/turns/retry-turn.js.map +1 -0
  325. package/dist/turns/run-calls.d.ts +21 -4
  326. package/dist/turns/run-calls.d.ts.map +1 -1
  327. package/dist/turns/run-calls.js +157 -41
  328. package/dist/turns/run-calls.js.map +1 -1
  329. package/dist/turns/run-command.d.ts +5 -3
  330. package/dist/turns/run-command.d.ts.map +1 -1
  331. package/dist/turns/run-command.js +21 -12
  332. package/dist/turns/run-command.js.map +1 -1
  333. package/dist/turns/settle-calls.d.ts +2 -8
  334. package/dist/turns/settle-calls.d.ts.map +1 -1
  335. package/dist/turns/settle-calls.js +26 -35
  336. package/dist/turns/settle-calls.js.map +1 -1
  337. package/dist/turns/start-turn.d.ts +8 -83
  338. package/dist/turns/start-turn.d.ts.map +1 -1
  339. package/dist/turns/start-turn.js +35 -24
  340. package/dist/turns/start-turn.js.map +1 -1
  341. package/dist/turns/step-claim.d.ts +39 -0
  342. package/dist/turns/step-claim.d.ts.map +1 -0
  343. package/dist/turns/step-claim.js +72 -0
  344. package/dist/turns/step-claim.js.map +1 -0
  345. package/dist/turns/step-intents.d.ts +31 -0
  346. package/dist/turns/step-intents.d.ts.map +1 -0
  347. package/dist/turns/step-intents.js +101 -0
  348. package/dist/turns/step-intents.js.map +1 -0
  349. package/dist/turns/step-next.d.ts +17 -0
  350. package/dist/turns/step-next.d.ts.map +1 -0
  351. package/dist/turns/step-next.js +25 -0
  352. package/dist/turns/step-next.js.map +1 -0
  353. package/dist/turns/step.d.ts +1 -1
  354. package/dist/turns/step.d.ts.map +1 -1
  355. package/dist/turns/step.js +108 -88
  356. package/dist/turns/step.js.map +1 -1
  357. package/dist/turns/summary-facts.d.ts +25 -0
  358. package/dist/turns/summary-facts.d.ts.map +1 -0
  359. package/dist/turns/summary-facts.js +63 -0
  360. package/dist/turns/summary-facts.js.map +1 -0
  361. package/dist/turns/usage.d.ts +7 -0
  362. package/dist/turns/usage.d.ts.map +1 -0
  363. package/dist/turns/usage.js +18 -0
  364. package/dist/turns/usage.js.map +1 -0
  365. package/dist/ui/register-ui.js +3 -3
  366. package/dist/ui/register-ui.js.map +1 -1
  367. package/dist/web/components/approval.css +2 -0
  368. package/dist/web/components/approval.js +233 -0
  369. package/dist/web/components/call.css +1 -1
  370. package/dist/web/components/call.js +841 -131
  371. package/dist/web/components/connectors.css +1 -1
  372. package/dist/web/components/connectors.js +595 -592
  373. package/dist/web/components/conversation.css +1 -1
  374. package/dist/web/components/conversation.js +3341 -1418
  375. package/dist/web/components/mcp-sign-in.css +1 -1
  376. package/dist/web/components/model.css +1 -1
  377. package/dist/web/components/model.js +138 -134
  378. package/dist/web/components/question.css +1 -1
  379. package/dist/web/components/question.js +148 -78
  380. package/dist/web/components/sessions.css +1 -1
  381. package/docs/connectors.md +2 -2
  382. package/locales/ar.json +119 -12
  383. package/locales/en.json +119 -12
  384. package/package.json +6 -6
  385. package/dist/turns/cancel-turn.d.ts +0 -3
  386. package/dist/turns/cancel-turn.d.ts.map +0 -1
  387. package/dist/turns/cancel-turn.js +0 -31
  388. package/dist/turns/cancel-turn.js.map +0 -1
@@ -8,19 +8,20 @@ import { beginTurn, openTurn } from "./start-turn.js";
8
8
  export function backgroundText(call, ref, result) {
9
9
  return `The background call \`${call}\` (job ${ref}) finished:\n${result}`;
10
10
  }
11
+ /** Appends or queues the result in the caller's transaction; gives the turn it opened, for the caller to begin after its commit. */
12
+ export function appendBackgroundInTx(store, sessionId, source, text, startTurn) {
13
+ const session = store.sessions.get(sessionId);
14
+ if (session === undefined)
15
+ return undefined;
16
+ if (session.status !== 'idle') {
17
+ store.queued.insert({ sessionId, source, text, fileIds: null, fileNames: null, createdAt: now() });
18
+ return undefined;
19
+ }
20
+ appendMessage(store, session, { kind: 'user', content: userContent(text), source });
21
+ return startTurn ? openTurn(store, session) : undefined;
22
+ }
11
23
  export async function appendBackground(ctx, sessionId, source, text, startTurn) {
12
- const turnId = await ctx.store.transaction((tx) => {
13
- const store = txRecords(tx);
14
- const session = store.sessions.get(sessionId);
15
- if (session === undefined)
16
- return undefined;
17
- if (session.status !== 'idle') {
18
- store.queued.insert({ sessionId, source, text, fileIds: null, fileNames: null, createdAt: now() });
19
- return undefined;
20
- }
21
- appendMessage(store, session, { kind: 'user', content: userContent(text), source });
22
- return startTurn ? openTurn(store, session) : undefined;
23
- });
24
+ const turnId = await ctx.store.transaction((tx) => appendBackgroundInTx(txRecords(tx), sessionId, source, text, startTurn));
24
25
  if (turnId !== undefined)
25
26
  await beginTurn(ctx, sessionId, turnId, true);
26
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"background.js","sourceRoot":"","sources":["../../src/turns/background.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEtD,qHAAqH;AACrH,2GAA2G;AAE3G,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAW,EAAE,MAAc;IACtE,OAAO,yBAAyB,IAAI,WAAW,GAAG,gBAAgB,MAAM,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAQ,EAAE,SAAiB,EAAE,MAAc,EAAE,IAAY,EAAE,SAAkB;IAClH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE;QAChD,MAAM,KAAK,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACnG,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QACpF,OAAO,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1E,CAAC"}
1
+ {"version":3,"file":"background.js","sourceRoot":"","sources":["../../src/turns/background.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,+BAA+B,CAAC;AACpD,OAAO,EAAE,SAAS,EAAkB,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEtD,qHAAqH;AACrH,2GAA2G;AAE3G,2DAA2D;AAC3D,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,GAAW,EAAE,MAAc;IACtE,OAAO,yBAAyB,IAAI,WAAW,GAAG,gBAAgB,MAAM,EAAE,CAAC;AAC7E,CAAC;AAED,oIAAoI;AACpI,MAAM,UAAU,oBAAoB,CAAC,KAAgB,EAAE,SAAiB,EAAE,MAAc,EAAE,IAAY,EAAE,SAAkB;IACxH,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACnG,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACpF,OAAO,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAQ,EAAE,SAAiB,EAAE,MAAc,EAAE,IAAY,EAAE,SAAkB;IAClH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAC5H,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,9 @@
1
+ type Kinded = {
2
+ kind: string;
3
+ };
4
+ /** How many of `messages` are older than the newest `keep`: the kept ones never start at a tool result, so they start at its reply. */
5
+ export declare function olderCount(messages: readonly Kinded[], keep: number): number;
6
+ /** `messages` with, when they start at a tool result, the reply that made its call and that reply's results from `before`, the messages right before them. */
7
+ export declare function withCallingReply<Message extends Kinded>(before: readonly Message[], messages: readonly Message[]): Message[];
8
+ export {};
9
+ //# sourceMappingURL=call-groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-groups.d.ts","sourceRoot":"","sources":["../../src/turns/call-groups.ts"],"names":[],"mappings":"AAIA,KAAK,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/B,uIAAuI;AACvI,wBAAgB,UAAU,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI5E;AAED,8JAA8J;AAC9J,wBAAgB,gBAAgB,CAAC,OAAO,SAAS,MAAM,EAAE,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,CAI5H"}
@@ -0,0 +1,18 @@
1
+ // A reply's calls and their results stay together (ADR 0036, 16): a provider refuses a tool result whose call it
2
+ // wasn't sent. A step's results are stored right after the reply that made the calls, so a run of results belongs to
3
+ // the message before it.
4
+ /** How many of `messages` are older than the newest `keep`: the kept ones never start at a tool result, so they start at its reply. */
5
+ export function olderCount(messages, keep) {
6
+ let count = Math.max(messages.length - keep, 0);
7
+ while (count > 0 && messages[count]?.kind === 'toolResult')
8
+ count -= 1;
9
+ return count;
10
+ }
11
+ /** `messages` with, when they start at a tool result, the reply that made its call and that reply's results from `before`, the messages right before them. */
12
+ export function withCallingReply(before, messages) {
13
+ if (messages[0]?.kind !== 'toolResult')
14
+ return [...messages];
15
+ const reply = before.findLastIndex((message) => message.kind !== 'toolResult');
16
+ return before[reply]?.kind === 'assistant' ? [...before.slice(reply), ...messages] : [...messages];
17
+ }
18
+ //# sourceMappingURL=call-groups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-groups.js","sourceRoot":"","sources":["../../src/turns/call-groups.ts"],"names":[],"mappings":"AAAA,iHAAiH;AACjH,qHAAqH;AACrH,yBAAyB;AAIzB,uIAAuI;AACvI,MAAM,UAAU,UAAU,CAAC,QAA2B,EAAE,IAAY;IAClE,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,OAAO,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,YAAY;QAAE,KAAK,IAAI,CAAC,CAAC;IACvE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8JAA8J;AAC9J,MAAM,UAAU,gBAAgB,CAAyB,MAA0B,EAAE,QAA4B;IAC/G,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,YAAY;QAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IAC/E,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;AACrG,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type Ctx } from '@kvman/sdk';
2
+ import type { RunCall } from '../calls/run-tool.ts';
3
+ import { type SessionGrants } from '../prompt/session-grants.ts';
4
+ import type { HeldResult } from '../schemas/records.ts';
5
+ import { type CommandTarget } from './run-command.ts';
6
+ import type { StepLease } from './step-claim.ts';
7
+ type Refusal = {
8
+ code: 'VALIDATION_FAILED' | 'NOT_FOUND';
9
+ message: string;
10
+ };
11
+ type Permission = {
12
+ grants: SessionGrants;
13
+ target: CommandTarget | undefined;
14
+ } | {
15
+ error: Refusal;
16
+ };
17
+ /** No external preparation remains after this transaction's authority/scope/registry decision. */
18
+ export declare function callPermission(ctx: Ctx, lease: StepLease, call: RunCall, held?: HeldResult): Promise<Permission>;
19
+ /** A queued/resumed dispatch cannot reuse a revoked grant, obsolete lease or changed immediate target. */
20
+ export declare function dispatchGuard(ctx: Ctx, lease: StepLease, call: RunCall, expected?: CommandTarget, held?: HeldResult): () => Promise<void>;
21
+ export {};
22
+ //# sourceMappingURL=call-permission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-permission.d.ts","sourceRoot":"","sources":["../../src/turns/call-permission.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAA6B,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,KAAK,OAAO,GAAG;IAAE,IAAI,EAAE,mBAAmB,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5E,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AASpG,kGAAkG;AAClG,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAgBtH;AAED,0GAA0G;AAC1G,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAMzI"}
@@ -0,0 +1,49 @@
1
+ import { isDeepStrictEqual } from 'node:util';
2
+ import { ProblemError } from '@kvman/sdk';
3
+ import { builtinConnectors, noCommandMessage, noConnectorMessage } from "../connector-call.js";
4
+ import { grantsInTx, prepareGrants } from "../prompt/session-grants.js";
5
+ import { txRecords } from "../store/collections.js";
6
+ import { commandNamesOf, targetOf } from "./run-command.js";
7
+ import { liveStep } from "./step-intents.js";
8
+ const stale = () => ({ error: { code: 'VALIDATION_FAILED', message: 'The originating step or approved call is no longer current.' } });
9
+ function unavailable(grants, connector) {
10
+ const known = builtinConnectors.some(name => name === connector) || grants.connectors.some(candidate => candidate.name === connector);
11
+ if (known && !grants.disabled.has(connector) && grants.session.parentId !== null)
12
+ return `${connector} isn't available in this subagent.`;
13
+ return noConnectorMessage(connector, grants.names);
14
+ }
15
+ /** No external preparation remains after this transaction's authority/scope/registry decision. */
16
+ export async function callPermission(ctx, lease, call, held) {
17
+ ctx.job.signal.throwIfAborted();
18
+ if (ctx.job.id !== lease.jobId)
19
+ return stale();
20
+ const prepared = await prepareGrants(ctx);
21
+ return ctx.store.transaction(tx => {
22
+ ctx.job.signal.throwIfAborted();
23
+ const store = txRecords(tx), live = liveStep(store, lease, ctx.job.id);
24
+ if (live === undefined)
25
+ return stale();
26
+ if (held !== undefined && (live.turn.pending.length !== 0 || live.turn.calls.filter(row => row.toolCallId === held.toolCallId && row.toolName === 'run').length !== 1 || live.turn.results.filter(row => row.toolCallId === held.toolCallId).length !== 1 || !live.turn.results.some(row => isDeepStrictEqual(row, held))))
27
+ return stale();
28
+ const grants = grantsInTx(store, live.session, prepared);
29
+ if (grants === undefined)
30
+ return { error: { code: 'VALIDATION_FAILED', message: 'The session ancestry is no longer available.' } };
31
+ if (!grants.names.includes(call.connector))
32
+ return { error: { code: 'VALIDATION_FAILED', message: unavailable(grants, call.connector) } };
33
+ const target = call.command === 'help' ? undefined : targetOf(grants.connectors, call);
34
+ if (target === undefined && call.command !== 'help')
35
+ return { error: { code: 'NOT_FOUND', message: noCommandMessage(call.connector, call.command, commandNamesOf(grants.connectors, call.connector)) } };
36
+ return { grants, target };
37
+ });
38
+ }
39
+ /** A queued/resumed dispatch cannot reuse a revoked grant, obsolete lease or changed immediate target. */
40
+ export function dispatchGuard(ctx, lease, call, expected, held) {
41
+ return async () => {
42
+ const checked = await callPermission(ctx, lease, call, held);
43
+ if ('error' in checked)
44
+ throw new ProblemError({ ...checked.error, params: {} });
45
+ if (checked.target?.registration !== expected?.registration || checked.target?.asks !== expected?.asks)
46
+ throw new ProblemError({ code: 'VALIDATION_FAILED', message: 'The connector command changed before execution. Make this call again.', params: {} });
47
+ };
48
+ }
49
+ //# sourceMappingURL=call-permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-permission.js","sourceRoot":"","sources":["../../src/turns/call-permission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type Ctx, type Job } from '@kvman/sdk';
2
+ import type { EndedTurn } from './end-turn-state.ts';
3
+ import type { StepIdentity } from './step-intents.ts';
4
+ export type StepOwner = {
5
+ sessionId: string;
6
+ turnId: string;
7
+ jobId: string | null;
8
+ identity: StepIdentity | undefined;
9
+ };
10
+ /** Stopping owned work is not a replay permit; attempts/status cannot replace its immutable binding. */
11
+ export declare function ownsStepJob(job: Job, workspaceId: string, expected: StepOwner): boolean;
12
+ /** Verify AFTER terminal ownership capture; never trust a saved legacy or malformed pointer alone. */
13
+ export declare function cancelStepJob(ctx: Ctx, ended: EndedTurn): Promise<void>;
14
+ //# sourceMappingURL=cancel-step-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel-step-job.d.ts","sourceRoot":"","sources":["../../src/turns/cancel-step-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAA;CAAE,CAAC;AAExH,wGAAwG;AACxG,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAOvF;AAED,sGAAsG;AACtG,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAa7E"}
@@ -0,0 +1,35 @@
1
+ import { ProblemError } from '@kvman/sdk';
2
+ import { stepInputSchema } from "./step-claim.js";
3
+ /** Stopping owned work is not a replay permit; attempts/status cannot replace its immutable binding. */
4
+ export function ownsStepJob(job, workspaceId, expected) {
5
+ if (job.id !== expected.jobId || job.name !== 'kvcoder.turn.step' || job.workspaceId !== workspaceId)
6
+ return false;
7
+ const input = stepInputSchema.safeParse(job.input);
8
+ if (!input.success || input.data.sessionId !== expected.sessionId || input.data.turnId !== expected.turnId)
9
+ return false;
10
+ if (!('intentId' in input.data))
11
+ return true;
12
+ const identity = expected.identity;
13
+ return identity !== undefined && identity.sessionId === expected.sessionId && identity.turnId === expected.turnId && input.data.intentId === identity.intentId && input.data.generation === identity.generation;
14
+ }
15
+ /** Verify AFTER terminal ownership capture; never trust a saved legacy or malformed pointer alone. */
16
+ export async function cancelStepJob(ctx, ended) {
17
+ if (ended.stepJobId === null)
18
+ return;
19
+ let job;
20
+ try {
21
+ job = await ctx.exec('kernel.jobs.get', { id: ended.stepJobId });
22
+ }
23
+ catch (error) {
24
+ ctx.job.signal.throwIfAborted();
25
+ if (error instanceof ProblemError && error.problem.code === 'NOT_FOUND')
26
+ return;
27
+ throw error;
28
+ }
29
+ ctx.job.signal.throwIfAborted();
30
+ if (ownsStepJob(job, ctx.job.workspace.id, { sessionId: ended.session.id, turnId: ended.turnId, jobId: ended.stepJobId, identity: ended.stepIdentity }))
31
+ await ctx.cancel(job.id);
32
+ else
33
+ ctx.log.warn('A saved step job was not cancelled because ownership could not be verified.', { code: 'STEP_OWNERSHIP_UNCONFIRMED' });
34
+ }
35
+ //# sourceMappingURL=cancel-step-job.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel-step-job.js","sourceRoot":"","sources":["../../src/turns/cancel-step-job.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAsB,MAAM,YAAY,CAAC;AAE9D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAKlD,wGAAwG;AACxG,MAAM,UAAU,WAAW,CAAC,GAAQ,EAAE,WAAmB,EAAE,QAAmB;IAC5E,IAAI,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,IAAI,GAAG,CAAC,WAAW,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACnH,MAAM,KAAK,GAAG,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACzH,IAAI,CAAC,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;IACnC,OAAO,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,UAAU,CAAC;AAClN,CAAC;AAED,sGAAsG;AACtG,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAQ,EAAE,KAAgB;IAC5D,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO;IACrC,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAChC,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,OAAO;QAChF,MAAM,KAAK,CAAC;IACd,CAAC;IACD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IAChC,IAAI,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC;QAAE,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;;QAC7K,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,6EAA6E,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAC;AAC3I,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { Outcome } from '../schemas/records.ts';
2
+ import type { TxRecords } from '../store/collections.ts';
3
+ export declare function childResultInTx(store: TxRecords, childId: string, outcome: Outcome): {
4
+ text: string;
5
+ isError: boolean;
6
+ };
7
+ //# sourceMappingURL=child-result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-result.d.ts","sourceRoot":"","sources":["../../src/turns/child-result.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAezD,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAQvH"}
@@ -0,0 +1,24 @@
1
+ import { z } from '@kvman/sdk';
2
+ import { truncate } from "../result-text.js";
3
+ import { textOf } from "./model-context.js";
4
+ // What a finished subagent returns (ADR 0009, 102): its answer, or how and why it stopped (ADR 0050, 4). It reads
5
+ // inside a transaction, so the one that ends a child's turn can also deliver its result (ADR 0052, 2).
6
+ const noticeParamsSchema = z.object({ code: z.string(), details: z.object({ reason: z.string().exactOptional() }).exactOptional() });
7
+ // Why a child stopped, from the notice that ended it: the failure's code, and the provider's reason when it has one.
8
+ function stoppedBy(store, childId) {
9
+ const [last] = store.messages.find({ sessionId: childId }, { limit: 1, order: 'desc' });
10
+ const params = last?.kind === 'notice' ? noticeParamsSchema.safeParse(last.content['params']) : undefined;
11
+ return params?.success === true ? { code: params.data.code, reason: params.data.details?.reason } : undefined;
12
+ }
13
+ export function childResultInTx(store, childId, outcome) {
14
+ const [last] = store.messages.find({ sessionId: childId, kind: 'assistant' }, { limit: 1, order: 'desc' });
15
+ const answer = last === undefined ? '' : textOf(last.content['content']);
16
+ if (outcome === 'done')
17
+ return { text: truncate(answer), isError: false };
18
+ const why = stoppedBy(store, childId);
19
+ const lines = [`subagent ended ${outcome}${why === undefined ? '' : `: ${why.code}`}`, ...(why?.reason === undefined ? [] : [why.reason])];
20
+ if (answer !== '')
21
+ lines.push('', 'Its last message before it stopped (unfinished, not a result):', answer);
22
+ return { text: truncate(lines.join('\n')), isError: true };
23
+ }
24
+ //# sourceMappingURL=child-result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-result.js","sourceRoot":"","sources":["../../src/turns/child-result.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,kHAAkH;AAClH,uGAAuG;AAEvG,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;AAErI,qHAAqH;AACrH,SAAS,SAAS,CAAC,KAAgB,EAAE,OAAe;IAClD,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1G,OAAO,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAgB,EAAE,OAAe,EAAE,OAAgB;IACjF,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3G,MAAM,MAAM,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACzE,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC1E,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,CAAC,kBAAkB,OAAO,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3I,IAAI,MAAM,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gEAAgE,EAAE,MAAM,CAAC,CAAC;IAC5G,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC7D,CAAC"}
@@ -1,7 +1,20 @@
1
1
  import { type Ctx, type Stored } from '@kvman/sdk';
2
2
  import type { SessionDoc } from '../schemas/records.ts';
3
+ import { type StepLease } from './step-claim.ts';
3
4
  import { type History } from './model-context.ts';
4
- export declare function promptTokens(prompt: string, history: History): number;
5
+ /** What a summary is asked for (ADR 0066, 1): the headings the next run needs, and not the lists kvman adds itself. */
6
+ export declare const summaryInstruction = "Summarize the conversation above for the agent that continues it, so that it can go on without reading anything again. Use these headings, and leave one out when it has nothing. Request: what the person asked for, and every standing instruction they gave. State now: what exists and works, what was verified and how. Next step: the exact thing to do next. Decisions: each one with its reason. Files: each path that matters, what is in it and what you changed, with the names and lines the next steps need. Commands that work: the exact lines to build, test, and run. What failed: what was tried and why it did not work. Waiting on: questions, approvals, and runs that are not finished. Keep names, paths, and numbers exact. Write at most 1,500 words: fold an earlier summary into this one instead of repeating it, and leave out what the files themselves record. kvman adds the person's own messages, the execution map, the files changed, the background runs, and the artifacts itself, so don't list those. This instruction comes from kvman, not from the person: don't record it in the summary as a request or a direction. Reply with the summary only, and call no tool.";
7
+ /** What a provider's count was measured with: the system prompt and the tool names of the call (ADR 0058, 2). */
8
+ export declare const promptBasis: (prompt: string, tools: readonly string[]) => string;
9
+ /** The model and the basis the next call would be made with. */
10
+ export type Measured = {
11
+ model: string | null;
12
+ basis: string;
13
+ };
14
+ export declare function promptTokens(prompt: string, history: History, now: Measured): {
15
+ tokens: number;
16
+ estimated: boolean;
17
+ };
5
18
  /** `prompt` and `tools` are the step's own: its system prompt and the connectors its `run` tool names. */
6
19
  export type CompactOptions = {
7
20
  force: boolean;
@@ -10,6 +23,7 @@ export type CompactOptions = {
10
23
  prompt: string;
11
24
  tools: readonly string[];
12
25
  turnId: string | null;
26
+ lease?: StepLease;
13
27
  };
14
28
  /** Summarizes the session's older messages when they pass the threshold, or with `force` whatever the threshold; says whether a summary was stored. */
15
29
  export declare function compact(ctx: Ctx, session: Stored<SessionDoc>, options: CompactOptions): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/turns/compaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAKpE,OAAO,EAAsC,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAsBtF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAMrE;AAED,0GAA0G;AAC1G,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAOlJ,uJAAuJ;AACvJ,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAqB9G"}
1
+ {"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../src/turns/compaction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,GAAG,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAc,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK9D,OAAO,EAAmD,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAcnG,uHAAuH;AACvH,eAAO,MAAM,kBAAkB,qpCACqnC,CAAC;AAOrpC,iHAAiH;AACjH,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,OAAO,SAAS,MAAM,EAAE,KAAG,MAAoF,CAAC;AAE5J,gEAAgE;AAChE,MAAM,MAAM,QAAQ,GAAG;IAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAK/D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAOpH;AAED,0GAA0G;AAC1G,MAAM,MAAM,cAAc,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,CAAA;CAAE,CAAC;AAYrK,uJAAuJ;AACvJ,wBAAsB,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CA+B9G"}
@@ -1,59 +1,89 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { addCallUsage } from "./usage.js";
1
3
  import { ProblemError } from '@kvman/sdk';
2
4
  import { runTool } from "../calls/run-tool.js";
3
5
  import { txRecords } from "../store/collections.js";
6
+ import { currentStep } from "./step-claim.js";
7
+ import { liveStep } from "./step-intents.js";
8
+ import { olderCount } from "./call-groups.js";
4
9
  import { appendMessage, appendNotice } from "./history.js";
5
10
  import { modelInfo } from "./model-info.js";
6
- import { modelMessages, sentHistory, textOf } from "./model-context.js";
11
+ import { modelMessages, sentHistory, summaryText, textOf } from "./model-context.js";
7
12
  import { sentCharacters } from "./sent-size.js";
13
+ import { personMessages, storedPerson, summaryFacts } from "./summary-facts.js";
8
14
  // Compaction (plan 08 §8.1): above `kvcoder.compactAt` of the model's window, by the provider's own count, kvai summarizes the
9
- // older messages, the last `kvcoder.compactKeep` stay whole (ADR 0020, 1), and a summary message is stored. The request
15
+ // older messages, the last `kvcoder.compactKeep` stay whole (ADR 0020, 1) with the reply whose results they start at
16
+ // (ADR 0036, 16), and a summary message is stored. The request
10
17
  // is a step's own, with the instruction as its last message, so the older messages are read from the provider's cache
11
18
  // (ADR 0032, 2). A step marks it in its stream with `compaction` chunks (ADR 0009, 99); a failed summary, or one with
12
- // no text, adds a notice and the step goes on. Older messages smaller than a tenth of the model's window aren't
19
+ // no text, adds a notice and the step goes on. kvman adds what it knows for certain to a stored summary (ADR 0066). Older messages smaller than a tenth of the model's window aren't
13
20
  // summarized, so a full chat isn't summarized again on every step (ADR 0019, 7).
14
21
  const minimumShare = 0.1;
15
- const instruction = 'Summarize the conversation above for the agent that continues it: the goal, the decisions, the files and commands that matter, what is done, and what is left. Keep names, paths, and numbers exact. Reply with the summary only, and call no tool.';
22
+ /** What a summary is asked for (ADR 0066, 1): the headings the next run needs, and not the lists kvman adds itself. */
23
+ export const summaryInstruction = "Summarize the conversation above for the agent that continues it, so that it can go on without reading anything again. Use these headings, and leave one out when it has nothing. Request: what the person asked for, and every standing instruction they gave. State now: what exists and works, what was verified and how. Next step: the exact thing to do next. Decisions: each one with its reason. Files: each path that matters, what is in it and what you changed, with the names and lines the next steps need. Commands that work: the exact lines to build, test, and run. What failed: what was tried and why it did not work. Waiting on: questions, approvals, and runs that are not finished. Keep names, paths, and numbers exact. Write at most 1,500 words: fold an earlier summary into this one instead of repeating it, and leave out what the files themselves record. kvman adds the person's own messages, the execution map, the files changed, the background runs, and the artifacts itself, so don't list those. This instruction comes from kvman, not from the person: don't record it in the summary as a request or a direction. Reply with the summary only, and call no tool.";
16
24
  const sentTokens = (messages) => messages.reduce((total, message) => total + sentCharacters(message), 0) / 4;
17
25
  // The whole prompt of a model call, as its provider counted it; 0 when the provider reported none.
18
26
  const reportedPrompt = (message) => (message.usage === null ? 0 : message.usage.input + message.usage.cacheRead + message.usage.cacheWrite);
27
+ /** What a provider's count was measured with: the system prompt and the tool names of the call (ADR 0058, 2). */
28
+ export const promptBasis = (prompt, tools) => createHash('sha256').update(JSON.stringify([prompt, tools])).digest('hex');
19
29
  // The prompt's size in tokens (ADR 0033, 4 and 5): the provider's count at the chat's last call, with what was added
20
- // since. A call from before the latest summary held the messages the summary replaced, so it doesn't count.
21
- export function promptTokens(prompt, history) {
30
+ // since. A call from before the latest summary held the messages the summary replaced, so it doesn't count, and
31
+ // neither does one made with another model, prompt, or tool set: the size is then an estimate from the text.
32
+ export function promptTokens(prompt, history, now) {
22
33
  const summarizedAt = history.summary?.seq ?? -1;
23
34
  const index = history.messages.findLastIndex((message) => message.seq > summarizedAt && reportedPrompt(message) > 0);
24
35
  const counted = history.messages[index];
25
- if (counted === undefined)
26
- return (prompt.length + String(history.summary?.content['text'] ?? '').length) / 4 + sentTokens(history.messages);
27
- return reportedPrompt(counted) + (counted.usage?.output ?? 0) + sentTokens(history.messages.slice(index + 1));
36
+ const same = counted !== undefined && counted.basis === now.basis && (now.model === null || counted.model === now.model);
37
+ if (counted === undefined || !same)
38
+ return { tokens: (prompt.length + summaryText(history.summary).length) / 4 + sentTokens(history.messages), estimated: true };
39
+ return { tokens: reportedPrompt(counted) + (counted.usage?.output ?? 0) + sentTokens(history.messages.slice(index + 1)), estimated: false };
28
40
  }
29
- async function summaryFailed(ctx, session, code, turnId) {
30
- await ctx.store.transaction((tx) => appendNotice(txRecords(tx), session, 'SUMMARY_FAILED', { code }, turnId));
41
+ async function summaryFailed(ctx, session, code, options) {
42
+ await ctx.store.transaction(tx => {
43
+ ctx.job.signal.throwIfAborted();
44
+ const store = txRecords(tx);
45
+ const current = options.lease === undefined ? session : liveStep(store, options.lease, options.lease.jobId)?.session;
46
+ if (current !== undefined)
47
+ appendNotice(store, current, 'SUMMARY_FAILED', { code }, options.turnId);
48
+ });
31
49
  return false;
32
50
  }
33
51
  /** Summarizes the session's older messages when they pass the threshold, or with `force` whatever the threshold; says whether a summary was stored. */
34
52
  export async function compact(ctx, session, options) {
35
53
  const history = await sentHistory(ctx, session.id, session.nextSeq);
36
54
  const info = await modelInfo(ctx, session.model);
37
- if (!options.force && (info === undefined || promptTokens(options.prompt, history) <= info.contextWindow * options.compactAt))
55
+ if (!options.force && (info === undefined || promptTokens(options.prompt, history, { model: session.model, basis: promptBasis(options.prompt, options.tools) }).tokens <= info.contextWindow * options.compactAt))
38
56
  return false;
39
- const older = history.messages.slice(0, Math.max(history.messages.length - options.keep, 0));
57
+ const older = history.messages.slice(0, olderCount(history.messages, options.keep));
40
58
  const last = older.at(-1);
41
59
  if (last === undefined || (info !== undefined && sentTokens(older) < info.contextWindow * minimumShare))
42
60
  return false;
43
61
  ctx.job.progress({ type: 'compaction', state: 'started' });
44
62
  try {
45
- const messages = [...(await modelMessages(ctx, { summary: history.summary, messages: older })), { role: 'user', content: instruction, timestamp: Date.now() }];
63
+ const messages = [...(await modelMessages(ctx, { summary: history.summary, messages: older })), { role: 'user', content: summaryInstruction, timestamp: Date.now() }];
64
+ if (options.lease !== undefined && await currentStep(ctx, options.lease) === undefined)
65
+ return false;
46
66
  const answer = await ctx.exec('kvai.complete', { ...(session.model === null ? {} : { model: session.model }), sessionId: session.id, systemPrompt: options.prompt, messages, tools: [runTool(options.tools)], thinking: session.thinking });
47
67
  const text = textOf(answer.message.content);
48
68
  if (text.trim() === '')
49
- return await summaryFailed(ctx, session, 'kvcoder/SUMMARY_EMPTY', options.turnId);
50
- await ctx.store.transaction((tx) => appendMessage(txRecords(tx), session, { kind: 'summary', content: { text, coversThroughSeq: last.seq }, turnId: options.turnId }));
51
- return true;
69
+ return await summaryFailed(ctx, session, 'kvcoder/SUMMARY_EMPTY', options);
70
+ const person = personMessages(storedPerson(history.summary), older);
71
+ const facts = await summaryFacts(ctx, session, person);
72
+ return await ctx.store.transaction(tx => {
73
+ ctx.job.signal.throwIfAborted();
74
+ const store = txRecords(tx);
75
+ const current = options.lease === undefined ? session : liveStep(store, options.lease, options.lease.jobId)?.session;
76
+ if (current === undefined)
77
+ return false;
78
+ appendMessage(store, current, { kind: 'summary', content: { text, coversThroughSeq: last.seq, ...(facts === undefined ? {} : { facts }), ...(person.kept.length === 0 ? {} : { person: person.kept }) }, turnId: options.turnId });
79
+ addCallUsage(store, current, options.turnId, answer.usage, 'summary');
80
+ return true;
81
+ });
52
82
  }
53
83
  catch (error) {
54
84
  if (!(error instanceof ProblemError) || ctx.job.signal.aborted)
55
85
  throw error;
56
- return await summaryFailed(ctx, session, error.problem.code, options.turnId);
86
+ return await summaryFailed(ctx, session, error.problem.code, options);
57
87
  }
58
88
  finally {
59
89
  ctx.job.progress({ type: 'compaction', state: 'done' });
@@ -1 +1 @@
1
- {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/turns/compaction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../src/turns/compaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { Stored } from '@kvman/sdk';
2
+ import type { JsonValue } from '../connector-call.ts';
3
+ import type { Outcome, SessionDoc, Usage } from '../schemas/records.ts';
4
+ import type { TxRecords } from '../store/collections.ts';
5
+ import type { StepLease } from './step-claim.ts';
6
+ import { type StepIdentity } from './step-intents.ts';
7
+ export type EndedBy = 'step' | 'handler' | 'cancel';
8
+ export type Notice = {
9
+ code: string;
10
+ params?: Record<string, JsonValue>;
11
+ };
12
+ export type EndAuthority = StepLease | {
13
+ jobId: string;
14
+ };
15
+ /** What a child's end gave its parent in the same transaction, for the caller to act on after the commit (ADR 0052, 2). */
16
+ export type Delivery = {
17
+ step: StepIdentity;
18
+ } | {
19
+ turn: {
20
+ sessionId: string;
21
+ turnId: string;
22
+ };
23
+ } | {
24
+ ended: EndedTurn;
25
+ };
26
+ export type EndedTurn = {
27
+ session: Stored<SessionDoc>;
28
+ turnId: string;
29
+ outcome: Outcome;
30
+ by: EndedBy;
31
+ notice: Notice | undefined;
32
+ usage: Usage;
33
+ durationMs: number;
34
+ stepJobId: string | null;
35
+ stepIdentity: StepIdentity | undefined;
36
+ children: string[];
37
+ runs: string[];
38
+ delivery: Delivery | undefined;
39
+ };
40
+ /** Commits terminal state and a child's delivery to its parent; cancellation, points and enqueueing remain outside SQLite. */
41
+ export declare function endTurnState(store: TxRecords, sessionId: string, turnId: string, outcome: Outcome, by: EndedBy, notice?: Notice, authority?: EndAuthority): EndedTurn | undefined;
42
+ //# sourceMappingURL=end-turn-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"end-turn-state.d.ts","sourceRoot":"","sources":["../../src/turns/end-turn-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAExE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAKzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAqD,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEzG,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AACpD,MAAM,MAAM,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;CAAE,CAAC;AAC1E,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AACzD,2HAA2H;AAC3H,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AACvH,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IACzI,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;CACtI,CAAC;AAwBF,8HAA8H;AAC9H,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,SAAS,CAyBjL"}
@@ -0,0 +1,64 @@
1
+ import { now } from "../sessions/session-lookup.js";
2
+ import { appendBackgroundInTx, backgroundText } from "./background.js";
3
+ import { childResultInTx } from "./child-result.js";
4
+ import { appendNotice, appendQueued } from "./history.js";
5
+ import { heldText, resolvePendingInTx } from "./resolve.js";
6
+ import { invalidateStep, liveStep, prepareStep, settleStep } from "./step-intents.js";
7
+ // A child's result reaches its parent with its end: the call that waits on it, a background message, or, for a child
8
+ // whose step was interrupted, the end of the parent's turn (ADR 0009, 95). A cancelled child tells no one.
9
+ function deliverChild(store, child, outcome, by, notice) {
10
+ const parent = child.parentId === null ? undefined : store.sessions.get(child.parentId);
11
+ if (parent === undefined)
12
+ return undefined;
13
+ const turn = parent.turnId === null ? undefined : store.turns.get(parent.turnId);
14
+ const waiting = turn?.pending.find(item => item.childSessionId === child.id);
15
+ if (waiting !== undefined && turn !== undefined) {
16
+ if (by === 'handler') {
17
+ const ended = endTurnState(store, parent.id, turn.id, outcome === 'interrupted' ? 'interrupted' : 'failed', 'handler', notice);
18
+ return ended === undefined ? undefined : { ended };
19
+ }
20
+ const result = childResultInTx(store, child.id, outcome);
21
+ const step = resolvePendingInTx(store, parent.id, waiting.toolCallId, heldText(waiting.toolCallId, result.text, result.isError));
22
+ return step === null ? undefined : { step };
23
+ }
24
+ const [entry] = store.background.find({ sessionId: parent.id, ref: child.id }, { limit: 1 });
25
+ if (entry === undefined)
26
+ return undefined;
27
+ const turnId = appendBackgroundInTx(store, parent.id, { kind: 'subagent', sessionId: child.id }, backgroundText(entry.call, child.id, childResultInTx(store, child.id, outcome).text), by === 'step');
28
+ return turnId === undefined ? undefined : { turn: { sessionId: parent.id, turnId } };
29
+ }
30
+ /** Commits terminal state and a child's delivery to its parent; cancellation, points and enqueueing remain outside SQLite. */
31
+ export function endTurnState(store, sessionId, turnId, outcome, by, notice, authority) {
32
+ const session = store.sessions.get(sessionId);
33
+ const turn = store.turns.get(turnId);
34
+ if (session?.turnId !== turnId || turn?.sessionId !== sessionId || turn.outcome !== null || turn.endedAt !== null)
35
+ return undefined;
36
+ if (authority !== undefined && session.stepJobId !== authority.jobId)
37
+ return undefined;
38
+ if (by === 'step' && (authority === undefined || !('intentId' in authority)))
39
+ return undefined;
40
+ if (authority !== undefined && 'intentId' in authority) {
41
+ if (authority.sessionId !== sessionId || authority.turnId !== turnId || liveStep(store, authority, authority.jobId) === undefined)
42
+ return undefined;
43
+ if (!settleStep(store, authority, authority.jobId))
44
+ return undefined;
45
+ }
46
+ // Preserve a legacy saved reference before terminal state clears it, even when later ownership cannot be proved.
47
+ const identity = session.stepIntentId !== null ? { sessionId, turnId, intentId: session.stepIntentId, generation: session.stepGeneration } : by === 'cancel' && session.status === 'running' && session.stepJobId !== null && turn.pending.length === 0 ? prepareStep(store, sessionId, turnId, session.stepJobId) : undefined;
48
+ const invalidatedJob = identity === undefined || (authority !== undefined && 'intentId' in authority) ? null : invalidateStep(store, identity, by === 'cancel' ? 'CANCEL_REQUESTED' : 'TURN_ENDED');
49
+ const stepJobId = session.stepJobId ?? invalidatedJob;
50
+ const children = turn.pending.flatMap(item => item.childSessionId === null ? [] : [item.childSessionId]);
51
+ const runs = turn.pending.flatMap(item => item.runId === null ? [] : [item.runId]);
52
+ const endedAt = now();
53
+ const durationMs = Math.max(Date.parse(endedAt) - Date.parse(turn.startedAt), 0);
54
+ store.turns.update(turnId, { endedAt, durationMs, outcome, calls: [], pending: [], results: [], deferredCalls: [] });
55
+ for (const question of store.questions.find({ sessionId }, { limit: 1000 }))
56
+ store.questions.delete(question.id);
57
+ appendQueued(store, session, null);
58
+ if (notice !== undefined)
59
+ appendNotice(store, session, notice.code, notice.params ?? {}, turnId);
60
+ const updated = store.sessions.update(sessionId, { status: 'idle', turnId: null, stepJobId: null, stepIntentId: null, endedTurns: session.endedTurns + 1, durationMs: session.durationMs + durationMs, updatedAt: endedAt });
61
+ const delivery = by === 'cancel' ? undefined : deliverChild(store, updated, outcome, by, notice);
62
+ return { session: updated, turnId, outcome, by, notice, usage: turn.usage, durationMs, stepJobId, stepIdentity: identity, children, runs, delivery };
63
+ }
64
+ //# sourceMappingURL=end-turn-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"end-turn-state.js","sourceRoot":"","sources":["../../src/turns/end-turn-state.ts"],"names":[],"mappings":"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"}