@astralyn/pi 0.81.1-1

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 (1065) hide show
  1. package/CHANGELOG.md +5113 -0
  2. package/README.md +677 -0
  3. package/dist/bun/cli.d.ts +3 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +11 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/register-bedrock.d.ts +2 -0
  8. package/dist/bun/register-bedrock.d.ts.map +1 -0
  9. package/dist/bun/register-bedrock.js +4 -0
  10. package/dist/bun/register-bedrock.js.map +1 -0
  11. package/dist/bun/restore-sandbox-env.d.ts +17 -0
  12. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  13. package/dist/bun/restore-sandbox-env.js +36 -0
  14. package/dist/bun/restore-sandbox-env.js.map +1 -0
  15. package/dist/cli/args.d.ts +57 -0
  16. package/dist/cli/args.d.ts.map +1 -0
  17. package/dist/cli/args.js +381 -0
  18. package/dist/cli/args.js.map +1 -0
  19. package/dist/cli/config-selector.d.ts +16 -0
  20. package/dist/cli/config-selector.d.ts.map +1 -0
  21. package/dist/cli/config-selector.js +31 -0
  22. package/dist/cli/config-selector.js.map +1 -0
  23. package/dist/cli/file-processor.d.ts +15 -0
  24. package/dist/cli/file-processor.d.ts.map +1 -0
  25. package/dist/cli/file-processor.js +70 -0
  26. package/dist/cli/file-processor.js.map +1 -0
  27. package/dist/cli/initial-message.d.ts +18 -0
  28. package/dist/cli/initial-message.d.ts.map +1 -0
  29. package/dist/cli/initial-message.js +22 -0
  30. package/dist/cli/initial-message.js.map +1 -0
  31. package/dist/cli/list-models.d.ts +9 -0
  32. package/dist/cli/list-models.d.ts.map +1 -0
  33. package/dist/cli/list-models.js +98 -0
  34. package/dist/cli/list-models.js.map +1 -0
  35. package/dist/cli/project-trust.d.ts +10 -0
  36. package/dist/cli/project-trust.d.ts.map +1 -0
  37. package/dist/cli/project-trust.js +48 -0
  38. package/dist/cli/project-trust.js.map +1 -0
  39. package/dist/cli/session-picker.d.ts +10 -0
  40. package/dist/cli/session-picker.d.ts.map +1 -0
  41. package/dist/cli/session-picker.js +36 -0
  42. package/dist/cli/session-picker.js.map +1 -0
  43. package/dist/cli/startup-ui.d.ts +20 -0
  44. package/dist/cli/startup-ui.d.ts.map +1 -0
  45. package/dist/cli/startup-ui.js +184 -0
  46. package/dist/cli/startup-ui.js.map +1 -0
  47. package/dist/cli.d.ts +3 -0
  48. package/dist/cli.d.ts.map +1 -0
  49. package/dist/cli.js +18 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/config.d.ts +96 -0
  52. package/dist/config.d.ts.map +1 -0
  53. package/dist/config.js +455 -0
  54. package/dist/config.js.map +1 -0
  55. package/dist/core/agent-session-runtime.d.ts +119 -0
  56. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  57. package/dist/core/agent-session-runtime.js +306 -0
  58. package/dist/core/agent-session-runtime.js.map +1 -0
  59. package/dist/core/agent-session-services.d.ts +85 -0
  60. package/dist/core/agent-session-services.d.ts.map +1 -0
  61. package/dist/core/agent-session-services.js +133 -0
  62. package/dist/core/agent-session-services.js.map +1 -0
  63. package/dist/core/agent-session.d.ts +642 -0
  64. package/dist/core/agent-session.d.ts.map +1 -0
  65. package/dist/core/agent-session.js +2679 -0
  66. package/dist/core/agent-session.js.map +1 -0
  67. package/dist/core/auth-guidance.d.ts +5 -0
  68. package/dist/core/auth-guidance.d.ts.map +1 -0
  69. package/dist/core/auth-guidance.js +21 -0
  70. package/dist/core/auth-guidance.js.map +1 -0
  71. package/dist/core/auth-storage.d.ts +56 -0
  72. package/dist/core/auth-storage.d.ts.map +1 -0
  73. package/dist/core/auth-storage.js +229 -0
  74. package/dist/core/auth-storage.js.map +1 -0
  75. package/dist/core/bash-executor.d.ts +32 -0
  76. package/dist/core/bash-executor.d.ts.map +1 -0
  77. package/dist/core/bash-executor.js +111 -0
  78. package/dist/core/bash-executor.js.map +1 -0
  79. package/dist/core/cache-stats.d.ts +49 -0
  80. package/dist/core/cache-stats.d.ts.map +1 -0
  81. package/dist/core/cache-stats.js +101 -0
  82. package/dist/core/cache-stats.js.map +1 -0
  83. package/dist/core/compaction/branch-summarization.d.ts +98 -0
  84. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  85. package/dist/core/compaction/branch-summarization.js +246 -0
  86. package/dist/core/compaction/branch-summarization.js.map +1 -0
  87. package/dist/core/compaction/compaction.d.ts +137 -0
  88. package/dist/core/compaction/compaction.d.ts.map +1 -0
  89. package/dist/core/compaction/compaction.js +637 -0
  90. package/dist/core/compaction/compaction.js.map +1 -0
  91. package/dist/core/compaction/index.d.ts +7 -0
  92. package/dist/core/compaction/index.d.ts.map +1 -0
  93. package/dist/core/compaction/index.js +7 -0
  94. package/dist/core/compaction/index.js.map +1 -0
  95. package/dist/core/compaction/utils.d.ts +38 -0
  96. package/dist/core/compaction/utils.d.ts.map +1 -0
  97. package/dist/core/compaction/utils.js +142 -0
  98. package/dist/core/compaction/utils.js.map +1 -0
  99. package/dist/core/defaults.d.ts +3 -0
  100. package/dist/core/defaults.d.ts.map +1 -0
  101. package/dist/core/defaults.js +2 -0
  102. package/dist/core/defaults.js.map +1 -0
  103. package/dist/core/diagnostics.d.ts +15 -0
  104. package/dist/core/diagnostics.d.ts.map +1 -0
  105. package/dist/core/diagnostics.js +2 -0
  106. package/dist/core/diagnostics.js.map +1 -0
  107. package/dist/core/event-bus.d.ts +9 -0
  108. package/dist/core/event-bus.d.ts.map +1 -0
  109. package/dist/core/event-bus.js +25 -0
  110. package/dist/core/event-bus.js.map +1 -0
  111. package/dist/core/exec.d.ts +29 -0
  112. package/dist/core/exec.d.ts.map +1 -0
  113. package/dist/core/exec.js +75 -0
  114. package/dist/core/exec.js.map +1 -0
  115. package/dist/core/experimental.d.ts +2 -0
  116. package/dist/core/experimental.d.ts.map +1 -0
  117. package/dist/core/experimental.js +4 -0
  118. package/dist/core/experimental.js.map +1 -0
  119. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  120. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  121. package/dist/core/export-html/ansi-to-html.js +249 -0
  122. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  123. package/dist/core/export-html/index.d.ts +37 -0
  124. package/dist/core/export-html/index.d.ts.map +1 -0
  125. package/dist/core/export-html/index.js +226 -0
  126. package/dist/core/export-html/index.js.map +1 -0
  127. package/dist/core/export-html/template.css +1066 -0
  128. package/dist/core/export-html/template.html +55 -0
  129. package/dist/core/export-html/template.js +1864 -0
  130. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  131. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  132. package/dist/core/export-html/tool-renderer.js +108 -0
  133. package/dist/core/export-html/tool-renderer.js.map +1 -0
  134. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  135. package/dist/core/export-html/vendor/marked.min.js +78 -0
  136. package/dist/core/extensions/index.d.ts +12 -0
  137. package/dist/core/extensions/index.d.ts.map +1 -0
  138. package/dist/core/extensions/index.js +9 -0
  139. package/dist/core/extensions/index.js.map +1 -0
  140. package/dist/core/extensions/loader.d.ts +23 -0
  141. package/dist/core/extensions/loader.d.ts.map +1 -0
  142. package/dist/core/extensions/loader.js +558 -0
  143. package/dist/core/extensions/loader.js.map +1 -0
  144. package/dist/core/extensions/runner.d.ts +171 -0
  145. package/dist/core/extensions/runner.d.ts.map +1 -0
  146. package/dist/core/extensions/runner.js +953 -0
  147. package/dist/core/extensions/runner.js.map +1 -0
  148. package/dist/core/extensions/types.d.ts +1259 -0
  149. package/dist/core/extensions/types.d.ts.map +1 -0
  150. package/dist/core/extensions/types.js +45 -0
  151. package/dist/core/extensions/types.js.map +1 -0
  152. package/dist/core/extensions/wrapper.d.ts +20 -0
  153. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  154. package/dist/core/extensions/wrapper.js +41 -0
  155. package/dist/core/extensions/wrapper.js.map +1 -0
  156. package/dist/core/footer-data-provider.d.ts +54 -0
  157. package/dist/core/footer-data-provider.d.ts.map +1 -0
  158. package/dist/core/footer-data-provider.js +338 -0
  159. package/dist/core/footer-data-provider.js.map +1 -0
  160. package/dist/core/http-dispatcher.d.ts +22 -0
  161. package/dist/core/http-dispatcher.d.ts.map +1 -0
  162. package/dist/core/http-dispatcher.js +91 -0
  163. package/dist/core/http-dispatcher.js.map +1 -0
  164. package/dist/core/index.d.ts +13 -0
  165. package/dist/core/index.d.ts.map +1 -0
  166. package/dist/core/index.js +13 -0
  167. package/dist/core/index.js.map +1 -0
  168. package/dist/core/keybindings.d.ts +363 -0
  169. package/dist/core/keybindings.d.ts.map +1 -0
  170. package/dist/core/keybindings.js +300 -0
  171. package/dist/core/keybindings.js.map +1 -0
  172. package/dist/core/messages.d.ts +77 -0
  173. package/dist/core/messages.d.ts.map +1 -0
  174. package/dist/core/messages.js +123 -0
  175. package/dist/core/messages.js.map +1 -0
  176. package/dist/core/model-config.d.ts +512 -0
  177. package/dist/core/model-config.d.ts.map +1 -0
  178. package/dist/core/model-config.js +243 -0
  179. package/dist/core/model-config.js.map +1 -0
  180. package/dist/core/model-registry.d.ts +43 -0
  181. package/dist/core/model-registry.d.ts.map +1 -0
  182. package/dist/core/model-registry.js +104 -0
  183. package/dist/core/model-registry.js.map +1 -0
  184. package/dist/core/model-resolver.d.ts +121 -0
  185. package/dist/core/model-resolver.d.ts.map +1 -0
  186. package/dist/core/model-resolver.js +534 -0
  187. package/dist/core/model-resolver.js.map +1 -0
  188. package/dist/core/model-runtime.d.ts +82 -0
  189. package/dist/core/model-runtime.d.ts.map +1 -0
  190. package/dist/core/model-runtime.js +441 -0
  191. package/dist/core/model-runtime.js.map +1 -0
  192. package/dist/core/models-store.d.ts +17 -0
  193. package/dist/core/models-store.d.ts.map +1 -0
  194. package/dist/core/models-store.js +45 -0
  195. package/dist/core/models-store.js.map +1 -0
  196. package/dist/core/output-guard.d.ts +7 -0
  197. package/dist/core/output-guard.d.ts.map +1 -0
  198. package/dist/core/output-guard.js +89 -0
  199. package/dist/core/output-guard.js.map +1 -0
  200. package/dist/core/package-manager.d.ts +210 -0
  201. package/dist/core/package-manager.d.ts.map +1 -0
  202. package/dist/core/package-manager.js +2135 -0
  203. package/dist/core/package-manager.js.map +1 -0
  204. package/dist/core/project-trust.d.ts +15 -0
  205. package/dist/core/project-trust.d.ts.map +1 -0
  206. package/dist/core/project-trust.js +59 -0
  207. package/dist/core/project-trust.js.map +1 -0
  208. package/dist/core/prompt-templates.d.ts +54 -0
  209. package/dist/core/prompt-templates.d.ts.map +1 -0
  210. package/dist/core/prompt-templates.js +236 -0
  211. package/dist/core/prompt-templates.js.map +1 -0
  212. package/dist/core/provider-attribution.d.ts +4 -0
  213. package/dist/core/provider-attribution.d.ts.map +1 -0
  214. package/dist/core/provider-attribution.js +72 -0
  215. package/dist/core/provider-attribution.js.map +1 -0
  216. package/dist/core/provider-composer.d.ts +55 -0
  217. package/dist/core/provider-composer.d.ts.map +1 -0
  218. package/dist/core/provider-composer.js +375 -0
  219. package/dist/core/provider-composer.js.map +1 -0
  220. package/dist/core/radius.d.ts +2 -0
  221. package/dist/core/radius.d.ts.map +1 -0
  222. package/dist/core/radius.js +2 -0
  223. package/dist/core/radius.js.map +1 -0
  224. package/dist/core/remote-catalog-provider.d.ts +5 -0
  225. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  226. package/dist/core/remote-catalog-provider.js +102 -0
  227. package/dist/core/remote-catalog-provider.js.map +1 -0
  228. package/dist/core/resolve-config-value.d.ts +30 -0
  229. package/dist/core/resolve-config-value.d.ts.map +1 -0
  230. package/dist/core/resolve-config-value.js +247 -0
  231. package/dist/core/resolve-config-value.js.map +1 -0
  232. package/dist/core/resource-loader.d.ts +206 -0
  233. package/dist/core/resource-loader.d.ts.map +1 -0
  234. package/dist/core/resource-loader.js +817 -0
  235. package/dist/core/resource-loader.js.map +1 -0
  236. package/dist/core/runtime-credentials.d.ts +15 -0
  237. package/dist/core/runtime-credentials.d.ts.map +1 -0
  238. package/dist/core/runtime-credentials.js +36 -0
  239. package/dist/core/runtime-credentials.js.map +1 -0
  240. package/dist/core/sdk.d.ts +106 -0
  241. package/dist/core/sdk.d.ts.map +1 -0
  242. package/dist/core/sdk.js +267 -0
  243. package/dist/core/sdk.js.map +1 -0
  244. package/dist/core/session-cwd.d.ts +19 -0
  245. package/dist/core/session-cwd.d.ts.map +1 -0
  246. package/dist/core/session-cwd.js +38 -0
  247. package/dist/core/session-cwd.js.map +1 -0
  248. package/dist/core/session-manager.d.ts +356 -0
  249. package/dist/core/session-manager.d.ts.map +1 -0
  250. package/dist/core/session-manager.js +1338 -0
  251. package/dist/core/session-manager.js.map +1 -0
  252. package/dist/core/settings-manager.d.ts +297 -0
  253. package/dist/core/settings-manager.d.ts.map +1 -0
  254. package/dist/core/settings-manager.js +902 -0
  255. package/dist/core/settings-manager.js.map +1 -0
  256. package/dist/core/skills.d.ts +60 -0
  257. package/dist/core/skills.d.ts.map +1 -0
  258. package/dist/core/skills.js +387 -0
  259. package/dist/core/skills.js.map +1 -0
  260. package/dist/core/slash-commands.d.ts +15 -0
  261. package/dist/core/slash-commands.d.ts.map +1 -0
  262. package/dist/core/slash-commands.js +26 -0
  263. package/dist/core/slash-commands.js.map +1 -0
  264. package/dist/core/source-info.d.ts +18 -0
  265. package/dist/core/source-info.d.ts.map +1 -0
  266. package/dist/core/source-info.js +19 -0
  267. package/dist/core/source-info.js.map +1 -0
  268. package/dist/core/system-prompt.d.ts +28 -0
  269. package/dist/core/system-prompt.d.ts.map +1 -0
  270. package/dist/core/system-prompt.js +110 -0
  271. package/dist/core/system-prompt.js.map +1 -0
  272. package/dist/core/telemetry.d.ts +3 -0
  273. package/dist/core/telemetry.d.ts.map +1 -0
  274. package/dist/core/telemetry.js +9 -0
  275. package/dist/core/telemetry.js.map +1 -0
  276. package/dist/core/timings.d.ts +10 -0
  277. package/dist/core/timings.d.ts.map +1 -0
  278. package/dist/core/timings.js +41 -0
  279. package/dist/core/timings.js.map +1 -0
  280. package/dist/core/tools/bash.d.ts +68 -0
  281. package/dist/core/tools/bash.d.ts.map +1 -0
  282. package/dist/core/tools/bash.js +361 -0
  283. package/dist/core/tools/bash.js.map +1 -0
  284. package/dist/core/tools/edit-diff.d.ts +106 -0
  285. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  286. package/dist/core/tools/edit-diff.js +424 -0
  287. package/dist/core/tools/edit-diff.js.map +1 -0
  288. package/dist/core/tools/edit.d.ts +50 -0
  289. package/dist/core/tools/edit.d.ts.map +1 -0
  290. package/dist/core/tools/edit.js +261 -0
  291. package/dist/core/tools/edit.js.map +1 -0
  292. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  293. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  294. package/dist/core/tools/file-mutation-queue.js +52 -0
  295. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  296. package/dist/core/tools/find.d.ts +35 -0
  297. package/dist/core/tools/find.d.ts.map +1 -0
  298. package/dist/core/tools/find.js +305 -0
  299. package/dist/core/tools/find.js.map +1 -0
  300. package/dist/core/tools/grep.d.ts +37 -0
  301. package/dist/core/tools/grep.d.ts.map +1 -0
  302. package/dist/core/tools/grep.js +304 -0
  303. package/dist/core/tools/grep.js.map +1 -0
  304. package/dist/core/tools/index.d.ts +40 -0
  305. package/dist/core/tools/index.d.ts.map +1 -0
  306. package/dist/core/tools/index.js +112 -0
  307. package/dist/core/tools/index.js.map +1 -0
  308. package/dist/core/tools/ls.d.ts +37 -0
  309. package/dist/core/tools/ls.d.ts.map +1 -0
  310. package/dist/core/tools/ls.js +167 -0
  311. package/dist/core/tools/ls.js.map +1 -0
  312. package/dist/core/tools/output-accumulator.d.ts +52 -0
  313. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  314. package/dist/core/tools/output-accumulator.js +184 -0
  315. package/dist/core/tools/output-accumulator.js.map +1 -0
  316. package/dist/core/tools/path-utils.d.ts +10 -0
  317. package/dist/core/tools/path-utils.d.ts.map +1 -0
  318. package/dist/core/tools/path-utils.js +99 -0
  319. package/dist/core/tools/path-utils.js.map +1 -0
  320. package/dist/core/tools/read.d.ts +35 -0
  321. package/dist/core/tools/read.d.ts.map +1 -0
  322. package/dist/core/tools/read.js +276 -0
  323. package/dist/core/tools/read.js.map +1 -0
  324. package/dist/core/tools/render-utils.d.ts +24 -0
  325. package/dist/core/tools/render-utils.d.ts.map +1 -0
  326. package/dist/core/tools/render-utils.js +65 -0
  327. package/dist/core/tools/render-utils.js.map +1 -0
  328. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  329. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  330. package/dist/core/tools/tool-definition-wrapper.js +34 -0
  331. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  332. package/dist/core/tools/truncate.d.ts +70 -0
  333. package/dist/core/tools/truncate.d.ts.map +1 -0
  334. package/dist/core/tools/truncate.js +215 -0
  335. package/dist/core/tools/truncate.js.map +1 -0
  336. package/dist/core/tools/write.d.ts +26 -0
  337. package/dist/core/tools/write.d.ts.map +1 -0
  338. package/dist/core/tools/write.js +197 -0
  339. package/dist/core/tools/write.js.map +1 -0
  340. package/dist/core/trust-manager.d.ts +36 -0
  341. package/dist/core/trust-manager.d.ts.map +1 -0
  342. package/dist/core/trust-manager.js +202 -0
  343. package/dist/core/trust-manager.js.map +1 -0
  344. package/dist/core/usage-totals.d.ts +19 -0
  345. package/dist/core/usage-totals.d.ts.map +1 -0
  346. package/dist/core/usage-totals.js +52 -0
  347. package/dist/core/usage-totals.js.map +1 -0
  348. package/dist/extensions/deepwiki/client.d.ts +14 -0
  349. package/dist/extensions/deepwiki/client.d.ts.map +1 -0
  350. package/dist/extensions/deepwiki/client.js +196 -0
  351. package/dist/extensions/deepwiki/client.js.map +1 -0
  352. package/dist/extensions/deepwiki/constants.d.ts +13 -0
  353. package/dist/extensions/deepwiki/constants.d.ts.map +1 -0
  354. package/dist/extensions/deepwiki/constants.js +18 -0
  355. package/dist/extensions/deepwiki/constants.js.map +1 -0
  356. package/dist/extensions/deepwiki/contents.d.ts +63 -0
  357. package/dist/extensions/deepwiki/contents.d.ts.map +1 -0
  358. package/dist/extensions/deepwiki/contents.js +174 -0
  359. package/dist/extensions/deepwiki/contents.js.map +1 -0
  360. package/dist/extensions/deepwiki/execute.d.ts +25 -0
  361. package/dist/extensions/deepwiki/execute.d.ts.map +1 -0
  362. package/dist/extensions/deepwiki/execute.js +78 -0
  363. package/dist/extensions/deepwiki/execute.js.map +1 -0
  364. package/dist/extensions/deepwiki/http.d.ts +12 -0
  365. package/dist/extensions/deepwiki/http.d.ts.map +1 -0
  366. package/dist/extensions/deepwiki/http.js +74 -0
  367. package/dist/extensions/deepwiki/http.js.map +1 -0
  368. package/dist/extensions/deepwiki/index.d.ts +9 -0
  369. package/dist/extensions/deepwiki/index.d.ts.map +1 -0
  370. package/dist/extensions/deepwiki/index.js +25 -0
  371. package/dist/extensions/deepwiki/index.js.map +1 -0
  372. package/dist/extensions/deepwiki/render.d.ts +14 -0
  373. package/dist/extensions/deepwiki/render.d.ts.map +1 -0
  374. package/dist/extensions/deepwiki/render.js +166 -0
  375. package/dist/extensions/deepwiki/render.js.map +1 -0
  376. package/dist/extensions/deepwiki/schema.d.ts +13 -0
  377. package/dist/extensions/deepwiki/schema.d.ts.map +1 -0
  378. package/dist/extensions/deepwiki/schema.js +208 -0
  379. package/dist/extensions/deepwiki/schema.js.map +1 -0
  380. package/dist/extensions/index.d.ts +3 -0
  381. package/dist/extensions/index.d.ts.map +1 -0
  382. package/dist/extensions/index.js +17 -0
  383. package/dist/extensions/index.js.map +1 -0
  384. package/dist/extensions/llama/client.d.ts +61 -0
  385. package/dist/extensions/llama/client.d.ts.map +1 -0
  386. package/dist/extensions/llama/client.js +302 -0
  387. package/dist/extensions/llama/client.js.map +1 -0
  388. package/dist/extensions/llama/huggingface.d.ts +23 -0
  389. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  390. package/dist/extensions/llama/huggingface.js +141 -0
  391. package/dist/extensions/llama/huggingface.js.map +1 -0
  392. package/dist/extensions/llama/index.d.ts +3 -0
  393. package/dist/extensions/llama/index.d.ts.map +1 -0
  394. package/dist/extensions/llama/index.js +208 -0
  395. package/dist/extensions/llama/index.js.map +1 -0
  396. package/dist/extensions/llama/provider.d.ts +10 -0
  397. package/dist/extensions/llama/provider.d.ts.map +1 -0
  398. package/dist/extensions/llama/provider.js +102 -0
  399. package/dist/extensions/llama/provider.js.map +1 -0
  400. package/dist/extensions/llama/ui.d.ts +42 -0
  401. package/dist/extensions/llama/ui.d.ts.map +1 -0
  402. package/dist/extensions/llama/ui.js +416 -0
  403. package/dist/extensions/llama/ui.js.map +1 -0
  404. package/dist/extensions/question/constants.d.ts +13 -0
  405. package/dist/extensions/question/constants.d.ts.map +1 -0
  406. package/dist/extensions/question/constants.js +17 -0
  407. package/dist/extensions/question/constants.js.map +1 -0
  408. package/dist/extensions/question/dialog-primitives.d.ts +6 -0
  409. package/dist/extensions/question/dialog-primitives.d.ts.map +1 -0
  410. package/dist/extensions/question/dialog-primitives.js +20 -0
  411. package/dist/extensions/question/dialog-primitives.js.map +1 -0
  412. package/dist/extensions/question/dialog.d.ts +10 -0
  413. package/dist/extensions/question/dialog.d.ts.map +1 -0
  414. package/dist/extensions/question/dialog.js +519 -0
  415. package/dist/extensions/question/dialog.js.map +1 -0
  416. package/dist/extensions/question/index.d.ts +9 -0
  417. package/dist/extensions/question/index.d.ts.map +1 -0
  418. package/dist/extensions/question/index.js +32 -0
  419. package/dist/extensions/question/index.js.map +1 -0
  420. package/dist/extensions/question/limits.d.ts +11 -0
  421. package/dist/extensions/question/limits.d.ts.map +1 -0
  422. package/dist/extensions/question/limits.js +11 -0
  423. package/dist/extensions/question/limits.js.map +1 -0
  424. package/dist/extensions/question/render-cache.d.ts +9 -0
  425. package/dist/extensions/question/render-cache.d.ts.map +1 -0
  426. package/dist/extensions/question/render-cache.js +18 -0
  427. package/dist/extensions/question/render-cache.js.map +1 -0
  428. package/dist/extensions/question/render.d.ts +17 -0
  429. package/dist/extensions/question/render.d.ts.map +1 -0
  430. package/dist/extensions/question/render.js +47 -0
  431. package/dist/extensions/question/render.js.map +1 -0
  432. package/dist/extensions/question/results.d.ts +8 -0
  433. package/dist/extensions/question/results.d.ts.map +1 -0
  434. package/dist/extensions/question/results.js +68 -0
  435. package/dist/extensions/question/results.js.map +1 -0
  436. package/dist/extensions/question/schema.d.ts +22 -0
  437. package/dist/extensions/question/schema.d.ts.map +1 -0
  438. package/dist/extensions/question/schema.js +98 -0
  439. package/dist/extensions/question/schema.js.map +1 -0
  440. package/dist/extensions/question/state.d.ts +9 -0
  441. package/dist/extensions/question/state.d.ts.map +1 -0
  442. package/dist/extensions/question/state.js +76 -0
  443. package/dist/extensions/question/state.js.map +1 -0
  444. package/dist/extensions/question/types.d.ts +60 -0
  445. package/dist/extensions/question/types.d.ts.map +1 -0
  446. package/dist/extensions/question/types.js +2 -0
  447. package/dist/extensions/question/types.js.map +1 -0
  448. package/dist/extensions/rewind/config.d.ts +16 -0
  449. package/dist/extensions/rewind/config.d.ts.map +1 -0
  450. package/dist/extensions/rewind/config.js +69 -0
  451. package/dist/extensions/rewind/config.js.map +1 -0
  452. package/dist/extensions/rewind/engine.d.ts +97 -0
  453. package/dist/extensions/rewind/engine.d.ts.map +1 -0
  454. package/dist/extensions/rewind/engine.js +747 -0
  455. package/dist/extensions/rewind/engine.js.map +1 -0
  456. package/dist/extensions/rewind/gc.d.ts +35 -0
  457. package/dist/extensions/rewind/gc.d.ts.map +1 -0
  458. package/dist/extensions/rewind/gc.js +169 -0
  459. package/dist/extensions/rewind/gc.js.map +1 -0
  460. package/dist/extensions/rewind/index.d.ts +3 -0
  461. package/dist/extensions/rewind/index.d.ts.map +1 -0
  462. package/dist/extensions/rewind/index.js +253 -0
  463. package/dist/extensions/rewind/index.js.map +1 -0
  464. package/dist/extensions/rewind/menu.d.ts +13 -0
  465. package/dist/extensions/rewind/menu.d.ts.map +1 -0
  466. package/dist/extensions/rewind/menu.js +118 -0
  467. package/dist/extensions/rewind/menu.js.map +1 -0
  468. package/dist/extensions/rewind/paths.d.ts +4 -0
  469. package/dist/extensions/rewind/paths.d.ts.map +1 -0
  470. package/dist/extensions/rewind/paths.js +15 -0
  471. package/dist/extensions/rewind/paths.js.map +1 -0
  472. package/dist/extensions/rewind/restore.d.ts +37 -0
  473. package/dist/extensions/rewind/restore.d.ts.map +1 -0
  474. package/dist/extensions/rewind/restore.js +52 -0
  475. package/dist/extensions/rewind/restore.js.map +1 -0
  476. package/dist/extensions/rewind/snapshot.d.ts +45 -0
  477. package/dist/extensions/rewind/snapshot.d.ts.map +1 -0
  478. package/dist/extensions/rewind/snapshot.js +21 -0
  479. package/dist/extensions/rewind/snapshot.js.map +1 -0
  480. package/dist/extensions/rewind/storage.d.ts +12 -0
  481. package/dist/extensions/rewind/storage.d.ts.map +1 -0
  482. package/dist/extensions/rewind/storage.js +33 -0
  483. package/dist/extensions/rewind/storage.js.map +1 -0
  484. package/dist/extensions/rewind/text.d.ts +7 -0
  485. package/dist/extensions/rewind/text.d.ts.map +1 -0
  486. package/dist/extensions/rewind/text.js +19 -0
  487. package/dist/extensions/rewind/text.js.map +1 -0
  488. package/dist/extensions/rewind/tool-path.d.ts +3 -0
  489. package/dist/extensions/rewind/tool-path.d.ts.map +1 -0
  490. package/dist/extensions/rewind/tool-path.js +9 -0
  491. package/dist/extensions/rewind/tool-path.js.map +1 -0
  492. package/dist/extensions/router/constants.d.ts +20 -0
  493. package/dist/extensions/router/constants.d.ts.map +1 -0
  494. package/dist/extensions/router/constants.js +27 -0
  495. package/dist/extensions/router/constants.js.map +1 -0
  496. package/dist/extensions/router/dialog.d.ts +38 -0
  497. package/dist/extensions/router/dialog.d.ts.map +1 -0
  498. package/dist/extensions/router/dialog.js +407 -0
  499. package/dist/extensions/router/dialog.js.map +1 -0
  500. package/dist/extensions/router/index.d.ts +15 -0
  501. package/dist/extensions/router/index.d.ts.map +1 -0
  502. package/dist/extensions/router/index.js +61 -0
  503. package/dist/extensions/router/index.js.map +1 -0
  504. package/dist/extensions/router/presets.d.ts +48 -0
  505. package/dist/extensions/router/presets.d.ts.map +1 -0
  506. package/dist/extensions/router/presets.js +109 -0
  507. package/dist/extensions/router/presets.js.map +1 -0
  508. package/dist/extensions/router/probe.d.ts +20 -0
  509. package/dist/extensions/router/probe.d.ts.map +1 -0
  510. package/dist/extensions/router/probe.js +125 -0
  511. package/dist/extensions/router/probe.js.map +1 -0
  512. package/dist/extensions/router/register.d.ts +34 -0
  513. package/dist/extensions/router/register.d.ts.map +1 -0
  514. package/dist/extensions/router/register.js +81 -0
  515. package/dist/extensions/router/register.js.map +1 -0
  516. package/dist/extensions/router/store.d.ts +12 -0
  517. package/dist/extensions/router/store.d.ts.map +1 -0
  518. package/dist/extensions/router/store.js +164 -0
  519. package/dist/extensions/router/store.js.map +1 -0
  520. package/dist/extensions/router/stream.d.ts +16 -0
  521. package/dist/extensions/router/stream.d.ts.map +1 -0
  522. package/dist/extensions/router/stream.js +198 -0
  523. package/dist/extensions/router/stream.js.map +1 -0
  524. package/dist/extensions/router/types.d.ts +23 -0
  525. package/dist/extensions/router/types.d.ts.map +1 -0
  526. package/dist/extensions/router/types.js +2 -0
  527. package/dist/extensions/router/types.js.map +1 -0
  528. package/dist/extensions/router/ui.d.ts +9 -0
  529. package/dist/extensions/router/ui.d.ts.map +1 -0
  530. package/dist/extensions/router/ui.js +538 -0
  531. package/dist/extensions/router/ui.js.map +1 -0
  532. package/dist/extensions/statusline/index.d.ts +3 -0
  533. package/dist/extensions/statusline/index.d.ts.map +1 -0
  534. package/dist/extensions/statusline/index.js +367 -0
  535. package/dist/extensions/statusline/index.js.map +1 -0
  536. package/dist/extensions/todo/constants.d.ts +16 -0
  537. package/dist/extensions/todo/constants.d.ts.map +1 -0
  538. package/dist/extensions/todo/constants.js +20 -0
  539. package/dist/extensions/todo/constants.js.map +1 -0
  540. package/dist/extensions/todo/index.d.ts +17 -0
  541. package/dist/extensions/todo/index.d.ts.map +1 -0
  542. package/dist/extensions/todo/index.js +83 -0
  543. package/dist/extensions/todo/index.js.map +1 -0
  544. package/dist/extensions/todo/overlay.d.ts +24 -0
  545. package/dist/extensions/todo/overlay.d.ts.map +1 -0
  546. package/dist/extensions/todo/overlay.js +139 -0
  547. package/dist/extensions/todo/overlay.js.map +1 -0
  548. package/dist/extensions/todo/schema.d.ts +41 -0
  549. package/dist/extensions/todo/schema.d.ts.map +1 -0
  550. package/dist/extensions/todo/schema.js +36 -0
  551. package/dist/extensions/todo/schema.js.map +1 -0
  552. package/dist/extensions/todo/state.d.ts +57 -0
  553. package/dist/extensions/todo/state.d.ts.map +1 -0
  554. package/dist/extensions/todo/state.js +452 -0
  555. package/dist/extensions/todo/state.js.map +1 -0
  556. package/dist/extensions/todo/view.d.ts +8 -0
  557. package/dist/extensions/todo/view.d.ts.map +1 -0
  558. package/dist/extensions/todo/view.js +119 -0
  559. package/dist/extensions/todo/view.js.map +1 -0
  560. package/dist/index.d.ts +35 -0
  561. package/dist/index.d.ts.map +1 -0
  562. package/dist/index.js +47 -0
  563. package/dist/index.js.map +1 -0
  564. package/dist/main.d.ts +12 -0
  565. package/dist/main.d.ts.map +1 -0
  566. package/dist/main.js +704 -0
  567. package/dist/main.js.map +1 -0
  568. package/dist/migrations.d.ts +33 -0
  569. package/dist/migrations.d.ts.map +1 -0
  570. package/dist/migrations.js +281 -0
  571. package/dist/migrations.js.map +1 -0
  572. package/dist/modes/index.d.ts +9 -0
  573. package/dist/modes/index.d.ts.map +1 -0
  574. package/dist/modes/index.js +8 -0
  575. package/dist/modes/index.js.map +1 -0
  576. package/dist/modes/interactive/assets/clankolas.png +0 -0
  577. package/dist/modes/interactive/components/armin.d.ts +34 -0
  578. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  579. package/dist/modes/interactive/components/armin.js +333 -0
  580. package/dist/modes/interactive/components/armin.js.map +1 -0
  581. package/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  582. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  583. package/dist/modes/interactive/components/assistant-message.js +141 -0
  584. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  585. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  586. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  587. package/dist/modes/interactive/components/bash-execution.js +175 -0
  588. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  589. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  590. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  591. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  592. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  593. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  594. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  595. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  596. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  597. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  598. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  599. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  600. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  601. package/dist/modes/interactive/components/config-selector.d.ts +102 -0
  602. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  603. package/dist/modes/interactive/components/config-selector.js +761 -0
  604. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  605. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  606. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  607. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  608. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  609. package/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  610. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  611. package/dist/modes/interactive/components/custom-editor.js +70 -0
  612. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  613. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  614. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  615. package/dist/modes/interactive/components/custom-entry.js +52 -0
  616. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  617. package/dist/modes/interactive/components/custom-message.d.ts +20 -0
  618. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  619. package/dist/modes/interactive/components/custom-message.js +79 -0
  620. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  621. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  622. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  623. package/dist/modes/interactive/components/daxnuts.js +140 -0
  624. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  625. package/dist/modes/interactive/components/diff.d.ts +12 -0
  626. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  627. package/dist/modes/interactive/components/diff.js +133 -0
  628. package/dist/modes/interactive/components/diff.js.map +1 -0
  629. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  630. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  631. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  632. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  633. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  634. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  635. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  636. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  637. package/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  638. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  639. package/dist/modes/interactive/components/extension-editor.js +128 -0
  640. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  641. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  642. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  643. package/dist/modes/interactive/components/extension-input.js +61 -0
  644. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  645. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  646. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  647. package/dist/modes/interactive/components/extension-selector.js +83 -0
  648. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  649. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  650. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  651. package/dist/modes/interactive/components/first-time-setup.js +103 -0
  652. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  653. package/dist/modes/interactive/components/footer.d.ts +32 -0
  654. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  655. package/dist/modes/interactive/components/footer.js +222 -0
  656. package/dist/modes/interactive/components/footer.js.map +1 -0
  657. package/dist/modes/interactive/components/index.d.ts +34 -0
  658. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  659. package/dist/modes/interactive/components/index.js +35 -0
  660. package/dist/modes/interactive/components/index.js.map +1 -0
  661. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  662. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  663. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  664. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  665. package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  666. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  667. package/dist/modes/interactive/components/login-dialog.js +188 -0
  668. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  669. package/dist/modes/interactive/components/model-selector.d.ts +54 -0
  670. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  671. package/dist/modes/interactive/components/model-selector.js +310 -0
  672. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  673. package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  674. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  675. package/dist/modes/interactive/components/oauth-selector.js +163 -0
  676. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  677. package/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  678. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  679. package/dist/modes/interactive/components/scoped-models-selector.js +293 -0
  680. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  681. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  682. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  683. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  684. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  685. package/dist/modes/interactive/components/session-selector.d.ts +95 -0
  686. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  687. package/dist/modes/interactive/components/session-selector.js +867 -0
  688. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  689. package/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  690. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  691. package/dist/modes/interactive/components/settings-selector.js +593 -0
  692. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  693. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  694. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  695. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  696. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  697. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  698. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  699. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  700. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  701. package/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  702. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
  703. package/dist/modes/interactive/components/status-indicator.js +60 -0
  704. package/dist/modes/interactive/components/status-indicator.js.map +1 -0
  705. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  706. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  707. package/dist/modes/interactive/components/theme-selector.js +50 -0
  708. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  709. package/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  710. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  711. package/dist/modes/interactive/components/thinking-selector.js +52 -0
  712. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  713. package/dist/modes/interactive/components/tool-execution.d.ts +62 -0
  714. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  715. package/dist/modes/interactive/components/tool-execution.js +361 -0
  716. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  717. package/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  718. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  719. package/dist/modes/interactive/components/tree-selector.js +1245 -0
  720. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  721. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  722. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  723. package/dist/modes/interactive/components/trust-selector.js +91 -0
  724. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  725. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  726. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  727. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  728. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  729. package/dist/modes/interactive/components/user-message.d.ts +14 -0
  730. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  731. package/dist/modes/interactive/components/user-message.js +42 -0
  732. package/dist/modes/interactive/components/user-message.js.map +1 -0
  733. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  734. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  735. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  736. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  737. package/dist/modes/interactive/interactive-mode.d.ts +394 -0
  738. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  739. package/dist/modes/interactive/interactive-mode.js +5039 -0
  740. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  741. package/dist/modes/interactive/model-search.d.ts +12 -0
  742. package/dist/modes/interactive/model-search.d.ts.map +1 -0
  743. package/dist/modes/interactive/model-search.js +15 -0
  744. package/dist/modes/interactive/model-search.js.map +1 -0
  745. package/dist/modes/interactive/theme/dark.json +87 -0
  746. package/dist/modes/interactive/theme/ice-cream-dark.json +101 -0
  747. package/dist/modes/interactive/theme/ice-cream-light.json +101 -0
  748. package/dist/modes/interactive/theme/light.json +86 -0
  749. package/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  750. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
  751. package/dist/modes/interactive/theme/theme-controller.js +102 -0
  752. package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
  753. package/dist/modes/interactive/theme/theme-schema.json +340 -0
  754. package/dist/modes/interactive/theme/theme.d.ts +120 -0
  755. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  756. package/dist/modes/interactive/theme/theme.js +1063 -0
  757. package/dist/modes/interactive/theme/theme.js.map +1 -0
  758. package/dist/modes/print-mode.d.ts +28 -0
  759. package/dist/modes/print-mode.d.ts.map +1 -0
  760. package/dist/modes/print-mode.js +132 -0
  761. package/dist/modes/print-mode.js.map +1 -0
  762. package/dist/modes/rpc/jsonl.d.ts +17 -0
  763. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  764. package/dist/modes/rpc/jsonl.js +49 -0
  765. package/dist/modes/rpc/jsonl.js.map +1 -0
  766. package/dist/modes/rpc/rpc-client.d.ts +246 -0
  767. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  768. package/dist/modes/rpc/rpc-client.js +488 -0
  769. package/dist/modes/rpc/rpc-client.js.map +1 -0
  770. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  771. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  772. package/dist/modes/rpc/rpc-mode.js +639 -0
  773. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  774. package/dist/modes/rpc/rpc-types.d.ts +457 -0
  775. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  776. package/dist/modes/rpc/rpc-types.js +8 -0
  777. package/dist/modes/rpc/rpc-types.js.map +1 -0
  778. package/dist/package-manager-cli.d.ts +8 -0
  779. package/dist/package-manager-cli.d.ts.map +1 -0
  780. package/dist/package-manager-cli.js +775 -0
  781. package/dist/package-manager-cli.js.map +1 -0
  782. package/dist/rpc-entry.d.ts +3 -0
  783. package/dist/rpc-entry.d.ts.map +1 -0
  784. package/dist/rpc-entry.js +10 -0
  785. package/dist/rpc-entry.js.map +1 -0
  786. package/dist/utils/ansi.d.ts +2 -0
  787. package/dist/utils/ansi.d.ts.map +1 -0
  788. package/dist/utils/ansi.js +52 -0
  789. package/dist/utils/ansi.js.map +1 -0
  790. package/dist/utils/changelog.d.ts +22 -0
  791. package/dist/utils/changelog.d.ts.map +1 -0
  792. package/dist/utils/changelog.js +165 -0
  793. package/dist/utils/changelog.js.map +1 -0
  794. package/dist/utils/child-process.d.ts +18 -0
  795. package/dist/utils/child-process.d.ts.map +1 -0
  796. package/dist/utils/child-process.js +106 -0
  797. package/dist/utils/child-process.js.map +1 -0
  798. package/dist/utils/clipboard-image.d.ts +11 -0
  799. package/dist/utils/clipboard-image.d.ts.map +1 -0
  800. package/dist/utils/clipboard-image.js +245 -0
  801. package/dist/utils/clipboard-image.js.map +1 -0
  802. package/dist/utils/clipboard-native.d.ts +11 -0
  803. package/dist/utils/clipboard-native.d.ts.map +1 -0
  804. package/dist/utils/clipboard-native.js +20 -0
  805. package/dist/utils/clipboard-native.js.map +1 -0
  806. package/dist/utils/clipboard.d.ts +4 -0
  807. package/dist/utils/clipboard.d.ts.map +1 -0
  808. package/dist/utils/clipboard.js +130 -0
  809. package/dist/utils/clipboard.js.map +1 -0
  810. package/dist/utils/deprecation.d.ts +4 -0
  811. package/dist/utils/deprecation.d.ts.map +1 -0
  812. package/dist/utils/deprecation.js +13 -0
  813. package/dist/utils/deprecation.js.map +1 -0
  814. package/dist/utils/exif-orientation.d.ts +5 -0
  815. package/dist/utils/exif-orientation.d.ts.map +1 -0
  816. package/dist/utils/exif-orientation.js +158 -0
  817. package/dist/utils/exif-orientation.js.map +1 -0
  818. package/dist/utils/frontmatter.d.ts +8 -0
  819. package/dist/utils/frontmatter.d.ts.map +1 -0
  820. package/dist/utils/frontmatter.js +26 -0
  821. package/dist/utils/frontmatter.js.map +1 -0
  822. package/dist/utils/fs-watch.d.ts +5 -0
  823. package/dist/utils/fs-watch.d.ts.map +1 -0
  824. package/dist/utils/fs-watch.js +25 -0
  825. package/dist/utils/fs-watch.js.map +1 -0
  826. package/dist/utils/git.d.ts +26 -0
  827. package/dist/utils/git.d.ts.map +1 -0
  828. package/dist/utils/git.js +195 -0
  829. package/dist/utils/git.js.map +1 -0
  830. package/dist/utils/html.d.ts +7 -0
  831. package/dist/utils/html.d.ts.map +1 -0
  832. package/dist/utils/html.js +40 -0
  833. package/dist/utils/html.js.map +1 -0
  834. package/dist/utils/image-convert.d.ts +10 -0
  835. package/dist/utils/image-convert.d.ts.map +1 -0
  836. package/dist/utils/image-convert.js +45 -0
  837. package/dist/utils/image-convert.js.map +1 -0
  838. package/dist/utils/image-process.d.ts +18 -0
  839. package/dist/utils/image-process.d.ts.map +1 -0
  840. package/dist/utils/image-process.js +83 -0
  841. package/dist/utils/image-process.js.map +1 -0
  842. package/dist/utils/image-resize-core.d.ts +30 -0
  843. package/dist/utils/image-resize-core.d.ts.map +1 -0
  844. package/dist/utils/image-resize-core.js +124 -0
  845. package/dist/utils/image-resize-core.js.map +1 -0
  846. package/dist/utils/image-resize-worker.d.ts +2 -0
  847. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  848. package/dist/utils/image-resize-worker.js +31 -0
  849. package/dist/utils/image-resize-worker.js.map +1 -0
  850. package/dist/utils/image-resize.d.ts +16 -0
  851. package/dist/utils/image-resize.d.ts.map +1 -0
  852. package/dist/utils/image-resize.js +97 -0
  853. package/dist/utils/image-resize.js.map +1 -0
  854. package/dist/utils/json.d.ts +3 -0
  855. package/dist/utils/json.d.ts.map +1 -0
  856. package/dist/utils/json.js +7 -0
  857. package/dist/utils/json.js.map +1 -0
  858. package/dist/utils/mime.d.ts +3 -0
  859. package/dist/utils/mime.d.ts.map +1 -0
  860. package/dist/utils/mime.js +110 -0
  861. package/dist/utils/mime.js.map +1 -0
  862. package/dist/utils/open-browser.d.ts +9 -0
  863. package/dist/utils/open-browser.d.ts.map +1 -0
  864. package/dist/utils/open-browser.js +22 -0
  865. package/dist/utils/open-browser.js.map +1 -0
  866. package/dist/utils/paths.d.ts +31 -0
  867. package/dist/utils/paths.d.ts.map +1 -0
  868. package/dist/utils/paths.js +92 -0
  869. package/dist/utils/paths.js.map +1 -0
  870. package/dist/utils/photon.d.ts +21 -0
  871. package/dist/utils/photon.d.ts.map +1 -0
  872. package/dist/utils/photon.js +121 -0
  873. package/dist/utils/photon.js.map +1 -0
  874. package/dist/utils/pi-user-agent.d.ts +2 -0
  875. package/dist/utils/pi-user-agent.d.ts.map +1 -0
  876. package/dist/utils/pi-user-agent.js +5 -0
  877. package/dist/utils/pi-user-agent.js.map +1 -0
  878. package/dist/utils/shell.d.ts +31 -0
  879. package/dist/utils/shell.d.ts.map +1 -0
  880. package/dist/utils/shell.js +202 -0
  881. package/dist/utils/shell.js.map +1 -0
  882. package/dist/utils/sleep.d.ts +5 -0
  883. package/dist/utils/sleep.d.ts.map +1 -0
  884. package/dist/utils/sleep.js +17 -0
  885. package/dist/utils/sleep.js.map +1 -0
  886. package/dist/utils/syntax-highlight.d.ts +12 -0
  887. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  888. package/dist/utils/syntax-highlight.js +118 -0
  889. package/dist/utils/syntax-highlight.js.map +1 -0
  890. package/dist/utils/tools-manager.d.ts +3 -0
  891. package/dist/utils/tools-manager.d.ts.map +1 -0
  892. package/dist/utils/tools-manager.js +328 -0
  893. package/dist/utils/tools-manager.js.map +1 -0
  894. package/dist/utils/version-check.d.ts +15 -0
  895. package/dist/utils/version-check.d.ts.map +1 -0
  896. package/dist/utils/version-check.js +54 -0
  897. package/dist/utils/version-check.js.map +1 -0
  898. package/dist/utils/windows-self-update.d.ts +3 -0
  899. package/dist/utils/windows-self-update.d.ts.map +1 -0
  900. package/dist/utils/windows-self-update.js +77 -0
  901. package/dist/utils/windows-self-update.js.map +1 -0
  902. package/docs/compaction.md +401 -0
  903. package/docs/containerization.md +111 -0
  904. package/docs/custom-provider.md +763 -0
  905. package/docs/development.md +71 -0
  906. package/docs/docs.json +156 -0
  907. package/docs/extensions.md +2953 -0
  908. package/docs/images/doom-extension.png +0 -0
  909. package/docs/images/exy.png +0 -0
  910. package/docs/images/interactive-mode.png +0 -0
  911. package/docs/images/tree-view.png +0 -0
  912. package/docs/index.md +77 -0
  913. package/docs/json.md +86 -0
  914. package/docs/keybindings.md +198 -0
  915. package/docs/llama-cpp.md +99 -0
  916. package/docs/models.md +540 -0
  917. package/docs/packages.md +228 -0
  918. package/docs/prompt-templates.md +96 -0
  919. package/docs/providers.md +301 -0
  920. package/docs/quickstart.md +165 -0
  921. package/docs/rpc.md +1559 -0
  922. package/docs/sdk.md +1186 -0
  923. package/docs/security.md +59 -0
  924. package/docs/session-format.md +436 -0
  925. package/docs/sessions.md +145 -0
  926. package/docs/settings.md +319 -0
  927. package/docs/shell-aliases.md +13 -0
  928. package/docs/skills.md +231 -0
  929. package/docs/terminal-setup.md +142 -0
  930. package/docs/termux.md +127 -0
  931. package/docs/themes.md +301 -0
  932. package/docs/tmux.md +63 -0
  933. package/docs/tui.md +942 -0
  934. package/docs/usage.md +311 -0
  935. package/docs/windows.md +17 -0
  936. package/examples/README.md +25 -0
  937. package/examples/extensions/README.md +213 -0
  938. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  939. package/examples/extensions/bash-spawn-hook.ts +30 -0
  940. package/examples/extensions/bookmark.ts +50 -0
  941. package/examples/extensions/border-status-editor.ts +145 -0
  942. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  943. package/examples/extensions/claude-rules.ts +86 -0
  944. package/examples/extensions/commands.ts +72 -0
  945. package/examples/extensions/confirm-destructive.ts +59 -0
  946. package/examples/extensions/custom-compaction.ts +129 -0
  947. package/examples/extensions/custom-footer.ts +64 -0
  948. package/examples/extensions/custom-header.ts +73 -0
  949. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  950. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  951. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  952. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -0
  953. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  954. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  955. package/examples/extensions/dirty-repo-guard.ts +56 -0
  956. package/examples/extensions/doom-overlay/README.md +46 -0
  957. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  958. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  959. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  960. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  961. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  962. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  963. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  964. package/examples/extensions/doom-overlay/index.ts +74 -0
  965. package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
  966. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  967. package/examples/extensions/dynamic-resources/dynamic.json +79 -0
  968. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  969. package/examples/extensions/dynamic-resources/index.ts +15 -0
  970. package/examples/extensions/dynamic-tools.ts +74 -0
  971. package/examples/extensions/entry-renderer.ts +41 -0
  972. package/examples/extensions/event-bus.ts +43 -0
  973. package/examples/extensions/file-trigger.ts +41 -0
  974. package/examples/extensions/git-checkpoint.ts +53 -0
  975. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  976. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  977. package/examples/extensions/gondolin/index.ts +531 -0
  978. package/examples/extensions/gondolin/package-lock.json +185 -0
  979. package/examples/extensions/gondolin/package.json +19 -0
  980. package/examples/extensions/handoff.ts +191 -0
  981. package/examples/extensions/hello.ts +26 -0
  982. package/examples/extensions/hidden-thinking-label.ts +53 -0
  983. package/examples/extensions/inline-bash.ts +94 -0
  984. package/examples/extensions/input-transform-streaming.ts +39 -0
  985. package/examples/extensions/input-transform.ts +43 -0
  986. package/examples/extensions/interactive-shell.ts +196 -0
  987. package/examples/extensions/kimi-deferred-tools.ts +61 -0
  988. package/examples/extensions/mac-system-theme.ts +47 -0
  989. package/examples/extensions/message-renderer.ts +59 -0
  990. package/examples/extensions/minimal-mode.ts +426 -0
  991. package/examples/extensions/modal-editor.ts +85 -0
  992. package/examples/extensions/model-status.ts +31 -0
  993. package/examples/extensions/notify.ts +55 -0
  994. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  995. package/examples/extensions/overlay-test.ts +153 -0
  996. package/examples/extensions/permission-gate.ts +34 -0
  997. package/examples/extensions/pirate.ts +47 -0
  998. package/examples/extensions/plan-mode/README.md +66 -0
  999. package/examples/extensions/plan-mode/index.ts +390 -0
  1000. package/examples/extensions/plan-mode/utils.ts +168 -0
  1001. package/examples/extensions/preset.ts +436 -0
  1002. package/examples/extensions/project-trust.ts +64 -0
  1003. package/examples/extensions/prompt-customizer.ts +97 -0
  1004. package/examples/extensions/protected-paths.ts +30 -0
  1005. package/examples/extensions/provider-payload.ts +18 -0
  1006. package/examples/extensions/qna.ts +122 -0
  1007. package/examples/extensions/question.ts +286 -0
  1008. package/examples/extensions/questionnaire.ts +448 -0
  1009. package/examples/extensions/rainbow-editor.ts +88 -0
  1010. package/examples/extensions/reload-runtime.ts +37 -0
  1011. package/examples/extensions/rpc-demo.ts +118 -0
  1012. package/examples/extensions/sandbox/index.ts +321 -0
  1013. package/examples/extensions/sandbox/package-lock.json +92 -0
  1014. package/examples/extensions/sandbox/package.json +19 -0
  1015. package/examples/extensions/send-user-message.ts +97 -0
  1016. package/examples/extensions/session-name.ts +27 -0
  1017. package/examples/extensions/shutdown-command.ts +63 -0
  1018. package/examples/extensions/snake.ts +343 -0
  1019. package/examples/extensions/space-invaders.ts +560 -0
  1020. package/examples/extensions/ssh.ts +220 -0
  1021. package/examples/extensions/status-line.ts +32 -0
  1022. package/examples/extensions/structured-output.ts +65 -0
  1023. package/examples/extensions/subagent/README.md +175 -0
  1024. package/examples/extensions/subagent/agents/planner.md +37 -0
  1025. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1026. package/examples/extensions/subagent/agents/scout.md +50 -0
  1027. package/examples/extensions/subagent/agents/worker.md +24 -0
  1028. package/examples/extensions/subagent/agents.ts +126 -0
  1029. package/examples/extensions/subagent/index.ts +1009 -0
  1030. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1031. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1032. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1033. package/examples/extensions/summarize.ts +207 -0
  1034. package/examples/extensions/system-prompt-header.ts +17 -0
  1035. package/examples/extensions/tic-tac-toe.ts +1008 -0
  1036. package/examples/extensions/timed-confirm.ts +70 -0
  1037. package/examples/extensions/titlebar-spinner.ts +58 -0
  1038. package/examples/extensions/todo.ts +297 -0
  1039. package/examples/extensions/tool-override.ts +144 -0
  1040. package/examples/extensions/tools.ts +146 -0
  1041. package/examples/extensions/trigger-compact.ts +50 -0
  1042. package/examples/extensions/truncated-tool.ts +195 -0
  1043. package/examples/extensions/widget-placement.ts +9 -0
  1044. package/examples/extensions/with-deps/index.ts +32 -0
  1045. package/examples/extensions/with-deps/package-lock.json +31 -0
  1046. package/examples/extensions/with-deps/package.json +22 -0
  1047. package/examples/extensions/working-indicator.ts +123 -0
  1048. package/examples/extensions/working-message-test.ts +25 -0
  1049. package/examples/rpc-extension-ui.ts +632 -0
  1050. package/examples/sdk/01-minimal.ts +26 -0
  1051. package/examples/sdk/02-custom-model.ts +50 -0
  1052. package/examples/sdk/03-custom-prompt.ts +70 -0
  1053. package/examples/sdk/04-skills.ts +55 -0
  1054. package/examples/sdk/05-tools.ts +48 -0
  1055. package/examples/sdk/06-extensions.ts +94 -0
  1056. package/examples/sdk/07-context-files.ts +42 -0
  1057. package/examples/sdk/08-prompt-templates.ts +51 -0
  1058. package/examples/sdk/09-api-keys-and-oauth.ts +34 -0
  1059. package/examples/sdk/10-settings.ts +53 -0
  1060. package/examples/sdk/11-sessions.ts +52 -0
  1061. package/examples/sdk/12-full-control.ts +72 -0
  1062. package/examples/sdk/13-session-runtime.ts +67 -0
  1063. package/examples/sdk/README.md +140 -0
  1064. package/npm-shrinkwrap.json +1824 -0
  1065. package/package.json +99 -0
