@kvman/kvcoder 0.1.11 → 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 (235) hide show
  1. package/dist/api.d.ts +45 -0
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/calls/call-name.d.ts.map +1 -1
  4. package/dist/calls/call-name.js +10 -1
  5. package/dist/calls/call-name.js.map +1 -1
  6. package/dist/calls/run-tool.d.ts.map +1 -1
  7. package/dist/calls/run-tool.js +2 -0
  8. package/dist/calls/run-tool.js.map +1 -1
  9. package/dist/connector-call.d.ts +2 -2
  10. package/dist/connector-call.d.ts.map +1 -1
  11. package/dist/connector-call.js +5 -3
  12. package/dist/connector-call.js.map +1 -1
  13. package/dist/connectors/artifact.d.ts +1 -0
  14. package/dist/connectors/artifact.d.ts.map +1 -1
  15. package/dist/connectors/background.d.ts.map +1 -1
  16. package/dist/connectors/background.js +8 -4
  17. package/dist/connectors/background.js.map +1 -1
  18. package/dist/connectors/builtin-connectors.d.ts +38 -0
  19. package/dist/connectors/builtin-connectors.d.ts.map +1 -1
  20. package/dist/connectors/builtin-connectors.js +4 -1
  21. package/dist/connectors/builtin-connectors.js.map +1 -1
  22. package/dist/connectors/delegate.d.ts.map +1 -1
  23. package/dist/connectors/delegate.js +3 -0
  24. package/dist/connectors/delegate.js.map +1 -1
  25. package/dist/connectors/execution-map.d.ts +1 -1
  26. package/dist/connectors/execution-map.d.ts.map +1 -1
  27. package/dist/connectors/execution-map.js +1 -1
  28. package/dist/connectors/execution-map.js.map +1 -1
  29. package/dist/connectors/fs.d.ts +29 -1
  30. package/dist/connectors/fs.d.ts.map +1 -1
  31. package/dist/connectors/fs.js +46 -9
  32. package/dist/connectors/fs.js.map +1 -1
  33. package/dist/connectors/payload-fields.d.ts +3 -0
  34. package/dist/connectors/payload-fields.d.ts.map +1 -1
  35. package/dist/connectors/payload-fields.js +8 -2
  36. package/dist/connectors/payload-fields.js.map +1 -1
  37. package/dist/connectors/web.d.ts +16 -0
  38. package/dist/connectors/web.d.ts.map +1 -0
  39. package/dist/connectors/web.js +22 -0
  40. package/dist/connectors/web.js.map +1 -0
  41. package/dist/delegate/permission.d.ts +6 -0
  42. package/dist/delegate/permission.d.ts.map +1 -1
  43. package/dist/files/change-diff.d.ts +17 -0
  44. package/dist/files/change-diff.d.ts.map +1 -0
  45. package/dist/files/change-diff.js +59 -0
  46. package/dist/files/change-diff.js.map +1 -0
  47. package/dist/files/edit-places.d.ts +11 -0
  48. package/dist/files/edit-places.d.ts.map +1 -0
  49. package/dist/files/edit-places.js +105 -0
  50. package/dist/files/edit-places.js.map +1 -0
  51. package/dist/files/edit-text.d.ts +1 -0
  52. package/dist/files/edit-text.d.ts.map +1 -1
  53. package/dist/files/edit-text.js +22 -10
  54. package/dist/files/edit-text.js.map +1 -1
  55. package/dist/files/file-change.d.ts.map +1 -1
  56. package/dist/files/file-change.js +12 -0
  57. package/dist/files/file-change.js.map +1 -1
  58. package/dist/files/find-paths.d.ts +9 -0
  59. package/dist/files/find-paths.d.ts.map +1 -0
  60. package/dist/files/find-paths.js +38 -0
  61. package/dist/files/find-paths.js.map +1 -0
  62. package/dist/files/read-file.d.ts +3 -1
  63. package/dist/files/read-file.d.ts.map +1 -1
  64. package/dist/files/read-file.js +7 -6
  65. package/dist/files/read-file.js.map +1 -1
  66. package/dist/files/read-files.d.ts +11 -0
  67. package/dist/files/read-files.d.ts.map +1 -0
  68. package/dist/files/read-files.js +35 -0
  69. package/dist/files/read-files.js.map +1 -0
  70. package/dist/files/read-text.d.ts +63 -0
  71. package/dist/files/read-text.d.ts.map +1 -0
  72. package/dist/files/read-text.js +67 -0
  73. package/dist/files/read-text.js.map +1 -0
  74. package/dist/files/register-changes.d.ts +3 -0
  75. package/dist/files/register-changes.d.ts.map +1 -0
  76. package/dist/files/register-changes.js +78 -0
  77. package/dist/files/register-changes.js.map +1 -0
  78. package/dist/files/search-text.d.ts +10 -1
  79. package/dist/files/search-text.d.ts.map +1 -1
  80. package/dist/files/search-text.js +32 -57
  81. package/dist/files/search-text.js.map +1 -1
  82. package/dist/files/workspace-files.d.ts +5 -0
  83. package/dist/files/workspace-files.d.ts.map +1 -0
  84. package/dist/files/workspace-files.js +66 -0
  85. package/dist/files/workspace-files.js.map +1 -0
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +4 -0
  88. package/dist/index.js.map +1 -1
  89. package/dist/prompt/build-prompt.d.ts +4 -0
  90. package/dist/prompt/build-prompt.d.ts.map +1 -1
  91. package/dist/prompt/build-prompt.js +6 -2
  92. package/dist/prompt/build-prompt.js.map +1 -1
  93. package/dist/prompt/person-preferences.d.ts +5 -0
  94. package/dist/prompt/person-preferences.d.ts.map +1 -0
  95. package/dist/prompt/person-preferences.js +14 -0
  96. package/dist/prompt/person-preferences.js.map +1 -0
  97. package/dist/prompt/session-grants.d.ts +4 -0
  98. package/dist/prompt/session-grants.d.ts.map +1 -1
  99. package/dist/prompt/session-grants.js +3 -2
  100. package/dist/prompt/session-grants.js.map +1 -1
  101. package/dist/prompt/session-prompt.d.ts.map +1 -1
  102. package/dist/prompt/session-prompt.js +15 -6
  103. package/dist/prompt/session-prompt.js.map +1 -1
  104. package/dist/prompt/working-method.d.ts +2 -2
  105. package/dist/prompt/working-method.d.ts.map +1 -1
  106. package/dist/prompt/working-method.js +49 -43
  107. package/dist/prompt/working-method.js.map +1 -1
  108. package/dist/register-settings.d.ts +23 -0
  109. package/dist/register-settings.d.ts.map +1 -1
  110. package/dist/register-settings.js +13 -0
  111. package/dist/register-settings.js.map +1 -1
  112. package/dist/schemas/approval-rule.d.ts +9 -0
  113. package/dist/schemas/approval-rule.d.ts.map +1 -0
  114. package/dist/schemas/approval-rule.js +7 -0
  115. package/dist/schemas/approval-rule.js.map +1 -0
  116. package/dist/schemas/check.d.ts +7 -0
  117. package/dist/schemas/check.d.ts.map +1 -0
  118. package/dist/schemas/check.js +9 -0
  119. package/dist/schemas/check.js.map +1 -0
  120. package/dist/schemas/records.d.ts +10 -0
  121. package/dist/schemas/records.d.ts.map +1 -1
  122. package/dist/schemas/records.js +8 -0
  123. package/dist/schemas/records.js.map +1 -1
  124. package/dist/sessions/new-session.d.ts.map +1 -1
  125. package/dist/sessions/new-session.js +4 -1
  126. package/dist/sessions/new-session.js.map +1 -1
  127. package/dist/sessions/register-fork-export.d.ts.map +1 -1
  128. package/dist/sessions/register-fork-export.js +3 -2
  129. package/dist/sessions/register-fork-export.js.map +1 -1
  130. package/dist/sessions/register-sessions.d.ts.map +1 -1
  131. package/dist/sessions/register-sessions.js +17 -9
  132. package/dist/sessions/register-sessions.js.map +1 -1
  133. package/dist/sessions/session-view.d.ts +8 -1
  134. package/dist/sessions/session-view.d.ts.map +1 -1
  135. package/dist/sessions/session-view.js +6 -1
  136. package/dist/sessions/session-view.js.map +1 -1
  137. package/dist/sessions/waiting-on.d.ts +7 -0
  138. package/dist/sessions/waiting-on.d.ts.map +1 -0
  139. package/dist/sessions/waiting-on.js +20 -0
  140. package/dist/sessions/waiting-on.js.map +1 -0
  141. package/dist/store/collections.d.ts +18 -0
  142. package/dist/store/collections.d.ts.map +1 -1
  143. package/dist/store/collections.js +3 -1
  144. package/dist/store/collections.js.map +1 -1
  145. package/dist/turns/answer-extras.d.ts +21 -0
  146. package/dist/turns/answer-extras.d.ts.map +1 -0
  147. package/dist/turns/answer-extras.js +43 -0
  148. package/dist/turns/answer-extras.js.map +1 -0
  149. package/dist/turns/answer-fingerprint.d.ts +6 -2
  150. package/dist/turns/answer-fingerprint.d.ts.map +1 -1
  151. package/dist/turns/answer-fingerprint.js +9 -3
  152. package/dist/turns/answer-fingerprint.js.map +1 -1
  153. package/dist/turns/apply-answer.d.ts +2 -1
  154. package/dist/turns/apply-answer.d.ts.map +1 -1
  155. package/dist/turns/apply-answer.js +10 -4
  156. package/dist/turns/apply-answer.js.map +1 -1
  157. package/dist/turns/approval-rules.d.ts +13 -0
  158. package/dist/turns/approval-rules.d.ts.map +1 -0
  159. package/dist/turns/approval-rules.js +65 -0
  160. package/dist/turns/approval-rules.js.map +1 -0
  161. package/dist/turns/check-after-edits.d.ts +8 -0
  162. package/dist/turns/check-after-edits.d.ts.map +1 -0
  163. package/dist/turns/check-after-edits.js +23 -0
  164. package/dist/turns/check-after-edits.js.map +1 -0
  165. package/dist/turns/clear-results.d.ts +15 -0
  166. package/dist/turns/clear-results.d.ts.map +1 -0
  167. package/dist/turns/clear-results.js +58 -0
  168. package/dist/turns/clear-results.js.map +1 -0
  169. package/dist/turns/cleared-results.d.ts +17 -0
  170. package/dist/turns/cleared-results.d.ts.map +1 -0
  171. package/dist/turns/cleared-results.js +46 -0
  172. package/dist/turns/cleared-results.js.map +1 -0
  173. package/dist/turns/compaction.js +6 -6
  174. package/dist/turns/compaction.js.map +1 -1
  175. package/dist/turns/file-results.d.ts +15 -0
  176. package/dist/turns/file-results.d.ts.map +1 -0
  177. package/dist/turns/file-results.js +39 -0
  178. package/dist/turns/file-results.js.map +1 -0
  179. package/dist/turns/lost-reply.js +2 -2
  180. package/dist/turns/lost-reply.js.map +1 -1
  181. package/dist/turns/model-context.d.ts +2 -0
  182. package/dist/turns/model-context.d.ts.map +1 -1
  183. package/dist/turns/model-context.js +28 -5
  184. package/dist/turns/model-context.js.map +1 -1
  185. package/dist/turns/read-again.d.ts +11 -5
  186. package/dist/turns/read-again.d.ts.map +1 -1
  187. package/dist/turns/read-again.js +39 -10
  188. package/dist/turns/read-again.js.map +1 -1
  189. package/dist/turns/register-turns.d.ts.map +1 -1
  190. package/dist/turns/register-turns.js +12 -4
  191. package/dist/turns/register-turns.js.map +1 -1
  192. package/dist/turns/run-calls.d.ts +4 -0
  193. package/dist/turns/run-calls.d.ts.map +1 -1
  194. package/dist/turns/run-calls.js +35 -5
  195. package/dist/turns/run-calls.js.map +1 -1
  196. package/dist/turns/run-command.d.ts.map +1 -1
  197. package/dist/turns/run-command.js +4 -4
  198. package/dist/turns/run-command.js.map +1 -1
  199. package/dist/turns/step.d.ts.map +1 -1
  200. package/dist/turns/step.js +43 -8
  201. package/dist/turns/step.js.map +1 -1
  202. package/dist/ui/register-ui.js +2 -2
  203. package/dist/ui/register-ui.js.map +1 -1
  204. package/dist/web/components/approval.css +1 -1
  205. package/dist/web/components/approval.js +122 -89
  206. package/dist/web/components/call.css +1 -1
  207. package/dist/web/components/call.js +400 -302
  208. package/dist/web/components/connectors.css +1 -1
  209. package/dist/web/components/connectors.js +440 -427
  210. package/dist/web/components/conversation.css +1 -1
  211. package/dist/web/components/conversation.js +2509 -1500
  212. package/dist/web/components/mcp-sign-in.css +1 -1
  213. package/dist/web/components/model.css +1 -1
  214. package/dist/web/components/model.js +138 -126
  215. package/dist/web/components/preferences.css +2 -0
  216. package/dist/web/components/preferences.js +151 -0
  217. package/dist/web/components/question.css +1 -1
  218. package/dist/web/components/sessions.css +1 -1
  219. package/dist/web/components/sessions.js +44 -21
  220. package/dist/web-fetch/fetch-page.d.ts +28 -0
  221. package/dist/web-fetch/fetch-page.d.ts.map +1 -0
  222. package/dist/web-fetch/fetch-page.js +108 -0
  223. package/dist/web-fetch/fetch-page.js.map +1 -0
  224. package/dist/web-fetch/private-address.d.ts +3 -0
  225. package/dist/web-fetch/private-address.d.ts.map +1 -0
  226. package/dist/web-fetch/private-address.js +69 -0
  227. package/dist/web-fetch/private-address.js.map +1 -0
  228. package/dist/web-fetch/web-hosts.d.ts +7 -0
  229. package/dist/web-fetch/web-hosts.d.ts.map +1 -0
  230. package/dist/web-fetch/web-hosts.js +19 -0
  231. package/dist/web-fetch/web-hosts.js.map +1 -0
  232. package/docs/connectors.md +2 -2
  233. package/locales/ar.json +66 -1
  234. package/locales/en.json +66 -1
  235. package/package.json +17 -3
