@kvman/kvcoder 0.1.10 → 0.1.12

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 (328) hide show
  1. package/dist/api.d.ts +48 -2
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/calls/call-name.d.ts +8 -0
  4. package/dist/calls/call-name.d.ts.map +1 -0
  5. package/dist/calls/call-name.js +47 -0
  6. package/dist/calls/call-name.js.map +1 -0
  7. package/dist/calls/line-run.d.ts +1 -4
  8. package/dist/calls/line-run.d.ts.map +1 -1
  9. package/dist/calls/line-run.js +2 -2
  10. package/dist/calls/line-run.js.map +1 -1
  11. package/dist/calls/run-tool.d.ts +1 -6
  12. package/dist/calls/run-tool.d.ts.map +1 -1
  13. package/dist/calls/run-tool.js +5 -6
  14. package/dist/calls/run-tool.js.map +1 -1
  15. package/dist/connector-call.d.ts +3 -3
  16. package/dist/connector-call.d.ts.map +1 -1
  17. package/dist/connector-call.js +5 -3
  18. package/dist/connector-call.js.map +1 -1
  19. package/dist/connectors/artifact.d.ts +2 -1
  20. package/dist/connectors/artifact.d.ts.map +1 -1
  21. package/dist/connectors/artifact.js +1 -1
  22. package/dist/connectors/artifact.js.map +1 -1
  23. package/dist/connectors/background.d.ts.map +1 -1
  24. package/dist/connectors/background.js +17 -7
  25. package/dist/connectors/background.js.map +1 -1
  26. package/dist/connectors/binary.js +2 -2
  27. package/dist/connectors/binary.js.map +1 -1
  28. package/dist/connectors/builtin-connectors.d.ts +62 -2
  29. package/dist/connectors/builtin-connectors.d.ts.map +1 -1
  30. package/dist/connectors/builtin-connectors.js +4 -1
  31. package/dist/connectors/builtin-connectors.js.map +1 -1
  32. package/dist/connectors/connector-command.d.ts +0 -1
  33. package/dist/connectors/connector-command.d.ts.map +1 -1
  34. package/dist/connectors/connector-command.js +1 -1
  35. package/dist/connectors/connector-command.js.map +1 -1
  36. package/dist/connectors/delegate.d.ts +17 -0
  37. package/dist/connectors/delegate.d.ts.map +1 -1
  38. package/dist/connectors/delegate.js +31 -6
  39. package/dist/connectors/delegate.js.map +1 -1
  40. package/dist/connectors/execution-map.d.ts +14 -3
  41. package/dist/connectors/execution-map.d.ts.map +1 -1
  42. package/dist/connectors/execution-map.js +43 -12
  43. package/dist/connectors/execution-map.js.map +1 -1
  44. package/dist/connectors/fs.d.ts +29 -1
  45. package/dist/connectors/fs.d.ts.map +1 -1
  46. package/dist/connectors/fs.js +46 -9
  47. package/dist/connectors/fs.js.map +1 -1
  48. package/dist/connectors/payload-fields.d.ts +3 -0
  49. package/dist/connectors/payload-fields.d.ts.map +1 -1
  50. package/dist/connectors/payload-fields.js +8 -2
  51. package/dist/connectors/payload-fields.js.map +1 -1
  52. package/dist/connectors/shell.js +1 -1
  53. package/dist/connectors/shell.js.map +1 -1
  54. package/dist/connectors/web.d.ts +16 -0
  55. package/dist/connectors/web.d.ts.map +1 -0
  56. package/dist/connectors/web.js +22 -0
  57. package/dist/connectors/web.js.map +1 -0
  58. package/dist/delegate/approved-run.js +2 -2
  59. package/dist/delegate/approved-run.js.map +1 -1
  60. package/dist/delegate/continue-helper.d.ts +18 -0
  61. package/dist/delegate/continue-helper.d.ts.map +1 -0
  62. package/dist/delegate/continue-helper.js +64 -0
  63. package/dist/delegate/continue-helper.js.map +1 -0
  64. package/dist/delegate/permission.d.ts +11 -5
  65. package/dist/delegate/permission.d.ts.map +1 -1
  66. package/dist/delegate/runs.d.ts +9 -11
  67. package/dist/delegate/runs.d.ts.map +1 -1
  68. package/dist/delegate/runs.js +13 -9
  69. package/dist/delegate/runs.js.map +1 -1
  70. package/dist/delegate/workers.d.ts +6 -0
  71. package/dist/delegate/workers.d.ts.map +1 -1
  72. package/dist/files/change-diff.d.ts +17 -0
  73. package/dist/files/change-diff.d.ts.map +1 -0
  74. package/dist/files/change-diff.js +59 -0
  75. package/dist/files/change-diff.js.map +1 -0
  76. package/dist/files/edit-places.d.ts +11 -0
  77. package/dist/files/edit-places.d.ts.map +1 -0
  78. package/dist/files/edit-places.js +105 -0
  79. package/dist/files/edit-places.js.map +1 -0
  80. package/dist/files/edit-text.d.ts +1 -0
  81. package/dist/files/edit-text.d.ts.map +1 -1
  82. package/dist/files/edit-text.js +22 -10
  83. package/dist/files/edit-text.js.map +1 -1
  84. package/dist/files/file-change.d.ts.map +1 -1
  85. package/dist/files/file-change.js +12 -0
  86. package/dist/files/file-change.js.map +1 -1
  87. package/dist/files/find-paths.d.ts +9 -0
  88. package/dist/files/find-paths.d.ts.map +1 -0
  89. package/dist/files/find-paths.js +38 -0
  90. package/dist/files/find-paths.js.map +1 -0
  91. package/dist/files/read-file.d.ts +3 -1
  92. package/dist/files/read-file.d.ts.map +1 -1
  93. package/dist/files/read-file.js +7 -6
  94. package/dist/files/read-file.js.map +1 -1
  95. package/dist/files/read-files.d.ts +11 -0
  96. package/dist/files/read-files.d.ts.map +1 -0
  97. package/dist/files/read-files.js +35 -0
  98. package/dist/files/read-files.js.map +1 -0
  99. package/dist/files/read-text.d.ts +63 -0
  100. package/dist/files/read-text.d.ts.map +1 -0
  101. package/dist/files/read-text.js +67 -0
  102. package/dist/files/read-text.js.map +1 -0
  103. package/dist/files/register-changes.d.ts +3 -0
  104. package/dist/files/register-changes.d.ts.map +1 -0
  105. package/dist/files/register-changes.js +78 -0
  106. package/dist/files/register-changes.js.map +1 -0
  107. package/dist/files/search-text.d.ts +10 -1
  108. package/dist/files/search-text.d.ts.map +1 -1
  109. package/dist/files/search-text.js +32 -57
  110. package/dist/files/search-text.js.map +1 -1
  111. package/dist/files/workspace-files.d.ts +5 -0
  112. package/dist/files/workspace-files.d.ts.map +1 -0
  113. package/dist/files/workspace-files.js +66 -0
  114. package/dist/files/workspace-files.js.map +1 -0
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +6 -0
  117. package/dist/index.js.map +1 -1
  118. package/dist/jobs/helper-progress.d.ts +11 -0
  119. package/dist/jobs/helper-progress.d.ts.map +1 -0
  120. package/dist/jobs/helper-progress.js +38 -0
  121. package/dist/jobs/helper-progress.js.map +1 -0
  122. package/dist/jobs/job-rows.d.ts +3 -1
  123. package/dist/jobs/job-rows.d.ts.map +1 -1
  124. package/dist/jobs/job-rows.js +46 -22
  125. package/dist/jobs/job-rows.js.map +1 -1
  126. package/dist/jobs/process-report.d.ts +1 -1
  127. package/dist/jobs/process-report.d.ts.map +1 -1
  128. package/dist/jobs/process-report.js +11 -6
  129. package/dist/jobs/process-report.js.map +1 -1
  130. package/dist/jobs/process-run.d.ts +2 -5
  131. package/dist/jobs/process-run.d.ts.map +1 -1
  132. package/dist/jobs/process-run.js +6 -5
  133. package/dist/jobs/process-run.js.map +1 -1
  134. package/dist/jobs/register-jobs.js +3 -3
  135. package/dist/jobs/register-jobs.js.map +1 -1
  136. package/dist/maps/map-rules.d.ts +4 -2
  137. package/dist/maps/map-rules.d.ts.map +1 -1
  138. package/dist/maps/map-rules.js +7 -4
  139. package/dist/maps/map-rules.js.map +1 -1
  140. package/dist/maps/map-schema.d.ts +4 -4
  141. package/dist/maps/map-schema.d.ts.map +1 -1
  142. package/dist/maps/map-schema.js +10 -3
  143. package/dist/maps/map-schema.js.map +1 -1
  144. package/dist/prompt/build-prompt.d.ts +4 -0
  145. package/dist/prompt/build-prompt.d.ts.map +1 -1
  146. package/dist/prompt/build-prompt.js +8 -4
  147. package/dist/prompt/build-prompt.js.map +1 -1
  148. package/dist/prompt/person-preferences.d.ts +5 -0
  149. package/dist/prompt/person-preferences.d.ts.map +1 -0
  150. package/dist/prompt/person-preferences.js +14 -0
  151. package/dist/prompt/person-preferences.js.map +1 -0
  152. package/dist/prompt/session-grants.d.ts +7 -3
  153. package/dist/prompt/session-grants.d.ts.map +1 -1
  154. package/dist/prompt/session-grants.js +3 -2
  155. package/dist/prompt/session-grants.js.map +1 -1
  156. package/dist/prompt/session-prompt.d.ts.map +1 -1
  157. package/dist/prompt/session-prompt.js +15 -6
  158. package/dist/prompt/session-prompt.js.map +1 -1
  159. package/dist/prompt/working-method.d.ts +2 -2
  160. package/dist/prompt/working-method.d.ts.map +1 -1
  161. package/dist/prompt/working-method.js +51 -45
  162. package/dist/prompt/working-method.js.map +1 -1
  163. package/dist/register-settings.d.ts +27 -0
  164. package/dist/register-settings.d.ts.map +1 -1
  165. package/dist/register-settings.js +13 -0
  166. package/dist/register-settings.js.map +1 -1
  167. package/dist/schemas/approval-rule.d.ts +9 -0
  168. package/dist/schemas/approval-rule.d.ts.map +1 -0
  169. package/dist/schemas/approval-rule.js +7 -0
  170. package/dist/schemas/approval-rule.js.map +1 -0
  171. package/dist/schemas/check.d.ts +7 -0
  172. package/dist/schemas/check.d.ts.map +1 -0
  173. package/dist/schemas/check.js +9 -0
  174. package/dist/schemas/check.js.map +1 -0
  175. package/dist/schemas/records.d.ts +20 -6
  176. package/dist/schemas/records.d.ts.map +1 -1
  177. package/dist/schemas/records.js +15 -4
  178. package/dist/schemas/records.js.map +1 -1
  179. package/dist/sessions/new-session.d.ts.map +1 -1
  180. package/dist/sessions/new-session.js +8 -3
  181. package/dist/sessions/new-session.js.map +1 -1
  182. package/dist/sessions/register-fork-export.d.ts.map +1 -1
  183. package/dist/sessions/register-fork-export.js +3 -2
  184. package/dist/sessions/register-fork-export.js.map +1 -1
  185. package/dist/sessions/register-sessions.d.ts.map +1 -1
  186. package/dist/sessions/register-sessions.js +21 -10
  187. package/dist/sessions/register-sessions.js.map +1 -1
  188. package/dist/sessions/session-view.d.ts +10 -1
  189. package/dist/sessions/session-view.d.ts.map +1 -1
  190. package/dist/sessions/session-view.js +6 -1
  191. package/dist/sessions/session-view.js.map +1 -1
  192. package/dist/sessions/waiting-on.d.ts +7 -0
  193. package/dist/sessions/waiting-on.d.ts.map +1 -0
  194. package/dist/sessions/waiting-on.js +20 -0
  195. package/dist/sessions/waiting-on.js.map +1 -0
  196. package/dist/store/collections.d.ts +26 -8
  197. package/dist/store/collections.d.ts.map +1 -1
  198. package/dist/store/collections.js +3 -1
  199. package/dist/store/collections.js.map +1 -1
  200. package/dist/thinking-levels.d.ts +6 -0
  201. package/dist/thinking-levels.d.ts.map +1 -0
  202. package/dist/thinking-levels.js +13 -0
  203. package/dist/thinking-levels.js.map +1 -0
  204. package/dist/turns/answer-extras.d.ts +21 -0
  205. package/dist/turns/answer-extras.d.ts.map +1 -0
  206. package/dist/turns/answer-extras.js +43 -0
  207. package/dist/turns/answer-extras.js.map +1 -0
  208. package/dist/turns/answer-fingerprint.d.ts +6 -2
  209. package/dist/turns/answer-fingerprint.d.ts.map +1 -1
  210. package/dist/turns/answer-fingerprint.js +9 -3
  211. package/dist/turns/answer-fingerprint.js.map +1 -1
  212. package/dist/turns/apply-answer.d.ts +2 -1
  213. package/dist/turns/apply-answer.d.ts.map +1 -1
  214. package/dist/turns/apply-answer.js +10 -4
  215. package/dist/turns/apply-answer.js.map +1 -1
  216. package/dist/turns/approval-rules.d.ts +13 -0
  217. package/dist/turns/approval-rules.d.ts.map +1 -0
  218. package/dist/turns/approval-rules.js +65 -0
  219. package/dist/turns/approval-rules.js.map +1 -0
  220. package/dist/turns/cache-retention.d.ts +6 -0
  221. package/dist/turns/cache-retention.d.ts.map +1 -0
  222. package/dist/turns/cache-retention.js +7 -0
  223. package/dist/turns/cache-retention.js.map +1 -0
  224. package/dist/turns/call-results.d.ts +6 -0
  225. package/dist/turns/call-results.d.ts.map +1 -0
  226. package/dist/turns/call-results.js +21 -0
  227. package/dist/turns/call-results.js.map +1 -0
  228. package/dist/turns/check-after-edits.d.ts +8 -0
  229. package/dist/turns/check-after-edits.d.ts.map +1 -0
  230. package/dist/turns/check-after-edits.js +23 -0
  231. package/dist/turns/check-after-edits.js.map +1 -0
  232. package/dist/turns/child-result.d.ts.map +1 -1
  233. package/dist/turns/child-result.js +4 -2
  234. package/dist/turns/child-result.js.map +1 -1
  235. package/dist/turns/clear-results.d.ts +15 -0
  236. package/dist/turns/clear-results.d.ts.map +1 -0
  237. package/dist/turns/clear-results.js +58 -0
  238. package/dist/turns/clear-results.js.map +1 -0
  239. package/dist/turns/cleared-results.d.ts +17 -0
  240. package/dist/turns/cleared-results.d.ts.map +1 -0
  241. package/dist/turns/cleared-results.js +46 -0
  242. package/dist/turns/cleared-results.js.map +1 -0
  243. package/dist/turns/compaction.d.ts.map +1 -1
  244. package/dist/turns/compaction.js +8 -7
  245. package/dist/turns/compaction.js.map +1 -1
  246. package/dist/turns/end-turn-state.d.ts.map +1 -1
  247. package/dist/turns/end-turn-state.js +2 -0
  248. package/dist/turns/end-turn-state.js.map +1 -1
  249. package/dist/turns/ended-calls.d.ts +6 -0
  250. package/dist/turns/ended-calls.d.ts.map +1 -0
  251. package/dist/turns/ended-calls.js +43 -0
  252. package/dist/turns/ended-calls.js.map +1 -0
  253. package/dist/turns/file-results.d.ts +15 -0
  254. package/dist/turns/file-results.d.ts.map +1 -0
  255. package/dist/turns/file-results.js +39 -0
  256. package/dist/turns/file-results.js.map +1 -0
  257. package/dist/turns/lost-reply.js +2 -2
  258. package/dist/turns/lost-reply.js.map +1 -1
  259. package/dist/turns/model-context.d.ts +2 -0
  260. package/dist/turns/model-context.d.ts.map +1 -1
  261. package/dist/turns/model-context.js +41 -3
  262. package/dist/turns/model-context.js.map +1 -1
  263. package/dist/turns/model-info.d.ts +4 -0
  264. package/dist/turns/model-info.d.ts.map +1 -1
  265. package/dist/turns/model-info.js +7 -1
  266. package/dist/turns/model-info.js.map +1 -1
  267. package/dist/turns/model-retry.d.ts.map +1 -1
  268. package/dist/turns/model-retry.js +5 -4
  269. package/dist/turns/model-retry.js.map +1 -1
  270. package/dist/turns/read-again.d.ts +11 -5
  271. package/dist/turns/read-again.d.ts.map +1 -1
  272. package/dist/turns/read-again.js +39 -10
  273. package/dist/turns/read-again.js.map +1 -1
  274. package/dist/turns/register-turns.d.ts.map +1 -1
  275. package/dist/turns/register-turns.js +12 -4
  276. package/dist/turns/register-turns.js.map +1 -1
  277. package/dist/turns/run-calls.d.ts +4 -0
  278. package/dist/turns/run-calls.d.ts.map +1 -1
  279. package/dist/turns/run-calls.js +56 -10
  280. package/dist/turns/run-calls.js.map +1 -1
  281. package/dist/turns/run-command.d.ts.map +1 -1
  282. package/dist/turns/run-command.js +8 -10
  283. package/dist/turns/run-command.js.map +1 -1
  284. package/dist/turns/sent-size.d.ts +6 -2
  285. package/dist/turns/sent-size.d.ts.map +1 -1
  286. package/dist/turns/sent-size.js +8 -4
  287. package/dist/turns/sent-size.js.map +1 -1
  288. package/dist/turns/settle-calls.d.ts +1 -7
  289. package/dist/turns/settle-calls.d.ts.map +1 -1
  290. package/dist/turns/settle-calls.js +2 -19
  291. package/dist/turns/settle-calls.js.map +1 -1
  292. package/dist/turns/step.d.ts.map +1 -1
  293. package/dist/turns/step.js +68 -10
  294. package/dist/turns/step.js.map +1 -1
  295. package/dist/ui/register-ui.js +2 -2
  296. package/dist/ui/register-ui.js.map +1 -1
  297. package/dist/web/components/approval.css +1 -1
  298. package/dist/web/components/approval.js +122 -89
  299. package/dist/web/components/call.css +1 -1
  300. package/dist/web/components/call.js +431 -306
  301. package/dist/web/components/connectors.css +1 -1
  302. package/dist/web/components/connectors.js +553 -521
  303. package/dist/web/components/conversation.css +1 -1
  304. package/dist/web/components/conversation.js +2636 -1520
  305. package/dist/web/components/mcp-sign-in.css +1 -1
  306. package/dist/web/components/model.css +1 -1
  307. package/dist/web/components/model.js +140 -127
  308. package/dist/web/components/preferences.css +2 -0
  309. package/dist/web/components/preferences.js +151 -0
  310. package/dist/web/components/question.css +1 -1
  311. package/dist/web/components/sessions.css +1 -1
  312. package/dist/web/components/sessions.js +44 -21
  313. package/dist/web-fetch/fetch-page.d.ts +28 -0
  314. package/dist/web-fetch/fetch-page.d.ts.map +1 -0
  315. package/dist/web-fetch/fetch-page.js +108 -0
  316. package/dist/web-fetch/fetch-page.js.map +1 -0
  317. package/dist/web-fetch/private-address.d.ts +3 -0
  318. package/dist/web-fetch/private-address.d.ts.map +1 -0
  319. package/dist/web-fetch/private-address.js +69 -0
  320. package/dist/web-fetch/private-address.js.map +1 -0
  321. package/dist/web-fetch/web-hosts.d.ts +7 -0
  322. package/dist/web-fetch/web-hosts.d.ts.map +1 -0
  323. package/dist/web-fetch/web-hosts.js +19 -0
  324. package/dist/web-fetch/web-hosts.js.map +1 -0
  325. package/docs/connectors.md +5 -6
  326. package/locales/ar.json +81 -5
  327. package/locales/en.json +81 -5
  328. package/package.json +152 -6
