@daniel156161/prism 0.2.101 → 0.2.105

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 (205) hide show
  1. package/README.md +2 -2
  2. package/dist/pi/pi-env.d.ts +1 -1
  3. package/dist/pi/pi-env.js +1 -1
  4. package/dist/prism-extensions/integrations/ai-memory-system.js +16 -9
  5. package/dist/prism-extensions/integrations/ai-memory-system.js.map +1 -1
  6. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  7. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +23 -25
  8. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  9. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.d.ts.map +1 -1
  10. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js +3 -1
  11. package/node_modules/@earendil-works/pi-agent-core/dist/harness/env/nodejs.js.map +1 -1
  12. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +3 -2
  13. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  14. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  15. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  16. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.d.ts.map +1 -1
  17. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js +1 -1
  18. package/node_modules/@earendil-works/pi-ai/dist/api/mistral-conversations.js.map +1 -1
  19. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  20. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +38 -6
  21. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  22. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts +75 -0
  23. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.d.ts.map +1 -1
  24. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js +75 -0
  25. package/node_modules/@earendil-works/pi-ai/dist/image-models.generated.js.map +1 -1
  26. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.d.ts +3 -1
  27. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.d.ts.map +1 -1
  28. package/node_modules/@earendil-works/pi-ai/dist/providers/cloudflare-ai-gateway.js.map +1 -1
  29. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  30. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  31. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  32. package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
  33. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  34. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  35. package/node_modules/@earendil-works/pi-ai/dist/providers/data/deepseek.json +1 -1
  36. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  37. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  38. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  39. package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax-cn.json +1 -1
  40. package/node_modules/@earendil-works/pi-ai/dist/providers/data/minimax.json +1 -1
  41. package/node_modules/@earendil-works/pi-ai/dist/providers/data/mistral.json +1 -1
  42. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  43. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  44. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  45. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  46. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  47. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
  48. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  49. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  50. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  51. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai-coding-cn.json +1 -1
  52. package/node_modules/@earendil-works/pi-ai/dist/providers/data/zai.json +1 -1
  53. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +1 -1
  54. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  55. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  56. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  57. package/node_modules/@earendil-works/pi-client/CHANGELOG.md +1 -1
  58. package/node_modules/@earendil-works/pi-client/package.json +2 -2
  59. package/node_modules/@earendil-works/pi-coding-agent/CHANGELOG.md +47 -3
  60. package/node_modules/@earendil-works/pi-coding-agent/README.md +5 -4
  61. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/{chunk-GPPBJGBU.js → chunk-2KVJKXS2.js} +1 -1
  62. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/{chunk-E5KXRMZK.js → chunk-OMWWHBTG.js} +69 -68
  63. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/github-copilot.js +1 -1
  64. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/{google-generative-ai-XDKMGBCJ.js → google-generative-ai-YMUPJBKR.js} +1 -1
  65. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/{google-vertex-D5FGEO3Y.js → google-vertex-MPWMV4OF.js} +1 -1
  66. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/https-proxy-agent-2VXB7436.js +13 -0
  67. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/{mistral-conversations-YK73UAOZ.js → mistral-conversations-Q3AWZJAZ.js} +1 -1
  68. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/{openai-completions-JD4WAC3R.js → openai-completions-ERMU2SS7.js} +1 -1
  69. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/cli.js +1 -1
  70. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/index.js +1 -1
  71. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/rpc-entry.js +1 -1
  72. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/startup-ui.d.ts.map +1 -1
  73. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/startup-ui.js +2 -1
  74. package/node_modules/@earendil-works/pi-coding-agent/dist/cli/startup-ui.js.map +1 -1
  75. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts +12 -1
  76. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  77. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js +77 -9
  78. package/node_modules/@earendil-works/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  79. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  80. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/branch-summarization.js +4 -3
  81. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  82. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.d.ts +5 -0
  83. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  84. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.js +19 -5
  85. package/node_modules/@earendil-works/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  86. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  87. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  88. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  89. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  90. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  91. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js +45 -1
  92. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  93. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts +18 -1
  94. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  95. package/node_modules/@earendil-works/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  96. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  97. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js +4 -2
  98. package/node_modules/@earendil-works/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  99. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.d.ts +8 -1
  100. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  101. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js +17 -0
  102. package/node_modules/@earendil-works/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  103. package/node_modules/@earendil-works/pi-coding-agent/dist/extensions/llama/client.d.ts +6 -0
  104. package/node_modules/@earendil-works/pi-coding-agent/dist/extensions/llama/client.d.ts.map +1 -1
  105. package/node_modules/@earendil-works/pi-coding-agent/dist/extensions/llama/client.js +7 -0
  106. package/node_modules/@earendil-works/pi-coding-agent/dist/extensions/llama/client.js.map +1 -1
  107. package/node_modules/@earendil-works/pi-coding-agent/dist/extensions/llama/provider.d.ts +3 -1
  108. package/node_modules/@earendil-works/pi-coding-agent/dist/extensions/llama/provider.d.ts.map +1 -1
  109. package/node_modules/@earendil-works/pi-coding-agent/dist/extensions/llama/provider.js +27 -6
  110. package/node_modules/@earendil-works/pi-coding-agent/dist/extensions/llama/provider.js.map +1 -1
  111. package/node_modules/@earendil-works/pi-coding-agent/dist/index.d.ts +2 -1
  112. package/node_modules/@earendil-works/pi-coding-agent/dist/index.d.ts.map +1 -1
  113. package/node_modules/@earendil-works/pi-coding-agent/dist/index.js +1 -0
  114. package/node_modules/@earendil-works/pi-coding-agent/dist/index.js.map +1 -1
  115. package/node_modules/@earendil-works/pi-coding-agent/dist/main.d.ts.map +1 -1
  116. package/node_modules/@earendil-works/pi-coding-agent/dist/main.js +2 -0
  117. package/node_modules/@earendil-works/pi-coding-agent/dist/main.js.map +1 -1
  118. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  119. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  120. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +10 -0
  121. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  122. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +4 -0
  123. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  124. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js +55 -31
  125. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  126. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts +7 -0
  127. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  128. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.js +7 -0
  129. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-client.js.map +1 -1
  130. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  131. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js +3 -0
  132. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  133. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +12 -0
  134. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  135. package/node_modules/@earendil-works/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  136. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/shell.d.ts.map +1 -1
  137. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/shell.js +6 -4
  138. package/node_modules/@earendil-works/pi-coding-agent/dist/utils/shell.js.map +1 -1
  139. package/node_modules/@earendil-works/pi-coding-agent/docs/compaction.md +2 -0
  140. package/node_modules/@earendil-works/pi-coding-agent/docs/custom-provider.md +7 -7
  141. package/node_modules/@earendil-works/pi-coding-agent/docs/environment-variables.md +3 -0
  142. package/node_modules/@earendil-works/pi-coding-agent/docs/extensions.md +18 -0
  143. package/node_modules/@earendil-works/pi-coding-agent/docs/keybindings.md +1 -1
  144. package/node_modules/@earendil-works/pi-coding-agent/docs/quickstart.md +1 -1
  145. package/node_modules/@earendil-works/pi-coding-agent/docs/rpc.md +23 -0
  146. package/node_modules/@earendil-works/pi-coding-agent/docs/settings.md +12 -4
  147. package/node_modules/@earendil-works/pi-coding-agent/docs/terminal-setup.md +12 -0
  148. package/node_modules/@earendil-works/pi-coding-agent/docs/usage.md +4 -3
  149. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  150. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-anthropic/package.json +1 -1
  151. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  152. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/gondolin/package-lock.json +2 -2
  153. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/gondolin/package.json +1 -1
  154. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/sandbox/package-lock.json +2 -2
  155. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/sandbox/package.json +1 -1
  156. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/with-deps/package-lock.json +2 -2
  157. package/node_modules/@earendil-works/pi-coding-agent/examples/extensions/with-deps/package.json +1 -1
  158. package/node_modules/@earendil-works/pi-coding-agent/package.json +6 -6
  159. package/node_modules/@earendil-works/pi-protocol/package.json +1 -1
  160. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  161. package/node_modules/@earendil-works/pi-tui/README.md +1 -1
  162. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts +1 -0
  163. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.d.ts.map +1 -1
  164. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js +36 -3
  165. package/node_modules/@earendil-works/pi-tui/dist/autocomplete.js.map +1 -1
  166. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts +1 -1
  167. package/node_modules/@earendil-works/pi-tui/dist/index.d.ts.map +1 -1
  168. package/node_modules/@earendil-works/pi-tui/dist/index.js +1 -1
  169. package/node_modules/@earendil-works/pi-tui/dist/index.js.map +1 -1
  170. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts +2 -0
  171. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.d.ts.map +1 -1
  172. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js +37 -2
  173. package/node_modules/@earendil-works/pi-tui/dist/terminal-image.js.map +1 -1
  174. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts +11 -0
  175. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.d.ts.map +1 -1
  176. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js +58 -15
  177. package/node_modules/@earendil-works/pi-tui/dist/tui-alt-screen.js.map +1 -1
  178. package/node_modules/@earendil-works/pi-tui/dist/tui-main-screen.d.ts.map +1 -1
  179. package/node_modules/@earendil-works/pi-tui/dist/tui-main-screen.js +105 -45
  180. package/node_modules/@earendil-works/pi-tui/dist/tui-main-screen.js.map +1 -1
  181. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  182. package/node_modules/@types/node/README.md +1 -1
  183. package/node_modules/@types/node/buffer.buffer.d.ts +5 -0
  184. package/node_modules/@types/node/crypto.d.ts +0 -2
  185. package/node_modules/@types/node/dgram.d.ts +119 -4
  186. package/node_modules/@types/node/fs/promises.d.ts +61 -65
  187. package/node_modules/@types/node/fs.d.ts +86 -76
  188. package/node_modules/@types/node/http.d.ts +1 -1
  189. package/node_modules/@types/node/http2.d.ts +2 -2
  190. package/node_modules/@types/node/index.d.ts +1 -0
  191. package/node_modules/@types/node/inspector.d.ts +2 -1
  192. package/node_modules/@types/node/net.d.ts +108 -16
  193. package/node_modules/@types/node/package.json +2 -2
  194. package/node_modules/@types/node/quic.d.ts +37 -11
  195. package/node_modules/@types/node/stream/iter.d.ts +4 -4
  196. package/node_modules/@types/node/tls.d.ts +24 -0
  197. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +5 -0
  198. package/node_modules/@types/node/ts5.6/index.d.ts +1 -0
  199. package/node_modules/@types/node/ts5.7/index.d.ts +1 -0
  200. package/node_modules/@types/node/tty.d.ts +4 -3
  201. package/node_modules/@types/node/vfs.d.ts +210 -0
  202. package/node_modules/@types/node/vm.d.ts +1 -1
  203. package/package.json +9 -9
  204. package/src/prism-extensions/integrations/ai-memory-system.ts +14 -9
  205. package/node_modules/@earendil-works/pi-coding-agent/dist/bundle/chunks/dist-RDWOYWHR.js +0 -13
