@selesai/code 0.9.5 → 0.9.8

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 (284) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cli/credential-print.js +4 -4
  3. package/dist/cli.js +0 -0
  4. package/dist/core/agent-session-runtime.js +1 -4
  5. package/dist/core/agent-session.d.ts +2 -0
  6. package/dist/core/agent-session.js +26 -0
  7. package/dist/core/compaction/branch-summarization.js +30 -30
  8. package/dist/core/compaction/compaction.js +81 -81
  9. package/dist/core/compaction/utils.js +2 -2
  10. package/dist/core/export-html/template.css +1066 -1066
  11. package/dist/core/export-html/template.html +55 -55
  12. package/dist/core/export-html/template.js +1864 -1864
  13. package/dist/core/export-html/vendor/highlight.min.js +1212 -1212
  14. package/dist/core/export-html/vendor/marked.min.js +78 -78
  15. package/dist/core/handoff.d.ts +11 -0
  16. package/dist/core/handoff.js +49 -0
  17. package/dist/core/messages.js +7 -7
  18. package/dist/extensions/context-compaction-reminder.test.ts +82 -82
  19. package/dist/extensions/context-compaction-reminder.ts +28 -28
  20. package/dist/extensions/handoff-new.ts +14 -75
  21. package/dist/extensions/pi-intercom/LICENSE +21 -21
  22. package/dist/extensions/pi-intercom/broker/client.test.ts +83 -83
  23. package/dist/extensions/pi-intercom/broker/extension.test.ts +387 -387
  24. package/dist/extensions/pi-intercom/broker/framing.test.ts +114 -114
  25. package/dist/extensions/pi-intercom/broker/paths.test.ts +153 -153
  26. package/dist/extensions/pi-intercom/broker/paths.ts +134 -134
  27. package/dist/extensions/pi-intercom/broker/runtime-claim.test.ts +34 -34
  28. package/dist/extensions/pi-intercom/broker/runtime-claim.ts +21 -21
  29. package/dist/extensions/pi-intercom/cwd.test.ts +40 -40
  30. package/dist/extensions/pi-intercom/cwd.ts +31 -31
  31. package/dist/extensions/pi-intercom/extension-api.ts +44 -44
  32. package/dist/extensions/pi-intercom/format-context.test.ts +31 -31
  33. package/dist/extensions/pi-intercom/format-context.ts +32 -32
  34. package/dist/extensions/pi-intercom/test/overlay-width.test.ts +66 -66
  35. package/dist/extensions/pi-intercom/ui/compose.ts +143 -143
  36. package/dist/extensions/pi-intercom/ui/session-list.ts +166 -166
  37. package/dist/extensions/pi-powerline-footer/bash-mode/shell-session.ts +286 -286
  38. package/dist/extensions/pi-powerline-footer/bash-mode/transcript.ts +108 -108
  39. package/dist/extensions/pi-powerline-footer/separators.ts +57 -57
  40. package/dist/extensions/pi-powerline-footer/tests/session-usage.test.ts +47 -47
  41. package/dist/extensions/pi-powerline-footer/tests/tps.test.ts +39 -39
  42. package/dist/extensions/pi-powerline-footer/theme.example.json +24 -24
  43. package/dist/extensions/pi-powerline-footer/theme.json +12 -12
  44. package/dist/extensions/pi-powerline-footer/tps.ts +345 -345
  45. package/dist/extensions/pi-rewind-hook/README.md +245 -245
  46. package/dist/extensions/pi-rewind-hook/index.ts +1445 -1445
  47. package/dist/extensions/pi-rewind-hook/package.json +29 -29
  48. package/dist/extensions/pi-subagents/install.mjs +0 -0
  49. package/dist/extensions/pi-web-agent/package.json +31 -31
  50. package/dist/extensions/pi-web-agent/src/backends/config.ts +205 -205
  51. package/dist/extensions/pi-web-agent/src/backends/doctor.ts +136 -136
  52. package/dist/extensions/pi-web-agent/src/backends/factory.ts +152 -152
  53. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +25 -25
  54. package/dist/extensions/pi-web-agent/src/cache/ttl-cache.ts +28 -28
  55. package/dist/extensions/pi-web-agent/src/changelog-notice.ts +136 -136
  56. package/dist/extensions/pi-web-agent/src/commands/web-agent-config.ts +946 -946
  57. package/dist/extensions/pi-web-agent/src/extension.ts +126 -126
  58. package/dist/extensions/pi-web-agent/src/extract/readability.ts +118 -118
  59. package/dist/extensions/pi-web-agent/src/fetch/browser-resolution.ts +199 -199
  60. package/dist/extensions/pi-web-agent/src/fetch/firecrawl-fetch.ts +100 -100
  61. package/dist/extensions/pi-web-agent/src/fetch/headless-fetch.ts +117 -117
  62. package/dist/extensions/pi-web-agent/src/fetch/http-fetch.ts +67 -67
  63. package/dist/extensions/pi-web-agent/src/orchestration/answer-synthesizer.ts +60 -60
  64. package/dist/extensions/pi-web-agent/src/orchestration/candidate-selector.ts +50 -50
  65. package/dist/extensions/pi-web-agent/src/orchestration/direct-url.ts +52 -52
  66. package/dist/extensions/pi-web-agent/src/orchestration/evidence-quality.ts +105 -105
  67. package/dist/extensions/pi-web-agent/src/orchestration/evidence-ranker.ts +45 -45
  68. package/dist/extensions/pi-web-agent/src/orchestration/index.ts +28 -28
  69. package/dist/extensions/pi-web-agent/src/orchestration/query-planner.ts +47 -47
  70. package/dist/extensions/pi-web-agent/src/orchestration/research-orchestrator.ts +376 -376
  71. package/dist/extensions/pi-web-agent/src/orchestration/research-types.ts +64 -64
  72. package/dist/extensions/pi-web-agent/src/orchestration/research-worker.ts +181 -181
  73. package/dist/extensions/pi-web-agent/src/orchestration/source-profile.ts +101 -101
  74. package/dist/extensions/pi-web-agent/src/orchestration/stop-decider.ts +81 -81
  75. package/dist/extensions/pi-web-agent/src/presentation/config-store.ts +210 -210
  76. package/dist/extensions/pi-web-agent/src/presentation/config.ts +75 -75
  77. package/dist/extensions/pi-web-agent/src/presentation/explore-presentation.ts +61 -61
  78. package/dist/extensions/pi-web-agent/src/presentation/fetch-presentation.ts +54 -54
  79. package/dist/extensions/pi-web-agent/src/presentation/search-presentation.ts +41 -41
  80. package/dist/extensions/pi-web-agent/src/presentation/select-view.ts +20 -20
  81. package/dist/extensions/pi-web-agent/src/presentation/types.ts +63 -63
  82. package/dist/extensions/pi-web-agent/src/search/brave.ts +114 -114
  83. package/dist/extensions/pi-web-agent/src/search/duckduckgo.ts +72 -72
  84. package/dist/extensions/pi-web-agent/src/search/searxng.ts +96 -96
  85. package/dist/extensions/pi-web-agent/src/tools/web-explore.ts +71 -71
  86. package/dist/extensions/pi-web-agent/src/tools/web-fetch-headless.ts +31 -31
  87. package/dist/extensions/pi-web-agent/src/tools/web-fetch.ts +31 -31
  88. package/dist/extensions/pi-web-agent/src/tools/web-search.ts +157 -157
  89. package/dist/extensions/pi-web-agent/src/types.ts +88 -88
  90. package/dist/extensions/ponytail/package.json +8 -8
  91. package/dist/extensions/question/batch.ts +103 -103
  92. package/dist/extensions/question/constants.ts +30 -30
  93. package/dist/extensions/question/helpers.ts +58 -58
  94. package/dist/extensions/question/navigation.ts +14 -14
  95. package/dist/extensions/question/package.json +19 -19
  96. package/dist/extensions/question/schemas.ts +43 -43
  97. package/dist/extensions/question/selection-mode.ts +46 -46
  98. package/dist/extensions/question/shortcuts.ts +44 -44
  99. package/dist/extensions/question/types.ts +132 -132
  100. package/dist/extensions/test-resolve-hook-impl.mjs +6 -6
  101. package/dist/extensions/test-resolve-hook.mjs +6 -6
  102. package/dist/extensions/web-agent-onboarding.ts +222 -222
  103. package/dist/extensions/workflow/package.json +17 -17
  104. package/dist/modes/interactive/components/model-selector.d.ts +1 -0
  105. package/dist/modes/interactive/components/model-selector.js +8 -4
  106. package/dist/modes/interactive/interactive-mode.js +9 -5
  107. package/dist/modes/rpc/rpc-mode.js +24 -0
  108. package/dist/modes/rpc/rpc-types.d.ts +19 -0
  109. package/dist/package-manager-cli.js +71 -71
  110. package/dist/rpc-entry.js +0 -0
  111. package/dist/skills/agent-browser/SKILL.md +52 -52
  112. package/dist/skills/batch-grill-me/SKILL.md +19 -19
  113. package/dist/skills/grill-me/SKILL.md +10 -10
  114. package/dist/skills/handoff/SKILL.md +16 -16
  115. package/dist/skills/handoff-text/SKILL.md +14 -14
  116. package/dist/skills/implanger/SKILL.md +69 -69
  117. package/dist/skills/improve-codebase/REFERENCE.md +78 -78
  118. package/dist/skills/improve-codebase/SKILL.md +178 -178
  119. package/dist/skills/planger/SKILL.md +166 -166
  120. package/dist/skills/ponytail/SKILL.md +116 -116
  121. package/dist/skills/ponytail-audit/SKILL.md +42 -42
  122. package/dist/skills/ponytail-debt/SKILL.md +45 -45
  123. package/dist/skills/ponytail-gain/SKILL.md +51 -51
  124. package/dist/skills/ponytail-help/SKILL.md +70 -70
  125. package/dist/skills/ponytail-review/SKILL.md +58 -58
  126. package/dist/skills/selesai-handoff/SKILL.md +20 -20
  127. package/dist/skills/workflow-creation/SKILL.md +73 -73
  128. package/dist/themes/powerline-footer/theme.json +33 -33
  129. package/docs/compaction.md +396 -396
  130. package/docs/containerization.md +111 -111
  131. package/docs/development.md +71 -71
  132. package/docs/docs.json +164 -164
  133. package/docs/environment-variables.md +86 -86
  134. package/docs/index.md +83 -83
  135. package/docs/json.md +82 -82
  136. package/docs/models.md +502 -502
  137. package/docs/packages.md +227 -227
  138. package/docs/plans/subagent-delegation/phase-0-correctness.md +264 -264
  139. package/docs/plans/subagent-delegation/phase-1-behavioral-contract.md +485 -485
  140. package/docs/plans/subagent-delegation/phase-2-context-controls.md +281 -281
  141. package/docs/plans/subagent-delegation/phase-3-advisory-routing.md +361 -361
  142. package/docs/plans/subagent-delegation/phase-4-optional-enforcement.md +380 -380
  143. package/docs/prompt-templates.md +95 -95
  144. package/docs/providers.md +293 -293
  145. package/docs/sdk.md +1143 -1143
  146. package/docs/security.md +59 -59
  147. package/docs/session-format.md +414 -414
  148. package/docs/sessions.md +145 -145
  149. package/docs/shared-host-extensions.md +109 -109
  150. package/docs/shell-aliases.md +13 -13
  151. package/docs/skills.md +231 -231
  152. package/docs/terminal-setup.md +142 -142
  153. package/docs/termux.md +127 -127
  154. package/docs/themes.md +295 -295
  155. package/docs/tmux.md +63 -63
  156. package/docs/tui.md +927 -927
  157. package/docs/windows.md +17 -17
  158. package/examples/README.md +25 -25
  159. package/examples/extensions/README.md +211 -211
  160. package/examples/extensions/auto-commit-on-exit.ts +49 -49
  161. package/examples/extensions/bash-spawn-hook.ts +30 -30
  162. package/examples/extensions/bookmark.ts +50 -50
  163. package/examples/extensions/border-status-editor.ts +150 -150
  164. package/examples/extensions/built-in-tool-renderer.ts +249 -249
  165. package/examples/extensions/claude-rules.ts +86 -86
  166. package/examples/extensions/commands.ts +72 -72
  167. package/examples/extensions/confirm-destructive.ts +59 -59
  168. package/examples/extensions/custom-compaction.ts +130 -130
  169. package/examples/extensions/custom-footer.ts +64 -64
  170. package/examples/extensions/custom-header.ts +73 -73
  171. package/examples/extensions/custom-provider-anthropic/index.ts +610 -610
  172. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -24
  173. package/examples/extensions/custom-provider-anthropic/package.json +19 -19
  174. package/examples/extensions/custom-provider-gitlab-duo/index.ts +404 -404
  175. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -16
  176. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -82
  177. package/examples/extensions/dirty-repo-guard.ts +56 -56
  178. package/examples/extensions/doom-overlay/README.md +46 -46
  179. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -21
  180. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  181. package/examples/extensions/doom-overlay/doom/build.sh +152 -152
  182. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -72
  183. package/examples/extensions/doom-overlay/doom-component.ts +132 -132
  184. package/examples/extensions/doom-overlay/doom-engine.ts +173 -173
  185. package/examples/extensions/doom-overlay/doom-keys.ts +104 -104
  186. package/examples/extensions/doom-overlay/index.ts +74 -74
  187. package/examples/extensions/doom-overlay/wad-finder.ts +51 -51
  188. package/examples/extensions/dynamic-resources/SKILL.md +8 -8
  189. package/examples/extensions/dynamic-resources/dynamic.json +79 -79
  190. package/examples/extensions/dynamic-resources/dynamic.md +5 -5
  191. package/examples/extensions/dynamic-resources/index.ts +15 -15
  192. package/examples/extensions/dynamic-tools.ts +74 -74
  193. package/examples/extensions/event-bus.ts +43 -43
  194. package/examples/extensions/file-trigger.ts +41 -41
  195. package/examples/extensions/git-checkpoint.ts +53 -53
  196. package/examples/extensions/git-merge-and-resolve.ts +115 -115
  197. package/examples/extensions/github-issue-autocomplete.ts +185 -185
  198. package/examples/extensions/gondolin/index.ts +531 -531
  199. package/examples/extensions/gondolin/package-lock.json +185 -185
  200. package/examples/extensions/gondolin/package.json +19 -19
  201. package/examples/extensions/handoff.ts +199 -199
  202. package/examples/extensions/hello.ts +26 -26
  203. package/examples/extensions/hidden-thinking-label.ts +53 -53
  204. package/examples/extensions/inline-bash.ts +94 -94
  205. package/examples/extensions/input-transform-streaming.ts +39 -39
  206. package/examples/extensions/input-transform.ts +43 -43
  207. package/examples/extensions/interactive-shell.ts +196 -196
  208. package/examples/extensions/mac-system-theme.ts +47 -47
  209. package/examples/extensions/message-renderer.ts +59 -59
  210. package/examples/extensions/minimal-mode.ts +426 -426
  211. package/examples/extensions/modal-editor.ts +85 -85
  212. package/examples/extensions/model-status.ts +31 -31
  213. package/examples/extensions/notify.ts +55 -55
  214. package/examples/extensions/overlay-qa-tests.ts +1450 -1450
  215. package/examples/extensions/overlay-test.ts +153 -153
  216. package/examples/extensions/permission-gate.ts +34 -34
  217. package/examples/extensions/pirate.ts +47 -47
  218. package/examples/extensions/plan-mode/README.md +66 -66
  219. package/examples/extensions/plan-mode/index.ts +390 -390
  220. package/examples/extensions/plan-mode/utils.ts +168 -168
  221. package/examples/extensions/preset.ts +436 -436
  222. package/examples/extensions/project-trust.ts +64 -64
  223. package/examples/extensions/prompt-customizer.ts +97 -97
  224. package/examples/extensions/protected-paths.ts +30 -30
  225. package/examples/extensions/provider-payload.ts +18 -18
  226. package/examples/extensions/qna.ts +122 -122
  227. package/examples/extensions/question.ts +285 -285
  228. package/examples/extensions/questionnaire.ts +448 -448
  229. package/examples/extensions/rainbow-editor.ts +88 -88
  230. package/examples/extensions/reload-runtime.ts +37 -37
  231. package/examples/extensions/rpc-demo.ts +118 -118
  232. package/examples/extensions/sandbox/index.ts +321 -321
  233. package/examples/extensions/sandbox/package-lock.json +92 -92
  234. package/examples/extensions/sandbox/package.json +19 -19
  235. package/examples/extensions/send-user-message.ts +97 -97
  236. package/examples/extensions/session-name.ts +27 -27
  237. package/examples/extensions/shutdown-command.ts +63 -63
  238. package/examples/extensions/snake.ts +343 -343
  239. package/examples/extensions/space-invaders.ts +560 -560
  240. package/examples/extensions/ssh.ts +220 -220
  241. package/examples/extensions/status-line.ts +32 -32
  242. package/examples/extensions/structured-output.ts +65 -65
  243. package/examples/extensions/subagent/README.md +175 -175
  244. package/examples/extensions/subagent/agents/planner.md +37 -37
  245. package/examples/extensions/subagent/agents/reviewer.md +35 -35
  246. package/examples/extensions/subagent/agents/scout.md +50 -50
  247. package/examples/extensions/subagent/agents/worker.md +24 -24
  248. package/examples/extensions/subagent/agents.ts +126 -126
  249. package/examples/extensions/subagent/index.ts +1015 -1015
  250. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -10
  251. package/examples/extensions/subagent/prompts/implement.md +10 -10
  252. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -9
  253. package/examples/extensions/summarize.ts +209 -209
  254. package/examples/extensions/system-prompt-header.ts +17 -17
  255. package/examples/extensions/tic-tac-toe.ts +1008 -1008
  256. package/examples/extensions/timed-confirm.ts +70 -70
  257. package/examples/extensions/titlebar-spinner.ts +58 -58
  258. package/examples/extensions/todo.ts +297 -297
  259. package/examples/extensions/tool-override.ts +144 -144
  260. package/examples/extensions/tools.ts +146 -146
  261. package/examples/extensions/trigger-compact.ts +50 -50
  262. package/examples/extensions/truncated-tool.ts +195 -195
  263. package/examples/extensions/widget-placement.ts +9 -9
  264. package/examples/extensions/with-deps/index.ts +32 -32
  265. package/examples/extensions/with-deps/package-lock.json +31 -31
  266. package/examples/extensions/with-deps/package.json +22 -22
  267. package/examples/extensions/working-indicator.ts +123 -123
  268. package/examples/extensions/working-message-test.ts +25 -25
  269. package/examples/rpc-extension-ui.ts +632 -632
  270. package/examples/sdk/01-minimal.ts +26 -26
  271. package/examples/sdk/02-custom-model.ts +53 -53
  272. package/examples/sdk/03-custom-prompt.ts +75 -75
  273. package/examples/sdk/04-skills.ts +55 -55
  274. package/examples/sdk/05-tools.ts +48 -48
  275. package/examples/sdk/06-extensions.ts +99 -99
  276. package/examples/sdk/07-context-files.ts +47 -47
  277. package/examples/sdk/08-prompt-templates.ts +51 -51
  278. package/examples/sdk/09-api-keys-and-oauth.ts +52 -52
  279. package/examples/sdk/10-settings.ts +53 -53
  280. package/examples/sdk/11-sessions.ts +52 -52
  281. package/examples/sdk/12-full-control.ts +79 -79
  282. package/examples/sdk/13-session-runtime.ts +67 -67
  283. package/examples/sdk/README.md +144 -144
  284. package/package.json +1 -1
