@selesai/code 0.9.10 → 0.9.11

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 (302) hide show
  1. package/CHANGELOG.md +260 -255
  2. package/dist/cli/args.js +13 -2
  3. package/dist/cli/args.test.js +8 -0
  4. package/dist/cli/credential-print.js +4 -4
  5. package/dist/cli.js +0 -0
  6. package/dist/core/agent-session-auto-handoff.test.js +24 -1
  7. package/dist/core/agent-session.d.ts +11 -4
  8. package/dist/core/agent-session.js +96 -35
  9. package/dist/core/compaction/branch-summarization.js +30 -30
  10. package/dist/core/compaction/compaction.js +81 -81
  11. package/dist/core/compaction/utils.js +2 -2
  12. package/dist/core/defaults.d.ts +1 -0
  13. package/dist/core/defaults.js +9 -0
  14. package/dist/core/export-html/template.css +1066 -1066
  15. package/dist/core/export-html/template.html +55 -55
  16. package/dist/core/export-html/template.js +1864 -1864
  17. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  18. package/dist/core/export-html/vendor/marked.min.js +78 -78
  19. package/dist/core/extensions/loader.js +108 -35
  20. package/dist/core/extensions/loader.test.d.ts +1 -0
  21. package/dist/core/extensions/loader.test.js +21 -0
  22. package/dist/core/extensions/types.d.ts +12 -2
  23. package/dist/core/keybindings.d.ts +2 -2
  24. package/dist/core/messages.js +7 -7
  25. package/dist/core/model-resolver.d.ts +1 -0
  26. package/dist/core/model-resolver.js +10 -4
  27. package/dist/core/package-manager.js +4 -4
  28. package/dist/core/sdk.d.ts +5 -5
  29. package/dist/core/sdk.js +16 -4
  30. package/dist/core/settings-manager.d.ts +6 -0
  31. package/dist/core/settings-manager.js +22 -0
  32. package/dist/core/tools/bash.d.ts +18 -1
  33. package/dist/core/tools/bash.js +41 -23
  34. package/dist/core/tools/index.d.ts +4 -1
  35. package/dist/core/tools/index.js +9 -1
  36. package/dist/core/tools/powershell.d.ts +15 -0
  37. package/dist/core/tools/powershell.js +38 -0
  38. package/dist/core/tools/powershell.test.d.ts +1 -0
  39. package/dist/core/tools/powershell.test.js +20 -0
  40. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  41. package/dist/extensions/context-compaction-reminder.ts +28 -28
  42. package/dist/extensions/pi-intercom/LICENSE +21 -21
  43. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  44. package/dist/extensions/pi-intercom/broker/extension.test.ts +387 -387
  45. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  46. package/dist/extensions/pi-intercom/broker/paths.test.ts +153 -153
  47. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  48. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  49. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  50. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  51. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  52. package/dist/extensions/pi-intercom/extension-api.ts +44 -44
  53. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  54. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  55. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  56. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  57. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  58. package/dist/extensions/pi-powerline-footer/bash-mode/shell-session.ts +286 -286
  59. package/dist/extensions/pi-powerline-footer/bash-mode/transcript.ts +108 -108
  60. package/dist/extensions/pi-powerline-footer/separators.ts +57 -57
  61. package/dist/extensions/pi-powerline-footer/tests/session-usage.test.ts +47 -47
  62. package/dist/extensions/pi-powerline-footer/tests/tps.test.ts +39 -39
  63. package/dist/extensions/pi-powerline-footer/theme.example.json +24 -24
  64. package/dist/extensions/pi-powerline-footer/theme.json +12 -12
  65. package/dist/extensions/pi-powerline-footer/tps.ts +345 -345
  66. package/dist/extensions/pi-rewind-hook/README.md +245 -245
  67. package/dist/extensions/pi-rewind-hook/index.ts +1445 -1445
  68. package/dist/extensions/pi-rewind-hook/package.json +29 -29
  69. package/dist/extensions/pi-subagents/install.mjs +0 -0
  70. package/dist/extensions/pi-web-agent/package.json +31 -31
  71. package/dist/extensions/pi-web-agent/src/backends/config.ts +205 -205
  72. package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -136
  73. package/dist/extensions/pi-web-agent/src/backends/factory.ts +152 -152
  74. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  75. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  76. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  77. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +946 -946
  78. package/dist/extensions/pi-web-agent/src/extension.ts +126 -126
  79. package/dist/extensions/pi-web-agent/src/extract/readability.ts +118 -118
  80. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  81. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  82. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  83. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  84. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  85. package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +50 -50
  86. package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +52 -52
  87. package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +105 -105
  88. package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +45 -45
  89. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  90. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  91. package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +376 -376
  92. package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +64 -64
  93. package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +181 -181
  94. package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +101 -101
  95. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  96. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  97. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  98. package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +61 -61
  99. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  100. package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +41 -41
  101. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  102. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  103. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  104. package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +72 -72
  105. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  106. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  107. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  108. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  109. package/dist/extensions/pi-web-agent/src/tools/web-search.ts +157 -157
  110. package/dist/extensions/pi-web-agent/src/types.ts +88 -88
  111. package/dist/extensions/ponytail/package.json +8 -8
  112. package/dist/extensions/question/batch.ts +103 -103
  113. package/dist/extensions/question/constants.ts +30 -30
  114. package/dist/extensions/question/helpers.ts +58 -58
  115. package/dist/extensions/question/navigation.ts +14 -14
  116. package/dist/extensions/question/package.json +19 -19
  117. package/dist/extensions/question/schemas.ts +43 -43
  118. package/dist/extensions/question/selection-mode.ts +46 -46
  119. package/dist/extensions/question/shortcuts.ts +44 -44
  120. package/dist/extensions/question/types.ts +132 -132
  121. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  122. package/dist/extensions/test-resolve-hook.mjs +6 -6
  123. package/dist/extensions/web-agent-onboarding.ts +222 -222
  124. package/dist/extensions/workflow/package.json +17 -17
  125. package/dist/package-manager-cli.js +71 -71
  126. package/dist/rpc-entry.js +0 -0
  127. package/dist/skills/agent-browser/SKILL.md +52 -52
  128. package/dist/skills/batch-grill-me/SKILL.md +19 -19
  129. package/dist/skills/grill-me/SKILL.md +10 -10
  130. package/dist/skills/handoff/SKILL.md +16 -16
  131. package/dist/skills/handoff-text/SKILL.md +14 -14
  132. package/dist/skills/implanger/SKILL.md +69 -69
  133. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  134. package/dist/skills/improve-codebase/SKILL.md +178 -178
  135. package/dist/skills/planger/SKILL.md +166 -166
  136. package/dist/skills/ponytail/SKILL.md +116 -116
  137. package/dist/skills/ponytail-audit/SKILL.md +42 -42
  138. package/dist/skills/ponytail-debt/SKILL.md +45 -45
  139. package/dist/skills/ponytail-gain/SKILL.md +51 -51
  140. package/dist/skills/ponytail-help/SKILL.md +70 -70
  141. package/dist/skills/ponytail-review/SKILL.md +58 -58
  142. package/dist/skills/selesai-handoff/SKILL.md +20 -20
  143. package/dist/skills/workflow-creation/SKILL.md +73 -73
  144. package/dist/themes/powerline-footer/theme.json +33 -33
  145. package/dist/utils/shell.d.ts +3 -0
  146. package/dist/utils/shell.js +17 -5
  147. package/docs/compaction.md +396 -396
  148. package/docs/containerization.md +111 -111
  149. package/docs/development.md +71 -71
  150. package/docs/docs.json +164 -164
  151. package/docs/environment-variables.md +86 -86
  152. package/docs/index.md +83 -83
  153. package/docs/json.md +82 -82
  154. package/docs/models.md +502 -502
  155. package/docs/packages.md +227 -227
  156. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  157. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  158. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  159. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  160. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  161. package/docs/prompt-templates.md +95 -95
  162. package/docs/providers.md +293 -293
  163. package/docs/sdk.md +1144 -1143
  164. package/docs/security.md +59 -59
  165. package/docs/session-format.md +414 -414
  166. package/docs/sessions.md +145 -145
  167. package/docs/shared-host-extensions.md +109 -109
  168. package/docs/shell-aliases.md +13 -13
  169. package/docs/skills.md +231 -231
  170. package/docs/terminal-setup.md +142 -142
  171. package/docs/termux.md +127 -127
  172. package/docs/themes.md +295 -295
  173. package/docs/tmux.md +63 -63
  174. package/docs/tui.md +927 -927
  175. package/docs/windows.md +17 -17
  176. package/examples/README.md +25 -25
  177. package/examples/extensions/README.md +211 -211
  178. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  179. package/examples/extensions/bash-spawn-hook.ts +30 -30
  180. package/examples/extensions/bookmark.ts +50 -50
  181. package/examples/extensions/border-status-editor.ts +150 -150
  182. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  183. package/examples/extensions/claude-rules.ts +86 -86
  184. package/examples/extensions/commands.ts +72 -72
  185. package/examples/extensions/confirm-destructive.ts +59 -59
  186. package/examples/extensions/custom-compaction.ts +130 -130
  187. package/examples/extensions/custom-footer.ts +64 -64
  188. package/examples/extensions/custom-header.ts +73 -73
  189. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  190. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  191. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  192. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  193. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  194. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  195. package/examples/extensions/dirty-repo-guard.ts +56 -56
  196. package/examples/extensions/doom-overlay/README.md +46 -46
  197. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  198. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  199. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  200. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  201. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  202. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  203. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  204. package/examples/extensions/doom-overlay/index.ts +74 -74
  205. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  206. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  207. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  208. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  209. package/examples/extensions/dynamic-resources/index.ts +15 -15
  210. package/examples/extensions/dynamic-tools.ts +74 -74
  211. package/examples/extensions/event-bus.ts +43 -43
  212. package/examples/extensions/file-trigger.ts +41 -41
  213. package/examples/extensions/git-checkpoint.ts +53 -53
  214. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  215. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  216. package/examples/extensions/gondolin/index.ts +531 -531
  217. package/examples/extensions/gondolin/package-lock.json +185 -185
  218. package/examples/extensions/gondolin/package.json +19 -19
  219. package/examples/extensions/handoff.ts +199 -199
  220. package/examples/extensions/hello.ts +26 -26
  221. package/examples/extensions/hidden-thinking-label.ts +53 -53
  222. package/examples/extensions/inline-bash.ts +94 -94
  223. package/examples/extensions/input-transform-streaming.ts +39 -39
  224. package/examples/extensions/input-transform.ts +43 -43
  225. package/examples/extensions/interactive-shell.ts +196 -196
  226. package/examples/extensions/mac-system-theme.ts +47 -47
  227. package/examples/extensions/message-renderer.ts +59 -59
  228. package/examples/extensions/minimal-mode.ts +426 -426
  229. package/examples/extensions/modal-editor.ts +85 -85
  230. package/examples/extensions/model-status.ts +31 -31
  231. package/examples/extensions/notify.ts +55 -55
  232. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  233. package/examples/extensions/overlay-test.ts +153 -153
  234. package/examples/extensions/permission-gate.ts +34 -34
  235. package/examples/extensions/pirate.ts +47 -47
  236. package/examples/extensions/plan-mode/README.md +66 -66
  237. package/examples/extensions/plan-mode/index.ts +390 -390
  238. package/examples/extensions/plan-mode/utils.ts +168 -168
  239. package/examples/extensions/preset.ts +436 -436
  240. package/examples/extensions/project-trust.ts +64 -64
  241. package/examples/extensions/prompt-customizer.ts +97 -97
  242. package/examples/extensions/protected-paths.ts +30 -30
  243. package/examples/extensions/provider-payload.ts +18 -18
  244. package/examples/extensions/qna.ts +122 -122
  245. package/examples/extensions/question.ts +285 -285
  246. package/examples/extensions/questionnaire.ts +448 -448
  247. package/examples/extensions/rainbow-editor.ts +88 -88
  248. package/examples/extensions/reload-runtime.ts +37 -37
  249. package/examples/extensions/rpc-demo.ts +118 -118
  250. package/examples/extensions/sandbox/index.ts +321 -321
  251. package/examples/extensions/sandbox/package-lock.json +92 -92
  252. package/examples/extensions/sandbox/package.json +19 -19
  253. package/examples/extensions/send-user-message.ts +97 -97
  254. package/examples/extensions/session-name.ts +27 -27
  255. package/examples/extensions/shutdown-command.ts +63 -63
  256. package/examples/extensions/snake.ts +343 -343
  257. package/examples/extensions/space-invaders.ts +560 -560
  258. package/examples/extensions/ssh.ts +220 -220
  259. package/examples/extensions/status-line.ts +32 -32
  260. package/examples/extensions/structured-output.ts +65 -65
  261. package/examples/extensions/subagent/README.md +175 -175
  262. package/examples/extensions/subagent/agents/planner.md +37 -37
  263. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  264. package/examples/extensions/subagent/agents/scout.md +50 -50
  265. package/examples/extensions/subagent/agents/worker.md +24 -24
  266. package/examples/extensions/subagent/agents.ts +126 -126
  267. package/examples/extensions/subagent/index.ts +1015 -1015
  268. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  269. package/examples/extensions/subagent/prompts/implement.md +10 -10
  270. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  271. package/examples/extensions/summarize.ts +209 -209
  272. package/examples/extensions/system-prompt-header.ts +17 -17
  273. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  274. package/examples/extensions/timed-confirm.ts +70 -70
  275. package/examples/extensions/titlebar-spinner.ts +58 -58
  276. package/examples/extensions/todo.ts +297 -297
  277. package/examples/extensions/tool-override.ts +144 -144
  278. package/examples/extensions/tools.ts +146 -146
  279. package/examples/extensions/trigger-compact.ts +50 -50
  280. package/examples/extensions/truncated-tool.ts +195 -195
  281. package/examples/extensions/widget-placement.ts +9 -9
  282. package/examples/extensions/with-deps/index.ts +32 -32
  283. package/examples/extensions/with-deps/package-lock.json +31 -31
  284. package/examples/extensions/with-deps/package.json +22 -22
  285. package/examples/extensions/working-indicator.ts +123 -123
  286. package/examples/extensions/working-message-test.ts +25 -25
  287. package/examples/rpc-extension-ui.ts +632 -632
  288. package/examples/sdk/01-minimal.ts +26 -26
  289. package/examples/sdk/02-custom-model.ts +53 -53
  290. package/examples/sdk/03-custom-prompt.ts +75 -75
  291. package/examples/sdk/04-skills.ts +55 -55
  292. package/examples/sdk/05-tools.ts +48 -48
  293. package/examples/sdk/06-extensions.ts +99 -99
  294. package/examples/sdk/07-context-files.ts +47 -47
  295. package/examples/sdk/08-prompt-templates.ts +51 -51
  296. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  297. package/examples/sdk/10-settings.ts +53 -53
  298. package/examples/sdk/11-sessions.ts +52 -52
  299. package/examples/sdk/12-full-control.ts +79 -79
  300. package/examples/sdk/13-session-runtime.ts +67 -67
  301. package/examples/sdk/README.md +144 -144
  302. package/package.json +4 -4
