@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
@@ -1,11 +1,11 @@
1
- import { startChild } from "../connectors/delegate.js";
2
- import { dropRun, launchRun } from "../delegate/runs.js";
1
+ import { dropRun } from "../delegate/runs.js";
2
+ import { startPending } from "../delegate/start-pending.js";
3
3
  import { firePoint } from "../registry/session-points.js";
4
4
  import { now } from "../sessions/session-lookup.js";
5
5
  import { records, txRecords } from "../store/collections.js";
6
- import { endTurn } from "./end-turn.js";
7
6
  import { appendMessage, appendQueued } from "./history.js";
8
- import { queueStep } from "./start-turn.js";
7
+ import { liveStep, settleStep } from "./step-intents.js";
8
+ import { advanceStep, dispatchNext } from "./step-next.js";
9
9
  // A result's details without a second copy of its output (ADR 0034, 7): the output stays only where it differs from the
10
10
  // text the model gets, which is a shell line's and a binary's.
11
11
  function storedDetails(held) {
@@ -24,22 +24,6 @@ export function appendResults(store, session, turnId, calls, results) {
24
24
  appendMessage(store, session, { kind: 'toolResult', content: held.details === null ? content : { ...content, details: storedDetails(held) }, turnId });
25
25
  }
26
26
  }
27
- /** The running turn inside a transaction, if `turnId` still is it. */
28
- export function liveTurn(store, sessionId, turnId) {
29
- const session = store.sessions.get(sessionId);
30
- const turn = store.turns.get(turnId);
31
- if (session?.turnId !== turnId || turn === undefined || turn.outcome !== null)
32
- return undefined;
33
- return { session, turn };
34
- }
35
- /** Queues the next step, or ends the turn at `kvcoder.maxSteps` (ADR 0009, 102). */
36
- export async function continueTurn(ctx, sessionId, turnId, maxSteps) {
37
- const turn = await records(ctx.store).turns.get(turnId);
38
- if (turn !== undefined && maxSteps !== null && turn.steps >= maxSteps)
39
- await endTurn(ctx, sessionId, turnId, 'maxSteps', 'step', { code: 'MAX_STEPS', params: { steps: maxSteps } });
40
- else
41
- await queueStep(ctx, sessionId, turnId, true);
42
- }
43
27
  function pendingOf(store, sessionId, rootSessionId, turnId, toolCallId, outcome) {
44
28
  if (outcome.kind === 'subagent')
45
29
  return { toolCallId, kind: 'subagent', questionId: null, question: null, childSessionId: outcome.childSessionId, runId: null };
@@ -49,31 +33,34 @@ function pendingOf(store, sessionId, rootSessionId, turnId, toolCallId, outcome)
49
33
  const shown = outcome.questionKind === 'approval' ? outcome.question : { kind: outcome.questionKind, ...outcome.question };
50
34
  return { toolCallId, kind: outcome.questionKind === 'approval' ? 'approval' : 'question', questionId: question.id, question: shown, childSessionId: null, runId: null };
51
35
  }
