@kvman/kvcoder 0.1.6 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/dist/api.d.ts +49 -3
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/calls/run-shell.d.ts.map +1 -1
  4. package/dist/calls/run-shell.js +39 -9
  5. package/dist/calls/run-shell.js.map +1 -1
  6. package/dist/connector-call.d.ts +1 -1
  7. package/dist/connector-call.d.ts.map +1 -1
  8. package/dist/connector-call.js +4 -2
  9. package/dist/connector-call.js.map +1 -1
  10. package/dist/connectors/artifact.d.ts +1 -1
  11. package/dist/connectors/artifact.d.ts.map +1 -1
  12. package/dist/connectors/artifact.js +4 -4
  13. package/dist/connectors/artifact.js.map +1 -1
  14. package/dist/connectors/ask.d.ts +24 -0
  15. package/dist/connectors/ask.d.ts.map +1 -1
  16. package/dist/connectors/ask.js +20 -11
  17. package/dist/connectors/ask.js.map +1 -1
  18. package/dist/connectors/background.d.ts +14 -1
  19. package/dist/connectors/background.d.ts.map +1 -1
  20. package/dist/connectors/background.js +53 -23
  21. package/dist/connectors/background.js.map +1 -1
  22. package/dist/connectors/builtin-connectors.d.ts +110 -0
  23. package/dist/connectors/builtin-connectors.d.ts.map +1 -1
  24. package/dist/connectors/builtin-connectors.js +4 -1
  25. package/dist/connectors/builtin-connectors.js.map +1 -1
  26. package/dist/connectors/delegate.d.ts +3 -2
  27. package/dist/connectors/delegate.d.ts.map +1 -1
  28. package/dist/connectors/delegate.js +27 -9
  29. package/dist/connectors/delegate.js.map +1 -1
  30. package/dist/connectors/execution-map.d.ts +62 -0
  31. package/dist/connectors/execution-map.d.ts.map +1 -0
  32. package/dist/connectors/execution-map.js +142 -0
  33. package/dist/connectors/execution-map.js.map +1 -0
  34. package/dist/connectors/fs.d.ts +32 -1
  35. package/dist/connectors/fs.d.ts.map +1 -1
  36. package/dist/connectors/fs.js +76 -45
  37. package/dist/connectors/fs.js.map +1 -1
  38. package/dist/connectors/mcp.d.ts +18 -1
  39. package/dist/connectors/mcp.d.ts.map +1 -1
  40. package/dist/connectors/mcp.js +54 -6
  41. package/dist/connectors/mcp.js.map +1 -1
  42. package/dist/connectors/payload-fields.d.ts.map +1 -1
  43. package/dist/connectors/payload-fields.js +1 -1
  44. package/dist/connectors/payload-fields.js.map +1 -1
  45. package/dist/delegate/approved-run.d.ts +4 -6
  46. package/dist/delegate/approved-run.d.ts.map +1 -1
  47. package/dist/delegate/approved-run.js +74 -34
  48. package/dist/delegate/approved-run.js.map +1 -1
  49. package/dist/delegate/git-staging.d.ts +12 -0
  50. package/dist/delegate/git-staging.d.ts.map +1 -0
  51. package/dist/delegate/git-staging.js +54 -0
  52. package/dist/delegate/git-staging.js.map +1 -0
  53. package/dist/delegate/permission.d.ts +240 -0
  54. package/dist/delegate/permission.d.ts.map +1 -0
  55. package/dist/delegate/permission.js +78 -0
  56. package/dist/delegate/permission.js.map +1 -0
  57. package/dist/delegate/program-permission.d.ts +27 -0
  58. package/dist/delegate/program-permission.d.ts.map +1 -0
  59. package/dist/delegate/program-permission.js +53 -0
  60. package/dist/delegate/program-permission.js.map +1 -0
  61. package/dist/delegate/register-worker-run.d.ts.map +1 -1
  62. package/dist/delegate/register-worker-run.js +27 -11
  63. package/dist/delegate/register-worker-run.js.map +1 -1
  64. package/dist/delegate/run-program.d.ts.map +1 -1
  65. package/dist/delegate/run-program.js +29 -8
  66. package/dist/delegate/run-program.js.map +1 -1
  67. package/dist/delegate/runs.d.ts +14 -4
  68. package/dist/delegate/runs.d.ts.map +1 -1
  69. package/dist/delegate/runs.js +49 -19
  70. package/dist/delegate/runs.js.map +1 -1
  71. package/dist/delegate/staging-guard.d.ts +9 -0
  72. package/dist/delegate/staging-guard.d.ts.map +1 -0
  73. package/dist/delegate/staging-guard.js +55 -0
  74. package/dist/delegate/staging-guard.js.map +1 -0
  75. package/dist/delegate/start-background.d.ts +7 -0
  76. package/dist/delegate/start-background.d.ts.map +1 -0
  77. package/dist/delegate/start-background.js +32 -0
  78. package/dist/delegate/start-background.js.map +1 -0
  79. package/dist/delegate/start-pending.d.ts +5 -0
  80. package/dist/delegate/start-pending.d.ts.map +1 -0
  81. package/dist/delegate/start-pending.js +42 -0
  82. package/dist/delegate/start-pending.js.map +1 -0
  83. package/dist/delegate/workers.d.ts +5 -2
  84. package/dist/delegate/workers.d.ts.map +1 -1
  85. package/dist/delegate/workers.js +44 -8
  86. package/dist/delegate/workers.js.map +1 -1
  87. package/dist/files/file-change.d.ts +28 -0
  88. package/dist/files/file-change.d.ts.map +1 -0
  89. package/dist/files/file-change.js +125 -0
  90. package/dist/files/file-change.js.map +1 -0
  91. package/dist/files/file-parts.d.ts +18 -0
  92. package/dist/files/file-parts.d.ts.map +1 -0
  93. package/dist/files/file-parts.js +40 -0
  94. package/dist/files/file-parts.js.map +1 -0
  95. package/dist/files/read-file.d.ts +9 -1
  96. package/dist/files/read-file.d.ts.map +1 -1
  97. package/dist/files/read-file.js +35 -13
  98. package/dist/files/read-file.js.map +1 -1
  99. package/dist/files/search-text.d.ts +12 -2
  100. package/dist/files/search-text.d.ts.map +1 -1
  101. package/dist/files/search-text.js +87 -23
  102. package/dist/files/search-text.js.map +1 -1
  103. package/dist/index.d.ts.map +1 -1
  104. package/dist/index.js +4 -0
  105. package/dist/index.js.map +1 -1
  106. package/dist/jobs/job-rows.d.ts +11 -2
  107. package/dist/jobs/job-rows.d.ts.map +1 -1
  108. package/dist/jobs/job-rows.js +24 -13
  109. package/dist/jobs/job-rows.js.map +1 -1
  110. package/dist/jobs/process-handlers.d.ts.map +1 -1
  111. package/dist/jobs/process-handlers.js +12 -1
  112. package/dist/jobs/process-handlers.js.map +1 -1
  113. package/dist/jobs/process-report.d.ts.map +1 -1
  114. package/dist/jobs/process-report.js +2 -1
  115. package/dist/jobs/process-report.js.map +1 -1
  116. package/dist/jobs/process-run.d.ts.map +1 -1
  117. package/dist/jobs/process-run.js +2 -1
  118. package/dist/jobs/process-run.js.map +1 -1
  119. package/dist/jobs/register-jobs.d.ts.map +1 -1
  120. package/dist/jobs/register-jobs.js +1 -0
  121. package/dist/jobs/register-jobs.js.map +1 -1
  122. package/dist/maps/map-reminder.d.ts +7 -0
  123. package/dist/maps/map-reminder.d.ts.map +1 -0
  124. package/dist/maps/map-reminder.js +24 -0
  125. package/dist/maps/map-reminder.js.map +1 -0
  126. package/dist/maps/map-rules.d.ts +36 -0
  127. package/dist/maps/map-rules.d.ts.map +1 -0
  128. package/dist/maps/map-rules.js +86 -0
  129. package/dist/maps/map-rules.js.map +1 -0
  130. package/dist/maps/map-schema.d.ts +55 -0
  131. package/dist/maps/map-schema.d.ts.map +1 -0
  132. package/dist/maps/map-schema.js +27 -0
  133. package/dist/maps/map-schema.js.map +1 -0
  134. package/dist/maps/register-maps.d.ts +3 -0
  135. package/dist/maps/register-maps.d.ts.map +1 -0
  136. package/dist/maps/register-maps.js +21 -0
  137. package/dist/maps/register-maps.js.map +1 -0
  138. package/dist/mcp/connect.d.ts +2 -0
  139. package/dist/mcp/connect.d.ts.map +1 -1
  140. package/dist/mcp/connect.js +16 -4
  141. package/dist/mcp/connect.js.map +1 -1
  142. package/dist/mcp/oauth-provider.d.ts +8 -5
  143. package/dist/mcp/oauth-provider.d.ts.map +1 -1
  144. package/dist/mcp/oauth-provider.js +31 -22
  145. package/dist/mcp/oauth-provider.js.map +1 -1
  146. package/dist/mcp/secrets.d.ts +2 -0
  147. package/dist/mcp/secrets.d.ts.map +1 -1
  148. package/dist/mcp/secrets.js +6 -0
  149. package/dist/mcp/secrets.js.map +1 -1
  150. package/dist/mcp/sign-in.d.ts.map +1 -1
  151. package/dist/mcp/sign-in.js +12 -4
  152. package/dist/mcp/sign-in.js.map +1 -1
  153. package/dist/messages/receive-message.d.ts +2 -1
  154. package/dist/messages/receive-message.d.ts.map +1 -1
  155. package/dist/messages/receive-message.js +34 -9
  156. package/dist/messages/receive-message.js.map +1 -1
  157. package/dist/messages/register-messages.d.ts.map +1 -1
  158. package/dist/messages/register-messages.js +13 -8
  159. package/dist/messages/register-messages.js.map +1 -1
  160. package/dist/messages/send-receipt.d.ts +10 -0
  161. package/dist/messages/send-receipt.d.ts.map +1 -0
  162. package/dist/messages/send-receipt.js +14 -0
  163. package/dist/messages/send-receipt.js.map +1 -0
  164. package/dist/prompt/build-prompt.d.ts +1 -0
  165. package/dist/prompt/build-prompt.d.ts.map +1 -1
  166. package/dist/prompt/build-prompt.js +5 -1
  167. package/dist/prompt/build-prompt.js.map +1 -1
  168. package/dist/prompt/project-rules.d.ts +6 -0
  169. package/dist/prompt/project-rules.d.ts.map +1 -0
  170. package/dist/prompt/project-rules.js +37 -0
  171. package/dist/prompt/project-rules.js.map +1 -0
  172. package/dist/prompt/session-grants.d.ts +209 -0
  173. package/dist/prompt/session-grants.d.ts.map +1 -0
  174. package/dist/prompt/session-grants.js +50 -0
  175. package/dist/prompt/session-grants.js.map +1 -0
  176. package/dist/prompt/session-prompt.d.ts +3 -2
  177. package/dist/prompt/session-prompt.d.ts.map +1 -1
  178. package/dist/prompt/session-prompt.js +24 -40
  179. package/dist/prompt/session-prompt.js.map +1 -1
  180. package/dist/prompt/working-method.d.ts.map +1 -1
  181. package/dist/prompt/working-method.js +22 -16
  182. package/dist/prompt/working-method.js.map +1 -1
  183. package/dist/register-settings.d.ts +3 -1
  184. package/dist/register-settings.d.ts.map +1 -1
  185. package/dist/register-settings.js +5 -4
  186. package/dist/register-settings.js.map +1 -1
  187. package/dist/registry/register-connectors.d.ts +9 -0
  188. package/dist/registry/register-connectors.d.ts.map +1 -1
  189. package/dist/registry/register-connectors.js +20 -12
  190. package/dist/registry/register-connectors.js.map +1 -1
  191. package/dist/result-text.d.ts +4 -0
  192. package/dist/result-text.d.ts.map +1 -1
  193. package/dist/result-text.js +9 -0
  194. package/dist/result-text.js.map +1 -1
  195. package/dist/schemas/records.d.ts +142 -0
  196. package/dist/schemas/records.d.ts.map +1 -1
  197. package/dist/schemas/records.js +60 -2
  198. package/dist/schemas/records.js.map +1 -1
  199. package/dist/sessions/execution-root.d.ts +8 -0
  200. package/dist/sessions/execution-root.d.ts.map +1 -0
  201. package/dist/sessions/execution-root.js +25 -0
  202. package/dist/sessions/execution-root.js.map +1 -0
  203. package/dist/sessions/new-session.d.ts +5 -1
  204. package/dist/sessions/new-session.d.ts.map +1 -1
  205. package/dist/sessions/new-session.js +17 -4
  206. package/dist/sessions/new-session.js.map +1 -1
  207. package/dist/sessions/register-context.d.ts.map +1 -1
  208. package/dist/sessions/register-context.js +6 -5
  209. package/dist/sessions/register-context.js.map +1 -1
  210. package/dist/sessions/register-fork-export.d.ts.map +1 -1
  211. package/dist/sessions/register-fork-export.js +5 -3
  212. package/dist/sessions/register-fork-export.js.map +1 -1
  213. package/dist/sessions/register-lifecycle.d.ts.map +1 -1
  214. package/dist/sessions/register-lifecycle.js +14 -5
  215. package/dist/sessions/register-lifecycle.js.map +1 -1
  216. package/dist/sessions/register-sessions.d.ts.map +1 -1
  217. package/dist/sessions/register-sessions.js +0 -2
  218. package/dist/sessions/register-sessions.js.map +1 -1
  219. package/dist/sessions/session-view.d.ts +23 -0
  220. package/dist/sessions/session-view.d.ts.map +1 -1
  221. package/dist/sessions/session-view.js +4 -1
  222. package/dist/sessions/session-view.js.map +1 -1
  223. package/dist/store/all-docs.d.ts +4 -0
  224. package/dist/store/all-docs.d.ts.map +1 -0
  225. package/dist/store/all-docs.js +14 -0
  226. package/dist/store/all-docs.js.map +1 -0
  227. package/dist/store/collections.d.ts +230 -0
  228. package/dist/store/collections.d.ts.map +1 -1
  229. package/dist/store/collections.js +16 -1
  230. package/dist/store/collections.js.map +1 -1
  231. package/dist/turns/answer-fingerprint.d.ts +4 -0
  232. package/dist/turns/answer-fingerprint.d.ts.map +1 -0
  233. package/dist/turns/answer-fingerprint.js +18 -0
  234. package/dist/turns/answer-fingerprint.js.map +1 -0
  235. package/dist/turns/apply-answer.d.ts +19 -0
  236. package/dist/turns/apply-answer.d.ts.map +1 -0
  237. package/dist/turns/apply-answer.js +47 -0
  238. package/dist/turns/apply-answer.js.map +1 -0
  239. package/dist/turns/background.d.ts +3 -0
  240. package/dist/turns/background.d.ts.map +1 -1
  241. package/dist/turns/background.js +13 -12
  242. package/dist/turns/background.js.map +1 -1
  243. package/dist/turns/call-permission.d.ts +22 -0
  244. package/dist/turns/call-permission.d.ts.map +1 -0
  245. package/dist/turns/call-permission.js +49 -0
  246. package/dist/turns/call-permission.js.map +1 -0
  247. package/dist/turns/cancel-step-job.d.ts +14 -0
  248. package/dist/turns/cancel-step-job.d.ts.map +1 -0
  249. package/dist/turns/cancel-step-job.js +35 -0
  250. package/dist/turns/cancel-step-job.js.map +1 -0
  251. package/dist/turns/child-result.d.ts +7 -0
  252. package/dist/turns/child-result.d.ts.map +1 -0
  253. package/dist/turns/child-result.js +24 -0
  254. package/dist/turns/child-result.js.map +1 -0
  255. package/dist/turns/compaction.d.ts +15 -1
  256. package/dist/turns/compaction.d.ts.map +1 -1
  257. package/dist/turns/compaction.js +44 -16
  258. package/dist/turns/compaction.js.map +1 -1
  259. package/dist/turns/end-turn-state.d.ts +42 -0
  260. package/dist/turns/end-turn-state.d.ts.map +1 -0
  261. package/dist/turns/end-turn-state.js +64 -0
  262. package/dist/turns/end-turn-state.js.map +1 -0
  263. package/dist/turns/end-turn.d.ts +7 -8
  264. package/dist/turns/end-turn.d.ts.map +1 -1
  265. package/dist/turns/end-turn.js +52 -55
  266. package/dist/turns/end-turn.js.map +1 -1
  267. package/dist/turns/helper-calls.d.ts +6 -0
  268. package/dist/turns/helper-calls.d.ts.map +1 -0
  269. package/dist/turns/helper-calls.js +8 -0
  270. package/dist/turns/helper-calls.js.map +1 -0
  271. package/dist/turns/history.d.ts +3 -1
  272. package/dist/turns/history.d.ts.map +1 -1
  273. package/dist/turns/history.js +15 -7
  274. package/dist/turns/history.js.map +1 -1
  275. package/dist/turns/lost-reply.d.ts +7 -0
  276. package/dist/turns/lost-reply.d.ts.map +1 -1
  277. package/dist/turns/lost-reply.js +12 -0
  278. package/dist/turns/lost-reply.js.map +1 -1
  279. package/dist/turns/message-blocks.d.ts +2 -0
  280. package/dist/turns/message-blocks.d.ts.map +1 -1
  281. package/dist/turns/message-blocks.js +7 -0
  282. package/dist/turns/message-blocks.js.map +1 -1
  283. package/dist/turns/model-context.d.ts +2 -0
  284. package/dist/turns/model-context.d.ts.map +1 -1
  285. package/dist/turns/model-context.js +23 -4
  286. package/dist/turns/model-context.js.map +1 -1
  287. package/dist/turns/model-retry.d.ts +2 -1
  288. package/dist/turns/model-retry.d.ts.map +1 -1
  289. package/dist/turns/model-retry.js +5 -1
  290. package/dist/turns/model-retry.js.map +1 -1
  291. package/dist/turns/read-only.d.ts +6 -0
  292. package/dist/turns/read-only.d.ts.map +1 -0
  293. package/dist/turns/read-only.js +12 -0
  294. package/dist/turns/read-only.js.map +1 -0
  295. package/dist/turns/receipt-job.d.ts +5 -0
  296. package/dist/turns/receipt-job.d.ts.map +1 -0
  297. package/dist/turns/receipt-job.js +40 -0
  298. package/dist/turns/receipt-job.js.map +1 -0
  299. package/dist/turns/recover-workspace.d.ts +9 -0
  300. package/dist/turns/recover-workspace.d.ts.map +1 -0
  301. package/dist/turns/recover-workspace.js +79 -0
  302. package/dist/turns/recover-workspace.js.map +1 -0
  303. package/dist/turns/recovery-state.d.ts +19 -0
  304. package/dist/turns/recovery-state.d.ts.map +1 -0
  305. package/dist/turns/recovery-state.js +87 -0
  306. package/dist/turns/recovery-state.js.map +1 -0
  307. package/dist/turns/register-interruptions.d.ts.map +1 -1
  308. package/dist/turns/register-interruptions.js +19 -8
  309. package/dist/turns/register-interruptions.js.map +1 -1
  310. package/dist/turns/register-turns.d.ts.map +1 -1
  311. package/dist/turns/register-turns.js +42 -31
  312. package/dist/turns/register-turns.js.map +1 -1
  313. package/dist/turns/resolve.d.ts +4 -0
  314. package/dist/turns/resolve.d.ts.map +1 -1
  315. package/dist/turns/resolve.js +19 -17
  316. package/dist/turns/resolve.js.map +1 -1
  317. package/dist/turns/retry-turn.d.ts +4 -0
  318. package/dist/turns/retry-turn.d.ts.map +1 -0
  319. package/dist/turns/retry-turn.js +20 -0
  320. package/dist/turns/retry-turn.js.map +1 -0
  321. package/dist/turns/run-calls.d.ts +21 -4
  322. package/dist/turns/run-calls.d.ts.map +1 -1
  323. package/dist/turns/run-calls.js +157 -41
  324. package/dist/turns/run-calls.js.map +1 -1
  325. package/dist/turns/run-command.d.ts +5 -3
  326. package/dist/turns/run-command.d.ts.map +1 -1
  327. package/dist/turns/run-command.js +21 -12
  328. package/dist/turns/run-command.js.map +1 -1
  329. package/dist/turns/settle-calls.d.ts +2 -8
  330. package/dist/turns/settle-calls.d.ts.map +1 -1
  331. package/dist/turns/settle-calls.js +26 -35
  332. package/dist/turns/settle-calls.js.map +1 -1
  333. package/dist/turns/start-turn.d.ts +8 -83
  334. package/dist/turns/start-turn.d.ts.map +1 -1
  335. package/dist/turns/start-turn.js +35 -24
  336. package/dist/turns/start-turn.js.map +1 -1
  337. package/dist/turns/step-claim.d.ts +39 -0
  338. package/dist/turns/step-claim.d.ts.map +1 -0
  339. package/dist/turns/step-claim.js +72 -0
  340. package/dist/turns/step-claim.js.map +1 -0
  341. package/dist/turns/step-intents.d.ts +31 -0
  342. package/dist/turns/step-intents.d.ts.map +1 -0
  343. package/dist/turns/step-intents.js +101 -0
  344. package/dist/turns/step-intents.js.map +1 -0
  345. package/dist/turns/step-next.d.ts +17 -0
  346. package/dist/turns/step-next.d.ts.map +1 -0
  347. package/dist/turns/step-next.js +25 -0
  348. package/dist/turns/step-next.js.map +1 -0
  349. package/dist/turns/step.d.ts +1 -1
  350. package/dist/turns/step.d.ts.map +1 -1
  351. package/dist/turns/step.js +108 -88
  352. package/dist/turns/step.js.map +1 -1
  353. package/dist/turns/summary-facts.d.ts +25 -0
  354. package/dist/turns/summary-facts.d.ts.map +1 -0
  355. package/dist/turns/summary-facts.js +63 -0
  356. package/dist/turns/summary-facts.js.map +1 -0
  357. package/dist/turns/usage.d.ts +7 -0
  358. package/dist/turns/usage.d.ts.map +1 -0
  359. package/dist/turns/usage.js +18 -0
  360. package/dist/turns/usage.js.map +1 -0
  361. package/dist/ui/register-ui.js +3 -3
  362. package/dist/ui/register-ui.js.map +1 -1
  363. package/dist/web/components/approval.css +2 -0
  364. package/dist/web/components/approval.js +233 -0
  365. package/dist/web/components/call.css +1 -1
  366. package/dist/web/components/call.js +383 -287
  367. package/dist/web/components/connectors.css +1 -1
  368. package/dist/web/components/connectors.js +595 -592
  369. package/dist/web/components/conversation.css +1 -1
  370. package/dist/web/components/conversation.js +2902 -1593
  371. package/dist/web/components/mcp-sign-in.css +1 -1
  372. package/dist/web/components/model.css +1 -1
  373. package/dist/web/components/model.js +138 -134
  374. package/dist/web/components/question.css +1 -1
  375. package/dist/web/components/question.js +148 -78
  376. package/dist/web/components/sessions.css +1 -1
  377. package/docs/connectors.md +2 -2
  378. package/locales/ar.json +88 -12
  379. package/locales/en.json +88 -12
  380. package/package.json +6 -6
  381. package/dist/turns/cancel-turn.d.ts +0 -3
  382. package/dist/turns/cancel-turn.d.ts.map +0 -1
  383. package/dist/turns/cancel-turn.js +0 -31
  384. package/dist/turns/cancel-turn.js.map +0 -1