@@ -13,7 +13,10 @@ export declare function records(store: Store): {
13
13
  readOnly: boolean;
14
14
  } | null;
15
15
  model: string | null;
16
- thinking: "off" | "minimal" | "low" | "medium" | "high";
16
+ thinking: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
17
+ decides: boolean;
18
+ clearedThroughSeq: number | null;
19
+ webHosts: string[];
17
20
  usageBy: {
18
21
  summary: {
19
22
  input: number;
@@ -158,10 +161,10 @@ export declare function records(store: Store): {
158
161
  details: import("zod").JSONType;
159
162
  isError: boolean;
160
163
  run: {
161
- description: string;
162
164
  connector: string;
163
165
  command: string;
164
166
  payload: Record<string, import("zod").JSONType>;
167
+ description?: string;
165
168
  } | {
166
169
  command: string;
167
170
  timeoutMs: number;
@@ -170,10 +173,10 @@ export declare function records(store: Store): {
170
173
  deferredCalls: {
171
174
  toolCallId: string;
172
175
  call: {
173
- description: string;
174
176
  connector: string;
175
177
  command: string;
176
178
  payload: Record<string, import("zod").JSONType>;
179
+ description?: string;
177
180
  };
178
181
  }[];
179
182
  }>;
@@ -213,6 +216,12 @@ export declare function records(store: Store): {
213
216
  written: string;
214
217
  createdAt: string;
215
218
  }>;
219
+ fileChanges: import("@kvman/sdk").Collection<{
220
+ sessionId: string;
221
+ path: string;
222
+ firstAt: string;
223
+ lastAt: string;
224
+ }>;
216
225
  fileParts: import("@kvman/sdk").Collection<{
217
226
  sessionId: string;
218
227
  path: string;
@@ -236,7 +245,7 @@ export declare function records(store: Store): {
236
245
  steps: {
237
246
  id: string;
238
247
  title: string;
239
- description: string | null;
248
+ details: string | null;
240
249
  after: string[];
241
250
  uses: string | null;
242
251
  check: string;
@@ -373,7 +382,10 @@ export declare function txRecords(tx: Transaction): {
373
382
  readOnly: boolean;
374
383
  } | null;
375
384
  model: string | null;
376
- thinking: "off" | "minimal" | "low" | "medium" | "high";
385
+ thinking: "off" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max";
386
+ decides: boolean;
387
+ clearedThroughSeq: number | null;
388
+ webHosts: string[];
377
389
  usageBy: {
378
390
  summary: {
379
391
  input: number;
@@ -518,10 +530,10 @@ export declare function txRecords(tx: Transaction): {
518
530
  details: import("zod").JSONType;
519
531
  isError: boolean;
520
532
  run: {
521
- description: string;
522
533
  connector: string;
523
534
  command: string;
524
535
  payload: Record<string, import("zod").JSONType>;
536
+ description?: string;
525
537
  } | {
526
538
  command: string;
527
539
  timeoutMs: number;
@@ -530,10 +542,10 @@ export declare function txRecords(tx: Transaction): {
530
542
  deferredCalls: {
531
543
  toolCallId: string;
532
544
  call: {
533
- description: string;
534
545
  connector: string;
535
546
  command: string;
536
547
  payload: Record<string, import("zod").JSONType>;
548
+ description?: string;
537
549
  };
538
550
  }[];
539
551
  }>;
@@ -573,6 +585,12 @@ export declare function txRecords(tx: Transaction): {
573
585
  written: string;
574
586
  createdAt: string;
575
587
  }>;
588
+ fileChanges: import("@kvman/sdk").TransactionCollection<{
589
+ sessionId: string;
590
+ path: string;
591
+ firstAt: string;
592
+ lastAt: string;
593
+ }>;
576
594
  fileParts: import("@kvman/sdk").TransactionCollection<{
577
595
  sessionId: string;
578
596
  path: string;
@@ -596,7 +614,7 @@ export declare function txRecords(tx: Transaction): {
596
614
  steps: {
597
615
  id: string;
598
616
  title: string;
599
- description: string | null;
617
+ details: string | null;
600
618
  after: string[];
601
619
  uses: string | null;
602
620
  check: string;
@@ -1 +1 @@
1
- {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAUrD,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BnC;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,EAAE,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BxC;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAUrD,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,KAAK,EAAE,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BnC;AAED,iDAAiD;AACjD,wBAAgB,SAAS,CAAC,EAAE,EAAE,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BxC;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC"}
@@ -1,4 +1,4 @@
1
- import { answerReceiptDocSchema, artifactDocSchema, backgroundDocSchema, fileBackupDocSchema, filePartDocSchema, fileViewDocSchema, messageDocSchema, processDocSchema, questionDocSchema, queuedDocSchema, runDocSchema, sendReceiptDocSchema, sessionDocSchema, stepIntentDocSchema, turnDocSchema } from "../schemas/records.js";
1
+ import { answerReceiptDocSchema, artifactDocSchema, backgroundDocSchema, fileBackupDocSchema, fileChangeDocSchema, filePartDocSchema, fileViewDocSchema, messageDocSchema, processDocSchema, questionDocSchema, queuedDocSchema, runDocSchema, sendReceiptDocSchema, sessionDocSchema, stepIntentDocSchema, turnDocSchema } from "../schemas/records.js";
2
2
  import { mapDocSchema } from "../maps/map-schema.js";
3
3
  import { signInDocSchema } from "../mcp/sign-in-record.js";
4
4
  import { connectorDocSchema, handlerDocSchema, handlerJobDocSchema, sectionDocSchema, slashDocSchema } from "../schemas/registry.js";
@@ -18,6 +18,7 @@ export function records(store) {
18
18
  sendReceipts: store.collection('send-receipts', sendReceiptDocSchema),
19
19
  fileViews: store.collection('file-views', fileViewDocSchema),
20
20
  fileBackups: store.collection('file-backups', fileBackupDocSchema),
21
+ fileChanges: store.collection('file-changes', fileChangeDocSchema),
21
22
  fileParts: store.collection('file-parts', filePartDocSchema),
22
23
  artifacts: store.collection('artifacts', artifactDocSchema),
23
24
  maps: store.collection('maps', mapDocSchema),
@@ -46,6 +47,7 @@ export function txRecords(tx) {
46
47
  sendReceipts: tx.collection('send-receipts', sendReceiptDocSchema),
47
48
  fileViews: tx.collection('file-views', fileViewDocSchema),
48
49
  fileBackups: tx.collection('file-backups', fileBackupDocSchema),
50
+ fileChanges: tx.collection('file-changes', fileChangeDocSchema),
49
51
  fileParts: tx.collection('file-parts', filePartDocSchema),
50
52
  artifacts: tx.collection('artifacts', artifactDocSchema),
51
53
  maps: tx.collection('maps', mapDocSchema),
@@ -1 +1 @@
1
- {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Every thinking level, from none to the most. */
2
+ export declare const thinkingLevels: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
3
+ export type ThinkingLevel = (typeof thinkingLevels)[number];
4
+ /** The level a model whose levels are `levels` uses for `wanted`: itself, else the next higher it has, else the next lower. */
5
+ export declare function nearestLevel(levels: readonly ThinkingLevel[], wanted: ThinkingLevel): ThinkingLevel;
6
+ //# sourceMappingURL=thinking-levels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinking-levels.d.ts","sourceRoot":"","sources":["../src/thinking-levels.ts"],"names":[],"mappings":"AAGA,mDAAmD;AACnD,eAAO,MAAM,cAAc,sEAAuE,CAAC;AAEnG,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5D,+HAA+H;AAC/H,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,EAAE,MAAM,EAAE,aAAa,GAAG,aAAa,CAKnG"}
@@ -0,0 +1,13 @@
1
+ // The thinking levels (ADR 0087, 11): all of them in order, and the one a model uses for a level it lacks, by pi-ai's
2
+ // rule. The server and the web app share this module, so it imports nothing.
3
+ /** Every thinking level, from none to the most. */
4
+ export const thinkingLevels = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'];
5
+ /** The level a model whose levels are `levels` uses for `wanted`: itself, else the next higher it has, else the next lower. */
6
+ export function nearestLevel(levels, wanted) {
7
+ if (levels.includes(wanted))
8
+ return wanted;
9
+ const index = thinkingLevels.indexOf(wanted);
10
+ const higher = thinkingLevels.slice(index + 1).find((level) => levels.includes(level));
11
+ return higher ?? thinkingLevels.slice(0, index).findLast((level) => levels.includes(level)) ?? wanted;
12
+ }
13
+ //# sourceMappingURL=thinking-levels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thinking-levels.js","sourceRoot":"","sources":["../src/thinking-levels.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,6EAA6E;AAE7E,mDAAmD;AACnD,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAU,CAAC;AAInG,+HAA+H;AAC/H,MAAM,UAAU,YAAY,CAAC,MAAgC,EAAE,MAAqB;IAClF,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC3C,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACvF,OAAO,MAAM,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,MAAM,CAAC;AACxG,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { z, type Ctx, type Json } from '@kvman/sdk';
2
+ import { type ApprovalRule } from '../schemas/approval-rule.ts';
3
+ import { type QuestionDoc } from '../schemas/records.ts';
4
+ export declare const answerExtrasShape: {
5
+ remember: z.ZodExactOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
6
+ kind: z.ZodLiteral<"line">;
7
+ prefix: z.ZodString;
8
+ }, z.core.$strict>, z.ZodObject<{
9
+ kind: z.ZodLiteral<"files">;
10
+ }, z.core.$strict>], "kind">>;
11
+ reason: z.ZodExactOptional<z.ZodString>;
12
+ };
13
+ export type AnswerExtras = {
14
+ remember?: ApprovalRule | undefined;
15
+ reason?: string | undefined;
16
+ };
17
+ /** Refuses extras that don't belong to the question and its answer, before anything is saved. */
18
+ export declare function checkExtras(question: QuestionDoc, answer: Json, extras: AnswerExtras): void;
19
+ /** Adds the rule to this workspace's approval rules, unless one like it is there (ADR 0091, 3). */
20
+ export declare function rememberRule(ctx: Ctx, rule: ApprovalRule): Promise<void>;
21
+ //# sourceMappingURL=answer-extras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-extras.d.ts","sourceRoot":"","sources":["../../src/turns/answer-extras.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAKxE,eAAO,MAAM,iBAAiB;;;;;;;;CAG7B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAchG,iGAAiG;AACjG,wBAAgB,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAK3F;AAID,mGAAmG;AACnG,wBAAsB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9E"}
@@ -0,0 +1,43 @@
1
+ import { z } from '@kvman/sdk';
2
+ import { builtinConnectors } from "../connector-call.js";
3
+ import { invalid } from "../problems.js";
4
+ import { approvalRuleSchema } from "../schemas/approval-rule.js";
5
+ import { runCallSchema } from "../schemas/records.js";
6
+ // What an approval's answer may carry besides the decision (plan 08 §8.6, ADR 0091, 3 and 4): a rule to remember with
7
+ // an allowed call, or the reason for a denied one.
8
+ export const answerExtrasShape = {
9
+ remember: approvalRuleSchema.exactOptional(),
10
+ reason: z.string().trim().min(1).max(1000).exactOptional(),
11
+ };
12
+ const fileChanges = new Set(['write', 'edit', 'undo', 'assemble']);
13
+ const confirmedOf = (answer) => (typeof answer === 'object' && answer !== null && !Array.isArray(answer) ? answer['confirmed'] : undefined);
14
+ // Whether a rule of this kind could cover the approval's call: a line for a shell or binary line, files for a file change.
15
+ function fits(rule, question) {
16
+ const call = runCallSchema.safeParse(question.question);
17
+ if (!call.success)
18
+ return false;
19
+ const { connector, command } = call.data;
20
+ if (rule.kind === 'files')
21
+ return connector === 'fs' && fileChanges.has(command);
22
+ return command === 'exec' && (connector === 'shell' || !builtinConnectors.some((name) => name === connector));
23
+ }
24
+ /** Refuses extras that don't belong to the question and its answer, before anything is saved. */
25
+ export function checkExtras(question, answer, extras) {
26
+ if (extras.remember === undefined && extras.reason === undefined)
27
+ return;
28
+ if (question.kind !== 'approval')
29
+ throw invalid('remember and reason belong to the answer of an approval.');
30
+ if (extras.remember !== undefined && (confirmedOf(answer) !== true || !fits(extras.remember, question)))
31
+ throw invalid('remember goes with an allowed call that a rule of its kind could cover.');
32
+ if (extras.reason !== undefined && confirmedOf(answer) !== false)
33
+ throw invalid('reason goes with a denied call.');
34
+ }
35
+ const sameRule = (first, second) => first.kind === second.kind && (first.kind === 'files' || (second.kind === 'line' && first.prefix.replace(/\s+/g, ' ') === second.prefix.replace(/\s+/g, ' ')));
36
+ /** Adds the rule to this workspace's approval rules, unless one like it is there (ADR 0091, 3). */
37
+ export async function rememberRule(ctx, rule) {
38
+ const rules = z.array(approvalRuleSchema).parse(await ctx.settings.get('kvcoder.approval.allowed'));
39
+ if (rules.some((saved) => sameRule(saved, rule)))
40
+ return;
41
+ await ctx.settings.set('kvcoder.approval.allowed', [...rules, rule], { scope: 'workspace' });
42
+ }
43
+ //# sourceMappingURL=answer-extras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"answer-extras.js","sourceRoot":"","sources":["../../src/turns/answer-extras.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,8 @@
1
1
  import { type QuestionKind } from '../connectors/ask.ts';
2
- /** First application must additionally call checkedAnswer with the current question to validate choice membership. */
3
- export declare function answerFingerprint(kind: QuestionKind, answer: unknown): string;
2
+ import type { AnswerExtras } from './answer-extras.ts';
3
+ /**
4
+ * First application must additionally call checkedAnswer with the current question to validate choice membership. An
5
+ * answer with a rule or a reason covers them too; one without has the fingerprint receipts had before (ADR 0091, 4).
6
+ */
7
+ export declare function answerFingerprint(kind: QuestionKind, answer: unknown, extras?: AnswerExtras): string;
4
8
  //# sourceMappingURL=answer-fingerprint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"answer-fingerprint.d.ts","sourceRoot":"","sources":["../../src/turns/answer-fingerprint.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAc1E,sHAAsH;AACtH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,GAAG,MAAM,CAE7E"}
1
+ {"version":3,"file":"answer-fingerprint.d.ts","sourceRoot":"","sources":["../../src/turns/answer-fingerprint.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAavD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAE,YAAiB,GAAG,MAAM,CAKxG"}
@@ -11,8 +11,14 @@ function canonical(value) {
11
11
  }
12
12
  return JSON.stringify(value);
13
13
  }
14
- /** First application must additionally call checkedAnswer with the current question to validate choice membership. */
15
- export function answerFingerprint(kind, answer) {
16
- return createHash('sha256').update(canonical(normalizeAnswer(kind, answer))).digest('hex');
14
+ /**
15
+ * First application must additionally call checkedAnswer with the current question to validate choice membership. An
16
+ * answer with a rule or a reason covers them too; one without has the fingerprint receipts had before (ADR 0091, 4).
17
+ */
18
+ export function answerFingerprint(kind, answer, extras = {}) {
19
+ const normalized = normalizeAnswer(kind, answer);
20
+ const extra = { ...(extras.remember === undefined ? {} : { remember: extras.remember }), ...(extras.reason === undefined ? {} : { reason: extras.reason }) };
21
+ const covered = Object.keys(extra).length === 0 ? normalized : { answer: normalized, ...extra };
22
+ return createHash('sha256').update(canonical(covered)).digest('hex');
17
23
  }
18
24
  //# sourceMappingURL=answer-fingerprint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"answer-fingerprint.js","sourceRoot":"","sources":["../../src/turns/answer-fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAqB,MAAM,sBAAsB,CAAC;AAG1E,0GAA0G;AAC1G,+GAA+G;AAC/G,SAAS,SAAS,CAAC,KAAgB;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACtG,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,sHAAsH;AACtH,MAAM,UAAU,iBAAiB,CAAC,IAAkB,EAAE,MAAe;IACnE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC7F,CAAC"}
1
+ {"version":3,"file":"answer-fingerprint.js","sourceRoot":"","sources":["../../src/turns/answer-fingerprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,eAAe,EAAqB,MAAM,sBAAsB,CAAC;AAI1E,0GAA0G;AAC1G,+GAA+G;AAC/G,SAAS,SAAS,CAAC,KAAgB;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACvE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACtG,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAkB,EAAE,MAAe,EAAE,SAAuB,EAAE;IAC9F,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;IAC7J,MAAM,OAAO,GAAc,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,EAAE,CAAC;IAC3G,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvE,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { Ctx, Json, Stored } from '@kvman/sdk';
2
2
  import { type AnswerReceiptDoc, type QuestionDoc, type RunCallDoc } from '../schemas/records.ts';
3
3
  import type { TxRecords } from '../store/collections.ts';
4
+ import { type AnswerExtras } from './answer-extras.ts';
4
5
  import type { StepIdentity } from './step-intents.ts';
5
6
  export type AnswerApplication = {
6
7
  kind: 'acknowledged';
@@ -15,5 +16,5 @@ export type AnswerApplication = {
15
16
  call: RunCallDoc;
16
17
  };
17
18
  /** No awaits or effects: the first valid ordinary application and all its records commit together. */
18
- export declare function applyAnswer(ctx: Ctx, store: TxRecords, questionId: string, answer: Json, expected?: Stored<QuestionDoc>): AnswerApplication;
19
+ export declare function applyAnswer(ctx: Ctx, store: TxRecords, questionId: string, answer: Json, extras: AnswerExtras, expected?: Stored<QuestionDoc>): AnswerApplication;
19
20
  //# sourceMappingURL=apply-answer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"apply-answer.d.ts","sourceRoot":"","sources":["../../src/turns/apply-answer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIpD,OAAO,EAAiB,KAAK,gBAAgB,EAAmB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEjI,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,GACrF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAE1E,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,iBAAiB,CA+B3I"}
1
+ {"version":3,"file":"apply-answer.d.ts","sourceRoot":"","sources":["../../src/turns/apply-answer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAIpD,OAAO,EAAiB,KAAK,gBAAgB,EAAmB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEjI,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAA;CAAE,GACrF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAE1E,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,iBAAiB,CAkCjK"}
@@ -4,13 +4,15 @@ import { invalid } from "../problems.js";
4
4
  import { runCallSchema } from "../schemas/records.js";
5
5
  import { now } from "../sessions/session-lookup.js";
6
6
  import { answerFingerprint } from "./answer-fingerprint.js";
7
+ import { allowHostInTx } from "../web-fetch/web-hosts.js";
8
+ import { checkExtras } from "./answer-extras.js";
7
9
  import { heldText, resolvePendingInTx } from "./resolve.js";
8
10
  /** No awaits or effects: the first valid ordinary application and all its records commit together. */
9
- export function applyAnswer(ctx, store, questionId, answer, expected) {
11
+ export function applyAnswer(ctx, store, questionId, answer, extras, expected) {
10
12
  ctx.job.signal.throwIfAborted();
11
13
  const [receipt] = store.answerReceipts.find({ questionId }, { limit: 1 });
12
14
  if (receipt !== undefined) {
13
- if (answerFingerprint(receipt.questionKind, answer) !== receipt.answerFingerprint)
15
+ if (answerFingerprint(receipt.questionKind, answer, extras) !== receipt.answerFingerprint)
14
16
  throw invalid('This question already has a different answer.');
15
17
  return { kind: 'acknowledged', receipt };
16
18
  }
@@ -28,6 +30,7 @@ export function applyAnswer(ctx, store, questionId, answer, expected) {
28
30
  if (candidates.length !== 1 || pending?.toolCallId !== question.toolCallId || pending.questionId !== questionId || pending.kind !== (question.kind === 'approval' ? 'approval' : 'question') || pending.childSessionId !== null || pending.runId !== null || pending.question === null || turn.results.some(item => item.toolCallId === question.toolCallId))
29
31
  throw missing();
30
32
  const checked = checkedAnswer(question, answer);
33
+ checkExtras(question, answer, extras);
31
34
  const call = checked.kind === 'approval' && checked.approved ? runCallSchema.parse(question.question) : undefined;
32
35
  // Existing run records cannot prove durable launch. Keep grants on their existing separate flow, WITHOUT receipts.
33
36
  if (call !== undefined && isDelegateRun(call))
@@ -36,8 +39,11 @@ export function applyAnswer(ctx, store, questionId, answer, expected) {
36
39
  ? heldText(question.toolCallId, checked.text, false)
37
40
  : call !== undefined
38
41
  ? { toolCallId: question.toolCallId, text: '', details: null, isError: false, run: call }
39
- : heldText(question.toolCallId, 'denied by the user', true);
40
- const fingerprint = answerFingerprint(question.kind, answer);
42
+ : heldText(question.toolCallId, extras.reason === undefined ? 'denied by the user' : `denied by the user: ${extras.reason}`, true);
43
+ // An allowed fetch lets the chat reach its host from now on (ADR 0095, 4).
44
+ if (call !== undefined)
45
+ allowHostInTx(store, question.sessionId, call);
46
+ const fingerprint = answerFingerprint(question.kind, answer, extras);
41
47
  ctx.job.signal.throwIfAborted();
42
48
  store.questions.delete(questionId);
43
49
  const identity = resolvePendingInTx(store, question.sessionId, question.toolCallId, held);
@@ -1 +1 @@
1
- {"version":3,"file":"apply-answer.js","sourceRoot":"","sources":["../../src/turns/apply-answer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"apply-answer.js","sourceRoot":"","sources":["../../src/turns/apply-answer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { RunCall } from '../calls/run-tool.ts';
2
+ import type { ApprovalRule } from '../schemas/approval-rule.ts';
3
+ /** The commands of a line, or `undefined` when one of them holds more than plain words. */
4
+ export declare function lineParts(line: string): string[] | undefined;
5
+ /** Whether every command of the line starts with one of the prefixes, at a word's end. */
6
+ export declare function lineCovered(line: string, prefixes: readonly string[]): boolean;
7
+ /** Whether a file, by its path from the workspace folder, runs code or holds secrets: Git's own folder, `.env` files, and the project's rules. */
8
+ export declare function guardedFile(relative: string): boolean;
9
+ /** The line a call runs in the real shell: `shell exec`'s, or a binary's `<name> <args>`. */
10
+ export declare function callLine(call: RunCall, registration: string): string | undefined;
11
+ /** Whether one of the rules covers the call, which would otherwise ask (ADR 0091, 2). */
12
+ export declare function ruleCovers(rules: readonly ApprovalRule[], call: RunCall, registration: string, workspace: string): Promise<boolean>;
13
+ //# sourceMappingURL=approval-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-rules.d.ts","sourceRoot":"","sources":["../../src/turns/approval-rules.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAIpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAWhE,2FAA2F;AAC3F,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAG5D;AAID,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAI9E;AAMD,kJAAkJ;AAClJ,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIrD;AAED,6FAA6F;AAC7F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKhF;AAcD,yFAAyF;AACzF,wBAAsB,UAAU,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAIzI"}
@@ -0,0 +1,65 @@
1
+ import { realpath } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { ProblemError } from '@kvman/sdk';
4
+ import { binaryExec } from "../connectors/binary.js";
5
+ import { builtinCommands } from "../connectors/builtin-connectors.js";
6
+ import { resolveInWorkspace } from "../files/workspace-path.js";
7
+ // The person's approval rules (plan 08 §8.3, ADR 0091, 1 and 2): a line whose every part starts with an allowed
8
+ // prefix, or a file change, runs without asking. A part is covered only when it holds plain words, so no shell's
9
+ // syntax can run another command inside it; a file that runs code or holds secrets is never covered.
10
+ const separators = /&&|\|\||[;|&\r\n]/;
11
+ // Letters, digits, spaces, and the punctuation of plain arguments: no `$`, backtick, bracket, brace, `<`, `>`, or `\`.
12
+ const plainPart = /^[\p{L}\p{N} \t_.,/:=+@%~*'"-]*$/u;
13
+ const words = (text) => text.trim().replace(/\s+/g, ' ');
14
+ /** The commands of a line, or `undefined` when one of them holds more than plain words. */
15
+ export function lineParts(line) {
16
+ const parts = line.split(separators).map(words).filter((part) => part !== '');
17
+ return parts.every((part) => plainPart.test(part)) ? parts : undefined;
18
+ }
19
+ const startsWith = (part, prefix) => part === prefix || part.startsWith(`${prefix} `);
20
+ /** Whether every command of the line starts with one of the prefixes, at a word's end. */
21
+ export function lineCovered(line, prefixes) {
22
+ const parts = lineParts(line);
23
+ const allowed = prefixes.map(words);
24
+ return parts !== undefined && parts.length > 0 && parts.every((part) => allowed.some((prefix) => startsWith(part, prefix)));
25
+ }
26
+ const shellRun = builtinCommands.shell.exec.registration;
27
+ const fileChanges = new Set([builtinCommands.fs.write, builtinCommands.fs.edit, builtinCommands.fs.undo, builtinCommands.fs.assemble].map((command) => command.registration));
28
+ const projectRules = new Set(['agents.md', 'claude.md']);
29
+ /** Whether a file, by its path from the workspace folder, runs code or holds secrets: Git's own folder, `.env` files, and the project's rules. */
30
+ export function guardedFile(relative) {
31
+ const segments = relative.split(/[\\/]/).filter((segment) => segment !== '' && segment !== '.');
32
+ const name = (segments.at(-1) ?? '').toLowerCase();
33
+ return segments.some((segment) => segment.toLowerCase() === '.git') || name === '.env' || name.startsWith('.env.') || (segments.length === 1 && projectRules.has(name));
34
+ }
35
+ /** The line a call runs in the real shell: `shell exec`'s, or a binary's `<name> <args>`. */
36
+ export function callLine(call, registration) {
37
+ if (registration === shellRun)
38
+ return typeof call.payload['line'] === 'string' ? call.payload['line'] : undefined;
39
+ if (registration !== binaryExec.registration)
40
+ return undefined;
41
+ const args = call.payload['args'];
42
+ return typeof args === 'string' && args.trim() !== '' ? `${call.connector} ${args}` : call.connector;
43
+ }
44
+ // A file change a files rule covers: its real path is inside the workspace folder and isn't a guarded file.
45
+ async function fileCovered(workspace, requested) {
46
+ if (typeof requested !== 'string' || requested === '')
47
+ return false;
48
+ try {
49
+ return !guardedFile(path.relative(await realpath(workspace), await resolveInWorkspace(workspace, requested)));
50
+ }
51
+ catch (error) {
52
+ // A path outside the folder is the call's own failure to report; it is just not covered.
53
+ if (error instanceof ProblemError)
54
+ return false;
55
+ throw error;
56
+ }
57
+ }
58
+ /** Whether one of the rules covers the call, which would otherwise ask (ADR 0091, 2). */
59
+ export async function ruleCovers(rules, call, registration, workspace) {
60
+ if (fileChanges.has(registration))
61
+ return rules.some((rule) => rule.kind === 'files') && fileCovered(workspace, call.payload['path']);
62
+ const line = callLine(call, registration);
63
+ return line !== undefined && lineCovered(line, rules.flatMap((rule) => (rule.kind === 'line' ? [rule.prefix] : [])));
64
+ }
65
+ //# sourceMappingURL=approval-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-rules.js","sourceRoot":"","sources":["../../src/turns/approval-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { SessionDoc } from '../schemas/records.ts';
2
+ /** The `cacheRetention` a session's step and summary calls send, spread into `kvai.complete`'s input. */
3
+ export declare function cacheRetentionOf(session: Pick<SessionDoc, 'parentId'>): {
4
+ cacheRetention?: 'long';
5
+ };
6
+ //# sourceMappingURL=cache-retention.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-retention.d.ts","sourceRoot":"","sources":["../../src/turns/cache-retention.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAKxD,yGAAyG;AACzG,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAEnG"}
@@ -0,0 +1,7 @@
1
+ // The lead of a chat waits on the person, approvals, background runs, and helpers for longer than a provider's short
2
+ // prompt cache, so its calls ask for the long one; a helper's calls run back to back and keep the default (ADR 0087, 4).
3
+ /** The `cacheRetention` a session's step and summary calls send, spread into `kvai.complete`'s input. */
4
+ export function cacheRetentionOf(session) {
5
+ return session.parentId === null ? { cacheRetention: 'long' } : {};
6
+ }
7
+ //# sourceMappingURL=cache-retention.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-retention.js","sourceRoot":"","sources":["../../src/turns/cache-retention.ts"],"names":[],"mappings":"AAEA,qHAAqH;AACrH,yHAAyH;AAEzH,yGAAyG;AACzG,MAAM,UAAU,gBAAgB,CAAC,OAAqC;IACpE,OAAO,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACrE,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { Stored } from '@kvman/sdk';
2
+ import type { HeldResult, SessionDoc, TurnDoc } from '../schemas/records.ts';
3
+ import type { TxRecords } from '../store/collections.ts';
4
+ /** Appends a step's results as toolResult messages, in the model's call order. */
5
+ export declare function appendResults(store: TxRecords, session: Stored<SessionDoc>, turnId: string, calls: TurnDoc['calls'], results: readonly HeldResult[]): void;
6
+ //# sourceMappingURL=call-results.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-results.d.ts","sourceRoot":"","sources":["../../src/turns/call-results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAa,UAAU,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAazD,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAO1J"}
@@ -0,0 +1,21 @@
1
+ import { appendMessage } from "./history.js";
2
+ // A reply's results as stored messages (plan 08 §8.2): one toolResult message per call, in the model's call order.
3
+ // A result's details without a second copy of its output (ADR 0034, 7): the output stays only where it differs from the
4
+ // text the model gets, which is a shell line's and a binary's.
5
+ function storedDetails(held) {
6
+ const details = held.details;
7
+ if (typeof details !== 'object' || details === null || Array.isArray(details) || details['output'] !== held.text)
8
+ return details;
9
+ return Object.fromEntries(Object.entries(details).filter(([name]) => name !== 'output'));
10
+ }
11
+ /** Appends a step's results as toolResult messages, in the model's call order. */
12
+ export function appendResults(store, session, turnId, calls, results) {
13
+ for (const call of calls) {
14
+ const held = results.find((candidate) => candidate.toolCallId === call.toolCallId);
15
+ if (held === undefined)
16
+ continue;
17
+ const content = { role: 'toolResult', toolCallId: call.toolCallId, toolName: call.toolName, content: [{ type: 'text', text: held.text }], isError: held.isError, timestamp: Date.now() };
18
+ appendMessage(store, session, { kind: 'toolResult', content: held.details === null ? content : { ...content, details: storedDetails(held) }, turnId });
19
+ }
20
+ }
21
+ //# sourceMappingURL=call-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-results.js","sourceRoot":"","sources":["../../src/turns/call-results.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,mHAAmH;AAEnH,wHAAwH;AACxH,+DAA+D;AAC/D,SAAS,aAAa,CAAC,IAAgB;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC;IACjI,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC;AAC3F,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,OAA2B,EAAE,MAAc,EAAE,KAAuB,EAAE,OAA8B;IAClJ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;QACnF,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,MAAM,OAAO,GAA8B,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACpN,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACzJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Ctx } from '@kvman/sdk';
2
+ import type { Check } from '../schemas/check.ts';
3
+ import type { RunCall } from '../calls/run-tool.ts';
4
+ /** The reply's last file change that ran at once and succeeded, by its place. */
5
+ export declare function lastFileChange(calls: readonly (RunCall | undefined)[], succeeded: readonly boolean[]): number | undefined;
6
+ /** Runs the check and gives the lines the change's result ends with. */
7
+ export declare function checkLines(ctx: Ctx, sessionId: string, check: NonNullable<Check>): Promise<string>;
8
+ //# sourceMappingURL=check-after-edits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-after-edits.d.ts","sourceRoot":"","sources":["../../src/turns/check-after-edits.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAUpD,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,CAGzH;AAQD,wEAAwE;AACxE,wBAAsB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAKxG"}
@@ -0,0 +1,23 @@
1
+ import { runLine } from "../calls/line-run.js";
2
+ // The person's check after file changes (plan 08 §8.3, ADR 0094, 3): after a reply whose `fs` change ran at once and
3
+ // succeeded, `kvcoder.check`'s line runs once, without asking, and its exit code and last 4 KB end the last change's result.
4
+ const changes = new Set(['write', 'edit', 'undo', 'assemble']);
5
+ const tailBytes = 4096;
6
+ /** The reply's last file change that ran at once and succeeded, by its place. */
7
+ export function lastFileChange(calls, succeeded) {
8
+ const index = calls.findLastIndex((call, place) => call?.connector === 'fs' && changes.has(call.command) && succeeded[place] === true);
9
+ return index === -1 ? undefined : index;
10
+ }
11
+ // The end of the output, whole characters, at most 4 KB.
12
+ function tail(output) {
13
+ const bytes = Buffer.from(output.trimEnd(), 'utf8');
14
+ return bytes.length <= tailBytes ? bytes.toString('utf8') : `…${bytes.subarray(bytes.length - tailBytes).toString('utf8').replace(/^�+/, '')}`;
15
+ }
16
+ /** Runs the check and gives the lines the change's result ends with. */
17
+ export async function checkLines(ctx, sessionId, check) {
18
+ const run = await runLine(ctx, sessionId, check.line, { timeoutMs: check.timeoutMs });
19
+ const timedOut = run.timedOut ? `, timed out after ${String(Math.round(check.timeoutMs / 1000))} s` : '';
20
+ const output = tail(run.output);
21
+ return `\n\n[kvman ran the check: ${check.line}, exit code ${String(run.exitCode ?? 1)}${timedOut}]${output === '' ? '' : `\n${output}`}`;
22
+ }
23
+ //# sourceMappingURL=check-after-edits.js.map