package/docs/sessions.md CHANGED
@@ -1,145 +1,145 @@
1
- # Sessions
2
-
3
- Pi saves conversations as sessions so you can continue work, branch from earlier turns, and revisit previous paths.
4
-
5
- ## Session Storage
6
-
7
- Sessions auto-save to `~/.pi/agent/sessions/`, organized by working directory. Each session is a JSONL file with a tree structure.
8
-
9
- ```bash
10
- pi -c # Continue most recent session
11
- pi -r # Browse and select from past sessions
12
- pi --no-session # Ephemeral mode; do not save
13
- pi --name "my task" # Set session display name at startup
14
- pi --session <path|id> # Use a specific session file or partial session ID
15
- pi --fork <path|id> # Fork a session file or partial session ID into a new session
16
- ```
17
-
18
- Use `/session` in interactive mode to see the current session file, session ID, message count, tokens, and cost.
19
-
20
- For the JSONL file format and SessionManager API, see [Session Format](session-format.md).
21
-
22
- ## Session Commands
23
-
24
- | Command | Description |
25
- |---------|-------------|
26
- | `/resume` | Browse and select previous sessions |
27
- | `/new` | Start a new session |
28
- | `/name <name>` | Set the current session display name |
29
- | `/session` | Show session info |
30
- | `/tree` | Navigate the current session tree |
31
- | `/fork` | Create a new session from a previous user message |
32
- | `/clone` | Duplicate the current active branch into a new session |
33
- | `/compact [prompt]` | Summarize older context; see [Compaction](compaction.md) |
34
- | `/export [file]` | Export session to HTML |
35
- | `/share` | Upload as private GitHub gist with shareable HTML link |
36
-
37
- ## Resuming and Deleting Sessions
38
-
39
- `/resume` opens an interactive session picker for the current project. `pi -r` opens the same picker at startup.
40
-
41
- In the picker you can:
42
-
43
- - search by typing
44
- - toggle path display with Ctrl+P
45
- - toggle sort mode with Ctrl+S
46
- - filter to named sessions with Ctrl+N
47
- - rename with Ctrl+R
48
- - delete with Ctrl+D, then confirm
49
-
50
- When available, pi uses the `trash` CLI for deletion instead of permanently removing files.
51
-
52
- ## Naming Sessions
53
-
54
- Use `/name <name>` to set a human-readable session name:
55
-
56
- ```text
57
- /name Refactor auth module
58
- ```
59
-
60
- Set the name at startup with `--name` or `-n`:
61
-
62
- ```bash
63
- pi --name "Refactor auth module"
64
- pi --name "CI audit" -p "Review this build failure"
65
- ```
66
-
67
- Named sessions are easier to find in `/resume` and `pi -r`.
68
-
69
- ## Branching with `/tree`
70
-
71
- Sessions are stored as trees. Every entry has an `id` and `parentId`, and the current position is the active leaf. `/tree` lets you jump to any previous point and continue from there without creating a new file.
72
-
73
- <p align="center"><img src="images/tree-view.png" alt="Tree View" width="600"></p>
74
-
75
- Example shape:
76
-
77
- ```text
78
- ├─ user: "Hello, can you help..."
79
- │ └─ assistant: "Of course! I can..."
80
- │ ├─ user: "Let's try approach A..."
81
- │ │ └─ assistant: "For approach A..."
82
- │ │ └─ user: "That worked..." ← active
83
- │ └─ user: "Actually, approach B..."
84
- │ └─ assistant: "For approach B..."
85
- ```
86
-
87
- ### Tree Controls
88
-
89
- | Key | Action |
90
- |-----|--------|
91
- | ↑/↓ | Navigate visible entries |
92
- | ←/→ | Page up/down |
93
- | Ctrl+←/Ctrl+→ or Alt+←/Alt+→ | Fold/unfold or jump between branch segments |
94
- | Shift+L | Set or clear a label on the selected entry |
95
- | Shift+T | Toggle label timestamps |
96
- | Enter | Select entry |
97
- | Escape/Ctrl+C | Cancel |
98
- | Ctrl+O | Cycle filter mode |
99
-
100
- Filter modes are: default, no-tools, user-only, labeled-only, and all. Configure the default with `treeFilterMode` in [Settings](settings.md).
101
-
102
- ### Selection Behavior
103
-
104
- Selecting a user or custom message:
105
-
106
- 1. Moves the leaf to the selected message's parent.
107
- 2. Places the selected message text in the editor.
108
- 3. Lets you edit and resubmit, creating a new branch.
109
-
110
- Selecting an assistant, tool, compaction, or other non-user entry:
111
-
112
- 1. Moves the leaf to that entry.
113
- 2. Leaves the editor empty.
114
- 3. Lets you continue from that point.
115
-
116
- Selecting the root user message resets the leaf to an empty conversation and places the original prompt in the editor.
117
-
118
- ## `/tree`, `/fork`, and `/clone`
119
-
120
- | Feature | `/tree` | `/fork` | `/clone` |
121
- |---------|---------|---------|----------|
122
- | Output | Same session file | New session file | New session file |
123
- | View | Full tree | User-message selector | Current active branch |
124
- | Typical use | Explore alternatives in place | Start a new session from an earlier prompt | Duplicate current work before continuing |
125
- | Summary | Optional branch summary | None | None |
126
-
127
- Use `/tree` when you want to keep alternatives together. Use `/fork` or `/clone` when you want a separate session file.
128
-
129
- ## Branch Summaries
130
-
131
- When `/tree` switches away from one branch to another, pi can summarize the abandoned branch and attach that summary at the new position. This preserves important context from the path you left without replaying the whole branch.
132
-
133
- When prompted, choose one of:
134
-
135
- 1. no summary
136
- 2. summarize with the default prompt
137
- 3. summarize with custom focus instructions
138
-
139
- See [Compaction](compaction.md) for branch summarization internals and extension hooks.
140
-
141
- ## Session Format
142
-
143
- Session files are JSONL and contain message entries, model changes, thinking-level changes, labels, compactions, branch summaries, and extension entries.
144
-
145
- For parsers, extensions, SDK usage, and the full SessionManager API, see [Session Format](session-format.md).
1
+ # Sessions
2
+
3
+ Pi saves conversations as sessions so you can continue work, branch from earlier turns, and revisit previous paths.
4
+
5
+ ## Session Storage
6
+
7
+ Sessions auto-save to `~/.pi/agent/sessions/`, organized by working directory. Each session is a JSONL file with a tree structure.
8
+
9
+ ```bash
10
+ pi -c # Continue most recent session
11
+ pi -r # Browse and select from past sessions
12
+ pi --no-session # Ephemeral mode; do not save
13
+ pi --name "my task" # Set session display name at startup
14
+ pi --session <path|id> # Use a specific session file or partial session ID
15
+ pi --fork <path|id> # Fork a session file or partial session ID into a new session
16
+ ```
17
+
18
+ Use `/session` in interactive mode to see the current session file, session ID, message count, tokens, and cost.
19
+
20
+ For the JSONL file format and SessionManager API, see [Session Format](session-format.md).
21
+
22
+ ## Session Commands
23
+
24
+ | Command | Description |
25
+ |---------|-------------|
26
+ | `/resume` | Browse and select previous sessions |
27
+ | `/new` | Start a new session |
28
+ | `/name <name>` | Set the current session display name |
29
+ | `/session` | Show session info |
30
+ | `/tree` | Navigate the current session tree |
31
+ | `/fork` | Create a new session from a previous user message |
32
+ | `/clone` | Duplicate the current active branch into a new session |
33
+ | `/compact [prompt]` | Summarize older context; see [Compaction](compaction.md) |
34
+ | `/export [file]` | Export session to HTML |
35
+ | `/share` | Upload as private GitHub gist with shareable HTML link |
36
+
37
+ ## Resuming and Deleting Sessions
38
+
39
+ `/resume` opens an interactive session picker for the current project. `pi -r` opens the same picker at startup.
40
+
41
+ In the picker you can:
42
+
43
+ - search by typing
44
+ - toggle path display with Ctrl+P
45
+ - toggle sort mode with Ctrl+S
46
+ - filter to named sessions with Ctrl+N
47
+ - rename with Ctrl+R
48
+ - delete with Ctrl+D, then confirm
49
+
50
+ When available, pi uses the `trash` CLI for deletion instead of permanently removing files.
51
+
52
+ ## Naming Sessions
53
+
54
+ Use `/name <name>` to set a human-readable session name:
55
+
56
+ ```text
57
+ /name Refactor auth module
58
+ ```
59
+
60
+ Set the name at startup with `--name` or `-n`:
61
+
62
+ ```bash
63
+ pi --name "Refactor auth module"
64
+ pi --name "CI audit" -p "Review this build failure"
65
+ ```
66
+
67
+ Named sessions are easier to find in `/resume` and `pi -r`.
68
+
69
+ ## Branching with `/tree`
70
+
71
+ Sessions are stored as trees. Every entry has an `id` and `parentId`, and the current position is the active leaf. `/tree` lets you jump to any previous point and continue from there without creating a new file.
72
+
73
+ <p align="center"><img src="images/tree-view.png" alt="Tree View" width="600"></p>
74
+
75
+ Example shape:
76
+
77
+ ```text
78
+ ├─ user: "Hello, can you help..."
79
+ │ └─ assistant: "Of course! I can..."
80
+ │ ├─ user: "Let's try approach A..."
81
+ │ │ └─ assistant: "For approach A..."
82
+ │ │ └─ user: "That worked..." ← active
83
+ │ └─ user: "Actually, approach B..."
84
+ │ └─ assistant: "For approach B..."
85
+ ```
86
+
87
+ ### Tree Controls
88
+
89
+ | Key | Action |
90
+ |-----|--------|
91
+ | ↑/↓ | Navigate visible entries |
92
+ | ←/→ | Page up/down |
93
+ | Ctrl+←/Ctrl+→ or Alt+←/Alt+→ | Fold/unfold or jump between branch segments |
94
+ | Shift+L | Set or clear a label on the selected entry |
95
+ | Shift+T | Toggle label timestamps |
96
+ | Enter | Select entry |
97
+ | Escape/Ctrl+C | Cancel |
98
+ | Ctrl+O | Cycle filter mode |
99
+
100
+ Filter modes are: default, no-tools, user-only, labeled-only, and all. Configure the default with `treeFilterMode` in [Settings](settings.md).
101
+
102
+ ### Selection Behavior
103
+
104
+ Selecting a user or custom message:
105
+
106
+ 1. Moves the leaf to the selected message's parent.
107
+ 2. Places the selected message text in the editor.
108
+ 3. Lets you edit and resubmit, creating a new branch.
109
+
110
+ Selecting an assistant, tool, compaction, or other non-user entry:
111
+
112
+ 1. Moves the leaf to that entry.
113
+ 2. Leaves the editor empty.
114
+ 3. Lets you continue from that point.
115
+
116
+ Selecting the root user message resets the leaf to an empty conversation and places the original prompt in the editor.
117
+
118
+ ## `/tree`, `/fork`, and `/clone`
119
+
120
+ | Feature | `/tree` | `/fork` | `/clone` |
121
+ |---------|---------|---------|----------|
122
+ | Output | Same session file | New session file | New session file |
123
+ | View | Full tree | User-message selector | Current active branch |
124
+ | Typical use | Explore alternatives in place | Start a new session from an earlier prompt | Duplicate current work before continuing |
125
+ | Summary | Optional branch summary | None | None |
126
+
127
+ Use `/tree` when you want to keep alternatives together. Use `/fork` or `/clone` when you want a separate session file.
128
+
129
+ ## Branch Summaries
130
+
131
+ When `/tree` switches away from one branch to another, pi can summarize the abandoned branch and attach that summary at the new position. This preserves important context from the path you left without replaying the whole branch.
132
+
133
+ When prompted, choose one of:
134
+
135
+ 1. no summary
136
+ 2. summarize with the default prompt
137
+ 3. summarize with custom focus instructions
138
+
139
+ See [Compaction](compaction.md) for branch summarization internals and extension hooks.
140
+
141
+ ## Session Format
142
+
143
+ Session files are JSONL and contain message entries, model changes, thinking-level changes, labels, compactions, branch summaries, and extension entries.
144
+
145
+ For parsers, extensions, SDK usage, and the full SessionManager API, see [Session Format](session-format.md).
@@ -1,109 +1,109 @@
1
- # Shared Host Extensions
2
-
3
- Selesai is a pi fork with its own config directory (`~/.selesai/agent/`). By default it only reads your extensions from there. If you already use `pi` and have extensions installed under `~/.pi/agent/extensions/`, you can let selesai reuse them without duplicating auth, sessions, models, or settings.
4
-
5
- This page covers three things:
6
-
7
- 1. The shared-host fallback (how selesai reads pi's extensions).
8
- 2. Collisions: what happens when the same extension exists in both.
9
- 3. Picking the winner per extension via `extensionHost`.
10
-
11
- ## What gets shared, and what does not
12
-
13
- | Read from `~/.pi/agent/` | Kept separate under `~/.selesai/agent/` |
14
- |---|---|
15
- | `extensions/` | `auth.json` |
16
- | | `models.json` |
17
- | | `settings.json` |
18
- | | `sessions/` |
19
- | | `skills/`, `prompts/`, `themes/` |
20
-
21
- Only **extensions** are shared from the pi host dir. Everything tied to your identity, model defaults, and settings stays in selesai's own dir. This means you can keep a single set of API keys in `~/.pi/agent/auth.json` for pi, and a different set in `~/.selesai/agent/auth.json` for selesai, while both agents load the same extension code.
22
-
23
- The host directory is hardcoded to `~/.pi/agent/extensions`. If pi ever renames its config dir, selesai will silently stop loading pi's extensions — no error, the extensions just won't appear. There is no env var to override this; the path is deliberately fixed so your two installs can't drift into loading the wrong dir.
24
-
25
- ## Collisions: same extension in both dirs
26
-
27
- If an extension named `pi-subagents` exists in both `~/.selesai/agent/extensions/` and `~/.pi/agent/extensions/`, selesai does **not** load both. Loading both causes split-brain problems for stateful extensions (timers, event handlers, watchers running twice with separate `state` objects), so selesai loads exactly one copy and drops the other.
28
-
29
- The "name" used for dedup is the **top-level entry name** under the extensions dir:
30
-
31
- - A packaged extension dir (e.g. `pi-subagents/` with a `package.json`) → the dir name `pi-subagents`.
32
- - A loose `.ts` file (e.g. `copy-turn.ts`) → the file name `copy-turn.ts`.
33
-
34
- If you fork `pi-subagents` into a dir called `my-subagents`, the names differ and both load — no collision.
35
-
36
- ### Default winner
37
-
38
- Without any config, **selesai's copy wins**. The pi copy is dropped entirely (never loaded), and a warning is printed at startup:
39
-
40
- ```
41
- Warning: Extension "pi-subagents" exists in both ~/.selesai/agent/extensions and ~/.pi/agent/extensions; loaded the selesai copy, skipped the other. Set "extensionHost": { "pi-subagents": "pi" } or "selesai" in settings.json to change the winner.
42
- ```
43
-
44
- ## Picking the winner: `extensionHost`
45
-
46
- You control the winner per extension in `~/.selesai/agent/settings.json`:
47
-
48
- ```json
49
- {
50
- "extensionHost": {
51
- "pi-subagents": "pi",
52
- "copy-turn.ts": "selesai"
53
- }
54
- }
55
- ```
56
-
57
- | Value | Behavior |
58
- |---|---|
59
- | `"selesai"` | selesai's copy loads, pi's is dropped. |
60
- | `"pi"` | pi's copy loads, selesai's is dropped. |
61
- | (omitted) | Default applies (= selesai wins). |
62
-
63
- Typical reasons to pick `"pi"`:
64
- - You hack on an extension under `~/.pi/agent/extensions/` and want both agents to run your working copy.
65
- - pi's version is newer and you have not ported your changes into selesai yet.
66
- - An extension carries host-specific state (a socket path, a lockfile).
67
-
68
- Typical reasons to leave it at `"selesai"` (default):
69
- - You have a selesai-specific fork and want it to shadow pi's.
70
- - You are migrating toward selesai and are phasing pi's copy out.
71
-
72
- The setting is scoped by name, so you can mix: keep pi's `pi-subagents` but use selesai's `copy-turn.ts`.
73
-
74
- ### Where to put it
75
-
76
- Global (`~/.selesai/agent/settings.json`) applies to every project. Project-local `.selesai/settings.json` (or `.pi/settings.json` inside a trusted project) overrides per project, since project settings merge on top of global. See [settings.md](settings.md) for the full merge rules.
77
-
78
- ## Workflow: running pi and selesai side by side
79
-
80
- 1. Keep your current install as-is:
81
- ```
82
- ~/.pi/agent/
83
- extensions/ <- your shared extensions live here
84
- auth.json
85
- settings.json
86
- ~/.selesai/agent/
87
- extensions/ <- (optional) selesai-specific forks override the above
88
- auth.json <- separate keys, separate sessions
89
- settings.json <- add extensionHost here
90
- ```
91
- 2. If you hit a collision warning and want the other copy, add one line to `~/.selesai/agent/settings.json`:
92
- ```json
93
- { "extensionHost": { "pi-subagents": "pi" } }
94
- ```
95
- 3. Restart. The warning now reads that pi's copy won and selesai's was skipped.
96
-
97
- ## How detection works (under the hood)
98
-
99
- - During resource resolution, selesai collects all enabled extensions from `~/.selesai/agent/extensions/`, then walks `~/.pi/agent/extensions/` for the rest.
100
- - For each pi-host entry, it computes the top-level entry name and checks it against the selesai set.
101
- - On a match, `extensionHost[name]` decides the winner; the loser is removed from the resolved set before anything loads, so no double-load of factories, no orphaned timers.
102
- - Each drop is recorded as a collision and surfaced as a startup warning (see [Settings](settings.md) for where diagnostics are reported).
103
-
104
- ## Limitations
105
-
106
- - **Only extensions are shared.** Skills, prompts, and themes in `~/.pi/agent/skills/` etc. are never read by selesai. Copy them into `~/.selesai/agent/` if you want them.
107
- - **Only name collisions are deduped.** If two unrelated extensions register the same tool or command name (e.g. both define `/foo`), that conflict is handled by pi's normal first-registration-wins rule after load, not by `extensionHost`.
108
- - **No version check.** If selesai's `pi-subagents` is 0.2.0 and pi's is 0.4.0, `extensionHost: { "pi-subagents": "pi" }` silently loads 0.4.0. Picking the winner is purely by install location, not by version. You are responsible for matching versions when you want consistent behavior.
109
- - **Hardcoded host path.** If you rename pi's config dir away from `~/.pi`, selesai stops seeing it. There is no resolver hook yet.
1
+ # Shared Host Extensions
2
+
3
+ Selesai is a pi fork with its own config directory (`~/.selesai/agent/`). By default it only reads your extensions from there. If you already use `pi` and have extensions installed under `~/.pi/agent/extensions/`, you can let selesai reuse them without duplicating auth, sessions, models, or settings.
4
+
5
+ This page covers three things:
6
+
7
+ 1. The shared-host fallback (how selesai reads pi's extensions).
8
+ 2. Collisions: what happens when the same extension exists in both.
9
+ 3. Picking the winner per extension via `extensionHost`.
10
+
11
+ ## What gets shared, and what does not
12
+
13
+ | Read from `~/.pi/agent/` | Kept separate under `~/.selesai/agent/` |
14
+ |---|---|
15
+ | `extensions/` | `auth.json` |
16
+ | | `models.json` |
17
+ | | `settings.json` |
18
+ | | `sessions/` |
19
+ | | `skills/`, `prompts/`, `themes/` |
20
+
21
+ Only **extensions** are shared from the pi host dir. Everything tied to your identity, model defaults, and settings stays in selesai's own dir. This means you can keep a single set of API keys in `~/.pi/agent/auth.json` for pi, and a different set in `~/.selesai/agent/auth.json` for selesai, while both agents load the same extension code.
22
+
23
+ The host directory is hardcoded to `~/.pi/agent/extensions`. If pi ever renames its config dir, selesai will silently stop loading pi's extensions — no error, the extensions just won't appear. There is no env var to override this; the path is deliberately fixed so your two installs can't drift into loading the wrong dir.
24
+
25
+ ## Collisions: same extension in both dirs
26
+
27
+ If an extension named `pi-subagents` exists in both `~/.selesai/agent/extensions/` and `~/.pi/agent/extensions/`, selesai does **not** load both. Loading both causes split-brain problems for stateful extensions (timers, event handlers, watchers running twice with separate `state` objects), so selesai loads exactly one copy and drops the other.
28
+
29
+ The "name" used for dedup is the **top-level entry name** under the extensions dir:
30
+
31
+ - A packaged extension dir (e.g. `pi-subagents/` with a `package.json`) → the dir name `pi-subagents`.
32
+ - A loose `.ts` file (e.g. `copy-turn.ts`) → the file name `copy-turn.ts`.
33
+
34
+ If you fork `pi-subagents` into a dir called `my-subagents`, the names differ and both load — no collision.
35
+
36
+ ### Default winner
37
+
38
+ Without any config, **selesai's copy wins**. The pi copy is dropped entirely (never loaded), and a warning is printed at startup:
39
+
40
+ ```
41
+ Warning: Extension "pi-subagents" exists in both ~/.selesai/agent/extensions and ~/.pi/agent/extensions; loaded the selesai copy, skipped the other. Set "extensionHost": { "pi-subagents": "pi" } or "selesai" in settings.json to change the winner.
42
+ ```
43
+
44
+ ## Picking the winner: `extensionHost`
45
+
46
+ You control the winner per extension in `~/.selesai/agent/settings.json`:
47
+
48
+ ```json
49
+ {
50
+ "extensionHost": {
51
+ "pi-subagents": "pi",
52
+ "copy-turn.ts": "selesai"
53
+ }
54
+ }
55
+ ```
56
+
57
+ | Value | Behavior |
58
+ |---|---|
59
+ | `"selesai"` | selesai's copy loads, pi's is dropped. |
60
+ | `"pi"` | pi's copy loads, selesai's is dropped. |
61
+ | (omitted) | Default applies (= selesai wins). |
62
+
63
+ Typical reasons to pick `"pi"`:
64
+ - You hack on an extension under `~/.pi/agent/extensions/` and want both agents to run your working copy.
65
+ - pi's version is newer and you have not ported your changes into selesai yet.
66
+ - An extension carries host-specific state (a socket path, a lockfile).
67
+
68
+ Typical reasons to leave it at `"selesai"` (default):
69
+ - You have a selesai-specific fork and want it to shadow pi's.
70
+ - You are migrating toward selesai and are phasing pi's copy out.
71
+
72
+ The setting is scoped by name, so you can mix: keep pi's `pi-subagents` but use selesai's `copy-turn.ts`.
73
+
74
+ ### Where to put it
75
+
76
+ Global (`~/.selesai/agent/settings.json`) applies to every project. Project-local `.selesai/settings.json` (or `.pi/settings.json` inside a trusted project) overrides per project, since project settings merge on top of global. See [settings.md](settings.md) for the full merge rules.
77
+
78
+ ## Workflow: running pi and selesai side by side
79
+
80
+ 1. Keep your current install as-is:
81
+ ```
82
+ ~/.pi/agent/
83
+ extensions/ <- your shared extensions live here
84
+ auth.json
85
+ settings.json
86
+ ~/.selesai/agent/
87
+ extensions/ <- (optional) selesai-specific forks override the above
88
+ auth.json <- separate keys, separate sessions
89
+ settings.json <- add extensionHost here
90
+ ```
91
+ 2. If you hit a collision warning and want the other copy, add one line to `~/.selesai/agent/settings.json`:
92
+ ```json
93
+ { "extensionHost": { "pi-subagents": "pi" } }
94
+ ```
95
+ 3. Restart. The warning now reads that pi's copy won and selesai's was skipped.
96
+
97
+ ## How detection works (under the hood)
98
+
99
+ - During resource resolution, selesai collects all enabled extensions from `~/.selesai/agent/extensions/`, then walks `~/.pi/agent/extensions/` for the rest.
100
+ - For each pi-host entry, it computes the top-level entry name and checks it against the selesai set.
101
+ - On a match, `extensionHost[name]` decides the winner; the loser is removed from the resolved set before anything loads, so no double-load of factories, no orphaned timers.
102
+ - Each drop is recorded as a collision and surfaced as a startup warning (see [Settings](settings.md) for where diagnostics are reported).
103
+
104
+ ## Limitations
105
+
106
+ - **Only extensions are shared.** Skills, prompts, and themes in `~/.pi/agent/skills/` etc. are never read by selesai. Copy them into `~/.selesai/agent/` if you want them.
107
+ - **Only name collisions are deduped.** If two unrelated extensions register the same tool or command name (e.g. both define `/foo`), that conflict is handled by pi's normal first-registration-wins rule after load, not by `extensionHost`.
108
+ - **No version check.** If selesai's `pi-subagents` is 0.2.0 and pi's is 0.4.0, `extensionHost: { "pi-subagents": "pi" }` silently loads 0.4.0. Picking the winner is purely by install location, not by version. You are responsible for matching versions when you want consistent behavior.
109
+ - **Hardcoded host path.** If you rename pi's config dir away from `~/.pi`, selesai stops seeing it. There is no resolver hook yet.
@@ -1,13 +1,13 @@
1
- # Shell Aliases
2
-
3
- Pi runs bash in non-interactive mode (`bash -c`), which doesn't expand aliases by default.
4
-
5
- To enable your shell aliases, add to `~/.pi/agent/settings.json`:
6
-
7
- ```json
8
- {
9
- "shellCommandPrefix": "shopt -s expand_aliases\neval \"$(grep '^alias ' ~/.zshrc)\""
10
- }
11
- ```
12
-
13
- Adjust the path (`~/.zshrc`, `~/.bashrc`, etc.) to match your shell config.
1
+ # Shell Aliases
2
+
3
+ Pi runs bash in non-interactive mode (`bash -c`), which doesn't expand aliases by default.
4
+
5
+ To enable your shell aliases, add to `~/.pi/agent/settings.json`:
6
+
7
+ ```json
8
+ {
9
+ "shellCommandPrefix": "shopt -s expand_aliases\neval \"$(grep '^alias ' ~/.zshrc)\""
10
+ }
11
+ ```
12
+
13
+ Adjust the path (`~/.zshrc`, `~/.bashrc`, etc.) to match your shell config.