@@ -14,6 +14,9 @@ export declare function records(store: Store): {
14
14
  } | null;
15
15
  model: string | null;
16
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;
@@ -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;
@@ -374,6 +383,9 @@ export declare function txRecords(tx: Transaction): {
374
383
  } | null;
375
384
  model: string | null;
376
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;
@@ -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;
@@ -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":"AACA,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACpU,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAErI,oHAAoH;AACpH,kHAAkH;AAClH,2DAA2D;AAE3D,yDAAyD;AACzD,MAAM,UAAU,OAAO,CAAC,KAAY;IAClC,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC;QACxD,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,mBAAmB,CAAC;QAClE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC;QACxD,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE,eAAe,CAAC;QACnD,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC;QAC/C,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,iBAAiB,CAAC;QAC3D,cAAc,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;QAC3E,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,CAAC;QACrE,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,iBAAiB,CAAC;QAC5D,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,cAAc,EAAE,mBAAmB,CAAC;QAClE,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,iBAAiB,CAAC;QAC5D,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,WAAW,EAAE,iBAAiB,CAAC;QAC3D,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;QAC5C,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,YAAY,EAAE,mBAAmB,CAAC;QAC/D,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;QAC5C,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC;QACxD,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC;QACrE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,gBAAgB,CAAC;QACjE,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,kBAAkB,CAAC;QACrE,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,cAAc,CAAC;QACxE,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC;QAC/D,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,mBAAmB,CAAC;QACzE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,eAAe,CAAC;KAClE,CAAC;AACJ,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,SAAS,CAAC,EAAe;IACvC,OAAO;QACL,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC;QACrD,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,mBAAmB,CAAC;QAC/D,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC;QACrD,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,eAAe,CAAC;QAChD,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC;QAC5C,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,iBAAiB,CAAC;QACxD,cAAc,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;QACxE,YAAY,EAAE,EAAE,CAAC,UAAU,CAAC,eAAe,EAAE,oBAAoB,CAAC;QAClE,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,iBAAiB,CAAC;QACzD,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,cAAc,EAAE,mBAAmB,CAAC;QAC/D,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,iBAAiB,CAAC;QACzD,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,WAAW,EAAE,iBAAiB,CAAC;QACxD,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;QACzC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,mBAAmB,CAAC;QAC5D,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC;QACzC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC;QACrD,cAAc,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC;QAClE,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE,gBAAgB,CAAC;QAC9D,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,EAAE,kBAAkB,CAAC;QAClE,aAAa,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,gBAAgB,EAAE,cAAc,CAAC;QACrE,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,gBAAgB,CAAC;QAC5D,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,mBAAmB,CAAC;QACtE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,cAAc,EAAE,eAAe,CAAC;KAC/D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/store/collections.ts"],"names":[],"mappings":"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"}
@@ -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,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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-after-edits.js","sourceRoot":"","sources":["../../src/turns/check-after-edits.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,qHAAqH;AACrH,6HAA6H;AAG7H,MAAM,OAAO,GAAwB,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;AACpF,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAAC,KAAuC,EAAE,SAA6B;IACnG,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;IACvI,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;AAC1C,CAAC;AAED,yDAAyD;AACzD,SAAS,IAAI,CAAC,MAAc;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO,KAAK,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC;AACjJ,CAAC;AAED,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAQ,EAAE,SAAiB,EAAE,KAAyB;IACrF,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,qBAAqB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzG,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,OAAO,6BAA6B,KAAK,CAAC,IAAI,eAAe,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,QAAQ,IAAI,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,EAAE,CAAC;AAC5I,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { Ctx, Stored } from '@kvman/sdk';
2
+ import type { SessionDoc } from '../schemas/records.ts';
3
+ import { type Measured } from './compaction.ts';
4
+ import { type History } from './model-context.ts';
5
+ import type { StepLease } from './step-claim.ts';
6
+ /** The newest result that may be cleared, and how many tokens the results not yet cleared up to it hold. */
7
+ export declare function clearable(history: History): {
8
+ seq: number;
9
+ tokens: number;
10
+ } | undefined;
11
+ /** Clears old results when one of the two moments has come; says whether it did. */
12
+ export declare function clearOldResults(ctx: Ctx, session: Stored<SessionDoc>, lease: StepLease, firstStep: boolean, measured: Measured & {
13
+ prompt: string;
14
+ }): Promise<boolean>;
15
+ //# sourceMappingURL=clear-results.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear-results.d.ts","sourceRoot":"","sources":["../../src/turns/clear-results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAe,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAWjD,4GAA4G;AAC5G,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAcvF;AAQD,oFAAoF;AACpF,wBAAsB,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB5K"}
@@ -0,0 +1,58 @@
1
+ import { txRecords } from "../store/collections.js";
2
+ import { isCleared } from "./cleared-results.js";
3
+ import { promptTokens } from "./compaction.js";
4
+ import { modelInfo } from "./model-info.js";
5
+ import { sentHistory } from "./model-context.js";
6
+ import { sentCharacters } from "./sent-size.js";
7
+ import { liveStep } from "./step-intents.js";
8
+ // When old tool results are cleared (plan 08 §8.1, ADR 0094, 1): at the start of a step, over the results older than
9
+ // the newest 40,000 tokens of results; at a turn's first step after an hour without a model call, when the provider's
10
+ // cache has expired anyway, or at any step when there is much to clear and the prompt is half full.
11
+ const keptTokens = 40_000;
12
+ const worthTokens = 20_000;
13
+ const cacheExpiredMs = 60 * 60 * 1000;
14
+ /** The newest result that may be cleared, and how many tokens the results not yet cleared up to it hold. */
15
+ export function clearable(history) {
16
+ let kept = 0;
17
+ let found;
18
+ for (const message of [...history.messages].reverse()) {
19
+ if (message.kind !== 'toolResult')
20
+ continue;
21
+ const tokens = sentCharacters(message) / 4;
22
+ if (kept < keptTokens) {
23
+ kept += tokens;
24
+ continue;
25
+ }
26
+ if (isCleared(message, history.cleared))
27
+ break;
28
+ found = { seq: found?.seq ?? message.seq, tokens: (found?.tokens ?? 0) + tokens };
29
+ }
30
+ return found;
31
+ }
32
+ // The time of the chat's newest model call, from the replies it sends.
33
+ const lastCallAt = (history) => {
34
+ const reply = history.messages.findLast((message) => message.kind === 'assistant');
35
+ return reply === undefined ? undefined : Date.parse(reply.createdAt);
36
+ };
37
+ /** Clears old results when one of the two moments has come; says whether it did. */
38
+ export async function clearOldResults(ctx, session, lease, firstStep, measured) {
39
+ const history = await sentHistory(ctx, session.id, session.nextSeq);
40
+ const candidate = clearable(history);
41
+ if (candidate === undefined)
42
+ return false;
43
+ const last = lastCallAt(history);
44
+ const expired = firstStep && last !== undefined && Date.now() - last > cacheExpiredMs;
45
+ const window = (await modelInfo(ctx, session.model))?.contextWindow;
46
+ const full = candidate.tokens > worthTokens && window !== undefined && promptTokens(measured.prompt, history, measured).tokens > window / 2;
47
+ if (!expired && !full)
48
+ return false;
49
+ return ctx.store.transaction((tx) => {
50
+ ctx.job.signal.throwIfAborted();
51
+ const store = txRecords(tx);
52
+ if (liveStep(store, lease, lease.jobId) === undefined)
53
+ return false;
54
+ store.sessions.update(session.id, { clearedThroughSeq: candidate.seq });
55
+ return true;
56
+ });
57
+ }
58
+ //# sourceMappingURL=clear-results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clear-results.js","sourceRoot":"","sources":["../../src/turns/clear-results.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Json, Stored } from '@kvman/sdk';
2
+ import type { MessageDoc } from '../schemas/records.ts';
3
+ /** Whether the model is sent this message as a cleared result. */
4
+ export declare const isCleared: (message: Pick<MessageDoc, "kind" | "seq">, clearedThrough: number) => boolean;
5
+ /** What a cleared result reads. */
6
+ export declare const clearedText: (call: string) => string;
7
+ /** Each call of the messages, by its id, named as `background` names a call. */
8
+ export declare function callNames(messages: readonly Stored<MessageDoc>[]): Map<string, string>;
9
+ /** The ids of the calls whose results are sent cleared. */
10
+ export declare function clearedCalls(messages: readonly Stored<MessageDoc>[], clearedThrough: number): Set<string>;
11
+ /** The longest text a cleared call keeps (ADR 0097, 4). */
12
+ export declare const keptCharacters = 500;
13
+ /** A cleared call's payload: every string longer than 500 characters replaced by a line that says how long it was. */
14
+ export declare function clearedPayload(value: Json): Json;
15
+ /** The characters a message is sent as, a cleared result counting its line. */
16
+ export declare const sentSize: (message: Stored<MessageDoc>, clearedThrough: number) => number;
17
+ //# sourceMappingURL=cleared-results.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleared-results.d.ts","sourceRoot":"","sources":["../../src/turns/cleared-results.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAOxD,kEAAkE;AAClE,eAAO,MAAM,SAAS,GAAI,SAAS,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC,EAAE,gBAAgB,MAAM,KAAG,OAAyE,CAAC;AAExK,mCAAmC;AACnC,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,MAAkF,CAAC;AAI9H,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,SAAS,MAAM,CAAC,UAAU,CAAC,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAatF;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,SAAS,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAEzG;AAED,2DAA2D;AAC3D,eAAO,MAAM,cAAc,MAAM,CAAC;AAElC,sHAAsH;AACtH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAKhD;AAED,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,GAAI,SAAS,MAAM,CAAC,UAAU,CAAC,EAAE,gBAAgB,MAAM,KAAG,MAAsG,CAAC"}