@@ -0,0 +1,253 @@
1
+ /**
2
+ * rewind — file-backed checkpoint & rewind for Pi.
3
+ *
4
+ * Engine: instead of snapshotting the whole work tree into a per-session shadow
5
+ * git repo (the old design, which froze the UI in large directories like a
6
+ * multi-project parent folder and grew storage without bound), we back up ONLY
7
+ * the files Pi's edit/write tools are about to modify — one copyFile before each
8
+ * edit (see engine.ts, ported from Claude Code's file-history). Cost is
9
+ * proportional to how many files Pi changed, never to project size.
10
+ *
11
+ * Per turn: before_agent_start opens a snapshot frame (re-recording tracked files
12
+ * at their turn-start state); tool_call(edit|write) backs up each newly edited
13
+ * file before it lands; agent_settled persists the frame to the session JSONL
14
+ * (custom "pi-rewind-snapshot" entry) when it changed. agent_settled is used
15
+ * instead of agent_end so auto-retry, overflow compaction-retry, and queued
16
+ * follow-ups stay in one logical turn (agent_end can fire mid-continuation).
17
+ * On session_start the index is rebuilt from those entries; resume/fork
18
+ * hard-links the prior session's blobs.
19
+ *
20
+ * Time-travel is fused into /tree: navigating to a node whose turn changed files
21
+ * offers to sync the work tree to that point (session_before_tree/session_tree).
22
+ * /rewind itself is a settings + storage menu (menu.ts), not a restore picker.
23
+ *
24
+ * Restore safety: applySnapshot only rewrites files that differ and never throws
25
+ * out — a broken backup degrades to "leave the file alone", so it can never abort
26
+ * the user's session.
27
+ *
28
+ * Architecture informed by oh-my-pi (GPL-3.0) and Claude Code's file-history;
29
+ * independent implementation. No ANSI: all UI is native (ctx.ui.* + theme).
30
+ */
31
+ import path from "node:path";
32
+ import { loadRewindConfig, reloadRewindConfig } from "./config.js";
33
+ import { beginTurn, disposeSession, endTurn, getSnapshots, migrateBackupsFromSession, registerSession, restoreStateFromSnapshots, trackEdit, } from "./engine.js";
34
+ import { runGc, sessionIdFromFile } from "./gc.js";
35
+ import { runRewindMenu } from "./menu.js";
36
+ import { rewindBackupsRoot, sessionsDirectory } from "./paths.js";
37
+ import { restoreToSnapshot, snapshotChangeDiffStats, snapshotChangedPaths, snapshotForEntry } from "./restore.js";
38
+ import { isSnapshot, SNAPSHOT_ENTRY_TYPE } from "./snapshot.js";
39
+ import { configureStorage } from "./storage.js";
40
+ import { truncateText } from "./text.js";
41
+ import { editWriteTargetPath, resolveToolPath } from "./tool-path.js";
42
+ // Bind the engine/gc storage roots to the real on-disk locations (they avoid
43
+ // importing paths.ts directly so they stay node-testable). Safe to call at load.
44
+ configureStorage({ backupsRoot: rewindBackupsRoot(), sessionsRoot: sessionsDirectory() });
45
+ // Global (one config.json). Reloaded from disk at session_start; /rewind menu
46
+ // saveRewindConfig updates the in-memory cache so the next turn sees changes
47
+ // without re-reading the file every before_agent_start.
48
+ let config = loadRewindConfig();
49
+ // Per-session transient state held by the integration layer.
50
+ const pendingPrompt = new Map(); // turn prompt, captured for the snapshot label
51
+ const pendingTreeRestore = new Map(); // /tree sync intent
52
+ // ---- helpers --------------------------------------------------------------
53
+ /** The id of the last user message in the current branch (the turn's anchor). */
54
+ function lastUserEntryId(ctx) {
55
+ const branch = ctx.sessionManager.getBranch();
56
+ for (let i = branch.length - 1; i >= 0; i--) {
57
+ const e = branch[i];
58
+ if (e.type === "message" && e.message.role === "user")
59
+ return e.id;
60
+ }
61
+ return undefined;
62
+ }
63
+ /** Rebuild the snapshot list for a session from its persisted custom entries. */
64
+ function rebuildSnapshots(ctx) {
65
+ const out = [];
66
+ for (const entry of ctx.sessionManager.getEntries()) {
67
+ if (entry.type === "custom" && entry.customType === SNAPSHOT_ENTRY_TYPE && isSnapshot(entry.data)) {
68
+ out.push(entry.data);
69
+ }
70
+ }
71
+ return out;
72
+ }
73
+ /** Max files listed in the /tree restore confirmation before "+N more". */
74
+ const RESTORE_PREVIEW_LIMIT = 8;
75
+ /** Max characters per previewed path (leading-truncated: the filename matters most). */
76
+ const RESTORE_PREVIEW_PATH_MAX = 64;
77
+ /**
78
+ * Bounded cwd-relative file list shown under the /tree restore question, so an
79
+ * irreversible work-tree rewrite is confirmed against WHICH files, not just a
80
+ * count. Multi-line select titles are upstream-sanctioned (ui.confirm joins
81
+ * title + message with \n through the same selector).
82
+ */
83
+ function formatRestorePreview(changedPaths, cwd) {
84
+ const lines = changedPaths.slice(0, RESTORE_PREVIEW_LIMIT).map((p) => {
85
+ const rel = path.relative(cwd, p);
86
+ const display = rel && !rel.startsWith("..") && !path.isAbsolute(rel) ? rel : p;
87
+ const bounded = display.length > RESTORE_PREVIEW_PATH_MAX ? `…${display.slice(-(RESTORE_PREVIEW_PATH_MAX - 1))}` : display;
88
+ return ` ${bounded}`;
89
+ });
90
+ if (changedPaths.length > RESTORE_PREVIEW_LIMIT) {
91
+ lines.push(` … +${changedPaths.length - RESTORE_PREVIEW_LIMIT} more`);
92
+ }
93
+ return lines.join("\n");
94
+ }
95
+ // ---- extension entry ------------------------------------------------------
96
+ export default function rewind(pi) {
97
+ // session_start: rebuild the index, migrate fork/resume blobs, reclaim storage.
98
+ pi.on("session_start", async (event, ctx) => {
99
+ config = reloadRewindConfig();
100
+ const sid = ctx.sessionManager.getSessionId();
101
+ if (!sid)
102
+ return;
103
+ registerSession(sid, ctx.cwd);
104
+ const snapshots = rebuildSnapshots(ctx);
105
+ restoreStateFromSnapshots(sid, ctx.cwd, snapshots, config.maxSnapshots);
106
+ if ((event.reason === "resume" || event.reason === "fork") && event.previousSessionFile) {
107
+ const prevSid = sessionIdFromFile(event.previousSessionFile);
108
+ if (prevSid) {
109
+ try {
110
+ await migrateBackupsFromSession(prevSid, sid, snapshots);
111
+ }
112
+ catch {
113
+ // best-effort; a missing blob just means that version can't restore
114
+ }
115
+ }
116
+ }
117
+ try {
118
+ runGc(config.retentionDays, sid);
119
+ }
120
+ catch {
121
+ // GC is best-effort; never block startup
122
+ }
123
+ });
124
+ // tool_call: back up the target file BEFORE the edit/write lands. Synchronous
125
+ // so the backup is on disk before the hook returns control to the agent loop.
126
+ pi.on("tool_call", (event, ctx) => {
127
+ if (event.toolName !== "edit" && event.toolName !== "write")
128
+ return;
129
+ if (!config.enabled)
130
+ return;
131
+ const sid = ctx.sessionManager.getSessionId();
132
+ if (!sid)
133
+ return;
134
+ const rawPath = editWriteTargetPath(event.input);
135
+ if (!rawPath)
136
+ return;
137
+ const abs = resolveToolPath(rawPath, ctx.cwd);
138
+ try {
139
+ trackEdit(sid, abs);
140
+ }
141
+ catch {
142
+ // never block the edit on a backup failure
143
+ }
144
+ });
145
+ // before_agent_start: open the turn's snapshot frame.
146
+ pi.on("before_agent_start", async (event, ctx) => {
147
+ // Memory-cached; session_start reloads disk, /rewind save updates cache.
148
+ config = loadRewindConfig();
149
+ if (!config.enabled)
150
+ return;
151
+ const sid = ctx.sessionManager.getSessionId();
152
+ if (!sid)
153
+ return;
154
+ pendingPrompt.set(sid, event.prompt ?? "");
155
+ try {
156
+ await beginTurn(sid);
157
+ }
158
+ catch {
159
+ // non-fatal
160
+ }
161
+ });
162
+ // agent_settled: finalize + persist after Pi will not auto-continue (retry /
163
+ // compact-retry / follow-up). agent_end alone is too early for that.
164
+ pi.on("agent_settled", async (_event, ctx) => {
165
+ if (!config.enabled)
166
+ return;
167
+ const sid = ctx.sessionManager.getSessionId();
168
+ if (!sid)
169
+ return;
170
+ const userEntryId = lastUserEntryId(ctx) ?? "";
171
+ const turnId = ctx.sessionManager.getLeafId() ?? userEntryId;
172
+ const prompt = truncateText(pendingPrompt.get(sid) ?? "", 120, { collapseWhitespace: true });
173
+ pendingPrompt.delete(sid);
174
+ const frame = endTurn(sid, userEntryId, turnId, prompt, new Date().toISOString(), config.maxSnapshots);
175
+ if (frame && userEntryId) {
176
+ pi.appendEntry(SNAPSHOT_ENTRY_TYPE, frame);
177
+ }
178
+ });
179
+ // session_before_tree: offer to sync files when navigating to a changed point.
180
+ pi.on("session_before_tree", async (event, ctx) => {
181
+ const sid = ctx.sessionManager.getSessionId();
182
+ if (!sid)
183
+ return;
184
+ pendingTreeRestore.set(sid, null);
185
+ if (!config.enabled)
186
+ return;
187
+ const target = snapshotForEntry(getSnapshots(sid), ctx.sessionManager, event.preparation.targetId);
188
+ if (!target)
189
+ return;
190
+ const changed = await snapshotChangedPaths(sid, target);
191
+ if (changed.length === 0)
192
+ return; // silent nav, like native /tree
193
+ // Lifecycle handler: silent-return without UI. (hasUI is the guard for
194
+ // ctx.ui.*; checking ctx.mode here would wrongly proceed when a TUI
195
+ // session has no usable UI.)
196
+ if (!ctx.hasUI)
197
+ return;
198
+ const n = changed.length;
199
+ let lineStats = "";
200
+ try {
201
+ const stats = await snapshotChangeDiffStats(sid, target, changed);
202
+ if (stats.insertions > 0 || stats.deletions > 0) {
203
+ lineStats = ` (+${stats.insertions} / −${stats.deletions})`;
204
+ }
205
+ }
206
+ catch {
207
+ // Coarse stats are best-effort; still offer path preview.
208
+ }
209
+ const choice = await ctx.ui.select(`Restore ${n} file${n === 1 ? "" : "s"} to this point?${lineStats}\n${formatRestorePreview(changed, ctx.cwd)}`, ["Yes, restore files", "No, conversation only"]);
210
+ if (choice?.startsWith("Yes")) {
211
+ // Cache paths so session_tree can apply without a second full compare.
212
+ pendingTreeRestore.set(sid, { snapshot: target, changedPaths: changed });
213
+ }
214
+ });
215
+ // session_tree: execute any sync intent recorded above.
216
+ pi.on("session_tree", async (_event, ctx) => {
217
+ const sid = ctx.sessionManager.getSessionId();
218
+ if (!sid)
219
+ return;
220
+ const pending = pendingTreeRestore.get(sid);
221
+ pendingTreeRestore.set(sid, null);
222
+ if (!pending)
223
+ return;
224
+ try {
225
+ const changed = await restoreToSnapshot(sid, pending.snapshot, {
226
+ onlyPaths: new Set(pending.changedPaths),
227
+ });
228
+ if (changed.length > 0) {
229
+ ctx.ui.notify(`Restored ${changed.length} file${changed.length === 1 ? "" : "s"} to this checkpoint.`, "info");
230
+ }
231
+ }
232
+ catch (e) {
233
+ ctx.ui.notify(`Rewind restore failed: ${String(e)}`, "warning");
234
+ }
235
+ });
236
+ // session_shutdown: drop this session's in-memory state.
237
+ pi.on("session_shutdown", async (_event, ctx) => {
238
+ const sid = ctx.sessionManager.getSessionId();
239
+ if (!sid)
240
+ return;
241
+ disposeSession(sid);
242
+ pendingTreeRestore.delete(sid);
243
+ pendingPrompt.delete(sid);
244
+ });
245
+ // /rewind: settings + storage menu (time-travel itself is via /tree).
246
+ pi.registerCommand("rewind", {
247
+ description: "Rewind settings and backup storage (restore is via /tree)",
248
+ handler: async (_args, ctx) => {
249
+ await runRewindMenu(ctx);
250
+ },
251
+ });
252
+ }
253
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/rewind/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * rewind — file-backed checkpoint & rewind for Pi.\n *\n * Engine: instead of snapshotting the whole work tree into a per-session shadow\n * git repo (the old design, which froze the UI in large directories like a\n * multi-project parent folder and grew storage without bound), we back up ONLY\n * the files Pi's edit/write tools are about to modify — one copyFile before each\n * edit (see engine.ts, ported from Claude Code's file-history). Cost is\n * proportional to how many files Pi changed, never to project size.\n *\n * Per turn: before_agent_start opens a snapshot frame (re-recording tracked files\n * at their turn-start state); tool_call(edit|write) backs up each newly edited\n * file before it lands; agent_settled persists the frame to the session JSONL\n * (custom \"pi-rewind-snapshot\" entry) when it changed. agent_settled is used\n * instead of agent_end so auto-retry, overflow compaction-retry, and queued\n * follow-ups stay in one logical turn (agent_end can fire mid-continuation).\n * On session_start the index is rebuilt from those entries; resume/fork\n * hard-links the prior session's blobs.\n *\n * Time-travel is fused into /tree: navigating to a node whose turn changed files\n * offers to sync the work tree to that point (session_before_tree/session_tree).\n * /rewind itself is a settings + storage menu (menu.ts), not a restore picker.\n *\n * Restore safety: applySnapshot only rewrites files that differ and never throws\n * out — a broken backup degrades to \"leave the file alone\", so it can never abort\n * the user's session.\n *\n * Architecture informed by oh-my-pi (GPL-3.0) and Claude Code's file-history;\n * independent implementation. No ANSI: all UI is native (ctx.ui.* + theme).\n */\nimport path from \"node:path\";\n\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport type { ExtensionAPI, ExtensionContext } from \"../../core/extensions/types.ts\";\n\nimport { loadRewindConfig, type RewindConfig, reloadRewindConfig } from \"./config.ts\";\nimport {\n\tbeginTurn,\n\tdisposeSession,\n\tendTurn,\n\tgetSnapshots,\n\tmigrateBackupsFromSession,\n\tregisterSession,\n\trestoreStateFromSnapshots,\n\ttrackEdit,\n} from \"./engine.ts\";\nimport { runGc, sessionIdFromFile } from \"./gc.ts\";\nimport { runRewindMenu } from \"./menu.ts\";\nimport { rewindBackupsRoot, sessionsDirectory } from \"./paths.ts\";\nimport { restoreToSnapshot, snapshotChangeDiffStats, snapshotChangedPaths, snapshotForEntry } from \"./restore.ts\";\nimport { type FileHistorySnapshot, isSnapshot, SNAPSHOT_ENTRY_TYPE } from \"./snapshot.ts\";\nimport { configureStorage } from \"./storage.ts\";\nimport { truncateText } from \"./text.ts\";\nimport { editWriteTargetPath, resolveToolPath } from \"./tool-path.ts\";\n\n// Bind the engine/gc storage roots to the real on-disk locations (they avoid\n// importing paths.ts directly so they stay node-testable). Safe to call at load.\nconfigureStorage({ backupsRoot: rewindBackupsRoot(), sessionsRoot: sessionsDirectory() });\n\n// Global (one config.json). Reloaded from disk at session_start; /rewind menu\n// saveRewindConfig updates the in-memory cache so the next turn sees changes\n// without re-reading the file every before_agent_start.\nlet config: RewindConfig = loadRewindConfig();\n\n/** /tree confirm → apply payload (changedPaths skips a second originChanged pass). */\ninterface PendingTreeRestore {\n\tsnapshot: FileHistorySnapshot;\n\tchangedPaths: string[];\n}\n\n// Per-session transient state held by the integration layer.\nconst pendingPrompt = new Map<string, string>(); // turn prompt, captured for the snapshot label\nconst pendingTreeRestore = new Map<string, PendingTreeRestore | null>(); // /tree sync intent\n\n// ---- helpers --------------------------------------------------------------\n\n/** The id of the last user message in the current branch (the turn's anchor). */\nfunction lastUserEntryId(ctx: ExtensionContext): string | undefined {\n\tconst branch = ctx.sessionManager.getBranch();\n\tfor (let i = branch.length - 1; i >= 0; i--) {\n\t\tconst e = branch[i];\n\t\tif (e.type === \"message\" && (e.message as AgentMessage).role === \"user\") return e.id;\n\t}\n\treturn undefined;\n}\n\n/** Rebuild the snapshot list for a session from its persisted custom entries. */\nfunction rebuildSnapshots(ctx: ExtensionContext): FileHistorySnapshot[] {\n\tconst out: FileHistorySnapshot[] = [];\n\tfor (const entry of ctx.sessionManager.getEntries()) {\n\t\tif (entry.type === \"custom\" && entry.customType === SNAPSHOT_ENTRY_TYPE && isSnapshot(entry.data)) {\n\t\t\tout.push(entry.data);\n\t\t}\n\t}\n\treturn out;\n}\n\n/** Max files listed in the /tree restore confirmation before \"+N more\". */\nconst RESTORE_PREVIEW_LIMIT = 8;\n/** Max characters per previewed path (leading-truncated: the filename matters most). */\nconst RESTORE_PREVIEW_PATH_MAX = 64;\n\n/**\n * Bounded cwd-relative file list shown under the /tree restore question, so an\n * irreversible work-tree rewrite is confirmed against WHICH files, not just a\n * count. Multi-line select titles are upstream-sanctioned (ui.confirm joins\n * title + message with \\n through the same selector).\n */\nfunction formatRestorePreview(changedPaths: string[], cwd: string): string {\n\tconst lines = changedPaths.slice(0, RESTORE_PREVIEW_LIMIT).map((p) => {\n\t\tconst rel = path.relative(cwd, p);\n\t\tconst display = rel && !rel.startsWith(\"..\") && !path.isAbsolute(rel) ? rel : p;\n\t\tconst bounded =\n\t\t\tdisplay.length > RESTORE_PREVIEW_PATH_MAX ? `…${display.slice(-(RESTORE_PREVIEW_PATH_MAX - 1))}` : display;\n\t\treturn ` ${bounded}`;\n\t});\n\tif (changedPaths.length > RESTORE_PREVIEW_LIMIT) {\n\t\tlines.push(` … +${changedPaths.length - RESTORE_PREVIEW_LIMIT} more`);\n\t}\n\treturn lines.join(\"\\n\");\n}\n\n// ---- extension entry ------------------------------------------------------\n\nexport default function rewind(pi: ExtensionAPI): void {\n\t// session_start: rebuild the index, migrate fork/resume blobs, reclaim storage.\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tconfig = reloadRewindConfig();\n\t\tconst sid = ctx.sessionManager.getSessionId();\n\t\tif (!sid) return;\n\t\tregisterSession(sid, ctx.cwd);\n\n\t\tconst snapshots = rebuildSnapshots(ctx);\n\t\trestoreStateFromSnapshots(sid, ctx.cwd, snapshots, config.maxSnapshots);\n\n\t\tif ((event.reason === \"resume\" || event.reason === \"fork\") && event.previousSessionFile) {\n\t\t\tconst prevSid = sessionIdFromFile(event.previousSessionFile);\n\t\t\tif (prevSid) {\n\t\t\t\ttry {\n\t\t\t\t\tawait migrateBackupsFromSession(prevSid, sid, snapshots);\n\t\t\t\t} catch {\n\t\t\t\t\t// best-effort; a missing blob just means that version can't restore\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\trunGc(config.retentionDays, sid);\n\t\t} catch {\n\t\t\t// GC is best-effort; never block startup\n\t\t}\n\t});\n\n\t// tool_call: back up the target file BEFORE the edit/write lands. Synchronous\n\t// so the backup is on disk before the hook returns control to the agent loop.\n\tpi.on(\"tool_call\", (event, ctx) => {\n\t\tif (event.toolName !== \"edit\" && event.toolName !== \"write\") return;\n\t\tif (!config.enabled) return;\n\t\tconst sid = ctx.sessionManager.getSessionId();\n\t\tif (!sid) return;\n\t\tconst rawPath = editWriteTargetPath(event.input);\n\t\tif (!rawPath) return;\n\t\tconst abs = resolveToolPath(rawPath, ctx.cwd);\n\t\ttry {\n\t\t\ttrackEdit(sid, abs);\n\t\t} catch {\n\t\t\t// never block the edit on a backup failure\n\t\t}\n\t});\n\n\t// before_agent_start: open the turn's snapshot frame.\n\tpi.on(\"before_agent_start\", async (event, ctx) => {\n\t\t// Memory-cached; session_start reloads disk, /rewind save updates cache.\n\t\tconfig = loadRewindConfig();\n\t\tif (!config.enabled) return;\n\t\tconst sid = ctx.sessionManager.getSessionId();\n\t\tif (!sid) return;\n\t\tpendingPrompt.set(sid, event.prompt ?? \"\");\n\t\ttry {\n\t\t\tawait beginTurn(sid);\n\t\t} catch {\n\t\t\t// non-fatal\n\t\t}\n\t});\n\n\t// agent_settled: finalize + persist after Pi will not auto-continue (retry /\n\t// compact-retry / follow-up). agent_end alone is too early for that.\n\tpi.on(\"agent_settled\", async (_event, ctx) => {\n\t\tif (!config.enabled) return;\n\t\tconst sid = ctx.sessionManager.getSessionId();\n\t\tif (!sid) return;\n\t\tconst userEntryId = lastUserEntryId(ctx) ?? \"\";\n\t\tconst turnId = ctx.sessionManager.getLeafId() ?? userEntryId;\n\t\tconst prompt = truncateText(pendingPrompt.get(sid) ?? \"\", 120, { collapseWhitespace: true });\n\t\tpendingPrompt.delete(sid);\n\t\tconst frame = endTurn(sid, userEntryId, turnId, prompt, new Date().toISOString(), config.maxSnapshots);\n\t\tif (frame && userEntryId) {\n\t\t\tpi.appendEntry(SNAPSHOT_ENTRY_TYPE, frame);\n\t\t}\n\t});\n\n\t// session_before_tree: offer to sync files when navigating to a changed point.\n\tpi.on(\"session_before_tree\", async (event, ctx) => {\n\t\tconst sid = ctx.sessionManager.getSessionId();\n\t\tif (!sid) return;\n\t\tpendingTreeRestore.set(sid, null);\n\t\tif (!config.enabled) return;\n\n\t\tconst target = snapshotForEntry(getSnapshots(sid), ctx.sessionManager, event.preparation.targetId);\n\t\tif (!target) return;\n\t\tconst changed = await snapshotChangedPaths(sid, target);\n\t\tif (changed.length === 0) return; // silent nav, like native /tree\n\t\t// Lifecycle handler: silent-return without UI. (hasUI is the guard for\n\t\t// ctx.ui.*; checking ctx.mode here would wrongly proceed when a TUI\n\t\t// session has no usable UI.)\n\t\tif (!ctx.hasUI) return;\n\n\t\tconst n = changed.length;\n\t\tlet lineStats = \"\";\n\t\ttry {\n\t\t\tconst stats = await snapshotChangeDiffStats(sid, target, changed);\n\t\t\tif (stats.insertions > 0 || stats.deletions > 0) {\n\t\t\t\tlineStats = ` (+${stats.insertions} / −${stats.deletions})`;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Coarse stats are best-effort; still offer path preview.\n\t\t}\n\t\tconst choice = await ctx.ui.select(\n\t\t\t`Restore ${n} file${n === 1 ? \"\" : \"s\"} to this point?${lineStats}\\n${formatRestorePreview(changed, ctx.cwd)}`,\n\t\t\t[\"Yes, restore files\", \"No, conversation only\"],\n\t\t);\n\t\tif (choice?.startsWith(\"Yes\")) {\n\t\t\t// Cache paths so session_tree can apply without a second full compare.\n\t\t\tpendingTreeRestore.set(sid, { snapshot: target, changedPaths: changed });\n\t\t}\n\t});\n\n\t// session_tree: execute any sync intent recorded above.\n\tpi.on(\"session_tree\", async (_event, ctx) => {\n\t\tconst sid = ctx.sessionManager.getSessionId();\n\t\tif (!sid) return;\n\t\tconst pending = pendingTreeRestore.get(sid);\n\t\tpendingTreeRestore.set(sid, null);\n\t\tif (!pending) return;\n\t\ttry {\n\t\t\tconst changed = await restoreToSnapshot(sid, pending.snapshot, {\n\t\t\t\tonlyPaths: new Set(pending.changedPaths),\n\t\t\t});\n\t\t\tif (changed.length > 0) {\n\t\t\t\tctx.ui.notify(\n\t\t\t\t\t`Restored ${changed.length} file${changed.length === 1 ? \"\" : \"s\"} to this checkpoint.`,\n\t\t\t\t\t\"info\",\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tctx.ui.notify(`Rewind restore failed: ${String(e)}`, \"warning\");\n\t\t}\n\t});\n\n\t// session_shutdown: drop this session's in-memory state.\n\tpi.on(\"session_shutdown\", async (_event, ctx) => {\n\t\tconst sid = ctx.sessionManager.getSessionId();\n\t\tif (!sid) return;\n\t\tdisposeSession(sid);\n\t\tpendingTreeRestore.delete(sid);\n\t\tpendingPrompt.delete(sid);\n\t});\n\n\t// /rewind: settings + storage menu (time-travel itself is via /tree).\n\tpi.registerCommand(\"rewind\", {\n\t\tdescription: \"Rewind settings and backup storage (restore is via /tree)\",\n\t\thandler: async (_args, ctx) => {\n\t\t\tawait runRewindMenu(ctx);\n\t\t},\n\t});\n}\n"]}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * menu.ts — the `/rewind` settings menu.
3
+ *
4
+ * Per the design, /rewind no longer performs the time-travel itself — restoring
5
+ * files is fused into /tree navigation (see index.ts session_before_tree/
6
+ * session_tree). /rewind is purely a settings + storage console:
7
+ * - toggle the master switch
8
+ * - set the auto-clean retention window
9
+ * - inspect and prune backup storage (aged / orphaned / all-but-current)
10
+ */
11
+ import type { ExtensionCommandContext } from "../../core/extensions/types.ts";
12
+ export declare function runRewindMenu(ctx: ExtensionCommandContext): Promise<void>;
13
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../src/extensions/rewind/menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAQ9E,wBAAsB,aAAa,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B/E","sourcesContent":["/**\n * menu.ts — the `/rewind` settings menu.\n *\n * Per the design, /rewind no longer performs the time-travel itself — restoring\n * files is fused into /tree navigation (see index.ts session_before_tree/\n * session_tree). /rewind is purely a settings + storage console:\n * - toggle the master switch\n * - set the auto-clean retention window\n * - inspect and prune backup storage (aged / orphaned / all-but-current)\n */\nimport type { ExtensionCommandContext } from \"../../core/extensions/types.ts\";\n\nimport { loadRewindConfig, saveRewindConfig } from \"./config.ts\";\nimport { listSessions, removeSession, runGc } from \"./gc.ts\";\nimport { formatSize } from \"./text.ts\";\n\nconst RETENTION_PRESETS = [7, 14, 30, 60, 90];\n\nexport async function runRewindMenu(ctx: ExtensionCommandContext): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/rewind requires an interactive UI.\", \"warning\");\n\t\treturn;\n\t}\n\tconst sid = ctx.sessionManager.getSessionId() ?? undefined;\n\n\tfor (;;) {\n\t\tconst cfg = loadRewindConfig();\n\t\tconst sessions = listSessions(sid);\n\t\tconst total = sessions.reduce((n, s) => n + s.bytes, 0);\n\n\t\tconst enabledLabel = `Rewind: ${cfg.enabled ? \"on\" : \"off\"}`;\n\t\tconst retentionLabel = `Auto-clean backups: ${cfg.retentionDays > 0 ? `after ${cfg.retentionDays} days` : \"never (keep forever)\"}`;\n\t\tconst storageLabel = `Storage: ${formatSize(total)} across ${sessions.length} session${sessions.length === 1 ? \"\" : \"s\"}`;\n\n\t\tconst pick = await ctx.ui.select(\"Rewind settings (Esc to close)\", [enabledLabel, retentionLabel, storageLabel]);\n\t\tif (!pick) return;\n\n\t\tif (pick === enabledLabel) {\n\t\t\tsaveRewindConfig({ ...cfg, enabled: !cfg.enabled });\n\t\t\tctx.ui.notify(`Rewind ${cfg.enabled ? \"disabled\" : \"enabled\"}.`, \"info\");\n\t\t} else if (pick === retentionLabel) {\n\t\t\tawait pickRetention(ctx);\n\t\t} else if (pick === storageLabel) {\n\t\t\tawait storageMenu(ctx, sid);\n\t\t}\n\t}\n}\n\nasync function pickRetention(ctx: ExtensionCommandContext): Promise<void> {\n\tconst options = [...RETENTION_PRESETS.map((d) => `${d} days`), \"Keep forever\", \"Custom...\"];\n\tconst pick = await ctx.ui.select(\"Auto-clean backups after\", options);\n\tif (!pick) return;\n\n\tlet days: number;\n\tif (pick === \"Keep forever\") {\n\t\tdays = 0;\n\t} else if (pick === \"Custom...\") {\n\t\tconst value = await ctx.ui.input(\"Days to keep backups (0 = forever)\");\n\t\tif (value === undefined) return;\n\t\tconst n = Number.parseInt(value.trim(), 10);\n\t\tif (!Number.isFinite(n) || n < 0) {\n\t\t\tctx.ui.notify(\"Invalid number of days.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tdays = n;\n\t} else {\n\t\tdays = Number.parseInt(pick, 10);\n\t}\n\n\tconst cfg = loadRewindConfig();\n\tsaveRewindConfig({ ...cfg, retentionDays: days });\n\tctx.ui.notify(days > 0 ? `Backups now kept for ${days} days.` : \"Backups kept forever.\", \"info\");\n}\n\nasync function storageMenu(ctx: ExtensionCommandContext, sid: string | undefined): Promise<void> {\n\tfor (;;) {\n\t\tconst sessions = listSessions(sid);\n\t\tconst total = sessions.reduce((n, s) => n + s.bytes, 0);\n\t\tconst orphans = sessions.filter((s) => s.orphan);\n\t\tconst others = sessions.filter((s) => s.sessionId !== sid);\n\n\t\tconst cleanLabel = \"Clean now (aged + orphaned)\";\n\t\tconst orphanLabel = `Remove orphaned (${orphans.length})`;\n\t\tconst allLabel = `Remove all except current (${others.length})`;\n\n\t\tconst pick = await ctx.ui.select(\n\t\t\t`Rewind storage — ${formatSize(total)}, ${sessions.length} session${sessions.length === 1 ? \"\" : \"s\"} (Esc to close)`,\n\t\t\t[cleanLabel, orphanLabel, allLabel],\n\t\t);\n\t\tif (!pick) return;\n\n\t\tif (pick === cleanLabel) {\n\t\t\tconst r = runGc(loadRewindConfig().retentionDays, sid);\n\t\t\tctx.ui.notify(\n\t\t\t\tr.removed > 0\n\t\t\t\t\t? `Removed ${r.removed} session(s), reclaimed ${formatSize(r.reclaimedBytes)}.`\n\t\t\t\t\t: \"Nothing to clean.\",\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t} else if (pick === orphanLabel) {\n\t\t\tif (orphans.length === 0) {\n\t\t\t\tctx.ui.notify(\"No orphaned backups.\", \"info\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst ok = await ctx.ui.confirm(\n\t\t\t\t\"Remove orphaned backups?\",\n\t\t\t\t`Deletes backups for ${orphans.length} session(s) with no session file.`,\n\t\t\t);\n\t\t\tif (!ok) continue;\n\t\t\tlet bytes = 0;\n\t\t\tlet removed = 0;\n\t\t\tfor (const s of orphans) {\n\t\t\t\tconst b = removeSession(s.sessionId);\n\t\t\t\tif (b !== null) {\n\t\t\t\t\tbytes += b;\n\t\t\t\t\tremoved++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.ui.notify(`Removed ${removed} orphaned session(s), reclaimed ${formatSize(bytes)}.`, \"info\");\n\t\t} else if (pick === allLabel) {\n\t\t\tif (others.length === 0) {\n\t\t\t\tctx.ui.notify(\"No other sessions' backups.\", \"info\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst ok = await ctx.ui.confirm(\n\t\t\t\t\"Remove all other backups?\",\n\t\t\t\t`Deletes backups for ${others.length} session(s), keeping only the current session.`,\n\t\t\t);\n\t\t\tif (!ok) continue;\n\t\t\tlet bytes = 0;\n\t\t\tlet removed = 0;\n\t\t\tfor (const s of others) {\n\t\t\t\tconst b = removeSession(s.sessionId);\n\t\t\t\tif (b !== null) {\n\t\t\t\t\tbytes += b;\n\t\t\t\t\tremoved++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.ui.notify(`Removed ${removed} session(s), reclaimed ${formatSize(bytes)}.`, \"info\");\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,118 @@
1
+ import { loadRewindConfig, saveRewindConfig } from "./config.js";
2
+ import { listSessions, removeSession, runGc } from "./gc.js";
3
+ import { formatSize } from "./text.js";
4
+ const RETENTION_PRESETS = [7, 14, 30, 60, 90];
5
+ export async function runRewindMenu(ctx) {
6
+ if (!ctx.hasUI) {
7
+ ctx.ui.notify("/rewind requires an interactive UI.", "warning");
8
+ return;
9
+ }
10
+ const sid = ctx.sessionManager.getSessionId() ?? undefined;
11
+ for (;;) {
12
+ const cfg = loadRewindConfig();
13
+ const sessions = listSessions(sid);
14
+ const total = sessions.reduce((n, s) => n + s.bytes, 0);
15
+ const enabledLabel = `Rewind: ${cfg.enabled ? "on" : "off"}`;
16
+ const retentionLabel = `Auto-clean backups: ${cfg.retentionDays > 0 ? `after ${cfg.retentionDays} days` : "never (keep forever)"}`;
17
+ const storageLabel = `Storage: ${formatSize(total)} across ${sessions.length} session${sessions.length === 1 ? "" : "s"}`;
18
+ const pick = await ctx.ui.select("Rewind settings (Esc to close)", [enabledLabel, retentionLabel, storageLabel]);
19
+ if (!pick)
20
+ return;
21
+ if (pick === enabledLabel) {
22
+ saveRewindConfig({ ...cfg, enabled: !cfg.enabled });
23
+ ctx.ui.notify(`Rewind ${cfg.enabled ? "disabled" : "enabled"}.`, "info");
24
+ }
25
+ else if (pick === retentionLabel) {
26
+ await pickRetention(ctx);
27
+ }
28
+ else if (pick === storageLabel) {
29
+ await storageMenu(ctx, sid);
30
+ }
31
+ }
32
+ }
33
+ async function pickRetention(ctx) {
34
+ const options = [...RETENTION_PRESETS.map((d) => `${d} days`), "Keep forever", "Custom..."];
35
+ const pick = await ctx.ui.select("Auto-clean backups after", options);
36
+ if (!pick)
37
+ return;
38
+ let days;
39
+ if (pick === "Keep forever") {
40
+ days = 0;
41
+ }
42
+ else if (pick === "Custom...") {
43
+ const value = await ctx.ui.input("Days to keep backups (0 = forever)");
44
+ if (value === undefined)
45
+ return;
46
+ const n = Number.parseInt(value.trim(), 10);
47
+ if (!Number.isFinite(n) || n < 0) {
48
+ ctx.ui.notify("Invalid number of days.", "warning");
49
+ return;
50
+ }
51
+ days = n;
52
+ }
53
+ else {
54
+ days = Number.parseInt(pick, 10);
55
+ }
56
+ const cfg = loadRewindConfig();
57
+ saveRewindConfig({ ...cfg, retentionDays: days });
58
+ ctx.ui.notify(days > 0 ? `Backups now kept for ${days} days.` : "Backups kept forever.", "info");
59
+ }
60
+ async function storageMenu(ctx, sid) {
61
+ for (;;) {
62
+ const sessions = listSessions(sid);
63
+ const total = sessions.reduce((n, s) => n + s.bytes, 0);
64
+ const orphans = sessions.filter((s) => s.orphan);
65
+ const others = sessions.filter((s) => s.sessionId !== sid);
66
+ const cleanLabel = "Clean now (aged + orphaned)";
67
+ const orphanLabel = `Remove orphaned (${orphans.length})`;
68
+ const allLabel = `Remove all except current (${others.length})`;
69
+ const pick = await ctx.ui.select(`Rewind storage — ${formatSize(total)}, ${sessions.length} session${sessions.length === 1 ? "" : "s"} (Esc to close)`, [cleanLabel, orphanLabel, allLabel]);
70
+ if (!pick)
71
+ return;
72
+ if (pick === cleanLabel) {
73
+ const r = runGc(loadRewindConfig().retentionDays, sid);
74
+ ctx.ui.notify(r.removed > 0
75
+ ? `Removed ${r.removed} session(s), reclaimed ${formatSize(r.reclaimedBytes)}.`
76
+ : "Nothing to clean.", "info");
77
+ }
78
+ else if (pick === orphanLabel) {
79
+ if (orphans.length === 0) {
80
+ ctx.ui.notify("No orphaned backups.", "info");
81
+ continue;
82
+ }
83
+ const ok = await ctx.ui.confirm("Remove orphaned backups?", `Deletes backups for ${orphans.length} session(s) with no session file.`);
84
+ if (!ok)
85
+ continue;
86
+ let bytes = 0;
87
+ let removed = 0;
88
+ for (const s of orphans) {
89
+ const b = removeSession(s.sessionId);
90
+ if (b !== null) {
91
+ bytes += b;
92
+ removed++;
93
+ }
94
+ }
95
+ ctx.ui.notify(`Removed ${removed} orphaned session(s), reclaimed ${formatSize(bytes)}.`, "info");
96
+ }
97
+ else if (pick === allLabel) {
98
+ if (others.length === 0) {
99
+ ctx.ui.notify("No other sessions' backups.", "info");
100
+ continue;
101
+ }
102
+ const ok = await ctx.ui.confirm("Remove all other backups?", `Deletes backups for ${others.length} session(s), keeping only the current session.`);
103
+ if (!ok)
104
+ continue;
105
+ let bytes = 0;
106
+ let removed = 0;
107
+ for (const s of others) {
108
+ const b = removeSession(s.sessionId);
109
+ if (b !== null) {
110
+ bytes += b;
111
+ removed++;
112
+ }
113
+ }
114
+ ctx.ui.notify(`Removed ${removed} session(s), reclaimed ${formatSize(bytes)}.`, "info");
115
+ }
116
+ }
117
+ }
118
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/extensions/rewind/menu.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * menu.ts — the `/rewind` settings menu.\n *\n * Per the design, /rewind no longer performs the time-travel itself — restoring\n * files is fused into /tree navigation (see index.ts session_before_tree/\n * session_tree). /rewind is purely a settings + storage console:\n * - toggle the master switch\n * - set the auto-clean retention window\n * - inspect and prune backup storage (aged / orphaned / all-but-current)\n */\nimport type { ExtensionCommandContext } from \"../../core/extensions/types.ts\";\n\nimport { loadRewindConfig, saveRewindConfig } from \"./config.ts\";\nimport { listSessions, removeSession, runGc } from \"./gc.ts\";\nimport { formatSize } from \"./text.ts\";\n\nconst RETENTION_PRESETS = [7, 14, 30, 60, 90];\n\nexport async function runRewindMenu(ctx: ExtensionCommandContext): Promise<void> {\n\tif (!ctx.hasUI) {\n\t\tctx.ui.notify(\"/rewind requires an interactive UI.\", \"warning\");\n\t\treturn;\n\t}\n\tconst sid = ctx.sessionManager.getSessionId() ?? undefined;\n\n\tfor (;;) {\n\t\tconst cfg = loadRewindConfig();\n\t\tconst sessions = listSessions(sid);\n\t\tconst total = sessions.reduce((n, s) => n + s.bytes, 0);\n\n\t\tconst enabledLabel = `Rewind: ${cfg.enabled ? \"on\" : \"off\"}`;\n\t\tconst retentionLabel = `Auto-clean backups: ${cfg.retentionDays > 0 ? `after ${cfg.retentionDays} days` : \"never (keep forever)\"}`;\n\t\tconst storageLabel = `Storage: ${formatSize(total)} across ${sessions.length} session${sessions.length === 1 ? \"\" : \"s\"}`;\n\n\t\tconst pick = await ctx.ui.select(\"Rewind settings (Esc to close)\", [enabledLabel, retentionLabel, storageLabel]);\n\t\tif (!pick) return;\n\n\t\tif (pick === enabledLabel) {\n\t\t\tsaveRewindConfig({ ...cfg, enabled: !cfg.enabled });\n\t\t\tctx.ui.notify(`Rewind ${cfg.enabled ? \"disabled\" : \"enabled\"}.`, \"info\");\n\t\t} else if (pick === retentionLabel) {\n\t\t\tawait pickRetention(ctx);\n\t\t} else if (pick === storageLabel) {\n\t\t\tawait storageMenu(ctx, sid);\n\t\t}\n\t}\n}\n\nasync function pickRetention(ctx: ExtensionCommandContext): Promise<void> {\n\tconst options = [...RETENTION_PRESETS.map((d) => `${d} days`), \"Keep forever\", \"Custom...\"];\n\tconst pick = await ctx.ui.select(\"Auto-clean backups after\", options);\n\tif (!pick) return;\n\n\tlet days: number;\n\tif (pick === \"Keep forever\") {\n\t\tdays = 0;\n\t} else if (pick === \"Custom...\") {\n\t\tconst value = await ctx.ui.input(\"Days to keep backups (0 = forever)\");\n\t\tif (value === undefined) return;\n\t\tconst n = Number.parseInt(value.trim(), 10);\n\t\tif (!Number.isFinite(n) || n < 0) {\n\t\t\tctx.ui.notify(\"Invalid number of days.\", \"warning\");\n\t\t\treturn;\n\t\t}\n\t\tdays = n;\n\t} else {\n\t\tdays = Number.parseInt(pick, 10);\n\t}\n\n\tconst cfg = loadRewindConfig();\n\tsaveRewindConfig({ ...cfg, retentionDays: days });\n\tctx.ui.notify(days > 0 ? `Backups now kept for ${days} days.` : \"Backups kept forever.\", \"info\");\n}\n\nasync function storageMenu(ctx: ExtensionCommandContext, sid: string | undefined): Promise<void> {\n\tfor (;;) {\n\t\tconst sessions = listSessions(sid);\n\t\tconst total = sessions.reduce((n, s) => n + s.bytes, 0);\n\t\tconst orphans = sessions.filter((s) => s.orphan);\n\t\tconst others = sessions.filter((s) => s.sessionId !== sid);\n\n\t\tconst cleanLabel = \"Clean now (aged + orphaned)\";\n\t\tconst orphanLabel = `Remove orphaned (${orphans.length})`;\n\t\tconst allLabel = `Remove all except current (${others.length})`;\n\n\t\tconst pick = await ctx.ui.select(\n\t\t\t`Rewind storage — ${formatSize(total)}, ${sessions.length} session${sessions.length === 1 ? \"\" : \"s\"} (Esc to close)`,\n\t\t\t[cleanLabel, orphanLabel, allLabel],\n\t\t);\n\t\tif (!pick) return;\n\n\t\tif (pick === cleanLabel) {\n\t\t\tconst r = runGc(loadRewindConfig().retentionDays, sid);\n\t\t\tctx.ui.notify(\n\t\t\t\tr.removed > 0\n\t\t\t\t\t? `Removed ${r.removed} session(s), reclaimed ${formatSize(r.reclaimedBytes)}.`\n\t\t\t\t\t: \"Nothing to clean.\",\n\t\t\t\t\"info\",\n\t\t\t);\n\t\t} else if (pick === orphanLabel) {\n\t\t\tif (orphans.length === 0) {\n\t\t\t\tctx.ui.notify(\"No orphaned backups.\", \"info\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst ok = await ctx.ui.confirm(\n\t\t\t\t\"Remove orphaned backups?\",\n\t\t\t\t`Deletes backups for ${orphans.length} session(s) with no session file.`,\n\t\t\t);\n\t\t\tif (!ok) continue;\n\t\t\tlet bytes = 0;\n\t\t\tlet removed = 0;\n\t\t\tfor (const s of orphans) {\n\t\t\t\tconst b = removeSession(s.sessionId);\n\t\t\t\tif (b !== null) {\n\t\t\t\t\tbytes += b;\n\t\t\t\t\tremoved++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.ui.notify(`Removed ${removed} orphaned session(s), reclaimed ${formatSize(bytes)}.`, \"info\");\n\t\t} else if (pick === allLabel) {\n\t\t\tif (others.length === 0) {\n\t\t\t\tctx.ui.notify(\"No other sessions' backups.\", \"info\");\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst ok = await ctx.ui.confirm(\n\t\t\t\t\"Remove all other backups?\",\n\t\t\t\t`Deletes backups for ${others.length} session(s), keeping only the current session.`,\n\t\t\t);\n\t\t\tif (!ok) continue;\n\t\t\tlet bytes = 0;\n\t\t\tlet removed = 0;\n\t\t\tfor (const s of others) {\n\t\t\t\tconst b = removeSession(s.sessionId);\n\t\t\t\tif (b !== null) {\n\t\t\t\t\tbytes += b;\n\t\t\t\t\tremoved++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tctx.ui.notify(`Removed ${removed} session(s), reclaimed ${formatSize(bytes)}.`, \"info\");\n\t\t}\n\t}\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export declare function rewindConfigPath(): string;
2
+ export declare function rewindBackupsRoot(): string;
3
+ export declare function sessionsDirectory(): string;
4
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/extensions/rewind/paths.ts"],"names":[],"mappings":"AAQA,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C","sourcesContent":["import { join } from \"node:path\";\n\nimport { getAgentDir } from \"../../config.ts\";\n\nfunction rewindDirectory(): string {\n\treturn join(getAgentDir(), \"rewind\");\n}\n\nexport function rewindConfigPath(): string {\n\treturn join(rewindDirectory(), \"config.json\");\n}\n\nexport function rewindBackupsRoot(): string {\n\treturn join(rewindDirectory(), \"backups\");\n}\n\nexport function sessionsDirectory(): string {\n\treturn join(getAgentDir(), \"sessions\");\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { join } from "node:path";
2
+ import { getAgentDir } from "../../config.js";
3
+ function rewindDirectory() {
4
+ return join(getAgentDir(), "rewind");
5
+ }
6
+ export function rewindConfigPath() {
7
+ return join(rewindDirectory(), "config.json");
8
+ }
9
+ export function rewindBackupsRoot() {
10
+ return join(rewindDirectory(), "backups");
11
+ }
12
+ export function sessionsDirectory() {
13
+ return join(getAgentDir(), "sessions");
14
+ }
15
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/extensions/rewind/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,SAAS,eAAe,GAAW;IAClC,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,QAAQ,CAAC,CAAC;AAAA,CACrC;AAED,MAAM,UAAU,gBAAgB,GAAW;IAC1C,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,aAAa,CAAC,CAAC;AAAA,CAC9C;AAED,MAAM,UAAU,iBAAiB,GAAW;IAC3C,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,CAAC,CAAC;AAAA,CAC1C;AAED,MAAM,UAAU,iBAAiB,GAAW;IAC3C,OAAO,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CAAC;AAAA,CACvC","sourcesContent":["import { join } from \"node:path\";\n\nimport { getAgentDir } from \"../../config.ts\";\n\nfunction rewindDirectory(): string {\n\treturn join(getAgentDir(), \"rewind\");\n}\n\nexport function rewindConfigPath(): string {\n\treturn join(rewindDirectory(), \"config.json\");\n}\n\nexport function rewindBackupsRoot(): string {\n\treturn join(rewindDirectory(), \"backups\");\n}\n\nexport function sessionsDirectory(): string {\n\treturn join(getAgentDir(), \"sessions\");\n}\n"]}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * restore.ts — map a /tree navigation target to the snapshot that should be
3
+ * restored and apply it via the engine.
4
+ */
5
+ import { type ApplySnapshotOptions, type CoarseDiffStats } from "./engine.ts";
6
+ import type { FileHistorySnapshot } from "./snapshot.ts";
7
+ /** Minimal session view we need to walk the entry tree. */
8
+ export interface EntryTreeView {
9
+ getEntry(id: string): {
10
+ id: string;
11
+ parentId: string | null;
12
+ } | undefined;
13
+ }
14
+ /** Collect the ancestor id set of `targetId` (inclusive), walking parentId to root. */
15
+ export declare function ancestorIds(view: EntryTreeView, targetId: string): Set<string>;
16
+ /**
17
+ * The snapshot that best matches navigating to `targetId`: the most recent
18
+ * snapshot (chronological) whose turn anchor (userEntryId) is an ancestor of, or
19
+ * equal to, the target. Undefined when no recorded turn precedes the target.
20
+ */
21
+ export declare function snapshotForEntry(snapshots: FileHistorySnapshot[], view: EntryTreeView, targetId: string): FileHistorySnapshot | undefined;
22
+ /**
23
+ * Absolute file paths restoring to this snapshot would change on disk (empty =
24
+ * none). Callers use the length for the count and the paths for the preview.
25
+ */
26
+ export declare function snapshotChangedPaths(sessionId: string, snapshot: FileHistorySnapshot): Promise<string[]>;
27
+ /**
28
+ * Coarse +N/−M line stats for the confirm dialog (paths must already be known
29
+ * changed — typically from snapshotChangedPaths).
30
+ */
31
+ export declare function snapshotChangeDiffStats(sessionId: string, snapshot: FileHistorySnapshot, changedPaths: readonly string[]): Promise<CoarseDiffStats>;
32
+ /**
33
+ * Restore the work tree to `snapshot` and return changed absolute paths.
34
+ * Pass `onlyPaths` from a prior snapshotChangedPaths call to skip re-compare.
35
+ */
36
+ export declare function restoreToSnapshot(sessionId: string, snapshot: FileHistorySnapshot, opts?: ApplySnapshotOptions): Promise<string[]>;
37
+ //# sourceMappingURL=restore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.d.ts","sourceRoot":"","sources":["../../../src/extensions/rewind/restore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACN,KAAK,oBAAoB,EAEzB,KAAK,eAAe,EAGpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;CAC1E;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAS9E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC/B,SAAS,EAAE,mBAAmB,EAAE,EAChC,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,MAAM,GACd,mBAAmB,GAAG,SAAS,CAOjC;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAExG;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,mBAAmB,EAC7B,YAAY,EAAE,SAAS,MAAM,EAAE,GAC7B,OAAO,CAAC,eAAe,CAAC,CAE1B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,mBAAmB,EAC7B,IAAI,CAAC,EAAE,oBAAoB,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAEnB","sourcesContent":["/**\n * restore.ts — map a /tree navigation target to the snapshot that should be\n * restored and apply it via the engine.\n */\nimport {\n\ttype ApplySnapshotOptions,\n\tapplySnapshot,\n\ttype CoarseDiffStats,\n\tcollectChangeDiffStats,\n\tcollectChanges,\n} from \"./engine.ts\";\nimport type { FileHistorySnapshot } from \"./snapshot.ts\";\n\n/** Minimal session view we need to walk the entry tree. */\nexport interface EntryTreeView {\n\tgetEntry(id: string): { id: string; parentId: string | null } | undefined;\n}\n\n/** Collect the ancestor id set of `targetId` (inclusive), walking parentId to root. */\nexport function ancestorIds(view: EntryTreeView, targetId: string): Set<string> {\n\tconst set = new Set<string>();\n\tlet cur: string | null = targetId;\n\tlet guard = 0;\n\twhile (cur && !set.has(cur) && guard++ < 100_000) {\n\t\tset.add(cur);\n\t\tcur = view.getEntry(cur)?.parentId ?? null;\n\t}\n\treturn set;\n}\n\n/**\n * The snapshot that best matches navigating to `targetId`: the most recent\n * snapshot (chronological) whose turn anchor (userEntryId) is an ancestor of, or\n * equal to, the target. Undefined when no recorded turn precedes the target.\n */\nexport function snapshotForEntry(\n\tsnapshots: FileHistorySnapshot[],\n\tview: EntryTreeView,\n\ttargetId: string,\n): FileHistorySnapshot | undefined {\n\tconst ancestors = ancestorIds(view, targetId);\n\tlet best: FileHistorySnapshot | undefined;\n\tfor (const snap of snapshots) {\n\t\tif (ancestors.has(snap.userEntryId)) best = snap; // snapshots are in chronological order\n\t}\n\treturn best;\n}\n\n/**\n * Absolute file paths restoring to this snapshot would change on disk (empty =\n * none). Callers use the length for the count and the paths for the preview.\n */\nexport function snapshotChangedPaths(sessionId: string, snapshot: FileHistorySnapshot): Promise<string[]> {\n\treturn collectChanges(sessionId, snapshot);\n}\n\n/**\n * Coarse +N/−M line stats for the confirm dialog (paths must already be known\n * changed — typically from snapshotChangedPaths).\n */\nexport function snapshotChangeDiffStats(\n\tsessionId: string,\n\tsnapshot: FileHistorySnapshot,\n\tchangedPaths: readonly string[],\n): Promise<CoarseDiffStats> {\n\treturn collectChangeDiffStats(sessionId, snapshot, changedPaths);\n}\n\n/**\n * Restore the work tree to `snapshot` and return changed absolute paths.\n * Pass `onlyPaths` from a prior snapshotChangedPaths call to skip re-compare.\n */\nexport async function restoreToSnapshot(\n\tsessionId: string,\n\tsnapshot: FileHistorySnapshot,\n\topts?: ApplySnapshotOptions,\n): Promise<string[]> {\n\treturn applySnapshot(sessionId, snapshot, opts);\n}\n"]}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * restore.ts — map a /tree navigation target to the snapshot that should be
3
+ * restored and apply it via the engine.
4
+ */
5
+ import { applySnapshot, collectChangeDiffStats, collectChanges, } from "./engine.js";
6
+ /** Collect the ancestor id set of `targetId` (inclusive), walking parentId to root. */
7
+ export function ancestorIds(view, targetId) {
8
+ const set = new Set();
9
+ let cur = targetId;
10
+ let guard = 0;
11
+ while (cur && !set.has(cur) && guard++ < 100_000) {
12
+ set.add(cur);
13
+ cur = view.getEntry(cur)?.parentId ?? null;
14
+ }
15
+ return set;
16
+ }
17
+ /**
18
+ * The snapshot that best matches navigating to `targetId`: the most recent
19
+ * snapshot (chronological) whose turn anchor (userEntryId) is an ancestor of, or
20
+ * equal to, the target. Undefined when no recorded turn precedes the target.
21
+ */
22
+ export function snapshotForEntry(snapshots, view, targetId) {
23
+ const ancestors = ancestorIds(view, targetId);
24
+ let best;
25
+ for (const snap of snapshots) {
26
+ if (ancestors.has(snap.userEntryId))
27
+ best = snap; // snapshots are in chronological order
28
+ }
29
+ return best;
30
+ }
31
+ /**
32
+ * Absolute file paths restoring to this snapshot would change on disk (empty =
33
+ * none). Callers use the length for the count and the paths for the preview.
34
+ */
35
+ export function snapshotChangedPaths(sessionId, snapshot) {
36
+ return collectChanges(sessionId, snapshot);
37
+ }
38
+ /**
39
+ * Coarse +N/−M line stats for the confirm dialog (paths must already be known
40
+ * changed — typically from snapshotChangedPaths).
41
+ */
42
+ export function snapshotChangeDiffStats(sessionId, snapshot, changedPaths) {
43
+ return collectChangeDiffStats(sessionId, snapshot, changedPaths);
44
+ }
45
+ /**
46
+ * Restore the work tree to `snapshot` and return changed absolute paths.
47
+ * Pass `onlyPaths` from a prior snapshotChangedPaths call to skip re-compare.
48
+ */
49
+ export async function restoreToSnapshot(sessionId, snapshot, opts) {
50
+ return applySnapshot(sessionId, snapshot, opts);
51
+ }
52
+ //# sourceMappingURL=restore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restore.js","sourceRoot":"","sources":["../../../src/extensions/rewind/restore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAEN,aAAa,EAEb,sBAAsB,EACtB,cAAc,GACd,MAAM,aAAa,CAAC;AAQrB,uFAAuF;AACvF,MAAM,UAAU,WAAW,CAAC,IAAmB,EAAE,QAAgB,EAAe;IAC/E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,IAAI,GAAG,GAAkB,QAAQ,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC;QAClD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACb,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,IAAI,IAAI,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AAAA,CACX;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC/B,SAAgC,EAChC,IAAmB,EACnB,QAAgB,EACkB;IAClC,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,IAAI,IAAqC,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,CAAC,uCAAuC;IAC1F,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,QAA6B,EAAqB;IACzG,OAAO,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAAA,CAC3C;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACtC,SAAiB,EACjB,QAA6B,EAC7B,YAA+B,EACJ;IAC3B,OAAO,sBAAsB,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAAA,CACjE;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,SAAiB,EACjB,QAA6B,EAC7B,IAA2B,EACP;IACpB,OAAO,aAAa,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;AAAA,CAChD","sourcesContent":["/**\n * restore.ts — map a /tree navigation target to the snapshot that should be\n * restored and apply it via the engine.\n */\nimport {\n\ttype ApplySnapshotOptions,\n\tapplySnapshot,\n\ttype CoarseDiffStats,\n\tcollectChangeDiffStats,\n\tcollectChanges,\n} from \"./engine.ts\";\nimport type { FileHistorySnapshot } from \"./snapshot.ts\";\n\n/** Minimal session view we need to walk the entry tree. */\nexport interface EntryTreeView {\n\tgetEntry(id: string): { id: string; parentId: string | null } | undefined;\n}\n\n/** Collect the ancestor id set of `targetId` (inclusive), walking parentId to root. */\nexport function ancestorIds(view: EntryTreeView, targetId: string): Set<string> {\n\tconst set = new Set<string>();\n\tlet cur: string | null = targetId;\n\tlet guard = 0;\n\twhile (cur && !set.has(cur) && guard++ < 100_000) {\n\t\tset.add(cur);\n\t\tcur = view.getEntry(cur)?.parentId ?? null;\n\t}\n\treturn set;\n}\n\n/**\n * The snapshot that best matches navigating to `targetId`: the most recent\n * snapshot (chronological) whose turn anchor (userEntryId) is an ancestor of, or\n * equal to, the target. Undefined when no recorded turn precedes the target.\n */\nexport function snapshotForEntry(\n\tsnapshots: FileHistorySnapshot[],\n\tview: EntryTreeView,\n\ttargetId: string,\n): FileHistorySnapshot | undefined {\n\tconst ancestors = ancestorIds(view, targetId);\n\tlet best: FileHistorySnapshot | undefined;\n\tfor (const snap of snapshots) {\n\t\tif (ancestors.has(snap.userEntryId)) best = snap; // snapshots are in chronological order\n\t}\n\treturn best;\n}\n\n/**\n * Absolute file paths restoring to this snapshot would change on disk (empty =\n * none). Callers use the length for the count and the paths for the preview.\n */\nexport function snapshotChangedPaths(sessionId: string, snapshot: FileHistorySnapshot): Promise<string[]> {\n\treturn collectChanges(sessionId, snapshot);\n}\n\n/**\n * Coarse +N/−M line stats for the confirm dialog (paths must already be known\n * changed — typically from snapshotChangedPaths).\n */\nexport function snapshotChangeDiffStats(\n\tsessionId: string,\n\tsnapshot: FileHistorySnapshot,\n\tchangedPaths: readonly string[],\n): Promise<CoarseDiffStats> {\n\treturn collectChangeDiffStats(sessionId, snapshot, changedPaths);\n}\n\n/**\n * Restore the work tree to `snapshot` and return changed absolute paths.\n * Pass `onlyPaths` from a prior snapshotChangedPaths call to skip re-compare.\n */\nexport async function restoreToSnapshot(\n\tsessionId: string,\n\tsnapshot: FileHistorySnapshot,\n\topts?: ApplySnapshotOptions,\n): Promise<string[]> {\n\treturn applySnapshot(sessionId, snapshot, opts);\n}\n"]}