@@ -0,0 +1,125 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { chmodSync, readFileSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { ProblemError } from '@kvman/sdk';
5
+ import { invalid, notFound } from "../problems.js";
6
+ import { now } from "../sessions/session-lookup.js";
7
+ import { txRecords } from "../store/collections.js";
8
+ import { resolveInWorkspace } from "./workspace-path.js";
9
+ // A change to a workspace file (ADR 0053): its read, its checks, and its replace run inside one store transaction, whose
10
+ // write lock makes kvman's workers take turns. A chat changes an existing file only as it last saw it, the new content
11
+ // is renamed over the file, and the previous content is kept so the change can be undone.
12
+ /** The copies a chat keeps, and the largest previous content one holds. */
13
+ export const copiesKept = 20;
14
+ export const copyLimit = 1024 * 1024;
15
+ export const fingerprintOf = (bytes) => createHash('sha256').update(bytes).digest('hex');
16
+ const codeOf = (error) => (error instanceof Error && 'code' in error && typeof error.code === 'string' ? error.code : undefined);
17
+ // The file system's own refusals are the model's to read and fix; anything else is a fault.
18
+ function refusal(error) {
19
+ return !(error instanceof ProblemError) && error instanceof Error && /^E[A-Z]+$/.test(codeOf(error) ?? '') ? invalid(error.message) : error;
20
+ }
21
+ function existing(file) {
22
+ try {
23
+ const found = statSync(file.real);
24
+ if (found.isDirectory())
25
+ throw invalid(`${file.shown} is a folder.`, { path: file.shown });
26
+ return { bytes: readFileSync(file.real), mode: found.mode & 0o777 };
27
+ }
28
+ catch (error) {
29
+ if (codeOf(error) === 'ENOENT')
30
+ return undefined;
31
+ throw refusal(error);
32
+ }
33
+ }
34
+ // Written beside the file and renamed over it, so a reader sees the old content or the new, never part of one.
35
+ function replace(real, content, mode, jobId) {
36
+ const beside = `${real}.${jobId}.kvman-tmp`;
37
+ try {
38
+ writeFileSync(beside, content);
39
+ if (mode !== undefined)
40
+ chmodSync(beside, mode);
41
+ renameSync(beside, real);
42
+ }
43
+ catch (error) {
44
+ rmSync(beside, { force: true });
45
+ throw refusal(error);
46
+ }
47
+ }
48
+ function setView(store, file, fingerprint) {
49
+ const [view] = store.fileViews.find({ sessionId: file.sessionId, path: file.real }, { limit: 1 });
50
+ if (view === undefined)
51
+ store.fileViews.insert({ sessionId: file.sessionId, path: file.real, fingerprint, updatedAt: now() });
52
+ else
53
+ store.fileViews.update(view.id, { fingerprint, updatedAt: now() });
54
+ }
55
+ function requireSeen(store, file, bytes) {
56
+ const [view] = store.fileViews.find({ sessionId: file.sessionId, path: file.real }, { limit: 1 });
57
+ if (view === undefined)
58
+ throw invalid(`${file.shown} exists and this chat hasn't read it. Read it first with fs read, then make the change.`, { path: file.shown });
59
+ if (view.fingerprint !== fingerprintOf(bytes))
60
+ throw invalid(`${file.shown} changed since this chat read it. Read it again with fs read, then make the change.`, { path: file.shown });
61
+ }
62
+ function saveCopy(store, file, previous, written) {
63
+ if (previous !== undefined && previous.length > copyLimit)
64
+ return;
65
+ store.fileBackups.insert({ sessionId: file.sessionId, path: file.real, previous: previous === undefined ? null : previous.toString('base64'), written, createdAt: now() });
66
+ for (const old of store.fileBackups.find({ sessionId: file.sessionId }, { limit: 1000, order: 'desc' }).slice(copiesKept))
67
+ store.fileBackups.delete(old.id);
68
+ }
69
+ /** Changes the file to what `plan` makes of its current content; `created` says whether it was new. */
70
+ export function changeFile(ctx, file, plan) {
71
+ return ctx.store.transaction((tx) => {
72
+ const store = txRecords(tx);
73
+ const found = existing(file);
74
+ // What is wrong with the change itself is said first; then whether the chat may make it.
75
+ const planned = plan(found?.bytes, store);
76
+ if (found !== undefined)
77
+ requireSeen(store, file, found.bytes);
78
+ const written = fingerprintOf(planned.content);
79
+ saveCopy(store, file, found?.bytes, written);
80
+ setView(store, file, written);
81
+ replace(file.real, planned.content, found?.mode, ctx.job.id);
82
+ return { ...planned.value, created: found === undefined };
83
+ });
84
+ }
85
+ /** Takes back the chat's latest change to the file, when the file still holds what that change wrote. */
86
+ export function undoChange(ctx, file) {
87
+ return ctx.store.transaction((tx) => {
88
+ const store = txRecords(tx);
89
+ const [copy] = store.fileBackups.find({ sessionId: file.sessionId, path: file.real }, { limit: 1, order: 'desc' });
90
+ if (copy === undefined)
91
+ throw notFound(`This chat has no change of ${file.shown} to undo.`, { path: file.shown });
92
+ const found = existing(file);
93
+ if (found === undefined || fingerprintOf(found.bytes) !== copy.written)
94
+ throw invalid(`${file.shown} changed since that change, so it isn't undone. Read it to see what it holds now.`, { path: file.shown });
95
+ store.fileBackups.delete(copy.id);
96
+ const previous = copy.previous === null ? undefined : Buffer.from(copy.previous, 'base64');
97
+ if (previous === undefined) {
98
+ for (const view of store.fileViews.find({ sessionId: file.sessionId, path: file.real }, { limit: 1 }))
99
+ store.fileViews.delete(view.id);
100
+ try {
101
+ unlinkSync(file.real);
102
+ }
103
+ catch (error) {
104
+ throw refusal(error);
105
+ }
106
+ return { path: file.shown, removed: true, bytes: 0 };
107
+ }
108
+ setView(store, file, fingerprintOf(previous));
109
+ replace(file.real, previous, found.mode, ctx.job.id);
110
+ return { path: file.shown, removed: false, bytes: previous.length };
111
+ });
112
+ }
113
+ /** Records the file as the chat has just read it; a file that is gone again records nothing. */
114
+ export async function recordFileView(ctx, sessionId, requested) {
115
+ const real = await resolveInWorkspace(ctx.job.workspace.path, requested);
116
+ const bytes = await readFile(real).catch((error) => {
117
+ if (codeOf(error) === 'ENOENT')
118
+ return undefined;
119
+ throw error;
120
+ });
121
+ if (bytes === undefined)
122
+ return;
123
+ await ctx.store.transaction((tx) => setView(txRecords(tx), { sessionId, shown: requested, real }, fingerprintOf(bytes)));
124
+ }
125
+ //# sourceMappingURL=file-change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-change.js","sourceRoot":"","sources":["../../src/files/file-change.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Ctx } from '@kvman/sdk';
2
+ import { type ChangedFile } from './file-change.ts';
3
+ /** The most pieces of one file, and the bytes one piece holds at most. */
4
+ export declare const partsLimit = 200;
5
+ export declare const partBytes: number;
6
+ export declare function savePart(ctx: Ctx, file: ChangedFile, part: number, content: string): Promise<{
7
+ path: string;
8
+ part: number;
9
+ parts: number[];
10
+ bytes: number;
11
+ }>;
12
+ export declare function assembleParts(ctx: Ctx, file: ChangedFile): Promise<{
13
+ path: string;
14
+ created: boolean;
15
+ bytes: number;
16
+ parts: number;
17
+ }>;
18
+ //# sourceMappingURL=file-parts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-parts.d.ts","sourceRoot":"","sources":["../../src/files/file-parts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAItC,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAKhE,0EAA0E;AAC1E,eAAO,MAAM,UAAU,MAAM,CAAC;AAC9B,eAAO,MAAM,SAAS,QAAY,CAAC;AAInC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAU5J;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAWpI"}
@@ -0,0 +1,40 @@
1
+ import { invalid, notFound, tooLarge } from "../problems.js";
2
+ import { now } from "../sessions/session-lookup.js";
3
+ import { txRecords } from "../store/collections.js";
4
+ import { changeFile } from "./file-change.js";
5
+ // A long file written in numbered pieces (ADR 0054, 2 and 3): each piece is held in kvman's store, a number sent again
6
+ // replaces its piece, and `assemble` writes the whole file at once through the safe change.
7
+ /** The most pieces of one file, and the bytes one piece holds at most. */
8
+ export const partsLimit = 200;
9
+ export const partBytes = 64 * 1024;
10
+ const held = (store, file) => store.fileParts.find({ sessionId: file.sessionId, path: file.real }, { limit: partsLimit }).sort((left, right) => left.part - right.part);
11
+ export function savePart(ctx, file, part, content) {
12
+ if (Buffer.byteLength(content) > partBytes)
13
+ throw tooLarge(`Part ${String(part)} of ${file.shown} is over ${String(partBytes)} bytes. Send it as smaller parts.`, partBytes);
14
+ return ctx.store.transaction((tx) => {
15
+ const store = txRecords(tx);
16
+ const [same] = store.fileParts.find({ sessionId: file.sessionId, path: file.real, part }, { limit: 1 });
17
+ if (same === undefined)
18
+ store.fileParts.insert({ sessionId: file.sessionId, path: file.real, part, content, updatedAt: now() });
19
+ else
20
+ store.fileParts.update(same.id, { content, updatedAt: now() });
21
+ const parts = held(store, file);
22
+ return { path: file.shown, part, parts: parts.map((saved) => saved.part), bytes: parts.reduce((total, saved) => total + Buffer.byteLength(saved.content), 0) };
23
+ });
24
+ }
25
+ export function assembleParts(ctx, file) {
26
+ return changeFile(ctx, file, (_previous, store) => {
27
+ const parts = held(store, file);
28
+ const last = parts.at(-1)?.part;
29
+ if (last === undefined)
30
+ throw notFound(`This chat holds no parts of ${file.shown}. Save them with fs part first.`, { path: file.shown });
31
+ const missing = Array.from({ length: last }, (_, index) => index + 1).filter((number) => !parts.some((saved) => saved.part === number));
32
+ if (missing.length > 0)
33
+ throw invalid(`${file.shown} is missing part ${missing.join(', ')}. Save it with fs part, then assemble again. Nothing was written.`, { path: file.shown });
34
+ const content = Buffer.from(parts.map((saved) => saved.content).join(''), 'utf8');
35
+ for (const saved of parts)
36
+ store.fileParts.delete(saved.id);
37
+ return { content, value: { path: file.shown, bytes: content.length, parts: parts.length } };
38
+ });
39
+ }
40
+ //# sourceMappingURL=file-parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-parts.js","sourceRoot":"","sources":["../../src/files/file-parts.ts"],"names":[],"mappings":"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"}
@@ -8,10 +8,18 @@ export type FileRead = {
8
8
  fromLine: number;
9
9
  totalLines: number;
10
10
  content: string;
11
+ truncated: boolean;
12
+ next?: {
13
+ fromLine: number;
14
+ fromColumn?: number;
15
+ };
11
16
  };
17
+ /** What the chat last saw of a file, by its real path, when it has read it. */
18
+ export type SeenFile = (real: string) => Promise<string | undefined>;
12
19
  export declare function readLines(workspace: string, input: {
13
20
  path: string;
14
21
  fromLine?: number | undefined;
22
+ fromColumn?: number | undefined;
15
23
  lines?: number | undefined;
16
- }): Promise<FileRead>;
24
+ }, seen?: SeenFile): Promise<FileRead>;
17
25
  //# sourceMappingURL=read-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/files/read-file.ts"],"names":[],"mappings":"AAOA,wDAAwD;AACxD,eAAO,MAAM,cAAc,OAAO,CAAC;AAMnC,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,OAA6G,CAAC;AAEzJ,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAOhE;AAOD,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/F,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBxJ"}
