@averyyy/pi-coding-agent 0.80.3-piclient.8 → 0.80.6-piclient.10

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 (203) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +5 -3
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +4 -4
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/cli/config-selector.d.ts +4 -2
  7. package/dist/cli/config-selector.d.ts.map +1 -1
  8. package/dist/cli/config-selector.js +1 -1
  9. package/dist/cli/config-selector.js.map +1 -1
  10. package/dist/core/agent-session.d.ts +21 -5
  11. package/dist/core/agent-session.d.ts.map +1 -1
  12. package/dist/core/agent-session.js +100 -30
  13. package/dist/core/agent-session.js.map +1 -1
  14. package/dist/core/auth-storage.d.ts.map +1 -1
  15. package/dist/core/auth-storage.js +13 -5
  16. package/dist/core/auth-storage.js.map +1 -1
  17. package/dist/core/cache-stats.d.ts +49 -0
  18. package/dist/core/cache-stats.d.ts.map +1 -0
  19. package/dist/core/cache-stats.js +101 -0
  20. package/dist/core/cache-stats.js.map +1 -0
  21. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  22. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  23. package/dist/core/compaction/branch-summarization.js.map +1 -1
  24. package/dist/core/compaction/compaction.d.ts +1 -2
  25. package/dist/core/compaction/compaction.d.ts.map +1 -1
  26. package/dist/core/compaction/compaction.js +56 -81
  27. package/dist/core/compaction/compaction.js.map +1 -1
  28. package/dist/core/extensions/index.d.ts +1 -1
  29. package/dist/core/extensions/index.d.ts.map +1 -1
  30. package/dist/core/extensions/index.js.map +1 -1
  31. package/dist/core/extensions/loader.d.ts.map +1 -1
  32. package/dist/core/extensions/loader.js +6 -0
  33. package/dist/core/extensions/loader.js.map +1 -1
  34. package/dist/core/extensions/runner.d.ts +6 -3
  35. package/dist/core/extensions/runner.d.ts.map +1 -1
  36. package/dist/core/extensions/runner.js +43 -0
  37. package/dist/core/extensions/runner.js.map +1 -1
  38. package/dist/core/extensions/types.d.ts +33 -11
  39. package/dist/core/extensions/types.d.ts.map +1 -1
  40. package/dist/core/extensions/types.js.map +1 -1
  41. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  42. package/dist/core/extensions/wrapper.js +22 -3
  43. package/dist/core/extensions/wrapper.js.map +1 -1
  44. package/dist/core/index.d.ts +1 -1
  45. package/dist/core/index.d.ts.map +1 -1
  46. package/dist/core/index.js.map +1 -1
  47. package/dist/core/keybindings.d.ts +8 -3
  48. package/dist/core/keybindings.d.ts.map +1 -1
  49. package/dist/core/keybindings.js +10 -9
  50. package/dist/core/keybindings.js.map +1 -1
  51. package/dist/core/model-registry.d.ts +4 -6
  52. package/dist/core/model-registry.d.ts.map +1 -1
  53. package/dist/core/model-registry.js +39 -9
  54. package/dist/core/model-registry.js.map +1 -1
  55. package/dist/core/model-resolver.d.ts +10 -0
  56. package/dist/core/model-resolver.d.ts.map +1 -1
  57. package/dist/core/model-resolver.js +14 -17
  58. package/dist/core/model-resolver.js.map +1 -1
  59. package/dist/core/package-manager.d.ts +4 -1
  60. package/dist/core/package-manager.d.ts.map +1 -1
  61. package/dist/core/package-manager.js +75 -28
  62. package/dist/core/package-manager.js.map +1 -1
  63. package/dist/core/pi-client-runtime-update.d.ts +14 -0
  64. package/dist/core/pi-client-runtime-update.d.ts.map +1 -0
  65. package/dist/core/pi-client-runtime-update.js +27 -0
  66. package/dist/core/pi-client-runtime-update.js.map +1 -0
  67. package/dist/core/pi-server-client.d.ts.map +1 -1
  68. package/dist/core/pi-server-client.js +122 -5
  69. package/dist/core/pi-server-client.js.map +1 -1
  70. package/dist/core/provider-attribution.d.ts.map +1 -1
  71. package/dist/core/provider-attribution.js +0 -10
  72. package/dist/core/provider-attribution.js.map +1 -1
  73. package/dist/core/resource-loader.d.ts +2 -2
  74. package/dist/core/resource-loader.d.ts.map +1 -1
  75. package/dist/core/resource-loader.js +6 -7
  76. package/dist/core/resource-loader.js.map +1 -1
  77. package/dist/core/sdk.d.ts +1 -1
  78. package/dist/core/sdk.d.ts.map +1 -1
  79. package/dist/core/sdk.js +8 -1
  80. package/dist/core/sdk.js.map +1 -1
  81. package/dist/core/session-manager.d.ts +20 -1
  82. package/dist/core/session-manager.d.ts.map +1 -1
  83. package/dist/core/session-manager.js +97 -68
  84. package/dist/core/session-manager.js.map +1 -1
  85. package/dist/core/settings-manager.d.ts +9 -3
  86. package/dist/core/settings-manager.d.ts.map +1 -1
  87. package/dist/core/settings-manager.js +10 -1
  88. package/dist/core/settings-manager.js.map +1 -1
  89. package/dist/core/slash-commands.d.ts +1 -0
  90. package/dist/core/slash-commands.d.ts.map +1 -1
  91. package/dist/core/slash-commands.js +3 -3
  92. package/dist/core/slash-commands.js.map +1 -1
  93. package/dist/core/tools/edit.d.ts.map +1 -1
  94. package/dist/core/tools/edit.js +2 -2
  95. package/dist/core/tools/edit.js.map +1 -1
  96. package/dist/index.d.ts +3 -2
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +2 -1
  99. package/dist/index.js.map +1 -1
  100. package/dist/main.d.ts +2 -2
  101. package/dist/main.d.ts.map +1 -1
  102. package/dist/main.js +1 -0
  103. package/dist/main.js.map +1 -1
  104. package/dist/modes/interactive/components/config-selector.d.ts +34 -3
  105. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  106. package/dist/modes/interactive/components/config-selector.js +280 -25
  107. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  108. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  109. package/dist/modes/interactive/components/custom-editor.js +1 -1
  110. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  111. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  112. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  113. package/dist/modes/interactive/components/custom-entry.js +52 -0
  114. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  115. package/dist/modes/interactive/components/footer.d.ts +4 -0
  116. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  117. package/dist/modes/interactive/components/footer.js +1 -1
  118. package/dist/modes/interactive/components/footer.js.map +1 -1
  119. package/dist/modes/interactive/components/login-dialog.d.ts +4 -0
  120. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  121. package/dist/modes/interactive/components/login-dialog.js +9 -2
  122. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  123. package/dist/modes/interactive/components/oauth-selector.d.ts +3 -1
  124. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  125. package/dist/modes/interactive/components/oauth-selector.js +17 -6
  126. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  127. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  128. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  129. package/dist/modes/interactive/components/settings-selector.js +12 -1
  130. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  131. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  132. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  133. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  134. package/dist/modes/interactive/components/tree-selector.d.ts +5 -0
  135. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  136. package/dist/modes/interactive/components/tree-selector.js +49 -12
  137. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  138. package/dist/modes/interactive/interactive-mode.d.ts +16 -5
  139. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  140. package/dist/modes/interactive/interactive-mode.js +368 -97
  141. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  142. package/dist/modes/interactive/theme/dark.json +1 -0
  143. package/dist/modes/interactive/theme/light.json +1 -0
  144. package/dist/modes/interactive/theme/theme-schema.json +6 -2
  145. package/dist/modes/interactive/theme/theme.d.ts +3 -2
  146. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  147. package/dist/modes/interactive/theme/theme.js +10 -3
  148. package/dist/modes/interactive/theme/theme.js.map +1 -1
  149. package/dist/modes/print-mode.d.ts.map +1 -1
  150. package/dist/modes/print-mode.js +1 -1
  151. package/dist/modes/print-mode.js.map +1 -1
  152. package/dist/modes/rpc/rpc-client.d.ts +6 -6
  153. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  154. package/dist/modes/rpc/rpc-client.js +3 -3
  155. package/dist/modes/rpc/rpc-client.js.map +1 -1
  156. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  157. package/dist/modes/rpc/rpc-mode.js +4 -1
  158. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  159. package/dist/package-manager-cli.d.ts +2 -2
  160. package/dist/package-manager-cli.d.ts.map +1 -1
  161. package/dist/package-manager-cli.js +71 -17
  162. package/dist/package-manager-cli.js.map +1 -1
  163. package/dist/utils/clipboard-image.d.ts.map +1 -1
  164. package/dist/utils/clipboard-image.js +1 -1
  165. package/dist/utils/clipboard-image.js.map +1 -1
  166. package/dist/utils/clipboard-native.d.ts +1 -0
  167. package/dist/utils/clipboard-native.d.ts.map +1 -1
  168. package/dist/utils/clipboard-native.js.map +1 -1
  169. package/dist/utils/clipboard.d.ts +2 -0
  170. package/dist/utils/clipboard.d.ts.map +1 -1
  171. package/dist/utils/clipboard.js +13 -0
  172. package/dist/utils/clipboard.js.map +1 -1
  173. package/docs/custom-provider.md +6 -3
  174. package/docs/extensions.md +213 -18
  175. package/docs/keybindings.md +1 -0
  176. package/docs/models.md +51 -8
  177. package/docs/packages.md +2 -2
  178. package/docs/providers.md +3 -0
  179. package/docs/quickstart.md +1 -1
  180. package/docs/rpc.md +15 -5
  181. package/docs/sdk.md +51 -1
  182. package/docs/session-format.md +18 -8
  183. package/docs/settings.md +3 -2
  184. package/docs/themes.md +5 -3
  185. package/docs/tui.md +1 -1
  186. package/docs/usage.md +3 -2
  187. package/examples/extensions/README.md +1 -0
  188. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  189. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  190. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  191. package/examples/extensions/entry-renderer.ts +41 -0
  192. package/examples/extensions/gondolin/package-lock.json +2 -2
  193. package/examples/extensions/gondolin/package.json +1 -1
  194. package/examples/extensions/preset.ts +2 -2
  195. package/examples/extensions/question.ts +1 -0
  196. package/examples/extensions/reload-runtime.ts +2 -2
  197. package/examples/extensions/sandbox/package-lock.json +2 -2
  198. package/examples/extensions/sandbox/package.json +1 -1
  199. package/examples/extensions/with-deps/package-lock.json +2 -2
  200. package/examples/extensions/with-deps/package.json +1 -1
  201. package/examples/sdk/12-full-control.ts +1 -1
  202. package/examples/sdk/README.md +1 -1
  203. package/package.json +8 -4
