pi-ui-extend 0.1.32 → 0.1.34

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 (95) hide show
  1. package/README.md +1 -1
  2. package/dist/app/app.d.ts +2 -0
  3. package/dist/app/app.js +28 -0
  4. package/dist/app/commands/command-session-actions.js +29 -1
  5. package/dist/app/constants.d.ts +1 -1
  6. package/dist/app/constants.js +2 -2
  7. package/dist/app/icons.d.ts +4 -9
  8. package/dist/app/icons.js +12 -35
  9. package/dist/app/model/model-usage-status.d.ts +2 -1
  10. package/dist/app/model/model-usage-status.js +33 -25
  11. package/dist/app/rendering/conversation-entry-renderer.d.ts +1 -0
  12. package/dist/app/rendering/conversation-tool-renderer.d.ts +1 -0
  13. package/dist/app/rendering/conversation-tool-renderer.js +12 -18
  14. package/dist/app/rendering/conversation-viewport.d.ts +4 -0
  15. package/dist/app/rendering/conversation-viewport.js +144 -13
  16. package/dist/app/rendering/dcp-stats.js +42 -16
  17. package/dist/app/rendering/render-controller.js +4 -0
  18. package/dist/app/rendering/status-line-renderer.d.ts +8 -1
  19. package/dist/app/rendering/status-line-renderer.js +36 -1
  20. package/dist/app/rendering/tab-line-renderer.js +2 -2
  21. package/dist/app/rendering/tool-block-renderer.d.ts +1 -0
  22. package/dist/app/rendering/tool-block-renderer.js +37 -11
  23. package/dist/app/runtime.js +1 -1
  24. package/dist/app/screen/mouse-controller.d.ts +5 -1
  25. package/dist/app/screen/mouse-controller.js +16 -0
  26. package/dist/app/screen/scroll-controller.d.ts +20 -0
  27. package/dist/app/screen/scroll-controller.js +127 -10
  28. package/dist/app/session/lazy-session-manager.js +35 -5
  29. package/dist/app/session/pix-system-message.d.ts +1 -0
  30. package/dist/app/session/pix-system-message.js +14 -3
  31. package/dist/app/session/queued-message-controller.d.ts +11 -4
  32. package/dist/app/session/queued-message-controller.js +74 -59
  33. package/dist/app/session/queued-message-entries.d.ts +2 -1
  34. package/dist/app/session/queued-message-entries.js +12 -1
  35. package/dist/app/session/session-event-controller.d.ts +42 -1
  36. package/dist/app/session/session-event-controller.js +500 -31
  37. package/dist/app/session/session-history.js +23 -4
  38. package/dist/app/session/tabs-controller.d.ts +11 -1
  39. package/dist/app/session/tabs-controller.js +102 -21
  40. package/dist/app/types.d.ts +14 -1
  41. package/dist/bundled-extensions/question/contract.d.ts +25 -0
  42. package/dist/bundled-extensions/question/contract.js +94 -0
  43. package/dist/bundled-extensions/question/index.d.ts +7 -0
  44. package/dist/bundled-extensions/question/index.js +28 -0
  45. package/dist/bundled-extensions/question/render.d.ts +4 -0
  46. package/dist/bundled-extensions/question/render.js +27 -0
  47. package/dist/bundled-extensions/question/result.d.ts +6 -0
  48. package/dist/bundled-extensions/question/result.js +84 -0
  49. package/dist/bundled-extensions/question/tool-description.d.ts +7 -0
  50. package/dist/bundled-extensions/question/tool-description.js +11 -0
  51. package/dist/bundled-extensions/question/tui.d.ts +2 -0
  52. package/dist/bundled-extensions/question/tui.js +577 -0
  53. package/dist/bundled-extensions/question/types.d.ts +103 -0
  54. package/dist/bundled-extensions/question/types.js +1 -0
  55. package/dist/bundled-extensions/session-title/config.d.ts +17 -0
  56. package/dist/bundled-extensions/session-title/config.js +150 -0
  57. package/dist/bundled-extensions/session-title/index.d.ts +5 -0
  58. package/dist/bundled-extensions/session-title/index.js +384 -0
  59. package/dist/bundled-extensions/session-title/title-generation.d.ts +26 -0
  60. package/dist/bundled-extensions/session-title/title-generation.js +141 -0
  61. package/dist/bundled-extensions/terminal-bell/index.d.ts +14 -0
  62. package/dist/bundled-extensions/terminal-bell/index.js +491 -0
  63. package/dist/config.d.ts +1 -1
  64. package/dist/config.js +2 -1
  65. package/dist/default-pix-config.js +2 -1
  66. package/dist/icon-theme.d.ts +7 -0
  67. package/dist/icon-theme.js +36 -0
  68. package/dist/schemas/pi-tools-suite-schema.d.ts +4 -0
  69. package/dist/schemas/pi-tools-suite-schema.js +5 -0
  70. package/dist/schemas/pix-schema.d.ts +1 -0
  71. package/dist/schemas/pix-schema.js +1 -0
  72. package/external/pi-tools-suite/README.md +7 -7
  73. package/external/pi-tools-suite/src/async-subagents/async-subagents.sample.jsonc +16 -16
  74. package/external/pi-tools-suite/src/async-subagents/core/state.ts +18 -4
  75. package/external/pi-tools-suite/src/async-subagents/core/types.ts +4 -0
  76. package/external/pi-tools-suite/src/async-subagents/tools/result.ts +14 -26
  77. package/external/pi-tools-suite/src/async-subagents/tools/subagents.ts +0 -1
  78. package/external/pi-tools-suite/src/dcp/config.ts +14 -14
  79. package/external/pi-tools-suite/src/dcp/index.ts +31 -43
  80. package/external/pi-tools-suite/src/dcp/state-persistence.ts +151 -0
  81. package/external/pi-tools-suite/src/default-pi-tools-suite-config.ts +25 -18
  82. package/external/pi-tools-suite/src/tool-descriptions.ts +34 -54
  83. package/package.json +3 -2
  84. package/schemas/pi-tools-suite.json +14 -0
  85. package/schemas/pix.json +7 -0
  86. package/extensions/question/contract.ts +0 -100
  87. package/extensions/question/index.ts +0 -34
  88. package/extensions/question/render.ts +0 -28
  89. package/extensions/question/result.ts +0 -86
  90. package/extensions/question/tool-description.ts +0 -11
  91. package/extensions/question/tui.ts +0 -629
  92. package/extensions/question/types.ts +0 -123
  93. package/extensions/session-title/config.ts +0 -164
  94. package/extensions/session-title/index.ts +0 -502
  95. package/extensions/terminal-bell/index.ts +0 -345