@@ -1,245 +1,245 @@
1
- # Rewind Extension
2
-
3
- A Pi agent extension that records exact file-state rewind points, allowing restoration of file states during `/tree` navigation and across resumed and forked sessions
4
-
5
- Rewind metadata lives in the session itself as hidden entries, so rewind history survives across forks, resumes, tree navigation, and compaction. Snapshot commits are kept reachable through a single git ref rather than one ref per checkpoint, and rewind points can be resolved across session lineage via `parentSession` links. Retention is optional and configurable; without it, exact history is kept indefinitely.
6
-
7
- ## Screenshots
8
-
9
- ![Selecting a message to branch from](rewind1.png)
10
-
11
- ![Choosing a restore option](rewind2.png)
12
-
13
- ## Requirements
14
-
15
- - Pi agent v0.65.0+
16
- - Node.js (for installation)
17
- - Git repository
18
-
19
- ## Installation
20
-
21
- ```bash
22
- pi install npm:pi-rewind-hook
23
- ```
24
-
25
- This will:
26
- 1. Create `~/.pi/agent/extensions/rewind/`
27
- 2. Download the extension files
28
- 3. Auto-discover the extension from the extensions directory (no `settings.json` extension entry required)
29
- 4. Remove legacy hooks/explicit rewind extension entries from `settings.json` if present
30
- 5. Clean up old `hooks/rewind` directory (if present)
31
-
32
- ## Works with pi-custom-compaction
33
-
34
- Rewind works seamlessly with [`pi-custom-compaction`](https://github.com/nicobailon/pi-custom-compaction). When `pi-custom-compaction` writes visible background-summary markers, it can ask Rewind to bind an exact file checkpoint to that marker’s own session-tree node. That means `/tree` can offer the normal `Restore files to that point` option directly on the custom compaction marker instead of falling back to a nearby parent node.
35
-
36
- Install the companion extension with:
37
-
38
- ```bash
39
- pi install npm:pi-custom-compaction
40
- ```
41
-
42
- This is optional. Pi’s default compaction and Rewind’s native compaction checkpoints continue to work without `pi-custom-compaction`.
43
-
44
- ## Configuration
45
-
46
- Optionally add settings to `~/.pi/agent/settings.json`. For example:
47
-
48
- ```json
49
- {
50
- "rewind": {
51
- "silentCheckpoints": true,
52
- "retention": {
53
- "maxSnapshots": 2000,
54
- "maxAgeDays": 30,
55
- "pinLabeledEntries": true
56
- }
57
- }
58
- }
59
- ```
60
-
61
- ### Settings
62
-
63
- - `rewind.silentCheckpoints` — hides footer/status and checkpoint notifications
64
- - `rewind.retention.maxSnapshots` — optional cap on unpinned unique snapshot commits kept reachable
65
- - `rewind.retention.maxAgeDays` — optional age limit for unpinned snapshot commits
66
- - `rewind.retention.pinLabeledEntries` — when true, snapshot commits bound to **labeled nodes** in the Pi session tree are exempt from `maxSnapshots` and `maxAgeDays` pruning (useful for bookmarking important rewind points you want to prevent getting garbage-collected)
67
- - `rewind.retention.scanMode` — retention discovery mode: `ancestor-only` (default, follow current session lineage only) or `repo-sessions` (scan discovered session roots)
68
- - `rewind.retention.startupBudgetMs` — optional startup time budget for retention sweeps; if exceeded, startup sweep is skipped and deferred
69
-
70
- If `rewind.retention` is omitted, Rewind keeps exact history with no automatic expiration. This can grow git object storage without bound over time.
71
-
72
- ## Usage
73
-
74
- ### Rewinding via `/fork`
75
-
76
- 1. Type `/fork` in Pi
77
- 2. Select a message to branch from
78
- 3. Choose a restore option
79
-
80
- **Options:**
81
-
82
- | Option | Files | Conversation |
83
- |--------|-------|-------------|
84
- | **Conversation only (keep current files)** | Unchanged | Reset to that point |
85
- | **Restore all (files + conversation)** | Restored | Reset to that point |
86
- | **Code only (restore files, keep conversation)** | Restored | Unchanged |
87
- | **Undo last file rewind** | Restored to before last rewind | Unchanged |
88
-
89
- `Restore all`, `Code only`, and `Undo last file rewind` are only shown when an exact rewind point or undo snapshot is available for the selected message.
90
-
91
- When you restore files during `/fork`, the undo snapshot is persisted in the **new child session**, because that is where you continue working.
92
-
93
- ### Rewinding via `/tree`
94
-
95
- 1. Press `Tab` to open the session tree
96
- 2. Navigate to a different node
97
- 3. Choose a restore option
98
-
99
- **Options:**
100
-
101
- | Option | Files | Conversation |
102
- |--------|-------|-------------|
103
- | **Keep current files** | Unchanged | Navigated to that point |
104
- | **Restore files to that point** | Restored | Navigated to that point |
105
- | **Undo last file rewind** | Restored to before last rewind | Navigated to that point |
106
-
107
- If you navigate with `Keep current files`, Rewind still persists the resulting session position's exact current file baseline via `rewind-op.current`.
108
-
109
- ### Examples
110
-
111
- **Undo a bad refactor:**
112
-
113
- ```
114
- You: refactor the auth module to use JWT
115
- Agent: [makes changes you don't like]
116
-
117
- You: /fork
118
- → Select "refactor the auth module to use JWT"
119
- → Select "Code only (restore files, keep conversation)"
120
-
121
- Result: Files restored, conversation intact. Try a different approach.
122
- ```
123
-
124
- **Start fresh from an earlier point:**
125
-
126
- ```
127
- You: /fork
128
- → Select an earlier message
129
- → Select "Restore all (files + conversation)"
130
-
131
- Result: Both files and conversation reset to that point.
132
- ```
133
-
134
- ## How Rewind works
135
-
136
- Rewind stores its ledger in hidden session `custom` entries:
137
-
138
- - `rewind-turn` — one per prompt, containing the triggering user-node snapshot plus any assistant-node snapshots produced during that prompt
139
- - `rewind-op` — sparse records for `/fork`, `/tree`, compaction aliases, summary aliases, and undo state
140
-
141
- Snapshots are only considered at visible boundaries:
142
-
143
- - the user pre-prompt boundary
144
- - each assistant `turn_end`
145
- - selected stateful session operations
146
-
147
- Rewind does not create per-tool snapshots.
148
-
149
- ### Canonical exact rewind points
150
-
151
- Exact file restore is available for:
152
-
153
- - user nodes
154
- - assistant nodes
155
- - compaction nodes aliased to the current exact state
156
- - branch-summary nodes aliased during `/tree`
157
-
158
- Exact file restore is not offered for toolResult nodes.
159
-
160
- ### Git storage model
161
-
162
- Snapshot commits are kept reachable through a single repo-local ref:
163
-
164
- ```text
165
- refs/pi-rewind/store
166
- ```
167
-
168
- That ref is only for git object reachability; the session ledger is authoritative.
169
-
170
- ### Deduplication
171
-
172
- Before creating a snapshot commit, Rewind captures the worktree tree SHA. If it matches the latest exact snapshot tree, Rewind reuses that existing snapshot commit instead of creating a new one.
173
-
174
- ### Restore exactness and scope
175
-
176
- Rewind restores the exact file state for the snapshot domain it owns:
177
-
178
- - tracked files
179
- - untracked, non-ignored files
180
- - without staging the real git index during restore
181
-
182
- Before restoring target contents, it deletes paths present in the current snapshot but absent from the target snapshot, then restores the target snapshot into the worktree only.
183
-
184
- Out of scope:
185
-
186
- - ignored files
187
- - empty directories
188
- - exact rewind points for `toolResult` nodes
189
- - exact rewind points for `bashExecution` nodes
190
-
191
- ## Lineage and resume behavior
192
-
193
- Rewind resolves exact rewind points across session lineage by following `parentSession` links and reading rewind metadata from ancestor session files.
194
-
195
- Rewind v2 uses only session-native `rewind-turn`/`rewind-op` metadata and does not read legacy checkpoint refs.
196
-
197
- ## Retention
198
-
199
- Retention only affects git reachability. Session JSONL metadata is append-only and is never compacted by Rewind.
200
-
201
- When retention is enabled, Rewind keeps snapshot commits alive if they are referenced by:
202
-
203
- - a `rewind-turn` or `rewind-op` binding in a discovered same-repo session
204
- - the latest `rewind-op.current` for a discovered same-repo session
205
- - the latest `rewind-op.undo` for a discovered same-repo session
206
- - a labeled bound entry when `pinLabeledEntries` is enabled
207
-
208
- If a snapshot commit has been pruned, Rewind validates commit existence before offering restore.
209
-
210
- If retention discovery yields an empty live set, Rewind preserves the existing `refs/pi-rewind/store` ref rather than deleting it.
211
-
212
- ## Viewing storage
213
-
214
- Show the store ref head:
215
-
216
- ```bash
217
- git rev-parse refs/pi-rewind/store
218
- ```
219
-
220
- Show the hidden rewind ledger in a session file:
221
-
222
- ```bash
223
- grep '"customType":"rewind-' ~/.pi/agent/sessions/**/*.jsonl
224
- ```
225
-
226
- ## Uninstalling
227
-
228
- 1. Remove the extension directory:
229
- ```bash
230
- rm -rf ~/.pi/agent/extensions/rewind
231
- ```
232
-
233
- 2. Remove any `rewind` key from `~/.pi/agent/settings.json` if you added one
234
-
235
- 3. Optionally, clean up the git reachability ref in each repo where you used the extension:
236
- ```bash
237
- git update-ref -d refs/pi-rewind/store
238
- ```
239
-
240
- ## Limitations
241
-
242
- - Only works in git repositories
243
- - Session metadata grows append-only; retention only trims git reachability
244
- - Discovery for retention is best-effort across discovered Pi session roots and explicit `parentSession` ancestors
245
- - Ignored files and empty directories are outside the snapshot model
1
+ # Rewind Extension
2
+
3
+ A Pi agent extension that records exact file-state rewind points, allowing restoration of file states during `/tree` navigation and across resumed and forked sessions
4
+
5
+ Rewind metadata lives in the session itself as hidden entries, so rewind history survives across forks, resumes, tree navigation, and compaction. Snapshot commits are kept reachable through a single git ref rather than one ref per checkpoint, and rewind points can be resolved across session lineage via `parentSession` links. Retention is optional and configurable; without it, exact history is kept indefinitely.
6
+
7
+ ## Screenshots
8
+
9
+ ![Selecting a message to branch from](rewind1.png)
10
+
11
+ ![Choosing a restore option](rewind2.png)
12
+
13
+ ## Requirements
14
+
15
+ - Pi agent v0.65.0+
16
+ - Node.js (for installation)
17
+ - Git repository
18
+
19
+ ## Installation
20
+
21
+ ```bash
22
+ pi install npm:pi-rewind-hook
23
+ ```
24
+
25
+ This will:
26
+ 1. Create `~/.pi/agent/extensions/rewind/`
27
+ 2. Download the extension files
28
+ 3. Auto-discover the extension from the extensions directory (no `settings.json` extension entry required)
29
+ 4. Remove legacy hooks/explicit rewind extension entries from `settings.json` if present
30
+ 5. Clean up old `hooks/rewind` directory (if present)
31
+
32
+ ## Works with pi-custom-compaction
33
+
34
+ Rewind works seamlessly with [`pi-custom-compaction`](https://github.com/nicobailon/pi-custom-compaction). When `pi-custom-compaction` writes visible background-summary markers, it can ask Rewind to bind an exact file checkpoint to that marker’s own session-tree node. That means `/tree` can offer the normal `Restore files to that point` option directly on the custom compaction marker instead of falling back to a nearby parent node.
35
+
36
+ Install the companion extension with:
37
+
38
+ ```bash
39
+ pi install npm:pi-custom-compaction
40
+ ```
41
+
42
+ This is optional. Pi’s default compaction and Rewind’s native compaction checkpoints continue to work without `pi-custom-compaction`.
43
+
44
+ ## Configuration
45
+
46
+ Optionally add settings to `~/.pi/agent/settings.json`. For example:
47
+
48
+ ```json
49
+ {
50
+ "rewind": {
51
+ "silentCheckpoints": true,
52
+ "retention": {
53
+ "maxSnapshots": 2000,
54
+ "maxAgeDays": 30,
55
+ "pinLabeledEntries": true
56
+ }
57
+ }
58
+ }
59
+ ```
60
+
61
+ ### Settings
62
+
63
+ - `rewind.silentCheckpoints` — hides footer/status and checkpoint notifications
64
+ - `rewind.retention.maxSnapshots` — optional cap on unpinned unique snapshot commits kept reachable
65
+ - `rewind.retention.maxAgeDays` — optional age limit for unpinned snapshot commits
66
+ - `rewind.retention.pinLabeledEntries` — when true, snapshot commits bound to **labeled nodes** in the Pi session tree are exempt from `maxSnapshots` and `maxAgeDays` pruning (useful for bookmarking important rewind points you want to prevent getting garbage-collected)
67
+ - `rewind.retention.scanMode` — retention discovery mode: `ancestor-only` (default, follow current session lineage only) or `repo-sessions` (scan discovered session roots)
68
+ - `rewind.retention.startupBudgetMs` — optional startup time budget for retention sweeps; if exceeded, startup sweep is skipped and deferred
69
+
70
+ If `rewind.retention` is omitted, Rewind keeps exact history with no automatic expiration. This can grow git object storage without bound over time.
71
+
72
+ ## Usage
73
+
74
+ ### Rewinding via `/fork`
75
+
76
+ 1. Type `/fork` in Pi
77
+ 2. Select a message to branch from
78
+ 3. Choose a restore option
79
+
80
+ **Options:**
81
+
82
+ | Option | Files | Conversation |
83
+ |--------|-------|-------------|
84
+ | **Conversation only (keep current files)** | Unchanged | Reset to that point |
85
+ | **Restore all (files + conversation)** | Restored | Reset to that point |
86
+ | **Code only (restore files, keep conversation)** | Restored | Unchanged |
87
+ | **Undo last file rewind** | Restored to before last rewind | Unchanged |
88
+
89
+ `Restore all`, `Code only`, and `Undo last file rewind` are only shown when an exact rewind point or undo snapshot is available for the selected message.
90
+
91
+ When you restore files during `/fork`, the undo snapshot is persisted in the **new child session**, because that is where you continue working.
92
+
93
+ ### Rewinding via `/tree`
94
+
95
+ 1. Press `Tab` to open the session tree
96
+ 2. Navigate to a different node
97
+ 3. Choose a restore option
98
+
99
+ **Options:**
100
+
101
+ | Option | Files | Conversation |
102
+ |--------|-------|-------------|
103
+ | **Keep current files** | Unchanged | Navigated to that point |
104
+ | **Restore files to that point** | Restored | Navigated to that point |
105
+ | **Undo last file rewind** | Restored to before last rewind | Navigated to that point |
106
+
107
+ If you navigate with `Keep current files`, Rewind still persists the resulting session position's exact current file baseline via `rewind-op.current`.
108
+
109
+ ### Examples
110
+
111
+ **Undo a bad refactor:**
112
+
113
+ ```
114
+ You: refactor the auth module to use JWT
115
+ Agent: [makes changes you don't like]
116
+
117
+ You: /fork
118
+ → Select "refactor the auth module to use JWT"
119
+ → Select "Code only (restore files, keep conversation)"
120
+
121
+ Result: Files restored, conversation intact. Try a different approach.
122
+ ```
123
+
124
+ **Start fresh from an earlier point:**
125
+
126
+ ```
127
+ You: /fork
128
+ → Select an earlier message
129
+ → Select "Restore all (files + conversation)"
130
+
131
+ Result: Both files and conversation reset to that point.
132
+ ```
133
+
134
+ ## How Rewind works
135
+
136
+ Rewind stores its ledger in hidden session `custom` entries:
137
+
138
+ - `rewind-turn` — one per prompt, containing the triggering user-node snapshot plus any assistant-node snapshots produced during that prompt
139
+ - `rewind-op` — sparse records for `/fork`, `/tree`, compaction aliases, summary aliases, and undo state
140
+
141
+ Snapshots are only considered at visible boundaries:
142
+
143
+ - the user pre-prompt boundary
144
+ - each assistant `turn_end`
145
+ - selected stateful session operations
146
+
147
+ Rewind does not create per-tool snapshots.
148
+
149
+ ### Canonical exact rewind points
150
+
151
+ Exact file restore is available for:
152
+
153
+ - user nodes
154
+ - assistant nodes
155
+ - compaction nodes aliased to the current exact state
156
+ - branch-summary nodes aliased during `/tree`
157
+
158
+ Exact file restore is not offered for toolResult nodes.
159
+
160
+ ### Git storage model
161
+
162
+ Snapshot commits are kept reachable through a single repo-local ref:
163
+
164
+ ```text
165
+ refs/pi-rewind/store
166
+ ```
167
+
168
+ That ref is only for git object reachability; the session ledger is authoritative.
169
+
170
+ ### Deduplication
171
+
172
+ Before creating a snapshot commit, Rewind captures the worktree tree SHA. If it matches the latest exact snapshot tree, Rewind reuses that existing snapshot commit instead of creating a new one.
173
+
174
+ ### Restore exactness and scope
175
+
176
+ Rewind restores the exact file state for the snapshot domain it owns:
177
+
178
+ - tracked files
179
+ - untracked, non-ignored files
180
+ - without staging the real git index during restore
181
+
182
+ Before restoring target contents, it deletes paths present in the current snapshot but absent from the target snapshot, then restores the target snapshot into the worktree only.
183
+
184
+ Out of scope:
185
+
186
+ - ignored files
187
+ - empty directories
188
+ - exact rewind points for `toolResult` nodes
189
+ - exact rewind points for `bashExecution` nodes
190
+
191
+ ## Lineage and resume behavior
192
+
193
+ Rewind resolves exact rewind points across session lineage by following `parentSession` links and reading rewind metadata from ancestor session files.
194
+
195
+ Rewind v2 uses only session-native `rewind-turn`/`rewind-op` metadata and does not read legacy checkpoint refs.
196
+
197
+ ## Retention
198
+
199
+ Retention only affects git reachability. Session JSONL metadata is append-only and is never compacted by Rewind.
200
+
201
+ When retention is enabled, Rewind keeps snapshot commits alive if they are referenced by:
202
+
203
+ - a `rewind-turn` or `rewind-op` binding in a discovered same-repo session
204
+ - the latest `rewind-op.current` for a discovered same-repo session
205
+ - the latest `rewind-op.undo` for a discovered same-repo session
206
+ - a labeled bound entry when `pinLabeledEntries` is enabled
207
+
208
+ If a snapshot commit has been pruned, Rewind validates commit existence before offering restore.
209
+
210
+ If retention discovery yields an empty live set, Rewind preserves the existing `refs/pi-rewind/store` ref rather than deleting it.
211
+
212
+ ## Viewing storage
213
+
214
+ Show the store ref head:
215
+
216
+ ```bash
217
+ git rev-parse refs/pi-rewind/store
218
+ ```
219
+
220
+ Show the hidden rewind ledger in a session file:
221
+
222
+ ```bash
223
+ grep '"customType":"rewind-' ~/.pi/agent/sessions/**/*.jsonl
224
+ ```
225
+
226
+ ## Uninstalling
227
+
228
+ 1. Remove the extension directory:
229
+ ```bash
230
+ rm -rf ~/.pi/agent/extensions/rewind
231
+ ```
232
+
233
+ 2. Remove any `rewind` key from `~/.pi/agent/settings.json` if you added one
234
+
235
+ 3. Optionally, clean up the git reachability ref in each repo where you used the extension:
236
+ ```bash
237
+ git update-ref -d refs/pi-rewind/store
238
+ ```
239
+
240
+ ## Limitations
241
+
242
+ - Only works in git repositories
243
+ - Session metadata grows append-only; retention only trims git reachability
244
+ - Discovery for retention is best-effort across discovered Pi session roots and explicit `parentSession` ancestors
245
+ - Ignored files and empty directories are outside the snapshot model