@@ -112,47 +112,40 @@ export function getLatestCompactionEntry(entries) {
112
112
  }
113
113
  return null;
114
114
  }
115
- /**
116
- * Build the session context from entries using tree traversal.
117
- * If leafId is provided, walks from that entry to root.
118
- * Handles compaction and branch summaries along the path.
119
- */
120
- export function buildSessionContext(entries, leafId, byId) {
121
- // Build uuid index if not available
122
- if (!byId) {
123
- byId = new Map();
124
- for (const entry of entries) {
125
- byId.set(entry.id, entry);
126
- }
115
+ function buildEntryIndex(entries, byId) {
116
+ if (byId)
117
+ return byId;
118
+ const index = new Map();
119
+ for (const entry of entries) {
120
+ index.set(entry.id, entry);
127
121
  }
128
- // Find leaf
122
+ return index;
123
+ }
124
+ function buildSessionPath(entries, leafId, byId) {
125
+ const index = buildEntryIndex(entries, byId);
129
126
  let leaf;
130
127
  if (leafId === null) {
131
- // Explicitly null - return no messages (navigated to before first entry)
132
- return { messages: [], thinkingLevel: "off", model: null };
128
+ return [];
133
129
  }
134
130
  if (leafId) {
135
- leaf = byId.get(leafId);
131
+ leaf = index.get(leafId);
136
132
  }
133
+ leaf ??= entries[entries.length - 1];
137
134
  if (!leaf) {
138
- // Fallback to last entry (when leafId is undefined)
139
- leaf = entries[entries.length - 1];
140
- }
141
- if (!leaf) {
142
- return { messages: [], thinkingLevel: "off", model: null };
135
+ return [];
143
136
  }
144
- // Walk from leaf to root, collecting path
145
137
  const path = [];
146
138
  let current = leaf;
147
139
  while (current) {
148
140
  path.push(current);
149
- current = current.parentId ? byId.get(current.parentId) : undefined;
141
+ current = current.parentId ? index.get(current.parentId) : undefined;
150
142
  }
151
143
  path.reverse();
152
- // Extract settings and find compaction
144
+ return path;
145
+ }
146
+ function getSessionContextSettings(path) {
153
147
  let thinkingLevel = "off";
154
148
  let model = null;
155
- let compaction = null;
156
149
  for (const entry of path) {
157
150
  if (entry.type === "thinking_level_change") {
158
151
  thinkingLevel = entry.thinkingLevel;
@@ -163,55 +156,83 @@ export function buildSessionContext(entries, leafId, byId) {
163
156
  else if (entry.type === "message" && entry.message.role === "assistant") {
164
157
  model = { provider: entry.message.provider, modelId: entry.message.model };
165
158
  }
166
- else if (entry.type === "compaction") {
167
- compaction = entry;
168
- }
169
159
  }
170
- // Build messages and collect corresponding entries
171
- // When there's a compaction, we need to:
172
- // 1. Emit summary first (entry = compaction)
173
- // 2. Emit kept messages (from firstKeptEntryId up to compaction)
174
- // 3. Emit messages after compaction
175
- const messages = [];
176
- const appendMessage = (entry) => {
177
- if (entry.type === "message") {
178
- messages.push(entry.message);
179
- }
180
- else if (entry.type === "custom_message") {
181
- messages.push(createCustomMessage(entry.customType, entry.content, entry.display, entry.details, entry.timestamp));
182
- }
183
- else if (entry.type === "branch_summary" && entry.summary) {
184
- messages.push(createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp));
185
- }
186
- };
187
- if (compaction) {
188
- // Emit summary first
189
- messages.push(createCompactionSummaryMessage(compaction.summary, compaction.tokensBefore, compaction.timestamp));
190
- // Find compaction index in path
191
- const compactionIdx = path.findIndex((e) => e.type === "compaction" && e.id === compaction.id);
192
- // Emit kept messages (before compaction, starting from firstKeptEntryId)
193
- let foundFirstKept = false;
194
- for (let i = 0; i < compactionIdx; i++) {
195
- const entry = path[i];
196
- if (entry.id === compaction.firstKeptEntryId) {
197
- foundFirstKept = true;
198
- }
199
- if (foundFirstKept) {
200
- appendMessage(entry);
201
- }
160
+ return { thinkingLevel, model };
161
+ }
162
+ /**
163
+ * Project one selected session entry into LLM/runtime messages.
164
+ * Plain custom entries are display/state entries and do not participate in context.
165
+ */
166
+ export function sessionEntryToContextMessages(entry) {
167
+ if (entry.type === "message") {
168
+ const message = entry.message;
169
+ // Session files are parsed without validation; old versions, forks, or
170
+ // hand-edited files can contain messages with null/missing content.
171
+ if ((message.role === "user" || message.role === "assistant" || message.role === "toolResult") &&
172
+ message.content == null) {
173
+ return [{ ...message, content: [] }];
202
174
  }
203
- // Emit messages after compaction
204
- for (let i = compactionIdx + 1; i < path.length; i++) {
205
- const entry = path[i];
206
- appendMessage(entry);
175
+ return [message];
176
+ }
177
+ if (entry.type === "custom_message") {
178
+ return [
179
+ createCustomMessage(entry.customType, entry.content ?? [], entry.display, entry.details, entry.timestamp),
180
+ ];
181
+ }
182
+ if (entry.type === "branch_summary" && entry.summary) {
183
+ return [createBranchSummaryMessage(entry.summary, entry.fromId, entry.timestamp)];
184
+ }
185
+ if (entry.type === "compaction") {
186
+ return [createCompactionSummaryMessage(entry.summary, entry.tokensBefore, entry.timestamp)];
187
+ }
188
+ return [];
189
+ }
190
+ /**
191
+ * Build the active, compaction-aware session entry list.
192
+ *
193
+ * This follows the current leaf path. If the path contains compaction entries,
194
+ * the latest compaction is represented by the compaction entry itself, followed
195
+ * by the kept entries starting at firstKeptEntryId and all entries after the
196
+ * compaction entry. Older summarized entries are omitted.
197
+ */
198
+ export function buildContextEntries(entries, leafId, byId) {
199
+ const path = buildSessionPath(entries, leafId, byId);
200
+ let compaction = null;
201
+ for (const entry of path) {
202
+ if (entry.type === "compaction") {
203
+ compaction = entry;
207
204
  }
208
205
  }
209
- else {
210
- // No compaction - emit all messages, handle branch summaries and custom messages
211
- for (const entry of path) {
212
- appendMessage(entry);
206
+ if (!compaction) {
207
+ return path;
208
+ }
209
+ const compactionIdx = path.findIndex((entry) => entry.id === compaction.id);
210
+ if (compactionIdx < 0) {
211
+ return path;
212
+ }
213
+ const contextEntries = [compaction];
214
+ let foundFirstKept = false;
215
+ for (let i = 0; i < compactionIdx; i++) {
216
+ const entry = path[i];
217
+ if (entry.id === compaction.firstKeptEntryId) {
218
+ foundFirstKept = true;
219
+ }
220
+ if (foundFirstKept) {
221
+ contextEntries.push(entry);
213
222
  }
214
223
  }
224
+ contextEntries.push(...path.slice(compactionIdx + 1));
225
+ return contextEntries;
226
+ }
227
+ /**
228
+ * Build the session context from entries using tree traversal.
229
+ * If leafId is provided, walks from that entry to root.
230
+ * Handles compaction and branch summaries along the path.
231
+ */
232
+ export function buildSessionContext(entries, leafId, byId) {
233
+ const path = buildSessionPath(entries, leafId, byId);
234
+ const { thinkingLevel, model } = getSessionContextSettings(path);
235
+ const messages = buildContextEntries(entries, leafId, byId).flatMap(sessionEntryToContextMessages);
215
236
  return { messages, thinkingLevel, model };
216
237
  }
217
238
  /**
@@ -577,6 +598,7 @@ export class SessionManager {
577
598
  this.fileEntries = [header];
578
599
  this.byId.clear();
579
600
  this.labelsById.clear();
601
+ this.labelTimestampsById.clear();
580
602
  this.leafId = null;
581
603
  this.flushed = false;
582
604
  if (this.persist) {
@@ -918,6 +940,13 @@ export class SessionManager {
918
940
  path.reverse();
919
941
  return path;
920
942
  }
943
+ /**
944
+ * Build the active, compaction-aware entry list for context/rendering.
945
+ * Uses tree traversal from current leaf.
946
+ */
947
+ buildContextEntries() {
948
+ return buildContextEntries(this.getEntries(), this.leafId, this.byId);
949
+ }
921
950
  /**
922
951
  * Build the session context (what gets sent to the LLM).
923
952
  * Uses tree traversal from current leaf.