@@ -1,19 +1,28 @@
1
1
  import { createId } from "../id.js";
2
2
  import { stringifyUnknown, submittedUserDisplayText } from "../rendering/message-content.js";
3
- import { deferredQueuedMessageEntries, queuedMessageEntries } from "./queued-message-entries.js";
3
+ import { autoQueuedMessageEntries, deferredQueuedMessageEntries, queuedMessageEntries } from "./queued-message-entries.js";
4
4
  export class AppQueuedMessageController {
5
5
  host;
6
+ autoUserMessages = [];
6
7
  deferredUserMessages = [];
7
- promptSubmissionInFlight = false;
8
- flushingDeferredUserMessages = false;
8
+ promptSubmissionInFlightSession;
9
9
  immediateSendInProgress = false;
10
10
  constructor(host) {
11
11
  this.host = host;
12
12
  }
13
13
  reset() {
14
+ this.autoUserMessages.length = 0;
14
15
  this.deferredUserMessages.length = 0;
15
- this.promptSubmissionInFlight = false;
16
- this.flushingDeferredUserMessages = false;
16
+ this.promptSubmissionInFlightSession = undefined;
17
+ }
18
+ captureAutoUserMessages() {
19
+ return this.autoUserMessages.map((message) => this.cloneSubmittedUserMessage(message));
20
+ }
21
+ restoreAutoUserMessages(messages) {
22
+ this.autoUserMessages.length = 0;
23
+ this.autoUserMessages.push(...messages.map((message) => this.cloneSubmittedUserMessage(message)));
24
+ this.updateQueuedMessageStatus();
25
+ void this.flushAutoUserMessages();
17
26
  }
18
27
  captureDeferredUserMessages() {
19
28
  return this.deferredUserMessages.map((message) => this.cloneSubmittedUserMessage(message));
@@ -37,8 +46,8 @@ export class AppQueuedMessageController {
37
46
  await this.sendUserMessageToSession(message, { streamingBehavior: "steer" });
38
47
  return;
39
48
  }
40
- if (this.shouldDeferUserMessage(session)) {
41
- this.deferUserMessage(message);
49
+ if (this.shouldQueueUserMessageAsSteering(session)) {
50
+ await this.queueUserMessageAsSteering(message);
42
51
  return;
43
52
  }
44
53
  await this.sendUserMessageToSession(message);
@@ -47,7 +56,7 @@ export class AppQueuedMessageController {
47
56
  const session = this.host.requireRuntime().session;
48
57
  const markInFlight = !session.isStreaming;
49
58
  if (markInFlight)
50
- this.promptSubmissionInFlight = true;
59
+ this.promptSubmissionInFlightSession = session;
51
60
  this.host.setSessionActivity("running");
52
61
  try {
53
62
  const opts = {};
@@ -58,8 +67,8 @@ export class AppQueuedMessageController {
58
67
  await session.prompt(message.promptText, Object.keys(opts).length > 0 ? opts : undefined);
59
68
  }
60
69
  finally {
61
- if (markInFlight)
62
- this.promptSubmissionInFlight = false;
70
+ if (markInFlight && this.promptSubmissionInFlightSession === session)
71
+ this.promptSubmissionInFlightSession = undefined;
63
72
  const runtime = this.host.runtime();
64
73
  if (runtime) {
65
74
  const activeSession = runtime.session;
@@ -68,47 +77,30 @@ export class AppQueuedMessageController {
68
77
  }
69
78
  if (this.totalQueuedMessageCount() > 0)
70
79
  this.updateQueuedMessageStatus();
80
+ void this.flushAutoUserMessages();
71
81
  }
72
82
  }
73
- async flushDeferredUserMessages() {
74
- if (this.immediateSendInProgress || this.flushingDeferredUserMessages || this.deferredUserMessages.length === 0)
83
+ async flushAutoUserMessages() {
84
+ if (this.immediateSendInProgress || this.autoUserMessages.length === 0)
75
85
  return;
76
86
  const session = this.host.runtime()?.session;
77
- if (!session || session.isCompacting)
87
+ if (!session || session.isStreaming || session.isCompacting || this.promptSubmissionInFlightSession === session)
78
88
  return;
79
- if (!session.isStreaming && this.promptSubmissionInFlight)
89
+ const message = this.autoUserMessages.shift();
90
+ if (!message)
80
91
  return;
81
- this.flushingDeferredUserMessages = true;
92
+ this.notifyAutoUserMessagesChanged();
93
+ this.updateQueuedMessageStatus();
94
+ if (this.host.isRunning())
95
+ this.host.render();
82
96
  try {
83
- while (this.deferredUserMessages.length > 0) {
84
- if (this.immediateSendInProgress)
85
- break;
86
- const activeSession = this.host.runtime()?.session;
87
- if (!activeSession || activeSession.isCompacting)
88
- break;
89
- if (!activeSession.isStreaming && this.promptSubmissionInFlight)
90
- break;
91
- const message = this.deferredUserMessages.shift();
92
- if (!message)
93
- break;
94
- this.notifyDeferredUserMessagesChanged();
95
- this.updateQueuedMessageStatus();
96
- try {
97
- await this.sendUserMessageToSession(message);
98
- }
99
- catch (error) {
100
- this.deferredUserMessages.unshift(message);
101
- this.notifyDeferredUserMessagesChanged();
102
- this.updateQueuedMessageStatus();
103
- this.host.addEntry({ id: createId("error"), kind: "error", text: `Queued message failed: ${stringifyUnknown(error)}` });
104
- break;
105
- }
106
- }
97
+ await this.sendUserMessageToSession(message);
107
98
  }
108
- finally {
109
- this.flushingDeferredUserMessages = false;
110
- if (this.totalQueuedMessageCount() > 0)
111
- this.updateQueuedMessageStatus();
99
+ catch (error) {
100
+ this.autoUserMessages.unshift(message);
101
+ this.notifyAutoUserMessagesChanged();
102
+ this.updateQueuedMessageStatus();
103
+ this.host.addEntry({ id: createId("error"), kind: "error", text: `Queued message failed: ${stringifyUnknown(error)}` });
112
104
  if (this.host.isRunning())
113
105
  this.host.render();
114
106
  }
@@ -116,7 +108,7 @@ export class AppQueuedMessageController {
116
108
  queuedMessageCounts() {
117
109
  const session = this.host.runtime()?.session;
118
110
  return {
119
- steering: (session?.getSteeringMessages().length ?? 0) + this.deferredUserMessages.length,
111
+ steering: (session?.getSteeringMessages().length ?? 0) + this.autoUserMessages.length + this.deferredUserMessages.length,
120
112
  followUp: session?.getFollowUpMessages().length ?? 0,
121
113
  };
122
114
  }
@@ -131,18 +123,20 @@ export class AppQueuedMessageController {
131
123
  restoreQueuedMessagesToEditorForAbort() {
132
124
  const session = this.host.runtime()?.session;
133
125
  const sdkQueued = session?.clearQueue() ?? { steering: [], followUp: [] };
126
+ const auto = this.autoUserMessages.splice(0);
134
127
  const deferred = this.deferredUserMessages.splice(0);
135
128
  if (deferred.length > 0)
136
129
  this.notifyDeferredUserMessagesChanged();
137
130
  const restoredTexts = [
138
131
  ...sdkQueued.steering,
132
+ ...auto.map((message) => this.restorableSubmittedMessageText(message)),
139
133
  ...deferred.map((message) => this.restorableSubmittedMessageText(message)),
140
134
  ...sdkQueued.followUp,
141
135
  ]
142
136
  .map((text) => text.trimEnd())
143
137
  .filter((text) => text.trim().length > 0);
144
- const images = deferred.flatMap((message) => message.images);
145
- const restoredCount = sdkQueued.steering.length + sdkQueued.followUp.length + deferred.length;
138
+ const images = [...auto, ...deferred].flatMap((message) => message.images);
139
+ const restoredCount = sdkQueued.steering.length + sdkQueued.followUp.length + auto.length + deferred.length;
146
140
  if (restoredTexts.length > 0 || images.length > 0) {
147
141
  const currentText = this.host.inputText().trimEnd();
148
142
  const combinedText = [...restoredTexts, currentText]
@@ -234,19 +228,31 @@ export class AppQueuedMessageController {
234
228
  return entry?.kind === "queued" ? entry : undefined;
235
229
  }
236
230
  queuedEntries() {
237
- return queuedMessageEntries(this.host.runtime()?.session, this.deferredUserMessages);
231
+ return queuedMessageEntries(this.host.runtime()?.session, this.autoUserMessages, this.deferredUserMessages);
232
+ }
233
+ autoQueuedEntries() {
234
+ return autoQueuedMessageEntries(this.autoUserMessages);
238
235
  }
239
236
  deferredQueuedEntries() {
240
237
  return deferredQueuedMessageEntries(this.deferredUserMessages);
241
238
  }
242
- shouldDeferUserMessage(session) {
243
- return session.isCompacting || this.promptSubmissionInFlight;
239
+ shouldQueueUserMessageAsSteering(session) {
240
+ return session.isCompacting || this.promptSubmissionInFlightSession === session;
241
+ }
242
+ async queueUserMessageAsSteering(message) {
243
+ this.autoUserMessages.push(message);
244
+ this.notifyAutoUserMessagesChanged();
245
+ this.updateQueuedMessageStatus();
246
+ this.host.setSessionStatus(this.host.runtime()?.session);
247
+ this.host.showToast("Message queued for the next agent turn", "info");
248
+ this.host.render();
249
+ void this.flushAutoUserMessages();
244
250
  }
245
251
  deferUserMessage(message) {
246
252
  this.deferredUserMessages.push(message);
247
253
  this.notifyDeferredUserMessagesChanged();
248
254
  this.updateQueuedMessageStatus();
249
- this.host.showToast("Message queued; send it from the queue menu or status button", "info");
255
+ this.host.showToast("Message paused; send it from the queue menu or status button", "info");
250
256
  this.host.render();
251
257
  }
252
258
  async rewriteSdkQueuedMessages(update) {
@@ -286,12 +292,14 @@ export class AppQueuedMessageController {
286
292
  steering: [...session.getSteeringMessages()],
287
293
  followUp: [...session.getFollowUpMessages()],
288
294
  };
289
- if (entry.queueSource === "deferred") {
290
- const [message] = this.deferredUserMessages.splice(entry.queueIndex, 1);
295
+ if (entry.queueSource === "auto" || entry.queueSource === "deferred") {
296
+ const source = entry.queueSource === "auto" ? this.autoUserMessages : this.deferredUserMessages;
297
+ const [message] = source.splice(entry.queueIndex, 1);
291
298
  if (!message)
292
299
  throw new Error("Queued message is no longer available");
293
300
  session.clearQueue();
294
- this.notifyDeferredUserMessagesChanged();
301
+ if (entry.queueSource === "deferred")
302
+ this.notifyDeferredUserMessagesChanged();
295
303
  return { removed: message, sdkMessagesToRestore: sdkMessages };
296
304
  }
297
305
  const messages = entry.queueSource === "sdk-steering" ? sdkMessages.steering : sdkMessages.followUp;
@@ -340,11 +348,13 @@ export class AppQueuedMessageController {
340
348
  return session?.isStreaming || session?.isCompacting ? "running" : "idle";
341
349
  }
342
350
  async removeQueuedEntry(entry) {
343
- if (entry.queueSource === "deferred") {
344
- const [message] = this.deferredUserMessages.splice(entry.queueIndex, 1);
351
+ if (entry.queueSource === "auto" || entry.queueSource === "deferred") {
352
+ const source = entry.queueSource === "auto" ? this.autoUserMessages : this.deferredUserMessages;
353
+ const [message] = source.splice(entry.queueIndex, 1);
345
354
  if (!message)
346
355
  throw new Error("Queued message is no longer available");
347
- this.notifyDeferredUserMessagesChanged();
356
+ if (entry.queueSource === "deferred")
357
+ this.notifyDeferredUserMessagesChanged();
348
358
  return message;
349
359
  }
350
360
  const removed = await this.rewriteSdkQueuedMessages((steering, followUp) => {
@@ -357,11 +367,13 @@ export class AppQueuedMessageController {
357
367
  return removed;
358
368
  }
359
369
  async requeueRemovedEntry(entry, removed) {
360
- if (entry.queueSource === "deferred") {
370
+ if (entry.queueSource === "auto" || entry.queueSource === "deferred") {
361
371
  if (typeof removed === "string")
362
372
  return;
363
- this.deferredUserMessages.splice(Math.min(entry.queueIndex, this.deferredUserMessages.length), 0, removed);
364
- this.notifyDeferredUserMessagesChanged();
373
+ const source = entry.queueSource === "auto" ? this.autoUserMessages : this.deferredUserMessages;
374
+ source.splice(Math.min(entry.queueIndex, source.length), 0, removed);
375
+ if (entry.queueSource === "deferred")
376
+ this.notifyDeferredUserMessagesChanged();
365
377
  return;
366
378
  }
367
379
  if (typeof removed !== "string")
@@ -397,4 +409,7 @@ export class AppQueuedMessageController {
397
409
  notifyDeferredUserMessagesChanged() {
398
410
  this.host.onDeferredUserMessagesChanged?.();
399
411
  }
412
+ notifyAutoUserMessagesChanged() {
413
+ this.host.onDeferredUserMessagesChanged?.();
414
+ }
400
415
  }
@@ -5,4 +5,5 @@ export type QueuedEntry = Extract<Entry, {
5
5
  }>;
6
6
  export declare function sdkQueuedMessageEntries(session: AgentSession | undefined): QueuedEntry[];
7
7
  export declare function deferredQueuedMessageEntries(messages: readonly SubmittedUserMessage[]): QueuedEntry[];
8
- export declare function queuedMessageEntries(session: AgentSession | undefined, deferredUserMessages: readonly SubmittedUserMessage[]): QueuedEntry[];
8
+ export declare function autoQueuedMessageEntries(messages: readonly SubmittedUserMessage[]): QueuedEntry[];
9
+ export declare function queuedMessageEntries(session: AgentSession | undefined, autoUserMessages: readonly SubmittedUserMessage[], deferredUserMessages: readonly SubmittedUserMessage[]): QueuedEntry[];
@@ -33,9 +33,20 @@ export function deferredQueuedMessageEntries(messages) {
33
33
  queueIndex: index,
34
34
  }));
35
35
  }
36
- export function queuedMessageEntries(session, deferredUserMessages) {
36
+ export function autoQueuedMessageEntries(messages) {
37
+ return messages.map((message, index) => ({
38
+ id: `${message.id}-auto-${index}`,
39
+ kind: "queued",
40
+ mode: "steering",
41
+ text: message.displayText,
42
+ queueSource: "auto",
43
+ queueIndex: index,
44
+ }));
45
+ }
46
+ export function queuedMessageEntries(session, autoUserMessages, deferredUserMessages) {
37
47
  return [
38
48
  ...sdkQueuedMessageEntries(session),
49
+ ...autoQueuedMessageEntries(autoUserMessages),
39
50
  ...deferredQueuedMessageEntries(deferredUserMessages),
40
51
  ];
41
52
  }
@@ -5,6 +5,7 @@ import type { Entry, SessionActivity } from "../types.js";
5
5
  import type { WorkspaceMutation, WorkspaceMutationPreparation } from "../workspace/workspace-undo.js";
6
6
  export type AppSessionEventControllerState = {
7
7
  toolEntryIdsByCallId: Map<string, string>;
8
+ pendingToolCallIdsByContentIndex: Map<number, string>;
8
9
  toolMutationPreparationsByCallId: Map<string, {
9
10
  userEntryId: string;
10
11
  args: unknown;
@@ -13,9 +14,16 @@ export type AppSessionEventControllerState = {
13
14
  olderHistoryLoader: SessionHistoryOlderLoader | undefined;
14
15
  currentUserEntryId: string | undefined;
15
16
  currentAssistantEntryId: string | undefined;
17
+ currentAssistantTextBlockEntryId: string | undefined;
18
+ currentAssistantTextBlockStartLength: number | undefined;
19
+ currentAssistantTextBlockContentIndex: number | undefined;
20
+ assistantTextBlocksByContentIndex: Map<number, string>;
16
21
  currentThinkingEntryId: string | undefined;
22
+ assistantMessageClosed: boolean;
17
23
  assistantTextBuffer: string;
18
24
  entryRenderVersions: Map<string, number>;
25
+ historyEntries: Entry[];
26
+ historyWindowStart: number;
19
27
  };
20
28
  export type AppSessionEventControllerHost = {
21
29
  readonly entries: Entry[];
@@ -31,6 +39,7 @@ export type AppSessionEventControllerHost = {
31
39
  setSessionStatus(session: AgentSessionRuntime["session"] | undefined): void;
32
40
  setSessionActivity(activity: SessionActivity): void;
33
41
  updateQueuedMessageStatus(): void;
42
+ flushAutoUserMessages(): void;
34
43
  prepareWorkspaceMutation(toolName: string, args: unknown): WorkspaceMutationPreparation | undefined;
35
44
  recordWorkspaceMutationForUserEntry(entryId: string, mutation: WorkspaceMutation): void;
36
45
  workspaceMutationFromToolExecution(input: {
@@ -52,11 +61,20 @@ export declare class AppSessionEventController {
52
61
  private readonly host;
53
62
  readonly entryRenderVersions: Map<string, number>;
54
63
  private readonly toolEntryIdsByCallId;
64
+ private readonly pendingToolCallIdsByContentIndex;
55
65
  private readonly toolMutationPreparationsByCallId;
56
66
  private olderHistoryLoader;
57
67
  private currentUserEntryId;
58
68
  private currentAssistantEntryId;
69
+ private currentAssistantTextBlockEntryId;
70
+ private currentAssistantTextBlockStartLength;
71
+ private currentAssistantTextBlockContentIndex;
72
+ private readonly assistantTextBlocksByContentIndex;
73
+ private readonly finalizedToolCallContentIndexes;
74
+ private historyEntries;
75
+ private historyWindowStart;
59
76
  private currentThinkingEntryId;
77
+ private assistantMessageClosed;
60
78
  private assistantTextBuffer;
61
79
  constructor(host: AppSessionEventControllerHost);
62
80
  snapshotState(): AppSessionEventControllerState;
@@ -71,6 +89,11 @@ export declare class AppSessionEventController {
71
89
  hasOlderSessionHistory(): boolean;
72
90
  isLoadingOlderSessionHistory(): boolean;
73
91
  loadOlderSessionHistory(options?: LoadOlderSessionHistoryOptions): Promise<boolean>;
92
+ hasNewerSessionHistory(): boolean;
93
+ isLoadingNewerSessionHistory(): boolean;
94
+ loadNewerSessionHistory(options?: {
95
+ render?: boolean;
96
+ }): Promise<boolean>;
74
97
  handleSessionEvent(event: AgentSessionEvent): void;
75
98
  addCustomMessageEntry(message: Record<string, unknown>): void;
76
99
  findEntry(id: string): Entry | undefined;
@@ -79,22 +102,40 @@ export declare class AppSessionEventController {
79
102
  }> | undefined;
80
103
  touchEntry(entry: Entry): void;
81
104
  addEntry(entry: Entry): void;
82
- private prependEntries;
105
+ prependEntries(entries: readonly Entry[]): void;
106
+ private shiftHistoryWindow;
107
+ private setHistoryWindowStart;
108
+ private historyWindowSize;
109
+ private maxHistoryWindowStart;
110
+ private registerEntry;
83
111
  private pruneHistoryWindow;
84
112
  private measuredLineCountForEntries;
85
113
  private forgetEntry;
114
+ private removeToolEntryOrphan;
86
115
  addSessionAbortedEntry(): void;
116
+ private finalizeAbandonedToolEntries;
87
117
  private handleMessageStart;
88
118
  private handleMessageEnd;
89
119
  private prepareToolWorkspaceMutation;
120
+ private finalizeToolResultMessage;
90
121
  private recordToolWorkspaceMutation;
91
122
  private handleMessageUpdate;
123
+ private handleToolCallStreamUpdate;
92
124
  private appendAssistantText;
93
125
  private flushAssistantTextBuffer;
126
+ private reconcileAssistantTextBlock;
127
+ private ensureAssistantTextBlockStarted;
128
+ private finishCurrentAssistantTextBlock;
129
+ private hasVisibleTextBeforeCurrentAssistantBlock;
94
130
  private drainAssistantTextBuffer;
95
131
  private hasVisibleAssistantText;
132
+ private hasStartedCurrentAssistantText;
96
133
  private appendThinkingText;
97
134
  private finishCurrentThinkingEntry;
135
+ private reconcileThinkingText;
136
+ private currentThinkingLevel;
137
+ private renderAssistantToolCallsFromMessage;
138
+ private upsertPendingToolCall;
98
139
  private upsertToolEntry;
99
140
  private clearCurrentAssistantState;
100
141
  }