1
+ {"version":3,"file":"read-file.d.ts","sourceRoot":"","sources":["../../src/files/read-file.ts"],"names":[],"mappings":"AASA,wDAAwD;AACxD,eAAO,MAAM,cAAc,OAAO,CAAC;AAMnC,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,OAA6G,CAAC;AAEzJ,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAOhE;AAED,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAErK,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAcrE,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiC1M"}
@@ -1,8 +1,10 @@
1
1
  import { readFile, stat } from 'node:fs/promises';
2
2
  import { invalid, notFound } from "../problems.js";
3
+ import { fingerprintOf } from "./file-change.js";
3
4
  import { resolveInWorkspace } from "./workspace-path.js";
4
5
  // `fs read` (plan 08 §8.5, ADR 0011, 8): whole lines of a text file inside the workspace folder, at most 2000 of them
5
- // and 30 KB, with the file's line count so the agent can go on from `fromLine`.
6
+ // and 30 KB, with the file's line count, and where to read on when something was left out, also inside one very long
7
+ // line (ADR 0055, 1).
6
8
  /** The most lines one read returns, and the default. */
7
9
  export const readLinesLimit = 2000;
8
10
  const contentLimit = 30 * 1024;
@@ -19,11 +21,19 @@ export function decodeText(bytes) {
19
21
  throw error;
20
22
  }