52
- export async function settleCalls(ctx, sessionId, turnId, calls, outcomes, maxSteps) {
36
+ export async function settleCalls(ctx, lease, calls, outcomes, maxSteps) {
37
+ const { sessionId, turnId } = lease;
53
38
  const order = calls.map((call) => ({ toolCallId: call.id, toolName: call.name }));
54
39
  const held = outcomes.flatMap((outcome) => (outcome.kind === 'result' ? [outcome.held] : []));
55
40
  if (held.length === outcomes.length) {
56
- const live = await ctx.store.transaction((tx) => {
41
+ const next = await ctx.store.transaction((tx) => {
57
42
  const store = txRecords(tx);
58
- const found = liveTurn(store, sessionId, turnId);
43
+ const found = liveStep(store, lease, lease.jobId);
59
44
  if (found === undefined)
60
- return false;
45
+ return undefined;
61
46
  appendResults(store, found.session, turnId, order, held);
62
47
  appendQueued(store, found.session, turnId);
63
- return true;
48
+ return advanceStep(store, lease, maxSteps);
64
49
  });
65
- if (live)
66
- await continueTurn(ctx, sessionId, turnId, maxSteps);
50
+ await dispatchNext(ctx, next);
67
51
  return;
68
52
  }
69
53
  const rootSessionId = (await rootOf(ctx, sessionId)) ?? sessionId;
70
54
  const pending = await ctx.store.transaction((tx) => {
71
55
  const store = txRecords(tx);
72
- if (liveTurn(store, sessionId, turnId) === undefined)
56
+ if (liveStep(store, lease, lease.jobId) === undefined)
73
57
  return undefined;
74
- const items = outcomes.flatMap((outcome, index) => (outcome.kind === 'result' ? [] : [pendingOf(store, sessionId, rootSessionId, turnId, calls[index]?.id ?? '', outcome)]));
75
- store.turns.update(turnId, { calls: order, pending: items, results: held });
76
- store.sessions.update(sessionId, { status: 'waiting', stepJobId: null, updatedAt: now() });
58
+ const items = outcomes.flatMap((outcome, index) => (outcome.kind === 'result' || outcome.kind === 'deferred' ? [] : [pendingOf(store, sessionId, rootSessionId, turnId, calls[index]?.id ?? '', outcome)]));
59
+ // Effects held back behind an approval wait with the turn, and run in the model's order when it resumes (ADR 0046).
60
+ const deferredCalls = outcomes.flatMap((outcome, index) => (outcome.kind === 'deferred' ? [{ toolCallId: calls[index]?.id ?? '', call: outcome.call }] : []));
61
+ store.turns.update(turnId, { calls: order, pending: items, results: held, deferredCalls });
62
+ settleStep(store, lease, lease.jobId);
63
+ store.sessions.update(sessionId, { status: 'waiting', stepJobId: null, stepIntentId: null, updatedAt: now() });
77
64
  return items;
78
65
  });
79
66
  if (pending === undefined) {
@@ -81,12 +68,16 @@ export async function settleCalls(ctx, sessionId, turnId, calls, outcomes, maxSt
81
68
  return;
82
69
  }
83
70
  for (const item of pending) {
71
+ const current = await ctx.store.transaction(tx => {
72
+ const store = txRecords(tx);
73
+ return store.sessions.get(sessionId)?.turnId === turnId && store.turns.get(turnId)?.pending.some(saved => saved.toolCallId === item.toolCallId);
74
+ });
75
+ if (!current)
76
+ continue;
84
77
  if (item.questionId !== null)
85
78
  ctx.job.progress({ type: 'component', component: 'kvcoder.question', props: { questionId: item.questionId, sessionId, pending: item } });
86
- if (item.childSessionId !== null)
87
- await startChild(ctx, item.childSessionId);
88
- if (item.runId !== null)
89
- await launchRun(ctx, item.runId);
79
+ if (item.childSessionId !== null || item.runId !== null)
80
+ await startPending(ctx, { sessionId, turnId, pending: item });
90
81
  }
91
82
  for (const kind of new Set(pending.map((item) => item.kind)))
92
83
  await firePoint(ctx, 'kvcoder.session.waiting', { sessionId, kind });
@@ -1 +1 @@
1
- {"version":3,"file":"settle-calls.js","sourceRoot":"","sources":["../../src/turns/settle-calls.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settle-calls.js","sourceRoot":"","sources":["../../src/turns/settle-calls.ts"],"names":[],"mappings":"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"}
@@ -1,88 +1,13 @@
1
1
  import type { Ctx, Stored } from '@kvman/sdk';
2
2
  import type { SessionDoc } from '../schemas/records.ts';
3
3
  import { type TxRecords } from '../store/collections.ts';
4
- /** Opens a turn on an idle session inside a transaction, and marks the session running. */
4
+ import { type StepIdentity } from './step-intents.ts';
5
+ /** Opens a turn and prepares its first intent in the same transaction (ADR0041). */
5
6
  export declare function openTurn(tx: TxRecords, session: Stored<SessionDoc>): string;
6
- /** Queues the turn's next step and records it as the session's step; `follow` sends the follow chunk. */
7
- export declare function queueStep(ctx: Ctx, sessionId: string, turnId: string, follow: boolean): Promise<string>;
8
- /** Starts a turn that `openTurn` opened: the `turn.started` point, then the first step. */
9
- export declare function beginTurn(ctx: Ctx, sessionId: string, turnId: string, follow: boolean): Promise<string>;
10
- /** The session's turn, when it is still the running one. */
11
- export declare function currentTurn(ctx: Ctx, sessionId: string, turnId: string): Promise<{
12
- session: Stored<{
13
- title: string;
14
- autoTitle: boolean;
15
- status: "idle" | "running" | "waiting";
16
- parentId: string | null;
17
- worker: {
18
- name: string;
19
- instructions: string;
20
- } | null;
21
- model: string | null;
22
- thinking: "off" | "minimal" | "low" | "medium" | "high";
23
- stepJobId: string | null;
24
- turnId: string | null;
25
- endedTurns: number;
26
- nextSeq: number;
27
- usage: {
28
- input: number;
29
- output: number;
30
- cacheRead: number;
31
- cacheWrite: number;
32
- cost: number;
33
- };
34
- durationMs: number;
35
- checks: {
36
- name: string;
37
- passed: boolean;
38
- }[] | null;
39
- connectors: string[] | null;
40
- optedIn: string[];
41
- createdAt: string;
42
- updatedAt: string;
43
- }>;
44
- turn: Stored<{
45
- sessionId: string;
46
- startedAt: string;
47
- endedAt: string | null;
48
- durationMs: number;
49
- steps: number;
50
- lost: number;
51
- usage: {
52
- input: number;
53
- output: number;
54
- cacheRead: number;
55
- cacheWrite: number;
56
- cost: number;
57
- };
58
- outcome: "done" | "cancelled" | "failed" | "interrupted" | "maxSteps" | null;
59
- calls: {
60
- toolCallId: string;
61
- toolName: string;
62
- }[];
63
- pending: {
64
- toolCallId: string;
65
- kind: "subagent" | "worker" | "question" | "approval";
66
- questionId: string | null;
67
- question: import("zod").JSONType;
68
- childSessionId: string | null;
69
- runId: string | null;
70
- }[];
71
- results: {
72
- toolCallId: string;
73
- text: string;
74
- details: import("zod").JSONType;
75
- isError: boolean;
76
- run: {
77
- description: string;
78
- connector: string;
79
- command: string;
80
- payload: Record<string, import("zod").JSONType>;
81
- } | {
82
- command: string;
83
- timeoutMs: number;
84
- } | null;
85
- }[];
86
- }>;
87
- } | undefined>;
7
+ /** Enqueues outside SQLite, then publishes only this exact identity; a losing candidate is cancelled. */
8
+ export declare function dispatchStep(ctx: Ctx, identity: StepIdentity, follow: boolean): Promise<string | null>;
9
+ /** Dispatches an already prepared transition; it never prepares a successor after the fact. */
10
+ export declare function queueStep(ctx: Ctx, sessionId: string, turnId: string, follow: boolean): Promise<string | null>;
11
+ /** Starts a committed turn: its point then its prepared first step, rechecked after the point. */
12
+ export declare function beginTurn(ctx: Ctx, sessionId: string, turnId: string, follow: boolean): Promise<string | null>;
88
13
  //# sourceMappingURL=start-turn.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"start-turn.d.ts","sourceRoot":"","sources":["../../src/turns/start-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAM7E,2FAA2F;AAC3F,wBAAgB,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAI3E;AAED,yGAAyG;AACzG,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAS7G;AAED,2FAA2F;AAC3F,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAG7G;AAED,4DAA4D;AAC5D,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAM5E"}
1
+ {"version":3,"file":"start-turn.d.ts","sourceRoot":"","sources":["../../src/turns/start-turn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,OAAO,EAAa,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpE,OAAO,EAA0C,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE9F,oFAAoF;AACpF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAK3E;AAED,yGAAyG;AACzG,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsB5G;AAED,+FAA+F;AAC/F,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGpH;AAED,kGAAkG;AAClG,wBAAsB,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGpH"}
@@ -1,40 +1,51 @@
1
1
  import { firePoint } from "../registry/session-points.js";
2
2
  import { now } from "../sessions/session-lookup.js";
3
- import { records, txRecords } from "../store/collections.js";
3
+ import { txRecords } from "../store/collections.js";
4
4
  import { noUsage } from "./history.js";
5
- // Starting a turn and chaining its steps (plan 08 §8.1): each step is an async job; the session records the running
6
- // step's job id, and the step that queues the next one sends `{ type: 'follow', jobId }` so the UI streams on.
7
- /** Opens a turn on an idle session inside a transaction, and marks the session running. */
5
+ import { preparedStep, prepareStep, publishStep } from "./step-intents.js";
6
+ /** Opens a turn and prepares its first intent in the same transaction (ADR0041). */
8
7
  export function openTurn(tx, session) {
9
- const turn = tx.turns.insert({ sessionId: session.id, startedAt: now(), endedAt: null, durationMs: 0, steps: 0, lost: 0, usage: noUsage(), outcome: null, calls: [], pending: [], results: [] });
8
+ const turn = tx.turns.insert({ sessionId: session.id, startedAt: now(), endedAt: null, durationMs: 0, steps: 0, lost: 0, incomplete: 0, usage: noUsage(), outcome: null, calls: [], pending: [], results: [], deferredCalls: [] });
10
9
  tx.sessions.update(session.id, { status: 'running', turnId: turn.id, stepJobId: null, updatedAt: now() });
10
+ prepareStep(tx, session.id, turn.id);
11
11
  return turn.id;
12
12
  }
13
- /** Queues the turn's next step and records it as the session's step; `follow` sends the follow chunk. */
14
- export async function queueStep(ctx, sessionId, turnId, follow) {
15
- const jobId = await ctx.execAsync('kvcoder.turn.step', { sessionId, turnId });
13
+ /** Enqueues outside SQLite, then publishes only this exact identity; a losing candidate is cancelled. */
14
+ export async function dispatchStep(ctx, identity, follow) {
15
+ ctx.job.signal.throwIfAborted();
16
+ const current = await ctx.store.transaction(tx => {
17
+ const found = preparedStep(txRecords(tx), identity.sessionId, identity.turnId);
18
+ return found?.intentId === identity.intentId && found.generation === identity.generation;
19
+ });
20
+ if (!current)
21
+ return null;
22
+ const jobId = await ctx.execAsync('kvcoder.turn.step', identity);
23
+ const publication = await ctx.store.transaction(tx => {
24
+ const store = txRecords(tx);
25
+ if (publishStep(store, identity, jobId))
26
+ return 'current';
27
+ const intent = store.stepIntents.get(identity.intentId);
28
+ // A canonical job can settle before its publisher returns. Its post-commit work is not a losing candidate.
29
+ return intent?.sessionId === identity.sessionId && intent.turnId === identity.turnId && intent.generation === identity.generation && intent.phase === 'settled' && intent.jobId === jobId ? 'settled' : 'lost';
30
+ });
31
+ if (publication !== 'current') {
32
+ if (publication === 'lost')
33
+ await ctx.cancel(jobId);
34
+ return null;
35
+ }
36
+ // A follow chunk is only a hint. Publication must win before it is emitted (ADR0041).
16
37
  if (follow)
17
38
  ctx.job.progress({ type: 'follow', jobId });
18
- await ctx.store.transaction((tx) => {
19
- const { sessions } = txRecords(tx);
20
- const session = sessions.get(sessionId);
21
- if (session?.turnId === turnId && session.status === 'running')
22
- sessions.update(sessionId, { stepJobId: jobId });
23
- });
24
39
  return jobId;
25
40
  }
26
- /** Starts a turn that `openTurn` opened: the `turn.started` point, then the first step. */
41
+ /** Dispatches an already prepared transition; it never prepares a successor after the fact. */
42
+ export async function queueStep(ctx, sessionId, turnId, follow) {
43
+ const identity = await ctx.store.transaction(tx => preparedStep(txRecords(tx), sessionId, turnId));
44
+ return identity === undefined ? null : dispatchStep(ctx, identity, follow);
45
+ }
46
+ /** Starts a committed turn: its point then its prepared first step, rechecked after the point. */
27
47
  export async function beginTurn(ctx, sessionId, turnId, follow) {
28
48
  await firePoint(ctx, 'kvcoder.turn.started', { sessionId, turnId });
29
49
  return queueStep(ctx, sessionId, turnId, follow);
30
50
  }
31
- /** The session's turn, when it is still the running one. */
32
- export async function currentTurn(ctx, sessionId, turnId) {
33
- const store = records(ctx.store);
34
- const session = await store.sessions.get(sessionId);
35
- if (session?.turnId !== turnId)
36
- return undefined;
37
- const turn = await store.turns.get(turnId);
38
- return turn === undefined || turn.outcome !== null ? undefined : { session, turn };
39
- }
40
51
  //# sourceMappingURL=start-turn.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"start-turn.js","sourceRoot":"","sources":["../../src/turns/start-turn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"start-turn.js","sourceRoot":"","sources":["../../src/turns/start-turn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { z, type Ctx, type Job } from '@kvman/sdk';
2
+ import { type StepIdentity } from './step-intents.ts';
3
+ declare const legacyStepInputSchema: z.ZodObject<{
4
+ sessionId: z.ZodString;
5
+ turnId: z.ZodString;
6
+ }, z.core.$strict>;
7
+ /** Private command input only: old jobs retain their actual two-field input, without defaults. */
8
+ export declare const stepInputSchema: z.ZodUnion<readonly [z.ZodObject<{
9
+ sessionId: z.ZodString;
10
+ turnId: z.ZodString;
11
+ intentId: z.ZodString;
12
+ generation: z.ZodNumber;
13
+ }, z.core.$strict>, z.ZodObject<{
14
+ sessionId: z.ZodString;
15
+ turnId: z.ZodString;
16
+ }, z.core.$strict>]>;
17
+ export type StepInput = z.output<typeof stepInputSchema>;
18
+ type LegacyStepInput = z.output<typeof legacyStepInputSchema>;
19
+ /** Internal execution authority, not a change to any public session/turn DTO. */
20
+ export type StepLease = StepIdentity & {
21
+ jobId: string;
22
+ };
23
+ /**
24
+ * Conservative compatibility proof for a currently executing old job. The kernel increments attempts
25
+ * before invoking the handler; old stepOptions used retries: 0. Attempt 1 therefore excludes an earlier
26
+ * kernel invocation, assuming immutable job name/workspace/input and no out-of-kernel execution.
27
+ * This does not certify effects of missing, terminal, requeued or merely default-generation records.
28
+ */
29
+ export declare function isLegacyStepJob(job: Job, input: LegacyStepInput, currentJobId: string, workspaceId: string): boolean;
30
+ /** Recheck authority after async preparation and immediately before effects; writes still recheck in their own tx. */
31
+ export declare function currentStep(ctx: Ctx, lease: StepLease): Promise<{
32
+ session: import("@kvman/sdk").Stored<import("../schemas/records.ts").SessionDoc>;
33
+ turn: import("@kvman/sdk").Stored<import("../schemas/records.ts").TurnDoc>;
34
+ intent: import("@kvman/sdk").Stored<import("../schemas/records.ts").StepIntentDoc>;
35
+ } | undefined>;
36
+ /** Claim before any approval, model or tool effects; no enqueue/cancel/effects in this transaction. */
37
+ export declare function claimStepInput(ctx: Ctx, input: StepInput): Promise<StepLease | undefined>;
38
+ export {};
39
+ //# sourceMappingURL=step-claim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-claim.d.ts","sourceRoot":"","sources":["../../src/turns/step-claim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,EAAoC,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAExF,QAAA,MAAM,qBAAqB;;;kBAAgE,CAAC;AAQ5F,kGAAkG;AAClG,eAAO,MAAM,eAAe;;;;;;;;oBAA0D,CAAC;AACvF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AACzD,KAAK,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAE9D,iFAAiF;AACjF,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAIpH;AAED,sHAAsH;AACtH,wBAAsB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS;;;;eAO3D;AAED,uGAAuG;AACvG,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,CAkC/F"}
@@ -0,0 +1,72 @@
1
+ import { ProblemError, z } from '@kvman/sdk';
2
+ import { txRecords } from "../store/collections.js";
3
+ import { claimStep, liveStep, prepareStep } from "./step-intents.js";
4
+ const legacyStepInputSchema = z.strictObject({ sessionId: z.string(), turnId: z.string() });
5
+ const modernStepInputSchema = z.strictObject({
6
+ sessionId: z.string(),
7
+ turnId: z.string(),
8
+ intentId: z.string(),
9
+ generation: z.number().int().positive().max(Number.MAX_SAFE_INTEGER),
10
+ });
11
+ /** Private command input only: old jobs retain their actual two-field input, without defaults. */
12
+ export const stepInputSchema = z.union([modernStepInputSchema, legacyStepInputSchema]);
13
+ /**
14
+ * Conservative compatibility proof for a currently executing old job. The kernel increments attempts
15
+ * before invoking the handler; old stepOptions used retries: 0. Attempt 1 therefore excludes an earlier
16
+ * kernel invocation, assuming immutable job name/workspace/input and no out-of-kernel execution.
17
+ * This does not certify effects of missing, terminal, requeued or merely default-generation records.
18
+ */
19
+ export function isLegacyStepJob(job, input, currentJobId, workspaceId) {
20
+ if (job.id !== currentJobId || job.name !== 'kvcoder.turn.step' || job.workspaceId !== workspaceId || job.status !== 'running' || job.attempts !== 1 || job.retries !== 0)
21
+ return false;
22
+ const saved = legacyStepInputSchema.safeParse(job.input);
23
+ return saved.success && saved.data.sessionId === input.sessionId && saved.data.turnId === input.turnId;
24
+ }
25
+ /** Recheck authority after async preparation and immediately before effects; writes still recheck in their own tx. */
26
+ export async function currentStep(ctx, lease) {
27
+ ctx.job.signal.throwIfAborted();
28
+ if (ctx.job.id !== lease.jobId)
29
+ return undefined;
30
+ return ctx.store.transaction(tx => {
31
+ ctx.job.signal.throwIfAborted();
32
+ return liveStep(txRecords(tx), lease, lease.jobId);
33
+ });
34
+ }
35
+ /** Claim before any approval, model or tool effects; no enqueue/cancel/effects in this transaction. */
36
+ export async function claimStepInput(ctx, input) {
37
+ const { id: jobId, signal, workspace } = ctx.job;
38
+ signal.throwIfAborted();
39
+ if ('intentId' in input) {
40
+ return ctx.store.transaction(tx => {
41
+ signal.throwIfAborted();
42
+ return claimStep(txRecords(tx), input, jobId) === undefined ? undefined : { ...input, jobId };
43
+ });
44
+ }
45
+ // jobs.get is cross-workspace. Never substitute the session's saved id for this executing job's id.
46
+ let job;
47
+ try {
48
+ job = await ctx.exec('kernel.jobs.get', { id: jobId });
49
+ }
50
+ catch (error) {
51
+ signal.throwIfAborted();
52
+ if (error instanceof ProblemError && error.problem.code === 'NOT_FOUND')
53
+ return undefined;
54
+ throw error;
55
+ }
56
+ signal.throwIfAborted();
57
+ if (!isLegacyStepJob(job, input, jobId, workspace.id))
58
+ return undefined;
59
+ return ctx.store.transaction(tx => {
60
+ signal.throwIfAborted();
61
+ const store = txRecords(tx);
62
+ const session = store.sessions.get(input.sessionId);
63
+ const turn = store.turns.get(input.turnId);
64
+ if (session?.status !== 'running' || session.turnId !== input.turnId || session.stepJobId !== jobId || session.stepIntentId !== null || turn?.sessionId !== input.sessionId || turn.outcome !== null || turn.endedAt !== null || turn.pending.length !== 0)
65
+ return undefined;
66
+ // A legacy read's generation 0/null defaults are not permission: the saved job binding and
67
+ // first-invocation metadata above are required, and all mutable state is checked in this same tx.
68
+ const identity = prepareStep(store, input.sessionId, input.turnId, jobId);
69
+ return claimStep(store, identity, jobId) === undefined ? undefined : { ...identity, jobId };
70
+ });
71
+ }
72
+ //# sourceMappingURL=step-claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-claim.js","sourceRoot":"","sources":["../../src/turns/step-claim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Stored } from '@kvman/sdk';
2
+ import type { SessionDoc, StepIntentDoc, TurnDoc } from '../schemas/records.ts';
3
+ import type { TxRecords } from '../store/collections.ts';
4
+ /** The private identity of one scheduled step (ADR0041); never a public session DTO. */
5
+ export type StepIdentity = {
6
+ sessionId: string;
7
+ turnId: string;
8
+ intentId: string;
9
+ generation: number;
10
+ };
11
+ type LiveIntent = {
12
+ session: Stored<SessionDoc>;
13
+ turn: Stored<TurnDoc>;
14
+ intent: Stored<StepIntentDoc>;
15
+ };
16
+ /** Reads only the current runnable prepared identity, never manufactures an intent outside its state transition. */
17
+ export declare function preparedStep(store: TxRecords, sessionId: string, turnId: string): StepIdentity | undefined;
18
+ /** Prepares a new intent in the transaction that makes its turn runnable. No enqueue occurs here. */
19
+ export declare function prepareStep(store: TxRecords, sessionId: string, turnId: string, legacyJobId?: string | null): StepIdentity;
20
+ /** Binds the one winner before model, approval or ordinary tool effects. Repeated claims lose. */
21
+ export declare function claimStep(store: TxRecords, expected: StepIdentity, jobId: string): LiveIntent | undefined;
22
+ /** Selects a published candidate, or confirms the already claimed winner; never replaces another. */
23
+ export declare function publishStep(store: TxRecords, expected: StepIdentity, jobId: string): boolean;
24
+ /** A step-derived write needs the current identity and its canonical job, not merely the same turn. */
25
+ export declare function liveStep(store: TxRecords, expected: StepIdentity, jobId: string): LiveIntent | undefined;
26
+ /** Use in the SAME transaction as results and waiting/end/successor state, never as a separate settlement. */
27
+ export declare function settleStep(store: TxRecords, expected: StepIdentity, jobId: string): boolean;
28
+ /** Invalidates only the expected identity; step-derived callers also validate their canonical job in this transaction. */
29
+ export declare function invalidateStep(store: TxRecords, expected: StepIdentity, reason: 'CANCEL_REQUESTED' | 'TURN_ENDED'): string | null;
30
+ export {};
31
+ //# sourceMappingURL=step-intents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-intents.d.ts","sourceRoot":"","sources":["../../src/turns/step-intents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGhF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,wFAAwF;AACxF,MAAM,MAAM,YAAY,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvG,KAAK,UAAU,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAA;CAAE,CAAC;AAaxG,oHAAoH;AACpH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAM1G;AAED,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,GAAG,IAAW,GAAG,YAAY,CAahI;AAED,kGAAkG;AAClG,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAUzG;AAED,qGAAqG;AACrG,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAW5F;AAED,uGAAuG;AACvG,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAGxG;AAED,8GAA8G;AAC9G,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAK3F;AAED,0HAA0H;AAC1H,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,kBAAkB,GAAG,YAAY,GAAG,MAAM,GAAG,IAAI,CAOjI"}
@@ -0,0 +1,101 @@
1
+ import { invalid } from "../problems.js";
2
+ import { now } from "../sessions/session-lookup.js";
3
+ import { deletingInTx, executionRootInTx } from "../sessions/execution-root.js";
4
+ /** All identity checks happen again in the transaction that writes state. */
5
+ function liveIntent(store, expected, teardown = false) {
6
+ const session = store.sessions.get(expected.sessionId);
7
+ if (session?.turnId !== expected.turnId || session.status !== 'running' || session.stepIntentId !== expected.intentId || session.stepGeneration !== expected.generation)
8
+ return undefined;
9
+ if (!teardown && deletingInTx(store, expected.sessionId))
10
+ return undefined;
11
+ const turn = store.turns.get(expected.turnId);
12
+ const intent = store.stepIntents.get(expected.intentId);
13
+ if (turn?.sessionId !== expected.sessionId || turn.outcome !== null || turn.endedAt !== null || intent?.sessionId !== expected.sessionId || intent.turnId !== expected.turnId || intent.generation !== expected.generation)
14
+ return undefined;
15
+ return { session, turn, intent };
16
+ }
17
+ /** Reads only the current runnable prepared identity, never manufactures an intent outside its state transition. */
18
+ export function preparedStep(store, sessionId, turnId) {
19
+ const session = store.sessions.get(sessionId);
20
+ if (session?.stepIntentId === null || session === undefined)
21
+ return undefined;
22
+ const identity = { sessionId, turnId, intentId: session.stepIntentId, generation: session.stepGeneration };
23
+ const live = liveIntent(store, identity);
24
+ return live?.intent.phase === 'prepared' && live.turn.pending.length === 0 ? identity : undefined;
25
+ }
26
+ /** Prepares a new intent in the transaction that makes its turn runnable. No enqueue occurs here. */
27
+ export function prepareStep(store, sessionId, turnId, legacyJobId = null) {
28
+ const session = store.sessions.get(sessionId);
29
+ const turn = store.turns.get(turnId);
30
+ if (session?.turnId !== turnId || session.status !== 'running' || turn?.sessionId !== sessionId || turn.outcome !== null || turn.endedAt !== null || turn.pending.length > 0)
31
+ throw invalid('A step needs its current runnable turn.');
32
+ // A saved legacy reference can still be retained and immediately invalidated by terminal cleanup.
33
+ if (legacyJobId === null && executionRootInTx(store, sessionId) === undefined)
34
+ throw invalid('A step needs its current runnable turn.');
35
+ if (session.stepIntentId !== null)
36
+ throw invalid('The current step intent must be settled or invalidated before preparing its successor.');
37
+ const generation = session.stepGeneration + 1;
38
+ if (!Number.isSafeInteger(generation))
39
+ throw invalid('The next step generation exceeds the safe integer range.');
40
+ const timestamp = now();
41
+ const intent = store.stepIntents.insert({ sessionId, turnId, generation, phase: 'prepared', jobId: null, legacyJobId, reason: null, createdAt: timestamp, updatedAt: timestamp });
42
+ store.sessions.update(sessionId, { stepGeneration: generation, stepIntentId: intent.id, stepJobId: null, updatedAt: timestamp });
43
+ return { sessionId, turnId, intentId: intent.id, generation };
44
+ }
45
+ /** Binds the one winner before model, approval or ordinary tool effects. Repeated claims lose. */
46
+ export function claimStep(store, expected, jobId) {
47
+ const live = liveIntent(store, expected);
48
+ if (live === undefined || live.intent.phase !== 'prepared' || live.turn.pending.length > 0)
49
+ return undefined;
50
+ // A published candidate is already selected; before publication the first valid claimant may win.
51
+ if (live.intent.jobId !== null && live.intent.jobId !== jobId)
52
+ return undefined;
53
+ if (live.intent.legacyJobId !== null && live.intent.legacyJobId !== jobId)
54
+ return undefined;
55
+ const updatedAt = now();
56
+ const intent = store.stepIntents.update(expected.intentId, { phase: 'claimed', jobId, updatedAt });
57
+ const session = store.sessions.update(expected.sessionId, { stepJobId: jobId, updatedAt });
58
+ return { session, turn: live.turn, intent };
59
+ }
60
+ /** Selects a published candidate, or confirms the already claimed winner; never replaces another. */
61
+ export function publishStep(store, expected, jobId) {
62
+ const live = liveIntent(store, expected);
63
+ if (live === undefined)
64
+ return false;
65
+ if (live.intent.phase === 'claimed')
66
+ return live.intent.jobId === jobId && live.session.stepJobId === jobId;
67
+ if (live.intent.phase !== 'prepared' || live.turn.pending.length > 0)
68
+ return false;
69
+ if (live.intent.legacyJobId !== null && live.intent.legacyJobId !== jobId)
70
+ return false;
71
+ if (live.intent.jobId !== null)
72
+ return live.intent.jobId === jobId && live.session.stepJobId === jobId;
73
+ const updatedAt = now();
74
+ store.stepIntents.update(expected.intentId, { jobId, updatedAt });
75
+ store.sessions.update(expected.sessionId, { stepJobId: jobId, updatedAt });
76
+ return true;
77
+ }
78
+ /** A step-derived write needs the current identity and its canonical job, not merely the same turn. */
79
+ export function liveStep(store, expected, jobId) {
80
+ const live = liveIntent(store, expected);
81
+ return live?.intent.phase === 'claimed' && live.intent.jobId === jobId && live.session.stepJobId === jobId ? live : undefined;
82
+ }
83
+ /** Use in the SAME transaction as results and waiting/end/successor state, never as a separate settlement. */
84
+ export function settleStep(store, expected, jobId) {
85
+ if (liveStep(store, expected, jobId) === undefined)
86
+ return false;
87
+ store.stepIntents.update(expected.intentId, { phase: 'settled', updatedAt: now() });
88
+ store.sessions.update(expected.sessionId, { stepIntentId: null, stepJobId: null });
89
+ return true;
90
+ }
91
+ /** Invalidates only the expected identity; step-derived callers also validate their canonical job in this transaction. */
92
+ export function invalidateStep(store, expected, reason) {
93
+ const live = liveIntent(store, expected, true);
94
+ if (live === undefined || (live.intent.phase !== 'prepared' && live.intent.phase !== 'claimed'))
95
+ return null;
96
+ store.stepIntents.update(expected.intentId, { phase: 'invalidated', reason, updatedAt: now() });
97
+ store.sessions.update(expected.sessionId, { stepIntentId: null, stepJobId: null });
98
+ // A verified legacy job is known even when publication and claim have not happened yet.
99
+ return live.intent.jobId ?? live.intent.legacyJobId;
100
+ }
101
+ //# sourceMappingURL=step-intents.js.map