@leanandmean/coding-agent 0.74.1-scramjet.6 → 0.74.1-scramjet.60

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 (227) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/LICENSE +202 -0
  3. package/README.md +21 -9
  4. package/dist/cli/args.d.ts.map +1 -1
  5. package/dist/cli/args.js +1 -1
  6. package/dist/cli/args.js.map +1 -1
  7. package/dist/cli/initial-message.d.ts +1 -0
  8. package/dist/cli/initial-message.d.ts.map +1 -1
  9. package/dist/cli/initial-message.js +3 -0
  10. package/dist/cli/initial-message.js.map +1 -1
  11. package/dist/cli/list-models.d.ts +2 -0
  12. package/dist/cli/list-models.d.ts.map +1 -1
  13. package/dist/cli/list-models.js +4 -1
  14. package/dist/cli/list-models.js.map +1 -1
  15. package/dist/config.d.ts +9 -2
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +33 -22
  18. package/dist/config.js.map +1 -1
  19. package/dist/core/agent-session-runtime.d.ts +12 -3
  20. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  21. package/dist/core/agent-session-runtime.js +64 -38
  22. package/dist/core/agent-session-runtime.js.map +1 -1
  23. package/dist/core/agent-session-services.d.ts +1 -0
  24. package/dist/core/agent-session-services.d.ts.map +1 -1
  25. package/dist/core/agent-session-services.js +2 -0
  26. package/dist/core/agent-session-services.js.map +1 -1
  27. package/dist/core/agent-session.d.ts +86 -16
  28. package/dist/core/agent-session.d.ts.map +1 -1
  29. package/dist/core/agent-session.js +865 -181
  30. package/dist/core/agent-session.js.map +1 -1
  31. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  32. package/dist/core/compaction/branch-summarization.js +21 -17
  33. package/dist/core/compaction/branch-summarization.js.map +1 -1
  34. package/dist/core/compaction/compaction.d.ts +3 -5
  35. package/dist/core/compaction/compaction.d.ts.map +1 -1
  36. package/dist/core/compaction/compaction.js +43 -10
  37. package/dist/core/compaction/compaction.js.map +1 -1
  38. package/dist/core/exec.d.ts +12 -0
  39. package/dist/core/exec.d.ts.map +1 -1
  40. package/dist/core/exec.js +74 -28
  41. package/dist/core/exec.js.map +1 -1
  42. package/dist/core/export-html/template.js +4 -0
  43. package/dist/core/extensions/index.d.ts +1 -1
  44. package/dist/core/extensions/index.d.ts.map +1 -1
  45. package/dist/core/extensions/index.js.map +1 -1
  46. package/dist/core/extensions/loader.d.ts.map +1 -1
  47. package/dist/core/extensions/loader.js +7 -0
  48. package/dist/core/extensions/loader.js.map +1 -1
  49. package/dist/core/extensions/runner.d.ts +9 -5
  50. package/dist/core/extensions/runner.d.ts.map +1 -1
  51. package/dist/core/extensions/runner.js +162 -3
  52. package/dist/core/extensions/runner.js.map +1 -1
  53. package/dist/core/extensions/types.d.ts +110 -6
  54. package/dist/core/extensions/types.d.ts.map +1 -1
  55. package/dist/core/extensions/types.js.map +1 -1
  56. package/dist/core/keybindings.d.ts +8 -0
  57. package/dist/core/keybindings.d.ts.map +1 -1
  58. package/dist/core/model-registry.d.ts +4 -0
  59. package/dist/core/model-registry.d.ts.map +1 -1
  60. package/dist/core/model-registry.js +179 -28
  61. package/dist/core/model-registry.js.map +1 -1
  62. package/dist/core/model-resolver.d.ts.map +1 -1
  63. package/dist/core/model-resolver.js +24 -6
  64. package/dist/core/model-resolver.js.map +1 -1
  65. package/dist/core/output-throughput-history.d.ts +25 -0
  66. package/dist/core/output-throughput-history.d.ts.map +1 -0
  67. package/dist/core/output-throughput-history.js +240 -0
  68. package/dist/core/output-throughput-history.js.map +1 -0
  69. package/dist/core/output-throughput.d.ts +43 -0
  70. package/dist/core/output-throughput.d.ts.map +1 -0
  71. package/dist/core/output-throughput.js +161 -0
  72. package/dist/core/output-throughput.js.map +1 -0
  73. package/dist/core/resource-loader.d.ts +6 -0
  74. package/dist/core/resource-loader.d.ts.map +1 -1
  75. package/dist/core/resource-loader.js +76 -21
  76. package/dist/core/resource-loader.js.map +1 -1
  77. package/dist/core/scramjet-command-parser.d.ts +4 -0
  78. package/dist/core/scramjet-command-parser.d.ts.map +1 -1
  79. package/dist/core/scramjet-command-parser.js +72 -1
  80. package/dist/core/scramjet-command-parser.js.map +1 -1
  81. package/dist/core/sdk.d.ts +2 -0
  82. package/dist/core/sdk.d.ts.map +1 -1
  83. package/dist/core/sdk.js +61 -10
  84. package/dist/core/sdk.js.map +1 -1
  85. package/dist/core/session-manager.d.ts +11 -3
  86. package/dist/core/session-manager.d.ts.map +1 -1
  87. package/dist/core/session-manager.js +46 -11
  88. package/dist/core/session-manager.js.map +1 -1
  89. package/dist/core/settings-manager.d.ts +18 -6
  90. package/dist/core/settings-manager.d.ts.map +1 -1
  91. package/dist/core/settings-manager.js +84 -16
  92. package/dist/core/settings-manager.js.map +1 -1
  93. package/dist/core/skills.d.ts.map +1 -1
  94. package/dist/core/skills.js +6 -2
  95. package/dist/core/skills.js.map +1 -1
  96. package/dist/core/system-prompt.d.ts +2 -0
  97. package/dist/core/system-prompt.d.ts.map +1 -1
  98. package/dist/core/system-prompt.js +5 -2
  99. package/dist/core/system-prompt.js.map +1 -1
  100. package/dist/core/tools/bash.d.ts.map +1 -1
  101. package/dist/core/tools/bash.js +4 -3
  102. package/dist/core/tools/bash.js.map +1 -1
  103. package/dist/index.d.ts +4 -3
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +3 -2
  106. package/dist/index.js.map +1 -1
  107. package/dist/main.d.ts +16 -0
  108. package/dist/main.d.ts.map +1 -1
  109. package/dist/main.js +38 -10
  110. package/dist/main.js.map +1 -1
  111. package/dist/modes/interactive/components/armin.d.ts +4 -2
  112. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  113. package/dist/modes/interactive/components/armin.js +14 -8
  114. package/dist/modes/interactive/components/armin.js.map +1 -1
  115. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  116. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  117. package/dist/modes/interactive/components/assistant-message.js +19 -8
  118. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  119. package/dist/modes/interactive/components/daxnuts.d.ts +4 -1
  120. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  121. package/dist/modes/interactive/components/daxnuts.js +14 -6
  122. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  123. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  124. package/dist/modes/interactive/components/extension-editor.js +5 -3
  125. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  126. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  127. package/dist/modes/interactive/components/extension-selector.js +4 -3
  128. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  129. package/dist/modes/interactive/components/footer.d.ts +4 -0
  130. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  131. package/dist/modes/interactive/components/footer.js +22 -18
  132. package/dist/modes/interactive/components/footer.js.map +1 -1
  133. package/dist/modes/interactive/components/model-selector.d.ts +3 -1
  134. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  135. package/dist/modes/interactive/components/model-selector.js +9 -3
  136. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  137. package/dist/modes/interactive/components/scoped-models-selector.d.ts +3 -1
  138. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  139. package/dist/modes/interactive/components/scoped-models-selector.js +8 -2
  140. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  141. package/dist/modes/interactive/components/settings-selector.d.ts +17 -3
  142. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  143. package/dist/modes/interactive/components/settings-selector.js +87 -16
  144. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  145. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  146. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  147. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  148. package/dist/modes/interactive/components/tool-execution.d.ts +19 -1
  149. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  150. package/dist/modes/interactive/components/tool-execution.js +129 -36
  151. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  152. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  153. package/dist/modes/interactive/components/user-message.js +3 -2
  154. package/dist/modes/interactive/components/user-message.js.map +1 -1
  155. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  156. package/dist/modes/interactive/components/visual-truncate.js +2 -2
  157. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  158. package/dist/modes/interactive/interactive-mode.d.ts +37 -1
  159. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  160. package/dist/modes/interactive/interactive-mode.js +876 -175
  161. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  162. package/dist/modes/interactive/spellcheck.d.ts +26 -0
  163. package/dist/modes/interactive/spellcheck.d.ts.map +1 -0
  164. package/dist/modes/interactive/spellcheck.js +144 -0
  165. package/dist/modes/interactive/spellcheck.js.map +1 -0
  166. package/dist/modes/interactive/theme/{dark.json → pi-dark.json} +3 -2
  167. package/dist/modes/interactive/theme/{light.json → pi-light.json} +27 -26
  168. package/dist/modes/interactive/theme/theme-schema.json +6 -1
  169. package/dist/modes/interactive/theme/theme.d.ts +24 -4
  170. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  171. package/dist/modes/interactive/theme/theme.js +123 -22
  172. package/dist/modes/interactive/theme/theme.js.map +1 -1
  173. package/dist/modes/print-mode.d.ts.map +1 -1
  174. package/dist/modes/print-mode.js +5 -0
  175. package/dist/modes/print-mode.js.map +1 -1
  176. package/dist/modes/rpc/rpc-client.d.ts +3 -1
  177. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  178. package/dist/modes/rpc/rpc-client.js.map +1 -1
  179. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  180. package/dist/modes/rpc/rpc-mode.js +6 -1
  181. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  182. package/dist/package-manager-cli.d.ts.map +1 -1
  183. package/dist/package-manager-cli.js +33 -14
  184. package/dist/package-manager-cli.js.map +1 -1
  185. package/dist/utils/clipboard-native.d.ts +1 -0
  186. package/dist/utils/clipboard-native.d.ts.map +1 -1
  187. package/dist/utils/clipboard-native.js.map +1 -1
  188. package/dist/utils/clipboard.d.ts +6 -0
  189. package/dist/utils/clipboard.d.ts.map +1 -1
  190. package/dist/utils/clipboard.js +278 -10
  191. package/dist/utils/clipboard.js.map +1 -1
  192. package/dist/utils/tools-manager.d.ts +1 -1
  193. package/dist/utils/tools-manager.d.ts.map +1 -1
  194. package/dist/utils/tools-manager.js +7 -6
  195. package/dist/utils/tools-manager.js.map +1 -1
  196. package/dist/utils/version-check.d.ts +17 -5
  197. package/dist/utils/version-check.d.ts.map +1 -1
  198. package/dist/utils/version-check.js +88 -21
  199. package/dist/utils/version-check.js.map +1 -1
  200. package/docs/compaction.md +9 -3
  201. package/docs/custom-provider.md +13 -4
  202. package/docs/extensions.md +139 -21
  203. package/docs/keybindings.md +25 -1
  204. package/docs/models.md +34 -2
  205. package/docs/packages.md +2 -0
  206. package/docs/prompt-templates.md +2 -0
  207. package/docs/quickstart.md +1 -4
  208. package/docs/rpc.md +8 -6
  209. package/docs/sdk.md +22 -3
  210. package/docs/session-format.md +2 -1
  211. package/docs/settings.md +13 -3
  212. package/docs/skills.md +7 -5
  213. package/docs/terminal-setup.md +79 -2
  214. package/docs/terminal-verification.md +71 -0
  215. package/docs/themes.md +63 -10
  216. package/docs/tui.md +120 -25
  217. package/docs/usage.md +6 -4
  218. package/examples/extensions/border-status-editor.ts +2 -3
  219. package/examples/extensions/doom-overlay/doom-component.ts +3 -3
  220. package/examples/extensions/mac-system-theme.ts +3 -2
  221. package/examples/extensions/modal-editor.ts +13 -8
  222. package/examples/extensions/overlay-qa-tests.ts +22 -9
  223. package/examples/extensions/overlay-test.ts +5 -3
  224. package/examples/extensions/snake.ts +3 -1
  225. package/examples/extensions/space-invaders.ts +6 -3
  226. package/examples/extensions/subagent/index.ts +20 -17
  227. package/package.json +69 -58