@@ -91,6 +91,8 @@ export class AgentSession {
91
91
  _followUpMessages = [];
92
92
  /** Messages queued to be included with the next user prompt as context ("asides"). */
93
93
  _pendingNextTurnMessages = [];
94
+ /** Context-only custom messages queued during a run, flushed once the current turn's tool results are in. */
95
+ _pendingCustomMessages = [];
94
96
  // Compaction state
95
97
  _compactionAbortController = undefined;
96
98
  _autoCompactionAbortController = undefined;
@@ -269,18 +271,33 @@ export class AgentSession {
269
271
  };
270
272
  };
271
273
  }
274
+ async _compactBeforeNextAssistantResponse(context) {
275
+ const model = this.model;
276
+ const settings = this.settingsManager.getCompactionSettings();
277
+ if (!model ||
278
+ model.contextWindow <= 0 ||
279
+ !shouldCompact(estimateContextTokens(context.messages).tokens, model.contextWindow, settings)) {
280
+ return context;
281
+ }
282
+ await this._runAutoCompaction("threshold", false);
283
+ return {
284
+ ...context,
285
+ messages: this.agent.state.messages.slice(),
286
+ };
287
+ }
272
288
  _installAgentNextTurnRefresh() {
273
289
  const previousPrepareNextTurnWithContext = this.agent.prepareNextTurnWithContext ??
274
290
  (this.agent.prepareNextTurn
275
291
  ? async (_turn, signal) => await this.agent.prepareNextTurn?.(signal)
276
292
  : undefined);
277
293
  this.agent.prepareNextTurnWithContext = async (turn, signal) => {
278
- const previousSnapshot = await previousPrepareNextTurnWithContext?.(turn, signal);
279
- const previousContext = previousSnapshot?.context ?? turn.context;
294
+ const context = await this._compactBeforeNextAssistantResponse(turn.context);
295
+ const previousSnapshot = await previousPrepareNextTurnWithContext?.({ ...turn, context }, signal);
296
+ const nextContext = previousSnapshot?.context ?? context;
280
297
  return {
281
298
  ...previousSnapshot,
282
299
  context: {
283
- ...previousContext,
300
+ ...nextContext,
284
301
  systemPrompt: this._systemPromptOverride ?? this._baseSystemPrompt,
285
302
  tools: this.agent.state.tools.slice(),
286
303
  },
@@ -400,6 +417,14 @@ export class AgentSession {
400
417
  }
401
418
  }
402
419
  }
420
+ // A turn ends after its assistant message and every tool result has been appended,
421
+ // so this is the first point in the run where a context-only custom message can be
422
+ // inserted without landing between a tool call and its result. Flushing after the
423
+ // extension and listener dispatch above also picks up messages that turn_end
424
+ // handlers queued.
425
+ if (event.type === "turn_end") {
426
+ this._flushPendingCustomMessages();
427
+ }
403
428
  };
