@mariozechner/pi-coding-agent 0.49.2 → 0.50.0

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 (237) hide show
  1. package/CHANGELOG.md +126 -1
  2. package/README.md +310 -1229
  3. package/dist/cli/args.d.ts +5 -0
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +57 -22
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/config-selector.d.ts +14 -0
  8. package/dist/cli/config-selector.d.ts.map +1 -0
  9. package/dist/cli/config-selector.js +31 -0
  10. package/dist/cli/config-selector.js.map +1 -0
  11. package/dist/cli/session-picker.d.ts.map +1 -1
  12. package/dist/cli/session-picker.js +1 -1
  13. package/dist/cli/session-picker.js.map +1 -1
  14. package/dist/config.d.ts +2 -0
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +6 -0
  17. package/dist/config.js.map +1 -1
  18. package/dist/core/agent-session.d.ts +53 -34
  19. package/dist/core/agent-session.d.ts.map +1 -1
  20. package/dist/core/agent-session.js +262 -67
  21. package/dist/core/agent-session.js.map +1 -1
  22. package/dist/core/auth-storage.d.ts +8 -18
  23. package/dist/core/auth-storage.d.ts.map +1 -1
  24. package/dist/core/auth-storage.js +39 -55
  25. package/dist/core/auth-storage.js.map +1 -1
  26. package/dist/core/bash-executor.d.ts.map +1 -1
  27. package/dist/core/bash-executor.js +2 -1
  28. package/dist/core/bash-executor.js.map +1 -1
  29. package/dist/core/diagnostics.d.ts +15 -0
  30. package/dist/core/diagnostics.d.ts.map +1 -0
  31. package/dist/core/diagnostics.js +2 -0
  32. package/dist/core/diagnostics.js.map +1 -0
  33. package/dist/core/export-html/template.css +9 -0
  34. package/dist/core/export-html/template.js +6 -4
  35. package/dist/core/extensions/index.d.ts +1 -1
  36. package/dist/core/extensions/index.d.ts.map +1 -1
  37. package/dist/core/extensions/index.js.map +1 -1
  38. package/dist/core/extensions/loader.d.ts +1 -1
  39. package/dist/core/extensions/loader.d.ts.map +1 -1
  40. package/dist/core/extensions/loader.js +10 -1
  41. package/dist/core/extensions/loader.js.map +1 -1
  42. package/dist/core/extensions/runner.d.ts +9 -3
  43. package/dist/core/extensions/runner.d.ts.map +1 -1
  44. package/dist/core/extensions/runner.js +39 -12
  45. package/dist/core/extensions/runner.js.map +1 -1
  46. package/dist/core/extensions/types.d.ts +112 -1
  47. package/dist/core/extensions/types.d.ts.map +1 -1
  48. package/dist/core/extensions/types.js.map +1 -1
  49. package/dist/core/footer-data-provider.d.ts +9 -2
  50. package/dist/core/footer-data-provider.d.ts.map +1 -1
  51. package/dist/core/footer-data-provider.js +13 -0
  52. package/dist/core/footer-data-provider.js.map +1 -1
  53. package/dist/core/model-registry.d.ts +42 -2
  54. package/dist/core/model-registry.d.ts.map +1 -1
  55. package/dist/core/model-registry.js +154 -44
  56. package/dist/core/model-registry.js.map +1 -1
  57. package/dist/core/model-resolver.d.ts.map +1 -1
  58. package/dist/core/model-resolver.js +3 -2
  59. package/dist/core/model-resolver.js.map +1 -1
  60. package/dist/core/package-manager.d.ts +129 -0
  61. package/dist/core/package-manager.d.ts.map +1 -0
  62. package/dist/core/package-manager.js +1148 -0
  63. package/dist/core/package-manager.js.map +1 -0
  64. package/dist/core/prompt-templates.d.ts +6 -0
  65. package/dist/core/prompt-templates.d.ts.map +1 -1
  66. package/dist/core/prompt-templates.js +114 -54
  67. package/dist/core/prompt-templates.js.map +1 -1
  68. package/dist/core/resource-loader.d.ts +160 -0
  69. package/dist/core/resource-loader.d.ts.map +1 -0
  70. package/dist/core/resource-loader.js +604 -0
  71. package/dist/core/resource-loader.js.map +1 -0
  72. package/dist/core/sdk.d.ts +14 -105
  73. package/dist/core/sdk.d.ts.map +1 -1
  74. package/dist/core/sdk.js +52 -304
  75. package/dist/core/sdk.js.map +1 -1
  76. package/dist/core/session-manager.d.ts.map +1 -1
  77. package/dist/core/session-manager.js +45 -1
  78. package/dist/core/session-manager.js.map +1 -1
  79. package/dist/core/settings-manager.d.ts +39 -16
  80. package/dist/core/settings-manager.d.ts.map +1 -1
  81. package/dist/core/settings-manager.js +107 -25
  82. package/dist/core/settings-manager.js.map +1 -1
  83. package/dist/core/skills.d.ts +18 -10
  84. package/dist/core/skills.d.ts.map +1 -1
  85. package/dist/core/skills.js +126 -93
  86. package/dist/core/skills.js.map +1 -1
  87. package/dist/core/system-prompt.d.ts +3 -27
  88. package/dist/core/system-prompt.d.ts.map +1 -1
  89. package/dist/core/system-prompt.js +16 -103
  90. package/dist/core/system-prompt.js.map +1 -1
  91. package/dist/core/tools/bash.d.ts.map +1 -1
  92. package/dist/core/tools/bash.js +2 -1
  93. package/dist/core/tools/bash.js.map +1 -1
  94. package/dist/core/tools/read.d.ts.map +1 -1
  95. package/dist/core/tools/read.js +4 -4
  96. package/dist/core/tools/read.js.map +1 -1
  97. package/dist/index.d.ts +12 -7
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +8 -6
  100. package/dist/index.js.map +1 -1
  101. package/dist/main.d.ts.map +1 -1
  102. package/dist/main.js +209 -97
  103. package/dist/main.js.map +1 -1
  104. package/dist/modes/interactive/components/assistant-message.d.ts +3 -2
  105. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  106. package/dist/modes/interactive/components/assistant-message.js +5 -3
  107. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  108. package/dist/modes/interactive/components/bordered-loader.d.ts +5 -1
  109. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  110. package/dist/modes/interactive/components/bordered-loader.js +29 -9
  111. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  112. package/dist/modes/interactive/components/branch-summary-message.d.ts +3 -2
  113. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  114. package/dist/modes/interactive/components/branch-summary-message.js +4 -2
  115. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  116. package/dist/modes/interactive/components/compaction-summary-message.d.ts +3 -2
  117. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  118. package/dist/modes/interactive/components/compaction-summary-message.js +4 -2
  119. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  120. package/dist/modes/interactive/components/config-selector.d.ts +71 -0
  121. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  122. package/dist/modes/interactive/components/config-selector.js +468 -0
  123. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  124. package/dist/modes/interactive/components/custom-message.d.ts +3 -2
  125. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  126. package/dist/modes/interactive/components/custom-message.js +4 -2
  127. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  128. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  129. package/dist/modes/interactive/components/footer.js +9 -0
  130. package/dist/modes/interactive/components/footer.js.map +1 -1
  131. package/dist/modes/interactive/components/index.d.ts +1 -0
  132. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  133. package/dist/modes/interactive/components/index.js +1 -0
  134. package/dist/modes/interactive/components/index.js.map +1 -1
  135. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  136. package/dist/modes/interactive/components/oauth-selector.js +3 -4
  137. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  138. package/dist/modes/interactive/components/session-selector.d.ts +18 -1
  139. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  140. package/dist/modes/interactive/components/session-selector.js +195 -87
  141. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  142. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  143. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  144. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  145. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  146. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  147. package/dist/modes/interactive/components/tool-execution.js +12 -5
  148. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  149. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  150. package/dist/modes/interactive/components/tree-selector.js +2 -2
  151. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  152. package/dist/modes/interactive/components/user-message.d.ts +2 -2
  153. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  154. package/dist/modes/interactive/components/user-message.js +2 -2
  155. package/dist/modes/interactive/components/user-message.js.map +1 -1
  156. package/dist/modes/interactive/interactive-mode.d.ts +47 -2
  157. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  158. package/dist/modes/interactive/interactive-mode.js +566 -211
  159. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  160. package/dist/modes/interactive/theme/dark.json +1 -1
  161. package/dist/modes/interactive/theme/light.json +1 -1
  162. package/dist/modes/interactive/theme/theme-schema.json +8 -1
  163. package/dist/modes/interactive/theme/theme.d.ts +8 -1
  164. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  165. package/dist/modes/interactive/theme/theme.js +79 -28
  166. package/dist/modes/interactive/theme/theme.js.map +1 -1
  167. package/dist/modes/print-mode.d.ts.map +1 -1
  168. package/dist/modes/print-mode.js +25 -89
  169. package/dist/modes/print-mode.js.map +1 -1
  170. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  171. package/dist/modes/rpc/rpc-mode.js +32 -92
  172. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  173. package/dist/utils/git.d.ts +2 -0
  174. package/dist/utils/git.d.ts.map +1 -0
  175. package/dist/utils/git.js +6 -0
  176. package/dist/utils/git.js.map +1 -0
  177. package/dist/utils/shell.d.ts +1 -0
  178. package/dist/utils/shell.d.ts.map +1 -1
  179. package/dist/utils/shell.js +16 -2
  180. package/dist/utils/shell.js.map +1 -1
  181. package/dist/utils/sleep.d.ts +5 -0
  182. package/dist/utils/sleep.d.ts.map +1 -0
  183. package/dist/utils/sleep.js +17 -0
  184. package/dist/utils/sleep.js.map +1 -0
  185. package/docs/compaction.md +23 -21
  186. package/docs/custom-provider.md +538 -0
  187. package/docs/development.md +69 -0
  188. package/docs/extensions.md +180 -118
  189. package/docs/images/doom-extension.png +0 -0
  190. package/docs/images/interactive-mode.png +0 -0
  191. package/docs/images/tree-view.png +0 -0
  192. package/docs/json.md +79 -0
  193. package/docs/keybindings.md +162 -0
  194. package/docs/models.md +193 -0
  195. package/docs/packages.md +163 -0
  196. package/docs/prompt-templates.md +67 -0
  197. package/docs/providers.md +147 -0
  198. package/docs/sdk.md +111 -178
  199. package/docs/session.md +167 -16
  200. package/docs/settings.md +216 -0
  201. package/docs/shell-aliases.md +13 -0
  202. package/docs/skills.md +111 -202
  203. package/docs/terminal-setup.md +65 -0
  204. package/docs/themes.md +295 -0
  205. package/docs/tui.md +36 -5
  206. package/docs/windows.md +17 -0
  207. package/examples/README.md +1 -0
  208. package/examples/extensions/README.md +24 -2
  209. package/examples/extensions/antigravity-image-gen.ts +413 -0
  210. package/examples/extensions/bookmark.ts +50 -0
  211. package/examples/extensions/custom-provider-anthropic/index.ts +604 -0
  212. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  213. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  214. package/examples/extensions/custom-provider-gitlab-duo/index.ts +349 -0
  215. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  216. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  217. package/examples/extensions/doom-overlay/doom/build.sh +1 -1
  218. package/examples/extensions/event-bus.ts +43 -0
  219. package/examples/extensions/inline-bash.ts +94 -0
  220. package/examples/extensions/message-renderer.ts +59 -0
  221. package/examples/extensions/session-name.ts +27 -0
  222. package/examples/extensions/space-invaders.ts +560 -0
  223. package/examples/extensions/with-deps/package-lock.json +2 -2
  224. package/examples/extensions/with-deps/package.json +1 -1
  225. package/examples/sdk/02-custom-model.ts +3 -3
  226. package/examples/sdk/03-custom-prompt.ts +20 -9
  227. package/examples/sdk/04-skills.ts +26 -27
  228. package/examples/sdk/06-extensions.ts +15 -6
  229. package/examples/sdk/07-context-files.ts +22 -18
  230. package/examples/sdk/08-prompt-templates.ts +19 -14
  231. package/examples/sdk/09-api-keys-and-oauth.ts +5 -12
  232. package/examples/sdk/10-settings.ts +3 -3
  233. package/examples/sdk/12-full-control.ts +16 -7
  234. package/examples/sdk/README.md +24 -30
  235. package/package.json +4 -4
  236. package/docs/theme.md +0 -617
  237. package/examples/extensions/chalk-logger.ts +0 -26