@@ -8,7 +8,7 @@
8
8
  * - Interact with the user via UI primitives
9
9
  */
10
10
  import type { AgentMessage, AgentToolResult, AgentToolUpdateCallback, ThinkingLevel, ToolExecutionMode } from "@leanandmean/agent";
11
- import type { Api, AssistantMessageEvent, AssistantMessageEventStream, Context, ImageContent, Model, OAuthCredentials, OAuthLoginCallbacks, SimpleStreamOptions, SystemPromptSection, TextContent, ToolResultMessage } from "@leanandmean/ai";
11
+ import type { Api, AssistantMessageEvent, AssistantMessageEventStream, Context, ImageContent, Model, OAuthCredentials, OAuthLoginCallbacks, ProviderRequestToolInventory, SimpleStreamOptions, SystemPromptSection, TextContent, ToolResultMessage } from "@leanandmean/ai";
12
12
  import type { AutocompleteItem, AutocompleteProvider, Component, EditorComponent, EditorTheme, KeyId, OverlayHandle, OverlayOptions, TUI } from "@leanandmean/tui";
13
13
  import type { Static, TSchema } from "typebox";
14
14
  import type { Theme } from "../../modes/interactive/theme/theme.js";
@@ -112,6 +112,8 @@ export interface ExtensionUIContext {
112
112
  }) | undefined): void;