404
429
  _willRetryAfterAgentEnd(event) {
405
430
  const settings = this.settingsManager.getRetrySettings();
@@ -755,6 +780,7 @@ export class AgentSession {
755
780
  finally {
756
781
  this._systemPromptOverride = undefined;
757
782
  this._flushPendingBashMessages();
783
+ this._flushPendingCustomMessages();
758
784
  await this._emitAgentSettled();
759
785
  }
760
786
  }
@@ -844,8 +870,9 @@ export class AgentSession {
844
870
  preflightResult?.(true);
845
871
  return;
846
872
  }
847
- // Flush any pending bash messages before the new prompt
873
+ // Flush any pending bash and custom messages before the new prompt
848
874
  this._flushPendingBashMessages();
875
+ this._flushPendingCustomMessages();
849
876
  // Validate model
850
877
  if (!this.model) {
851
878
  throw new Error(formatNoModelSelectedMessage());
@@ -1059,8 +1086,9 @@ export class AgentSession {
1059
1086
  /**
1060
1087
  * Send a custom message to the session. Creates a CustomMessageEntry.
1061
1088
  *
1062
- * Handles three cases:
1089
+ * Handles four cases:
1063
1090
  * - Streaming: queues message, processed when loop pulls from queue
1091
+ * - Streaming + triggerTurn false: appended to state/session once the current turn ends
1064
1092
  * - Not streaming + triggerTurn: appends to state/session, starts new turn
1065
1093
  * - Not streaming + no trigger: appends to state/session, no turn
1066
1094
  *
@@ -1092,11 +1120,34 @@ export class AgentSession {
1092
1120
  else if (options?.triggerTurn) {
1093
1121
  await this._runAgentPrompt(appMessage);
1094
1122
  }
1123
+ else if (this.isStreaming) {
1124
+ // Appending now would put the message between an assistant tool call and its
1125
+ // result, which providers that validate message order reject on replay. Defer
1126
+ // to the end of the turn. Nothing is emitted yet: message events must not
1127
+ // describe messages the session tree does not contain.
1128
+ this._pendingCustomMessages.push(appMessage);
1129
+ }
1095
1130
  else {
1096
- this.agent.state.messages.push(appMessage);
1097
- this.sessionManager.appendCustomMessageEntry(message.customType, message.content, message.display, message.details);
1098
- this._emit({ type: "message_start", message: appMessage });
1099
- this._emit({ type: "message_end", message: appMessage });
1131
+ this._appendCustomMessage(appMessage);
1132
+ }
1133
+ }
1134
+ _appendCustomMessage(appMessage) {
1135
+ this.agent.state.messages.push(appMessage);
1136
+ this.sessionManager.appendCustomMessageEntry(appMessage.customType, appMessage.content, appMessage.display, appMessage.details);
1137
+ this._emit({ type: "message_start", message: appMessage });
1138
+ this._emit({ type: "message_end", message: appMessage });
1139
+ }
1140
+ /**
1141
+ * Append custom messages queued while the agent was running.
1142
+ * Called once the current turn's tool results are in agent state and session history.
1143
+ */
1144
+ _flushPendingCustomMessages() {
1145
+ if (this._pendingCustomMessages.length === 0)
1146
+ return;
1147
+ const pending = this._pendingCustomMessages;
1148
+ this._pendingCustomMessages = [];
1149
+ for (const appMessage of pending) {
1150
+ this._appendCustomMessage(appMessage);
1100
1151
  }
1101
1152
  }
1102
1153
  /**
@@ -1208,6 +1259,7 @@ export class AgentSession {
1208
1259
  this.sessionManager.appendModelChange(model.provider, model.id);
1209
1260
  if (options.persist) {
1210
1261
  this.settingsManager.setDefaultModelAndProvider(model.provider, model.id);
1262
+ this._addPersistedDefaultToNonEmptyScope(model);
1211
1263
  }
1212
1264
  // Apply thinking level for the new model.
1213
1265
  // Per-model thinking level overrides take priority over the global default.
@@ -1215,6 +1267,20 @@ export class AgentSession {
1215
1267
  this.setThinkingLevel(thinkingLevel);
1216
1268
  await this._emitModelSelect(model, previousModel, "set");
1217
1269
  }
1270
+ _addPersistedDefaultToNonEmptyScope(model) {
1271
+ if (this._scopedModels.length === 0)
1272
+ return;
1273
+ if (this._scopedModels.some((scoped) => modelsAreEqual(scoped.model, model)))
1274
+ return;
1275
+ this._scopedModels = [...this._scopedModels, { model }];
1276
+ const enabledModels = this.settingsManager.getEnabledModels();
1277
+ if (!enabledModels?.length)
1278
+ return;
1279
+ const modelReference = `${model.provider}/${model.id}`;
1280
+ if (enabledModels.some((pattern) => pattern.toLowerCase() === modelReference.toLowerCase()))
1281
+ return;
1282
+ this.settingsManager.setEnabledModels([...enabledModels, modelReference]);
1283
+ }
1218
1284
  /**
1219
1285
  * Cycle to next/previous model.
1220
1286
  * Uses scoped models (from --models flag) if available, otherwise all available models.
@@ -1245,6 +1311,7 @@ export class AgentSession {
1245
1311
  this.sessionManager.appendModelChange(next.model.provider, next.model.id);
1246
1312
  if (options.persist) {
1247
1313
  this.settingsManager.setDefaultModelAndProvider(next.model.provider, next.model.id);
1314
+ this._addPersistedDefaultToNonEmptyScope(next.model);
1248
1315
  }
1249
1316
  // Apply thinking level for the new model.
1250
1317
  // - Explicit scoped model thinking level overrides defaults
@@ -1271,6 +1338,7 @@ export class AgentSession {
1271
1338
  this.sessionManager.appendModelChange(nextModel.provider, nextModel.id);
1272
1339
  if (options.persist) {
1273
1340
  this.settingsManager.setDefaultModelAndProvider(nextModel.provider, nextModel.id);
1341
+ this._addPersistedDefaultToNonEmptyScope(nextModel);
1274
1342
  }
1275
1343
  // Apply thinking level for the new model.
1276
1344
  // Model persistence does not implicitly rewrite the global thinking default.