21
23
  }
22
- // The start of a line that alone passes the limit, cut where a character ends.
23
- function cutLine(line) {
24
- return new TextDecoder('utf-8').decode(Buffer.from(line, 'utf8').subarray(0, contentLimit)).replace(/�+$/, '');
24
+ // The whole characters of `text` that fit the limit, counted from its start.
25
+ function fitting(characters) {
26
+ let bytes = 0;
27
+ let count = 0;
28
+ for (const character of characters) {
29
+ bytes += Buffer.byteLength(character);
30
+ if (bytes > contentLimit)
31
+ break;
32
+ count += 1;
33
+ }
34
+ return count;
25
35
  }
26
- export async function readLines(workspace, input) {
36
+ export async function readLines(workspace, input, seen) {
27
37
  const target = await resolveInWorkspace(workspace, input.path);
28
38
  const found = await stat(target).catch((error) => {
29
39
  if (isMissing(error))
@@ -32,22 +42,34 @@ export async function readLines(workspace, input) {
32
42
  });
33
43
  if (found.isDirectory())
34
44
  throw invalid(`${input.path} is a folder; list it with fs list.`, { path: input.path });
35
- const decoded = decodeText(await readFile(target));
45
+ const bytes = await readFile(target);
46
+ const decoded = decodeText(bytes);
36
47
  if (decoded === undefined)
37
48
  throw invalid(`${input.path} isn't valid UTF-8 text, so it isn't read.`, { path: input.path });
49
+ // Reading on inside a line joins two reads, so both must be of the same content (ADR 0055, 1).
50
+ const view = input.fromColumn === undefined ? undefined : await seen?.(target);
51
+ if (view !== undefined && view !== fingerprintOf(bytes))
52
+ throw invalid(`${input.path} changed since you started reading it. Read it again from its start.`, { path: input.path });
38
53
  const all = decoded.match(/[^\n]*\n|[^\n]+$/g) ?? [];
39
54
  const fromLine = input.fromLine ?? 1;
55
+ const fromColumn = input.fromColumn ?? 1;
40
56
  const wanted = all.slice(fromLine - 1, fromLine - 1 + (input.lines ?? readLinesLimit));
57
+ const first = [...(wanted[0] ?? '')].slice(fromColumn - 1);
58
+ const lines = wanted.length === 0 ? [] : [first.join(''), ...wanted.slice(1)];
41
59
  const kept = [];
42
- let bytes = 0;
43
- for (const line of wanted) {
44
- bytes += Buffer.byteLength(line);
45
- if (bytes > contentLimit)
60
+ let size = 0;
61
+ for (const line of lines) {
62
+ size += Buffer.byteLength(line);
63
+ if (size > contentLimit)
46
64
  break;
47
65
  kept.push(line);
48
66
  }
49
- const [first] = wanted;
50
- const content = kept.length === 0 && first !== undefined ? cutLine(first) : kept.join('');
51
- return { path: input.path, fromLine, totalLines: all.length, content };
67
+ const base = { path: input.path, fromLine, totalLines: all.length };
68
+ if (kept.length === 0 && lines.length > 0) {
69
+ const taken = fitting(first);
70
+ return { ...base, content: first.slice(0, taken).join(''), truncated: true, next: { fromLine, fromColumn: fromColumn + taken } };
71
+ }
72
+ const nextLine = fromLine + kept.length;
73
+ return nextLine > all.length ? { ...base, content: kept.join(''), truncated: false } : { ...base, content: kept.join(''), truncated: true, next: { fromLine: nextLine } };
52
74
  }
53
75
  //# sourceMappingURL=read-file.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/files/read-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read-file.js","sourceRoot":"","sources":["../../src/files/read-file.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,9 @@
1
+ /** The time one file's matching gets, and a whole search. */
2
+ export type SearchLimits = {
3
+ fileMs: number;
4
+ totalMs: number;
5
+ };
6
+ export declare const searchLimits: SearchLimits;
1
7
  export type Match = {
2
8
  line: number;
3
9
  text: string;
@@ -10,9 +16,13 @@ export type FileMatches = {
10
16
  export type SearchResult = {
11
17
  files: FileMatches[];
12
18
  truncated: boolean;
19
+ reason?: 'matches' | 'time';
13
20
  };
14
- export declare function searchText(workspace: string, input: {
21
+ export type SearchInput = {
15
22
  pattern: string;
16
23
  path?: string | undefined;
17
- }, signal: AbortSignal): Promise<SearchResult>;
24
+ literal?: boolean | undefined;
25
+ glob?: string | undefined;
26
+ };
27
+ export declare function searchText(workspace: string, input: SearchInput, signal: AbortSignal, limits?: SearchLimits): Promise<SearchResult>;
18
28
  //# sourceMappingURL=search-text.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-text.d.ts","sourceRoot":"","sources":["../../src/files/search-text.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,sEAAsE;AACtE,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC;AAwBxE,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CA4BrJ"}
1
+ {"version":3,"file":"search-text.d.ts","sourceRoot":"","sources":["../../src/files/search-text.ts"],"names":[],"mappings":"AAiBA,6DAA6D;AAC7D,MAAM,MAAM,YAAY,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAC/D,eAAO,MAAM,YAAY,EAAE,YAAiD,CAAC;AAE7E,MAAM,MAAM,KAAK,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,sEAAsE;AACtE,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,KAAK,EAAE,CAAA;CAAE,CAAC;AAE7D,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,CAAC;AACrG,MAAM,MAAM,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAyEnI,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAE,YAA2B,GAAG,OAAO,CAAC,YAAY,CAAC,CAmCvJ"}
@@ -1,14 +1,20 @@
1
- import { readdir, readFile, realpath, stat } from 'node:fs/promises';
1
+ import { execFile } from 'node:child_process';
2
+ import { lstat, readdir, readFile, realpath, stat } from 'node:fs/promises';
2
3
  import path from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import { createContext, Script } from 'node:vm';
3
6
  import { invalid, notFound } from "../problems.js";
4
7
  import { decodeText, isMissing } from "./read-file.js";
5
8
  import { resolveInWorkspace } from "./workspace-path.js";
6
- // `fs search` (plan 08 §8.5, ADR 0011, 8): the lines that match a regular expression, in a file or under a folder
7
- // inside the workspace folder, in path order. Dependency and dot folders are skipped, and so is anything that isn't
8
- // UTF-8 text; a symlink is never followed, so the walk can't leave the workspace or loop.
9
+ // `fs search` (plan 08 §8.5, ADR 0011, 8; ADR 0055): the lines that match a regular expression or a plain text, in a
10
+ // file or under a folder inside the workspace folder, in path order. Dependency and dot folders are skipped, and so is
11
+ // what Git ignores and anything that isn't UTF-8 text; a symlink is never followed, so the walk can't leave the
12
+ // workspace or loop. A file's matching runs where it can be interrupted, so a slow expression is stopped.
9
13
  const matchesLimit = 200;
10
14
  const lineLimit = 500;
15
+ export const searchLimits = { fileMs: 2_000, totalMs: 10_000 };
11
16
  const skipped = (name) => name === 'node_modules' || name.startsWith('.');
17
+ const run = promisify(execFile);
12
18
  function expression(pattern) {
13
19
  try {
14
20
  return new RegExp(pattern);
@@ -19,6 +25,11 @@ function expression(pattern) {
19
25
  throw error;
20
26
  }
21
27
  }
28
+ // A glob as an expression: `**` is any run, `*` any run but `/`, `?` one character but `/`.
29
+ function globExpression(glob) {
30
+ const body = glob.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*\*\/?|\*|\?/g, (found) => (found.startsWith('**') ? '.*' : found === '*' ? '[^/]*' : '[^/]'));
31
+ return new RegExp(`^${body}$`);
32
+ }
22
33
  // Every file under `folder`, in path order.
23
34
  async function* filesUnder(folder, signal) {
24
35
  for (const entry of (await readdir(folder, { withFileTypes: true })).sort((first, second) => (first.name < second.name ? -1 : 1))) {
@@ -32,8 +43,52 @@ async function* filesUnder(folder, signal) {
32
43
  yield child;
33
44
  }
34
45
  }
35
- export async function searchText(workspace, input, signal) {
36
- const pattern = expression(input.pattern);
46
+ // Git lists symlinks too, and a folder on the way may be one: only a regular file whose real path is under the
47
+ // searched folder is read, as the walk never follows a link.
48
+ async function regularInside(file, folder) {
49
+ const found = await lstat(file).catch(() => undefined);
50
+ if (found?.isFile() !== true)
51
+ return false;
52
+ const inside = path.relative(folder, await realpath(file));
53
+ return inside !== '' && !inside.startsWith('..') && !path.isAbsolute(inside);
54
+ }
55
+ // The files Git lists under `folder` as tracked or untracked and not ignored; `undefined` where Git can't say.
56
+ // A repository's own configuration may name a program as its file monitor, which listing would run: it is turned off.
57
+ async function gitFiles(folder, signal) {
58
+ let listed;
59
+ try {
60
+ listed = (await run('git', ['-c', 'core.fsmonitor=false', 'ls-files', '--cached', '--others', '--exclude-standard', '-z'], { cwd: folder, signal, maxBuffer: 64 * 1024 * 1024 })).stdout;
61
+ }
62
+ catch {
63
+ signal.throwIfAborted();
64
+ return undefined;
65
+ }
66
+ const real = await realpath(folder);
67
+ const files = [];
68
+ for (const name of listed.split('\0').filter((entry) => entry !== '' && !entry.split('/').some(skipped)).sort()) {
69
+ const file = path.join(real, name);
70
+ if (await regularInside(file, real))
71
+ files.push(file);
72
+ }
73
+ return files;
74
+ }
75
+ const matching = new Script('lines.flatMap((line, index) => (pattern.test(line) ? [index] : []))');
76
+ // The numbers of the matching lines, or `undefined` when the expression passed its time (ADR 0055, 4).
77
+ function matchingLines(lines, pattern, timeoutMs) {
78
+ if (typeof pattern === 'string')
79
+ return lines.flatMap((line, index) => (line.includes(pattern) ? [index] : []));
80
+ try {
81
+ return matching.runInContext(createContext({ lines, pattern }), { timeout: Math.max(Math.ceil(timeoutMs), 1) });
82
+ }
83
+ catch (error) {
84
+ // The error comes from the script's own context, so it is no `Error` of this one.
85
+ if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'ERR_SCRIPT_EXECUTION_TIMEOUT')
86
+ return undefined;
87
+ throw error;
88
+ }
89
+ }
90
+ export async function searchText(workspace, input, signal, limits = searchLimits) {
91
+ const pattern = input.literal === true ? input.pattern : expression(input.pattern);
37
92
  const requested = input.path === undefined || input.path === '' ? '.' : input.path;
38
93
  const target = await resolveInWorkspace(workspace, requested);
39
94
  const found = await stat(target).catch((error) => {
@@ -42,28 +97,37 @@ export async function searchText(workspace, input, signal) {
42
97
  throw error;
43
98
  });
44
99
  const base = await realpath(workspace);
45
- const files = found.isDirectory() ? filesUnder(target, signal) : [target];
100
+ const named = input.glob === undefined ? undefined : globExpression(input.glob);
101
+ const wanted = (file) => named === undefined || named.test(input.glob?.includes('/') === true ? path.relative(target, file).split(path.sep).join('/') : path.basename(file));
102
+ const files = !found.isDirectory() ? [target] : ((await gitFiles(target, signal)) ?? filesUnder(target, signal));
46
103
  const grouped = [];
104
+ const started = Date.now();
47
105
  let count = 0;
48
106
  for await (const file of files) {
49
- const text = decodeText(await readFile(file));
107
+ signal.throwIfAborted();
108
+ if (found.isDirectory() && !wanted(file))
109
+ continue;
110
+ const left = limits.totalMs - (Date.now() - started);
111
+ if (left <= 0)
112
+ return { files: grouped, truncated: true, reason: 'time' };
113
+ const bytes = await readFile(file).catch((error) => {
114
+ if (isMissing(error))
115
+ return undefined;
116
+ throw error;
117
+ });
118
+ const text = bytes === undefined ? undefined : decodeText(bytes);
50
119
  if (text === undefined)
51
120
  continue;
52
- const matches = [];
53
- let full = false;
54
- for (const [index, line] of text.split(/\r?\n/).entries()) {
55
- if (!pattern.test(line))
56
- continue;
57
- full = count === matchesLimit;
58
- if (full)
59
- break;
60
- count += 1;
61
- matches.push({ line: index + 1, text: line.slice(0, lineLimit) });
62
- }
63
- if (matches.length > 0)
64
- grouped.push({ path: path.relative(base, file).split(path.sep).join('/'), matches });
65
- if (full)
66
- return { files: grouped, truncated: true };
121
+ const lines = text.split(/\r?\n/);
122
+ const hits = matchingLines(lines, pattern, Math.min(limits.fileMs, left));
123
+ if (hits === undefined)
124
+ return { files: grouped, truncated: true, reason: 'time' };
125
+ const kept = hits.slice(0, matchesLimit - count);
126
+ count += kept.length;
127
+ if (kept.length > 0)
128
+ grouped.push({ path: path.relative(base, file).split(path.sep).join('/'), matches: kept.map((index) => ({ line: index + 1, text: (lines[index] ?? '').slice(0, lineLimit) })) });
129
+ if (kept.length < hits.length)
130
+ return { files: grouped, truncated: true, reason: 'matches' };
67
131
  }
68
132
  return { files: grouped, truncated: false };
69
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"search-text.js","sourceRoot":"","sources":["../../src/files/search-text.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search-text.js","sourceRoot":"","sources":["../../src/files/search-text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,qHAAqH;AACrH,uHAAuH;AACvH,gHAAgH;AAChH,0GAA0G;AAE1G,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,SAAS,GAAG,GAAG,CAAC;AAItB,MAAM,CAAC,MAAM,YAAY,GAAiB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAU7E,MAAM,OAAO,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC3F,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEhC,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,OAAO,CAAC,2CAA2C,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACzH,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAChK,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,4CAA4C;AAC5C,KAAK,SAAS,CAAC,CAAC,UAAU,CAAC,MAAc,EAAE,MAAmB;IAC5D,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClI,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAClC,IAAI,KAAK,CAAC,WAAW,EAAE;YAAE,KAAK,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;aACrD,IAAI,KAAK,CAAC,MAAM,EAAE;YAAE,MAAM,KAAK,CAAC;IACvC,CAAC;AACH,CAAC;AAED,+GAA+G;AAC/G,6DAA6D;AAC7D,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,MAAc;IACvD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3D,OAAO,MAAM,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC/E,CAAC;AAED,+GAA+G;AAC/G,sHAAsH;AACtH,KAAK,UAAU,QAAQ,CAAC,MAAc,EAAE,MAAmB;IACzD,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAC3L,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAChH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,MAAM,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,qEAAqE,CAAC,CAAC;AAEnG,uGAAuG;AACvG,SAAS,aAAa,CAAC,KAAwB,EAAE,OAAwB,EAAE,SAAiB;IAC1F,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChH,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,YAAY,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAa,CAAC;IAC9H,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kFAAkF;QAClF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,8BAA8B;YAAE,OAAO,SAAS,CAAC;QACtI,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAiB,EAAE,KAAkB,EAAE,MAAmB,EAAE,SAAuB,YAAY;IAC9H,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IACnF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxD,IAAI,SAAS,CAAC,KAAK,CAAC;YAAE,MAAM,QAAQ,CAAC,GAAG,SAAS,iBAAiB,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACzF,MAAM,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9L,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjH,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC/B,MAAM,CAAC,cAAc,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YAAE,SAAS;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;QACrD,IAAI,IAAI,IAAI,CAAC;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC1E,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC1D,IAAI,SAAS,CAAC,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAC;YACvC,MAAM,KAAK,CAAC;QACd,CAAC,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACjE,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1E,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC,CAAC;QACjD,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC;QACrB,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACtM,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC/F,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC9C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAgCtC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AACzE,YAAY,EAAE,MAAM,UAAU,CAAC;yBAGf,KAAK,GAAG,KAAG,IAAI;AAA/B,wBAwCE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAkCtC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AACzE,YAAY,EAAE,MAAM,UAAU,CAAC;yBAGf,KAAK,GAAG,KAAG,IAAI;AAA/B,wBA0CE"}
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { registerArtifacts } from "./artifacts/register-artifacts.js";
2
2
  import { registerConnectorHelp } from "./calls/connector-help.js";
3
3
  import { registerArtifactConnector } from "./connectors/artifact.js";
4
+ import { registerExecutionMapConnector } from "./connectors/execution-map.js";
5
+ import { registerMaps } from "./maps/register-maps.js";
4
6
  import { registerAskConnector } from "./connectors/ask.js";
5
7
  import { registerBackgroundConnector } from "./connectors/background.js";
6
8
  import { registerBinaryConnector } from "./connectors/binary.js";
@@ -42,6 +44,8 @@ export default (ctx) => {
42
44
  registerBinaryConnector(ctx);
43
45
  registerFsConnector(ctx);
44
46
  registerArtifactConnector(ctx);
47
+ registerExecutionMapConnector(ctx);
48
+ registerMaps(ctx);
45
49
  registerBackgroundConnector(ctx);
46
50
  registerAskConnector(ctx);
47
51
  registerDelegateConnector(ctx);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACzF,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKjD,uHAAuH;AACvH,eAAe,CAAC,GAAQ,EAAQ,EAAE;IAChC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,eAAe,CAAC,GAAG,CAAC,CAAC;IACrB,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,aAAa,CAAC,GAAG,CAAC,CAAC;IACnB,YAAY,CAAC,GAAG,CAAC,CAAC;IAClB,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC5B,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC7B,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACzB,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC/B,6BAA6B,CAAC,GAAG,CAAC,CAAC;IACnC,YAAY,CAAC,GAAG,CAAC,CAAC;IAClB,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACjC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1B,yBAAyB,CAAC,GAAG,CAAC,CAAC;IAC/B,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAC1B,WAAW,CAAC,GAAG,CAAC,CAAC;IACjB,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,YAAY,CAAC,GAAG,CAAC,CAAC;IAClB,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACvB,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC7B,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxB,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACtB,YAAY,CAAC,GAAG,CAAC,CAAC;IAClB,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC3B,cAAc,CAAC,GAAG,CAAC,CAAC;IACpB,UAAU,CAAC,GAAG,CAAC,CAAC;IAChB,GAAG,CAAC,eAAe,CAAC,gBAAgB,EAAE;QACpC,WAAW,EAAE,yJAAyJ;QACtK,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;KACF,CAAC,CAAC;AACL,CAAC,CAAC"}
@@ -8,15 +8,24 @@ export type JobRow = {
8
8
  startedAt: string;
9
9
  endedAt?: string;
10
10
  exitCode?: number;
11
+ staging?: {
12
+ state: 'changed' | 'restored';
13
+ paths: number;
14
+ headMoved: boolean;
15
+ };
11
16
  };
12
17
  export type JobDetail = {
13
18
  row: JobRow;
14
19
  detail: Record<string, Json>;
15
20
  };
21
+ /** How many of a process's last lines a read returns when it names no number. */
22
+ export declare const outputLines = 100;
16
23
  /** One job of the session by its id, with its output or problem; `undefined` when the session started no such job. */
17
- export declare function jobDetail(ctx: Ctx, sessionId: string, id: string): Promise<JobDetail | undefined>;
18
- /** The session's newest 50 jobs, newest first. */
24
+ export declare function jobDetail(ctx: Ctx, sessionId: string, id: string, lines?: number): Promise<JobDetail | undefined>;
25
+ /** The session's jobs, newest first: every one still running, however old, and its newest ended ones to 50 rows in all (ADR 0057, 2). */
19
26
  export declare function jobRows(ctx: Ctx, sessionId: string): Promise<JobRow[]>;
27
+ /** The chat's runs that are still running and that no turn waits on, as the agent is told of them (ADR 0068, 4). */
28
+ export declare function runningInBackground(ctx: Ctx, sessionId: string): Promise<string[]>;
20
29
  /** What the person's list adds to a row: the localhost links in a process's output. */
21
30
  export declare function linksOf(ctx: Ctx, sessionId: string, row: JobRow): Promise<string[]>;
22
31
  /** Stops a process or a run, or cancels a subagent and tells the session; `false` for a process or a run that had ended already. */