113
113
  /** Set the terminal window/tab title. */
114
114
  setTitle(title: string): void;
115
+ /** Register a callback that supplies the terminal title. When set, updateTerminalTitle() delegates to this provider; if the provider returns undefined, the default title is used. Pass undefined to clear. */
116
+ setTitleProvider(provider: (() => string | undefined) | undefined): void;
115
117
  /** Show a custom component with keyboard focus. */
116
118
  custom<T>(factory: (tui: TUI, theme: Theme, keybindings: KeybindingsManager, done: (result: T) => void) => (Component & {
117
119
  dispose?(): void;
@@ -119,10 +121,17 @@ export interface ExtensionUIContext {
119
121
  dispose?(): void;
120
122
  }>, options?: {
121
123
  overlay?: boolean;
124
+ /** Install visual context at a pending tool row and flush before focusing; retained mode also guards visibility. Not persisted. */
125
+ toolAttachedContext?: {
126
+ toolCallId: string;
127
+ render: (tui: TUI, theme: Theme) => Component;
128
+ };
122
129
  /** Overlay positioning/sizing options. Can be static or a function for dynamic updates. */
123
130
  overlayOptions?: OverlayOptions | (() => OverlayOptions);
124
131
  /** Called with the overlay handle after the overlay is shown. Use to control visibility. */
125
132
  onHandle?: (handle: OverlayHandle) => void;
133
+ /** Ordinary input-slot allocation before rendering; undefined on initialization/release. Not a visibility guarantee. */
134
+ onAvailableHeight?: (rows: number | undefined) => void;
126
135
  }): Promise<T>;
127
136
  /** Paste text into the editor, triggering paste handling (collapse for large content). */
128
137
  pasteToEditor(text: string): void;
@@ -192,8 +201,9 @@ export interface ExtensionUIContext {
192
201
  export interface ContextUsage {
193
202
  /** Estimated context tokens, or null if unknown (e.g. right after compaction, before next LLM response). */
194
203
  tokens: number | null;
204
+ /** Maximum supported total context in tokens. */
195
205
  contextWindow: number;
196
- /** Context usage as percentage of context window, or null if tokens is unknown. */
206
+ /** Context usage as percentage of total context, or null if tokens is unknown. */
197
207
  percent: number | null;
198
208
  }
199
209
  export interface CompactOptions {
@@ -221,7 +231,7 @@ export interface DispatchUserInputOptions {
221
231
  export interface ExtensionContext {
222
232
  /** UI methods for user interaction */
223
233
  ui: ExtensionUIContext;
224
- /** Whether UI is available (false in print/RPC mode) */
234
+ /** Whether some UI transport is available; individual methods may still be unsupported (for example custom() in RPC). */
225
235
  hasUI: boolean;
226
236
  /** Current working directory */
227
237
  cwd: string;
@@ -231,6 +241,11 @@ export interface ExtensionContext {
231
241
  modelRegistry: ModelRegistry;
232
242
  /** Current model (may be undefined) */
233
243
  model: Model<any> | undefined;
244
+ /** Scoped models when a model scope is active (via --models or /scoped-models), empty when no scope is configured */
245
+ scopedModels: ReadonlyArray<{
246
+ model: Model<any>;
247
+ thinkingLevel?: ThinkingLevel;
248
+ }>;
234
249
  /** Whether the agent is idle (not streaming) */
235
250
  isIdle(): boolean;
236
251
  /** The current abort signal, or undefined when the agent is not streaming. */
@@ -328,7 +343,7 @@ export interface ToolRenderContext<TState = any, TArgs = any> {
328
343
  args: TArgs;
329
344
  /** Unique id for this tool execution. Stable across call/result renders for the same tool call. */
330
345
  toolCallId: string;
331
- /** Invalidate just this tool execution component for redraw. */
346
+ /** Invalidate this tool execution component. Stale lifecycle callbacks are ignored. */
332
347
  invalidate: () => void;
333
348
  /** Previously returned component for this render slot, if any. */
334
349
  lastComponent: Component | undefined;
@@ -367,6 +382,17 @@ export interface ToolDefinition<TParams extends TSchema = TSchema, TDetails = un
367
382
  parameters: TParams;
368
383
  /** Controls whether ToolExecutionComponent renders the standard colored shell or the tool renders its own framing. */
369
384
  renderShell?: "default" | "self";
385
+ /**
386
+ * Controls whether the tool can be auto-activated into the LLM-visible tool set.
387
+ *
388
+ * - `"default"` (or omitted): the tool participates in normal activation and can be sent to the
389
+ * provider and called by the model.
390
+ * - `"harness-only"`: the tool is never placed in `agent.state.tools` and is therefore never
391
+ * provider-visible or model-callable. It stays registered and resolvable (via the full tool
392
+ * registry) so the harness can execute it through `pi.invokeHarnessTool`. This is the
393
+ * structural guarantee that a system-generated tool cannot masquerade as a model-callable one.
394
+ */
395
+ activation?: "default" | "harness-only";
370
396
  /** Optional compatibility shim to prepare raw tool call arguments before schema validation. Must return an object conforming to TParams. */
371
397
  prepareArguments?: (args: unknown) => Static<TParams>;
372
398
  /**
@@ -480,11 +506,34 @@ export interface ContextEvent {
480
506
  type: "context";
481
507
  messages: AgentMessage[];
482
508
  }
509
+ export type DeepReadonly<T> = T extends (...args: any[]) => any ? T : T extends object ? {
510
+ readonly [K in keyof T]: DeepReadonly<T[K]>;
511
+ } : T;
512
+ export type RoutedModelSnapshot = DeepReadonly<Model<any>>;
513
+ export interface RoutedModelIdentitySnapshot {
514
+ readonly provider: Model<any>["provider"];
515
+ readonly id: Model<any>["id"];
516
+ readonly api: Api;
517
+ }
518
+ /** Fired after context transformation and before provider serialization. Can replace the request-local system prompt. */
519
+ export interface BeforeProviderCallEvent {
520
+ type: "before_provider_call";
521
+ model: RoutedModelSnapshot;
522
+ systemPrompt: Context["systemPrompt"];
523
+ }
483
524
  /** Fired before a provider request is sent. Can replace the payload. */
484
525
  export interface BeforeProviderRequestEvent {
485
526
  type: "before_provider_request";
527
+ model: RoutedModelSnapshot;
486
528
  payload: unknown;
487
529
  }
530
+ /** Fired after all provider payload rewrites and before transport. Observation only. */
531
+ export interface ProviderRequestToolInventoryEvent {
532
+ type: "provider_request_tool_inventory";
533
+ readonly model: RoutedModelIdentitySnapshot;
534
+ readonly requestContextToolNames: readonly string[];
535
+ readonly inventory: DeepReadonly<ProviderRequestToolInventory>;
536
+ }
488
537
  /** Fired after a provider response is received and before the response stream is consumed. */
489
538
  export interface AfterProviderResponseEvent {
490
539
  type: "after_provider_response";
@@ -602,6 +651,16 @@ export interface InputEvent {
602
651
  /** Where the input came from */
603
652
  source: InputSource;
604
653
  }
654
+ export interface InputSessionEntry {
655
+ customType: string;
656
+ /**
657
+ * Extension-defined payload. Must be JSON-serializable: it is persisted with
658
+ * JSON.stringify and restored with JSON.parse, so non-JSON values (Date, Map,
659
+ * class instances) round-trip lossily and `undefined` properties are dropped.
660
+ * The requirement is enforced only at persist time, not by this type.
661
+ */
662
+ data?: unknown;
663
+ }
605
664
  /** Result from input event handler */
606
665
  export type InputEventResult = {
607
666
  action: "continue";
@@ -609,6 +668,8 @@ export type InputEventResult = {
609
668
  action: "transform";
610
669
  text: string;
611
670
  images?: ImageContent[];
671
+ sessionEntries?: InputSessionEntry[];
672
+ onAccepted?: () => void;
612
673
  } | {
613
674
  action: "handled";
614
675
  };
@@ -735,10 +796,13 @@ export declare function isToolCallEventType<TName extends string, TInput extends
735
796
  input: TInput;
736
797
  };
737
798
  /** Union of all event types */
738
- export type ExtensionEvent = ResourcesDiscoverEvent | SessionEvent | ContextEvent | BeforeProviderRequestEvent | AfterProviderResponseEvent | BeforeAgentStartEvent | AgentStartEvent | AgentEndEvent | TurnStartEvent | TurnEndEvent | MessageStartEvent | MessageUpdateEvent | MessageEndEvent | ToolExecutionStartEvent | ToolExecutionUpdateEvent | ToolExecutionEndEvent | ModelSelectEvent | ThinkingLevelSelectEvent | UserBashEvent | InputEvent | ToolCallEvent | ToolResultEvent;
799
+ export type ExtensionEvent = ResourcesDiscoverEvent | SessionEvent | ContextEvent | BeforeProviderCallEvent | BeforeProviderRequestEvent | ProviderRequestToolInventoryEvent | AfterProviderResponseEvent | BeforeAgentStartEvent | AgentStartEvent | AgentEndEvent | TurnStartEvent | TurnEndEvent | MessageStartEvent | MessageUpdateEvent | MessageEndEvent | ToolExecutionStartEvent | ToolExecutionUpdateEvent | ToolExecutionEndEvent | ModelSelectEvent | ThinkingLevelSelectEvent | UserBashEvent | InputEvent | ToolCallEvent | ToolResultEvent;
739
800
  export interface ContextEventResult {
740
801
  messages?: AgentMessage[];
741
802
  }
803
+ export interface BeforeProviderCallEventResult {
804
+ systemPrompt?: Context["systemPrompt"];
805
+ }
742
806
  export type BeforeProviderRequestEventResult = unknown;
743
807
  export interface ToolCallEventResult {
744
808
  /** Block tool execution. To modify arguments, mutate `event.input` in place instead. */
@@ -822,7 +886,9 @@ export interface ExtensionAPI {
822
886
  on(event: "session_before_tree", handler: ExtensionHandler<SessionBeforeTreeEvent, SessionBeforeTreeResult>): void;
823
887
  on(event: "session_tree", handler: ExtensionHandler<SessionTreeEvent>): void;
824
888
  on(event: "context", handler: ExtensionHandler<ContextEvent, ContextEventResult>): void;
889
+ on(event: "before_provider_call", handler: ExtensionHandler<BeforeProviderCallEvent, BeforeProviderCallEventResult>): void;
825
890
  on(event: "before_provider_request", handler: ExtensionHandler<BeforeProviderRequestEvent, BeforeProviderRequestEventResult>): void;
891
+ on(event: "provider_request_tool_inventory", handler: ExtensionHandler<ProviderRequestToolInventoryEvent>): void;
826
892
  on(event: "after_provider_response", handler: ExtensionHandler<AfterProviderResponseEvent>): void;
827
893
  on(event: "before_agent_start", handler: ExtensionHandler<BeforeAgentStartEvent, BeforeAgentStartEventResult>): void;
828
894
  on(event: "agent_start", handler: ExtensionHandler<AgentStartEvent>): void;
@@ -888,6 +954,28 @@ export interface ExtensionAPI {
888
954
  getAllTools(): ToolInfo[];
889
955
  /** Set the active tools by name. */
890
956
  setActiveTools(toolNames: string[]): void;
957
+ /**
958
+ * Execute a registered tool as a harness-originated call, without the model requesting it.
959
+ *
960
+ * The tool is resolved from the full tool registry (so `"harness-only"` tools that are never
961
+ * provider-visible can still be executed) and run through the real execution pipeline: it
962
+ * produces the same live `tool_execution_*`/message events, persisted session entries, and
963
+ * `tool_call`/`tool_result` extension hooks as a normal tool call, but emits no run/turn
964
+ * framing. When idle the call executes immediately; when a run is active it is queued and
965
+ * drained before the next intra-run LLM call.
966
+ *
967
+ * The returned promise resolves only after the resulting tool-result message has been persisted
968
+ * to the session (#341) — a strictly stronger guarantee than Agent-core execution alone — so a
969
+ * consumer that must not replace or tear down the session until the record row exists can safely
970
+ * `await` it. It rejects if no tool with `name` is registered, if a matching event fails to
971
+ * process/persist, if the session is disposed before it settles or is called after disposal, or if
972
+ * an explicit {@link InvokeHarnessToolOptions.toolCallId} is malformed or already pending.
973
+ * **Rejection means the pipeline
974
+ * did not complete — it does not prove the artifact is absent** (state and persistence may have
975
+ * partially completed), so do not blindly retry. A tool's own `execute()` error resolves normally
976
+ * as an `isError` result.
977
+ */
978
+ invokeHarnessTool(name: string, args: unknown, options?: InvokeHarnessToolOptions): Promise<void>;
891
979
  /** Get available slash commands in the current session. */
892
980
  getCommands(): SlashCommandInfo[];
893
981
  /** Set the current model. Returns false if no API key available. */
@@ -1028,8 +1116,10 @@ export interface ProviderModelConfig {
1028
1116
  cacheRead: number;
1029
1117
  cacheWrite: number;
1030
1118
  };
1031
- /** Maximum context window size in tokens. */
1119
+ /** Maximum supported total context in tokens. */
1032
1120
  contextWindow: number;
1121
+ maxInputTokens?: number;
1122
+ requestLimits?: Model<Api>["requestLimits"];
1033
1123
  /** Maximum output tokens. */
1034
1124
  maxTokens: number;
1035
1125
  /** Custom headers for this model. */
@@ -1078,6 +1168,15 @@ export type GetCommandsHandler = () => SlashCommandInfo[];
1078
1168
  export type SetActiveToolsHandler = (toolNames: string[]) => void;
1079
1169
  export type RefreshToolsHandler = () => void;
1080
1170
  export type SetModelHandler = (model: Model<any>) => Promise<boolean>;
1171
+ /** Options for {@link ExtensionAPI.invokeHarnessTool}. */
1172
+ export interface InvokeHarnessToolOptions {
1173
+ /**
1174
+ * Explicit tool-call id — must be provider-safe (1-64 characters of `[a-zA-Z0-9_-]`); an invalid
1175
+ * id is rejected. Defaults to a provider-safe generated id when omitted.
1176
+ */
1177
+ toolCallId?: string;
1178
+ }
1179
+ export type InvokeHarnessToolHandler = (name: string, args: unknown, options?: InvokeHarnessToolOptions) => Promise<void>;
1081
1180
  export type GetThinkingLevelHandler = () => ThinkingLevel;
1082
1181
  export type SetThinkingLevelHandler = (level: ThinkingLevel) => void;
1083
1182
  export type SetLabelHandler = (entryId: string, label: string | undefined) => void;
@@ -1120,6 +1219,7 @@ export interface ExtensionActions {
1120
1219
  getActiveTools: GetActiveToolsHandler;
1121
1220
  getAllTools: GetAllToolsHandler;
1122
1221
  setActiveTools: SetActiveToolsHandler;
1222
+ invokeHarnessTool: InvokeHarnessToolHandler;
1123
1223
  refreshTools: RefreshToolsHandler;
1124
1224
  getCommands: GetCommandsHandler;
1125
1225
  setModel: SetModelHandler;
@@ -1132,6 +1232,10 @@ export interface ExtensionActions {
1132
1232
  */
1133
1233
  export interface ExtensionContextActions {
1134
1234
  getModel: () => Model<any> | undefined;
1235
+ getScopedModels: () => ReadonlyArray<{
1236
+ model: Model<any>;
1237
+ thinkingLevel?: ThinkingLevel;
1238
+ }>;
1135
1239
  isIdle: () => boolean;
1136
1240
  getSignal: () => AbortSignal | undefined;
1137
1241
  abort: () => void;