package/docs/session.md CHANGED
@@ -26,11 +26,147 @@ Sessions have a version field in the header:
26
26
 
27
27
  Existing sessions are automatically migrated to the current version (v3) when loaded.
28
28
 
29
- ## Type Definitions
29
+ ## Source Files
30
30
 
31
- - [`src/core/session-manager.ts`](../src/core/session-manager.ts) - Session entry types
32
- - [`packages/agent-core/src/types.ts`](../../agent-core/src/types.ts) - `AgentMessage`
33
- - [`packages/ai/src/types.ts`](../../ai/src/types.ts) - `UserMessage`, `AssistantMessage`, `ToolResultMessage`, `Usage`, `ToolCall`, `ImageContent`, `TextContent`
31
+ Source on GitHub ([pi-mono](https://github.com/badlogic/pi-mono)):
32
+ - [`packages/coding-agent/src/core/session-manager.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/session-manager.ts) - Session entry types and SessionManager
33
+ - [`packages/coding-agent/src/core/messages.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/coding-agent/src/core/messages.ts) - Extended message types (BashExecutionMessage, CustomMessage, etc.)
34
+ - [`packages/ai/src/types.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/ai/src/types.ts) - Base message types (UserMessage, AssistantMessage, ToolResultMessage)
35
+ - [`packages/agent/src/types.ts`](https://github.com/badlogic/pi-mono/blob/main/packages/agent/src/types.ts) - AgentMessage union type
36
+
37
+ For TypeScript definitions in your project, inspect `node_modules/@mariozechner/pi-coding-agent/dist/` and `node_modules/@mariozechner/pi-ai/dist/`.
38
+
39
+ ## Message Types
40
+
41
+ Session entries contain `AgentMessage` objects. Understanding these types is essential for parsing sessions and writing extensions.
42
+
43
+ ### Content Blocks
44
+
45
+ Messages contain arrays of typed content blocks:
46
+
47
+ ```typescript
48
+ interface TextContent {
49
+ type: "text";
50
+ text: string;
51
+ }
52
+
53
+ interface ImageContent {
54
+ type: "image";
55
+ data: string; // base64 encoded
56
+ mimeType: string; // e.g., "image/jpeg", "image/png"
57
+ }
58
+
59
+ interface ThinkingContent {
60
+ type: "thinking";
61
+ thinking: string;
62
+ }
63
+
64
+ interface ToolCall {
65
+ type: "toolCall";
66
+ id: string;
67
+ name: string;
68
+ arguments: Record<string, any>;
69
+ }
70
+ ```
71
+
72
+ ### Base Message Types (from pi-ai)
73
+
74
+ ```typescript
75
+ interface UserMessage {
76
+ role: "user";
77
+ content: string | (TextContent | ImageContent)[];
78
+ timestamp: number; // Unix ms
79
+ }
80
+
81
+ interface AssistantMessage {
82
+ role: "assistant";
83
+ content: (TextContent | ThinkingContent | ToolCall)[];
84
+ api: string;
85
+ provider: string;
86
+ model: string;
87
+ usage: Usage;
88
+ stopReason: "stop" | "length" | "toolUse" | "error" | "aborted";
89
+ errorMessage?: string;
90
+ timestamp: number;
91
+ }
92
+
93
+ interface ToolResultMessage {
94
+ role: "toolResult";
95
+ toolCallId: string;
96
+ toolName: string;
97
+ content: (TextContent | ImageContent)[];
98
+ details?: any; // Tool-specific metadata
99
+ isError: boolean;
100
+ timestamp: number;
101
+ }
102
+
103
+ interface Usage {
104
+ input: number;
105
+ output: number;
106
+ cacheRead: number;
107
+ cacheWrite: number;
108
+ totalTokens: number;
109
+ cost: {
110
+ input: number;
111
+ output: number;
112
+ cacheRead: number;
113
+ cacheWrite: number;
114
+ total: number;
115
+ };
116
+ }
117
+ ```
118
+
119
+ ### Extended Message Types (from pi-coding-agent)
120
+
121
+ ```typescript
122
+ interface BashExecutionMessage {
123
+ role: "bashExecution";
124
+ command: string;
125
+ output: string;
126
+ exitCode: number | undefined;
127
+ cancelled: boolean;
128
+ truncated: boolean;
129
+ fullOutputPath?: string;
130
+ excludeFromContext?: boolean; // true for !! prefix commands
131
+ timestamp: number;
132
+ }
133
+
134
+ interface CustomMessage {
135
+ role: "custom";
136
+ customType: string; // Extension identifier
137
+ content: string | (TextContent | ImageContent)[];
138
+ display: boolean; // Show in TUI
139
+ details?: any; // Extension-specific metadata
140
+ timestamp: number;
141
+ }
142
+
143
+ interface BranchSummaryMessage {
144
+ role: "branchSummary";
145
+ summary: string;
146
+ fromId: string; // Entry we branched from
147
+ timestamp: number;
148
+ }
149
+
150
+ interface CompactionSummaryMessage {
151
+ role: "compactionSummary";
152
+ summary: string;
153
+ tokensBefore: number;
154
+ timestamp: number;
155
+ }
156
+ ```
157
+
158
+ ### AgentMessage Union
159
+
160
+ ```typescript
161
+ type AgentMessage =
162
+ | UserMessage
163
+ | AssistantMessage
164
+ | ToolResultMessage
165
+ | BashExecutionMessage
166
+ | CustomMessage
167
+ | BranchSummaryMessage
168
+ | CompactionSummaryMessage;
169
+ ```
34
170
 
35
171
  ## Entry Base
36
172
 
@@ -96,8 +232,8 @@ Created when context is compacted. Stores a summary of earlier messages.
96
232
  ```
97
233
 
98
234
  Optional fields:
99
- - `details`: Compaction-implementation specific data (e.g., file operations for default implementation, or custom data for extension implementations)
100
- - `fromHook`: `true` if generated by an extension, `false`/`undefined` if pi-generated
235
+ - `details`: Implementation-specific data (e.g., `{ readFiles: string[], modifiedFiles: string[] }` for default, or custom data for extensions)
236
+ - `fromHook`: `true` if generated by an extension, `false`/`undefined` if pi-generated (legacy field name)
101
237
 
102
238
  ### BranchSummaryEntry
103
239
 
@@ -108,8 +244,8 @@ Created when switching branches via `/tree` with an LLM generated summary of the
108
244
  ```
109
245
 
110
246
  Optional fields:
111
- - `details`: File tracking data (`{ readFiles: string[], modifiedFiles: string[] }`) for default implementation, arbitrary for custom implementation
112
- - `fromHook`: `true` if generated by an extension
247
+ - `details`: File tracking data (`{ readFiles: string[], modifiedFiles: string[] }`) for default, or custom data for extensions
248
+ - `fromHook`: `true` if generated by an extension, `false`/`undefined` if pi-generated (legacy field name)
113
249
 
114
250
  ### CustomEntry
115
251
 
@@ -224,15 +360,25 @@ for (const line of lines) {
224
360
 
225
361
  ## SessionManager API
226
362
 
227
- Key methods for working with sessions programmatically:
363
+ Key methods for working with sessions programmatically.
228
364
 
229
- ### Creation
365
+ ### Static Creation Methods
230
366
  - `SessionManager.create(cwd, sessionDir?)` - New session
231
- - `SessionManager.open(path, sessionDir?)` - Open existing
367
+ - `SessionManager.open(path, sessionDir?)` - Open existing session file
232
368
  - `SessionManager.continueRecent(cwd, sessionDir?)` - Continue most recent or create new
233
369
  - `SessionManager.inMemory(cwd?)` - No file persistence
370
+ - `SessionManager.forkFrom(sourcePath, targetCwd, sessionDir?)` - Fork session from another project
371
+
372
+ ### Static Listing Methods
373
+ - `SessionManager.list(cwd, sessionDir?, onProgress?)` - List sessions for a directory
374
+ - `SessionManager.listAll(onProgress?)` - List all sessions across all projects
375
+
376
+ ### Instance Methods - Session Management
377
+ - `newSession(options?)` - Start a new session (options: `{ parentSession?: string }`)
378
+ - `setSessionFile(path)` - Switch to a different session file
379
+ - `createBranchedSession(leafId)` - Extract branch to new session file
234
380
 
235
- ### Appending (all return entry ID)
381
+ ### Instance Methods - Appending (all return entry ID)
236
382
  - `appendMessage(message)` - Add message
237
383
  - `appendThinkingLevelChange(level)` - Record thinking change
238
384
  - `appendModelChange(provider, modelId)` - Record model change
@@ -242,7 +388,7 @@ Key methods for working with sessions programmatically:
242
388
  - `appendCustomMessageEntry(customType, content, display, details?)` - Extension message (in context)
243
389
  - `appendLabelChange(targetId, label)` - Set/clear label
244
390
 
245
- ### Tree Navigation
391
+ ### Instance Methods - Tree Navigation
246
392
  - `getLeafId()` - Current position
247
393
  - `getLeafEntry()` - Get current leaf entry
248
394
  - `getEntry(id)` - Get entry by ID
@@ -254,8 +400,13 @@ Key methods for working with sessions programmatically:
254
400
  - `resetLeaf()` - Reset leaf to null (before any entries)
255
401
  - `branchWithSummary(entryId, summary, details?, fromHook?)` - Branch with context summary
256
402
 
257
- ### Context
258
- - `buildSessionContext()` - Get messages for LLM
403
+ ### Instance Methods - Context & Info
404
+ - `buildSessionContext()` - Get messages, thinkingLevel, and model for LLM
259
405
  - `getEntries()` - All entries (excluding header)
260
- - `getHeader()` - Session metadata
406
+ - `getHeader()` - Session header metadata
261
407
  - `getSessionName()` - Get display name from latest session_info entry
408
+ - `getCwd()` - Working directory
409
+ - `getSessionDir()` - Session storage directory
410
+ - `getSessionId()` - Session UUID
411
+ - `getSessionFile()` - Session file path (undefined for in-memory)
412
+ - `isPersisted()` - Whether session is saved to disk
@@ -0,0 +1,216 @@
1
+ # Settings
2
+
3
+ Pi uses JSON settings files with project settings overriding global settings.
4
+
5
+ | Location | Scope |
6
+ |----------|-------|
7
+ | `~/.pi/agent/settings.json` | Global (all projects) |
8
+ | `.pi/settings.json` | Project (current directory) |
9
+
10
+ Edit directly or use `/settings` for common options.
11
+
12
+ ## All Settings
13
+
14
+ ### Model & Thinking
15
+
16
+ | Setting | Type | Default | Description |
17
+ |---------|------|---------|-------------|
18
+ | `defaultProvider` | string | - | Default provider (e.g., `"anthropic"`, `"openai"`) |
19
+ | `defaultModel` | string | - | Default model ID |
20
+ | `defaultThinkingLevel` | string | - | `"off"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"` |
21
+ | `hideThinkingBlock` | boolean | `false` | Hide thinking blocks in output |
22
+ | `thinkingBudgets` | object | - | Custom token budgets per thinking level |
23
+
24
+ #### thinkingBudgets
25
+
26
+ ```json
27
+ {
28
+ "thinkingBudgets": {
29
+ "minimal": 1024,
30
+ "low": 4096,
31
+ "medium": 10240,
32
+ "high": 32768
33
+ }
34
+ }
35
+ ```
36
+
37
+ ### UI & Display
38
+
39
+ | Setting | Type | Default | Description |
40
+ |---------|------|---------|-------------|
41
+ | `theme` | string | `"dark"` | Theme name (`"dark"`, `"light"`, or custom) |
42
+ | `quietStartup` | boolean | `false` | Hide startup header |
43
+ | `collapseChangelog` | boolean | `false` | Show condensed changelog after updates |
44
+ | `doubleEscapeAction` | string | `"tree"` | Action for double-escape: `"tree"` or `"fork"` |
45
+ | `editorPaddingX` | number | `0` | Horizontal padding for input editor (0-3) |
46
+ | `showHardwareCursor` | boolean | `false` | Show terminal cursor |
47
+
48
+ ### Compaction
49
+
50
+ | Setting | Type | Default | Description |
51
+ |---------|------|---------|-------------|
52
+ | `compaction.enabled` | boolean | `true` | Enable auto-compaction |
53
+ | `compaction.reserveTokens` | number | `16384` | Tokens reserved for LLM response |
54
+ | `compaction.keepRecentTokens` | number | `20000` | Recent tokens to keep (not summarized) |
55
+
56
+ ```json
57
+ {
58
+ "compaction": {
59
+ "enabled": true,
60
+ "reserveTokens": 16384,
61
+ "keepRecentTokens": 20000
62
+ }
63
+ }
64
+ ```
65
+
66
+ ### Branch Summary
67
+
68
+ | Setting | Type | Default | Description |
69
+ |---------|------|---------|-------------|
70
+ | `branchSummary.reserveTokens` | number | `16384` | Tokens reserved for branch summarization |
71
+
72
+ ### Retry
73
+
74
+ | Setting | Type | Default | Description |
75
+ |---------|------|---------|-------------|
76
+ | `retry.enabled` | boolean | `true` | Enable automatic retry on transient errors |
77
+ | `retry.maxRetries` | number | `3` | Maximum retry attempts |
78
+ | `retry.baseDelayMs` | number | `2000` | Base delay for exponential backoff (2s, 4s, 8s) |
79
+
80
+ ```json
81
+ {
82
+ "retry": {
83
+ "enabled": true,
84
+ "maxRetries": 3,
85
+ "baseDelayMs": 2000
86
+ }
87
+ }
88
+ ```
89
+
90
+ ### Message Delivery
91
+
92
+ | Setting | Type | Default | Description |
93
+ |---------|------|---------|-------------|
94
+ | `steeringMode` | string | `"one-at-a-time"` | How steering messages are sent: `"all"` or `"one-at-a-time"` |
95
+ | `followUpMode` | string | `"one-at-a-time"` | How follow-up messages are sent: `"all"` or `"one-at-a-time"` |
96
+
97
+ ### Terminal & Images
98
+
99
+ | Setting | Type | Default | Description |
100
+ |---------|------|---------|-------------|
101
+ | `terminal.showImages` | boolean | `true` | Show images in terminal (if supported) |
102
+ | `images.autoResize` | boolean | `true` | Resize images to 2000x2000 max |
103
+ | `images.blockImages` | boolean | `false` | Block all images from being sent to LLM |
104
+
105
+ ### Shell
106
+
107
+ | Setting | Type | Default | Description |
108
+ |---------|------|---------|-------------|
109
+ | `shellPath` | string | - | Custom shell path (e.g., for Cygwin on Windows) |
110
+ | `shellCommandPrefix` | string | - | Prefix for every bash command (e.g., `"shopt -s expand_aliases"`) |
111
+
112
+ ### Model Cycling
113
+
114
+ | Setting | Type | Default | Description |
115
+ |---------|------|---------|-------------|
116
+ | `enabledModels` | string[] | - | Model patterns for Ctrl+P cycling (same format as `--models` CLI flag) |
117
+
118
+ ```json
119
+ {
120
+ "enabledModels": ["claude-*", "gpt-4o", "gemini-2*"]
121
+ }
122
+ ```
123
+
124
+ ### Markdown
125
+
126
+ | Setting | Type | Default | Description |
127
+ |---------|------|---------|-------------|
128
+ | `markdown.codeBlockIndent` | string | `" "` | Indentation for code blocks |
129
+
130
+ ### Resources
131
+
132
+ These settings define where to load extensions, skills, prompts, and themes from.
133
+
134
+ Paths in `~/.pi/agent/settings.json` resolve relative to `~/.pi/agent`. Paths in `.pi/settings.json` resolve relative to `.pi`. Absolute paths and `~` are supported.
135
+
136
+ | Setting | Type | Default | Description |
137
+ |---------|------|---------|-------------|
138
+ | `packages` | array | `[]` | npm/git packages to load resources from |
139
+ | `extensions` | string[] | `[]` | Local extension file paths or directories |
140
+ | `skills` | string[] | `[]` | Local skill file paths or directories |
141
+ | `prompts` | string[] | `[]` | Local prompt template paths or directories |
142
+ | `themes` | string[] | `[]` | Local theme file paths or directories |
143
+ | `enableSkillCommands` | boolean | `true` | Register skills as `/skill:name` commands |
144
+
145
+ Arrays support glob patterns and exclusions. Use `!pattern` to exclude. Use `+path` to force-include an exact path and `-path` to force-exclude an exact path.
146
+
147
+ #### packages
148
+
149
+ String form loads all resources from a package:
150
+
151
+ ```json
152
+ {
153
+ "packages": ["pi-skills", "@org/my-extension"]
154
+ }
155
+ ```
156
+
157
+ Object form filters which resources to load:
158
+
159
+ ```json
160
+ {
161
+ "packages": [
162
+ {
163
+ "source": "pi-skills",
164
+ "skills": ["brave-search", "transcribe"],
165
+ "extensions": []
166
+ }
167
+ ]
168
+ }
169
+ ```
170
+
171
+ See [packages.md](packages.md) for package management details.
172
+
173
+ ## Example
174
+
175
+ ```json
176
+ {
177
+ "defaultProvider": "anthropic",
178
+ "defaultModel": "claude-sonnet-4-20250514",
179
+ "defaultThinkingLevel": "medium",
180
+ "theme": "dark",
181
+ "compaction": {
182
+ "enabled": true,
183
+ "reserveTokens": 16384,
184
+ "keepRecentTokens": 20000
185
+ },
186
+ "retry": {
187
+ "enabled": true,
188
+ "maxRetries": 3
189
+ },
190
+ "enabledModels": ["claude-*", "gpt-4o"],
191
+ "packages": ["pi-skills"]
192
+ }
193
+ ```
194
+
195
+ ## Project Overrides
196
+
197
+ Project settings (`.pi/settings.json`) override global settings. Nested objects are merged:
198
+
199
+ ```json
200
+ // ~/.pi/agent/settings.json (global)
201
+ {
202
+ "theme": "dark",
203
+ "compaction": { "enabled": true, "reserveTokens": 16384 }
204
+ }
205
+
206
+ // .pi/settings.json (project)
207
+ {
208
+ "compaction": { "reserveTokens": 8192 }
209
+ }
210
+
211
+ // Result
212
+ {
213
+ "theme": "dark",
214
+ "compaction": { "enabled": true, "reserveTokens": 8192 }
215
+ }
216
+ ```
@@ -0,0 +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.