@qduc/term2 0.1.7 → 0.1.8
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.
- package/dist/app.model-command-feedback.test.d.ts +2 -0
- package/dist/app.model-command-feedback.test.d.ts.map +1 -0
- package/dist/app.model-command-feedback.test.js +19 -0
- package/dist/app.model-command-feedback.test.js.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -1
- package/dist/components/BottomArea.d.ts +1 -8
- package/dist/components/BottomArea.d.ts.map +1 -1
- package/dist/components/BottomArea.js.map +1 -1
- package/dist/components/InputBox.d.ts +6 -0
- package/dist/components/InputBox.d.ts.map +1 -1
- package/dist/components/InputBox.js +25 -3
- package/dist/components/InputBox.js.map +1 -1
- package/dist/components/InputBox.test.js +10 -1
- package/dist/components/InputBox.test.js.map +1 -1
- package/dist/components/MentorMode.test.d.ts +2 -0
- package/dist/components/MentorMode.test.d.ts.map +1 -0
- package/dist/components/MentorMode.test.js.map +1 -0
- package/dist/components/StatusBar.test.d.ts +2 -0
- package/dist/components/StatusBar.test.d.ts.map +1 -0
- package/dist/components/StatusBar.test.js +19 -0
- package/dist/components/StatusBar.test.js.map +1 -0
- package/dist/components/TextInput.d.ts.map +1 -1
- package/dist/components/TextInput.js +1 -2
- package/dist/components/TextInput.js.map +1 -1
- package/dist/components/TextInput.test.js.map +1 -1
- package/dist/contracts/conversation.d.ts +27 -0
- package/dist/contracts/conversation.d.ts.map +1 -0
- package/dist/contracts/conversation.js +2 -0
- package/dist/contracts/conversation.js.map +1 -0
- package/dist/debug-schema.d.ts +2 -0
- package/dist/debug-schema.d.ts.map +1 -0
- package/dist/debug-schema.js +22 -0
- package/dist/debug-schema.js.map +1 -0
- package/dist/hooks/use-conversation.d.ts +3 -14
- package/dist/hooks/use-conversation.d.ts.map +1 -1
- package/dist/hooks/use-conversation.js +15 -87
- package/dist/hooks/use-conversation.js.map +1 -1
- package/dist/hooks/use-model-selection.test.d.ts +2 -0
- package/dist/hooks/use-model-selection.test.d.ts.map +1 -0
- package/dist/hooks/use-model-selection.test.js +28 -0
- package/dist/hooks/use-model-selection.test.js.map +1 -0
- package/dist/hooks/use-path-completion.test.d.ts +2 -0
- package/dist/hooks/use-path-completion.test.d.ts.map +1 -0
- package/dist/hooks/use-path-completion.test.js +29 -0
- package/dist/hooks/use-path-completion.test.js.map +1 -0
- package/dist/lib/mentor-client.d.ts +41 -0
- package/dist/lib/mentor-client.d.ts.map +1 -0
- package/dist/lib/mentor-client.js +146 -0
- package/dist/lib/mentor-client.js.map +1 -0
- package/dist/lib/mentor-client.test.d.ts +2 -0
- package/dist/lib/mentor-client.test.d.ts.map +1 -0
- package/dist/lib/mentor-client.test.js +440 -0
- package/dist/lib/mentor-client.test.js.map +1 -0
- package/dist/lib/retry-strategy.d.ts +43 -0
- package/dist/lib/retry-strategy.d.ts.map +1 -0
- package/dist/lib/retry-strategy.js +93 -0
- package/dist/lib/retry-strategy.js.map +1 -0
- package/dist/lib/retry-strategy.test.d.ts +2 -0
- package/dist/lib/retry-strategy.test.d.ts.map +1 -0
- package/dist/lib/retry-strategy.test.js +200 -0
- package/dist/lib/retry-strategy.test.js.map +1 -0
- package/dist/lib/tool-invoke.d.ts +13 -0
- package/dist/lib/tool-invoke.d.ts.map +1 -1
- package/dist/lib/tool-invoke.js +61 -3
- package/dist/lib/tool-invoke.js.map +1 -1
- package/dist/lib/tool-invoke.test.js +139 -1
- package/dist/lib/tool-invoke.test.js.map +1 -1
- package/dist/prompts/default.md.bak +77 -0
- package/dist/prompts/simple-mentor.md +0 -8
- package/dist/prompts/simple.md +4 -0
- package/dist/providers/github-copilot/model-direct.d.ts +34 -0
- package/dist/providers/github-copilot/model-direct.d.ts.map +1 -0
- package/dist/providers/github-copilot/model-direct.js +443 -0
- package/dist/providers/github-copilot/model-direct.js.map +1 -0
- package/dist/providers/github-copilot/model.d.ts.map +1 -1
- package/dist/providers/github-copilot/model.js +108 -25
- package/dist/providers/github-copilot/model.js.map +1 -1
- package/dist/providers/github-copilot/provider.d.ts +5 -0
- package/dist/providers/github-copilot/provider.d.ts.map +1 -1
- package/dist/providers/github-copilot/provider.js +7 -2
- package/dist/providers/github-copilot/provider.js.map +1 -1
- package/dist/providers/openrouter/merge-messages.test.d.ts +2 -0
- package/dist/providers/openrouter/merge-messages.test.d.ts.map +1 -0
- package/dist/providers/openrouter/merge-messages.test.js +83 -0
- package/dist/providers/openrouter/merge-messages.test.js.map +1 -0
- package/dist/providers/openrouter.history.test.d.ts +2 -0
- package/dist/providers/openrouter.history.test.d.ts.map +1 -0
- package/dist/providers/openrouter.history.test.js +533 -0
- package/dist/providers/openrouter.history.test.js.map +1 -0
- package/dist/reproduce_issue.test.d.ts +2 -0
- package/dist/reproduce_issue.test.d.ts.map +1 -0
- package/dist/reproduce_issue.test.js +31 -0
- package/dist/reproduce_issue.test.js.map +1 -0
- package/dist/services/approval-presentation-policy.d.ts +17 -0
- package/dist/services/approval-presentation-policy.d.ts.map +1 -0
- package/dist/services/approval-presentation-policy.js +44 -0
- package/dist/services/approval-presentation-policy.js.map +1 -0
- package/dist/services/approval-presentation-policy.test.d.ts +2 -0
- package/dist/services/approval-presentation-policy.test.d.ts.map +1 -0
- package/dist/services/approval-presentation-policy.test.js +74 -0
- package/dist/services/approval-presentation-policy.test.js.map +1 -0
- package/dist/services/approval-state.d.ts +4 -4
- package/dist/services/approval-state.d.ts.map +1 -1
- package/dist/services/conversation-events.d.ts +12 -9
- package/dist/services/conversation-events.d.ts.map +1 -1
- package/dist/services/conversation-result-builder.d.ts +41 -0
- package/dist/services/conversation-result-builder.d.ts.map +1 -0
- package/dist/services/conversation-result-builder.js +110 -0
- package/dist/services/conversation-result-builder.js.map +1 -0
- package/dist/services/conversation-result-builder.test.d.ts +2 -0
- package/dist/services/conversation-result-builder.test.d.ts.map +1 -0
- package/dist/services/conversation-result-builder.test.js +76 -0
- package/dist/services/conversation-result-builder.test.js.map +1 -0
- package/dist/services/conversation-service.d.ts +7 -5
- package/dist/services/conversation-service.d.ts.map +1 -1
- package/dist/services/conversation-service.js +1 -1
- package/dist/services/conversation-service.js.map +1 -1
- package/dist/services/conversation-service.test.js +183 -149
- package/dist/services/conversation-session.d.ts +4 -24
- package/dist/services/conversation-session.d.ts.map +1 -1
- package/dist/services/conversation-session.js +172 -229
- package/dist/services/conversation-session.js.map +1 -1
- package/dist/services/conversation-session.usage.test.d.ts +2 -0
- package/dist/services/conversation-session.usage.test.d.ts.map +1 -0
- package/dist/services/conversation-session.usage.test.js +59 -0
- package/dist/services/conversation-session.usage.test.js.map +1 -0
- package/dist/services/conversation-store.d.ts +6 -0
- package/dist/services/conversation-store.d.ts.map +1 -1
- package/dist/services/conversation-store.js +13 -0
- package/dist/services/conversation-store.js.map +1 -1
- package/dist/services/stream-event-processor.d.ts +32 -0
- package/dist/services/stream-event-processor.d.ts.map +1 -0
- package/dist/services/stream-event-processor.js +344 -0
- package/dist/services/stream-event-processor.js.map +1 -0
- package/dist/services/stream-event-processor.test.d.ts +2 -0
- package/dist/services/stream-event-processor.test.d.ts.map +1 -0
- package/dist/services/stream-event-processor.test.js +117 -0
- package/dist/services/stream-event-processor.test.js.map +1 -0
- package/dist/test-search-tool.d.ts +2 -0
- package/dist/test-search-tool.d.ts.map +1 -0
- package/dist/test-search-tool.js +36 -0
- package/dist/test-search-tool.js.map +1 -0
- package/dist/tools/read-file.test.js +15 -0
- package/dist/tools/read-file.test.js.map +1 -1
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +157 -1
- package/dist/tools/search-replace.js.map +1 -1
- package/dist/tools/search-replace.test.js +177 -0
- package/dist/tools/search-replace.test.js.map +1 -1
- package/dist/tools/tool-capabilities.d.ts +6 -0
- package/dist/tools/tool-capabilities.d.ts.map +1 -0
- package/dist/tools/tool-capabilities.js +17 -0
- package/dist/tools/tool-capabilities.js.map +1 -0
- package/dist/tools/types.d.ts +4 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +4 -1
- package/dist/tools/utils.js.map +1 -1
- package/dist/tools/utils.test.d.ts +2 -0
- package/dist/tools/utils.test.d.ts.map +1 -0
- package/dist/tools/utils.test.js +26 -0
- package/dist/tools/utils.test.js.map +1 -0
- package/dist/types/messages.d.ts +29 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +2 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/utils/command-safety.d.ts.map +1 -1
- package/dist/utils/command-safety.js +364 -10
- package/dist/utils/command-safety.js.map +1 -1
- package/dist/utils/conversation-event-handler.d.ts +16 -10
- package/dist/utils/conversation-event-handler.d.ts.map +1 -1
- package/dist/utils/conversation-event-handler.js +4 -0
- package/dist/utils/conversation-event-handler.js.map +1 -1
- package/dist/utils/extract-command-messages.repro.test.d.ts +2 -0
- package/dist/utils/extract-command-messages.repro.test.d.ts.map +1 -0
- package/dist/utils/extract-command-messages.repro.test.js +31 -0
- package/dist/utils/extract-command-messages.repro.test.js.map +1 -0
- package/dist/utils/extract-command-messages.test.js +51 -58
- package/dist/utils/message-utils.d.ts +17 -0
- package/dist/utils/message-utils.d.ts.map +1 -0
- package/dist/utils/message-utils.js +52 -0
- package/dist/utils/message-utils.js.map +1 -0
- package/dist/utils/message-utils.test.d.ts +2 -0
- package/dist/utils/message-utils.test.d.ts.map +1 -0
- package/dist/utils/message-utils.test.js +48 -0
- package/dist/utils/message-utils.test.js.map +1 -0
- package/dist/utils/streaming-session-factory.d.ts +9 -9
- package/dist/utils/streaming-session-factory.d.ts.map +1 -1
- package/dist/utils/streaming-session-factory.js +7 -2
- package/dist/utils/streaming-session-factory.js.map +1 -1
- package/dist/utils/synchronized-output.d.ts +35 -0
- package/dist/utils/synchronized-output.d.ts.map +1 -0
- package/dist/utils/synchronized-output.js +66 -0
- package/dist/utils/synchronized-output.js.map +1 -0
- package/dist/utils/synchronized-output.test.d.ts +2 -0
- package/dist/utils/synchronized-output.test.d.ts.map +1 -0
- package/dist/utils/synchronized-output.test.js +70 -0
- package/dist/utils/synchronized-output.test.js.map +1 -0
- package/package.json +1 -1
- package/dist/agent.lite-mode.test.d.ts +0 -2
- package/dist/agent.lite-mode.test.d.ts.map +0 -1
- package/dist/agent.lite-mode.test.js +0 -39
- package/dist/agent.lite-mode.test.js.map +0 -1
- package/dist/debug_ask_mentor.d.ts +0 -2
- package/dist/debug_ask_mentor.d.ts.map +0 -1
- package/dist/debug_ask_mentor.js +0 -73
- package/dist/debug_ask_mentor.js.map +0 -1
- package/dist/modes/companion/command-index.d.ts +0 -26
- package/dist/modes/companion/command-index.d.ts.map +0 -1
- package/dist/modes/companion/command-index.js +0 -50
- package/dist/modes/companion/command-index.js.map +0 -1
- package/dist/modes/companion/command-index.test.d.ts +0 -2
- package/dist/modes/companion/command-index.test.d.ts.map +0 -1
- package/dist/modes/companion/command-index.test.js +0 -86
- package/dist/modes/companion/command-index.test.js.map +0 -1
- package/dist/modes/companion/companion-app.d.ts +0 -12
- package/dist/modes/companion/companion-app.d.ts.map +0 -1
- package/dist/modes/companion/companion-app.js +0 -297
- package/dist/modes/companion/companion-app.js.map +0 -1
- package/dist/modes/companion/companion-session.d.ts +0 -63
- package/dist/modes/companion/companion-session.d.ts.map +0 -1
- package/dist/modes/companion/companion-session.js +0 -146
- package/dist/modes/companion/companion-session.js.map +0 -1
- package/dist/modes/companion/companion-session.test.d.ts +0 -2
- package/dist/modes/companion/companion-session.test.d.ts.map +0 -1
- package/dist/modes/companion/companion-session.test.js +0 -28
- package/dist/modes/companion/companion-session.test.js.map +0 -1
- package/dist/modes/companion/components/status-bar.d.ts +0 -13
- package/dist/modes/companion/components/status-bar.d.ts.map +0 -1
- package/dist/modes/companion/components/status-bar.js +0 -26
- package/dist/modes/companion/components/status-bar.js.map +0 -1
- package/dist/modes/companion/context-buffer.d.ts +0 -65
- package/dist/modes/companion/context-buffer.d.ts.map +0 -1
- package/dist/modes/companion/context-buffer.js +0 -156
- package/dist/modes/companion/context-buffer.js.map +0 -1
- package/dist/modes/companion/context-buffer.test.d.ts +0 -2
- package/dist/modes/companion/context-buffer.test.d.ts.map +0 -1
- package/dist/modes/companion/context-buffer.test.js +0 -154
- package/dist/modes/companion/context-buffer.test.js.map +0 -1
- package/dist/modes/companion/event-detector.d.ts +0 -46
- package/dist/modes/companion/event-detector.d.ts.map +0 -1
- package/dist/modes/companion/event-detector.js +0 -169
- package/dist/modes/companion/event-detector.js.map +0 -1
- package/dist/modes/companion/event-detector.test.d.ts +0 -2
- package/dist/modes/companion/event-detector.test.d.ts.map +0 -1
- package/dist/modes/companion/event-detector.test.js +0 -121
- package/dist/modes/companion/event-detector.test.js.map +0 -1
- package/dist/modes/companion/index.d.ts +0 -33
- package/dist/modes/companion/index.d.ts.map +0 -1
- package/dist/modes/companion/index.js +0 -21
- package/dist/modes/companion/index.js.map +0 -1
- package/dist/modes/companion/input-key-mapper.d.ts +0 -3
- package/dist/modes/companion/input-key-mapper.d.ts.map +0 -1
- package/dist/modes/companion/input-key-mapper.js +0 -31
- package/dist/modes/companion/input-key-mapper.js.map +0 -1
- package/dist/modes/companion/input-key-mapper.test.d.ts +0 -2
- package/dist/modes/companion/input-key-mapper.test.d.ts.map +0 -1
- package/dist/modes/companion/input-key-mapper.test.js +0 -26
- package/dist/modes/companion/input-key-mapper.test.js.map +0 -1
- package/dist/modes/companion/input-parser.d.ts +0 -53
- package/dist/modes/companion/input-parser.d.ts.map +0 -1
- package/dist/modes/companion/input-parser.js +0 -114
- package/dist/modes/companion/input-parser.js.map +0 -1
- package/dist/modes/companion/input-parser.test.d.ts +0 -2
- package/dist/modes/companion/input-parser.test.d.ts.map +0 -1
- package/dist/modes/companion/input-parser.test.js +0 -123
- package/dist/modes/companion/input-parser.test.js.map +0 -1
- package/dist/modes/companion/mode-manager.d.ts +0 -41
- package/dist/modes/companion/mode-manager.d.ts.map +0 -1
- package/dist/modes/companion/mode-manager.js +0 -56
- package/dist/modes/companion/mode-manager.js.map +0 -1
- package/dist/modes/companion/mode-manager.test.d.ts +0 -2
- package/dist/modes/companion/mode-manager.test.d.ts.map +0 -1
- package/dist/modes/companion/mode-manager.test.js +0 -65
- package/dist/modes/companion/mode-manager.test.js.map +0 -1
- package/dist/modes/companion/output-classifier.d.ts +0 -15
- package/dist/modes/companion/output-classifier.d.ts.map +0 -1
- package/dist/modes/companion/output-classifier.js +0 -77
- package/dist/modes/companion/output-classifier.js.map +0 -1
- package/dist/modes/companion/output-classifier.test.d.ts +0 -2
- package/dist/modes/companion/output-classifier.test.d.ts.map +0 -1
- package/dist/modes/companion/output-classifier.test.js +0 -133
- package/dist/modes/companion/output-classifier.test.js.map +0 -1
- package/dist/modes/companion/pty-wrapper.d.ts +0 -46
- package/dist/modes/companion/pty-wrapper.d.ts.map +0 -1
- package/dist/modes/companion/pty-wrapper.js +0 -143
- package/dist/modes/companion/pty-wrapper.js.map +0 -1
- package/dist/modes/companion/safety-classifier.d.ts +0 -31
- package/dist/modes/companion/safety-classifier.d.ts.map +0 -1
- package/dist/modes/companion/safety-classifier.js +0 -140
- package/dist/modes/companion/safety-classifier.js.map +0 -1
- package/dist/modes/companion/safety-classifier.test.d.ts +0 -2
- package/dist/modes/companion/safety-classifier.test.d.ts.map +0 -1
- package/dist/modes/companion/safety-classifier.test.js +0 -151
- package/dist/modes/companion/safety-classifier.test.js.map +0 -1
- package/dist/modes/companion/summarizer.d.ts +0 -24
- package/dist/modes/companion/summarizer.d.ts.map +0 -1
- package/dist/modes/companion/summarizer.js +0 -132
- package/dist/modes/companion/summarizer.js.map +0 -1
- package/dist/modes/companion/terminal-history.d.ts +0 -27
- package/dist/modes/companion/terminal-history.d.ts.map +0 -1
- package/dist/modes/companion/terminal-history.js +0 -142
- package/dist/modes/companion/terminal-history.js.map +0 -1
- package/dist/providers/github-copilot/model.test.d.ts +0 -2
- package/dist/providers/github-copilot/model.test.d.ts.map +0 -1
- package/dist/providers/github-copilot/model.test.js +0 -63
- package/dist/providers/github-copilot/model.test.js.map +0 -1
- package/dist/services/check_mock.d.ts +0 -2
- package/dist/services/check_mock.d.ts.map +0 -1
- package/dist/services/check_mock.js +0 -22
- package/dist/services/check_mock.js.map +0 -1
- package/dist/services/conversation-service.test.d.ts +0 -2
- package/dist/services/conversation-service.test.d.ts.map +0 -1
- package/dist/services/conversation-service.test.js.map +0 -1
- package/dist/utils/command-safety.devnull.test.d.ts +0 -2
- package/dist/utils/command-safety.devnull.test.d.ts.map +0 -1
- package/dist/utils/command-safety.devnull.test.js +0 -13
- package/dist/utils/command-safety.devnull.test.js.map +0 -1
- package/dist/utils/extract-command-messages.test.d.ts +0 -2
- package/dist/utils/extract-command-messages.test.d.ts.map +0 -1
- package/dist/utils/extract-command-messages.test.js.map +0 -1
|
@@ -18,11 +18,13 @@ export interface SystemMessage {
|
|
|
18
18
|
sender: 'system';
|
|
19
19
|
text: string;
|
|
20
20
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
21
|
+
export type UIMessage = {
|
|
22
|
+
id: string | number;
|
|
23
|
+
sender: string;
|
|
24
|
+
callId?: string;
|
|
25
|
+
status?: string;
|
|
26
|
+
};
|
|
27
|
+
export interface ConversationEventHandlerDeps<MessageT extends UIMessage = UIMessage, CommandMessageT extends CommandMessage = CommandMessage> {
|
|
26
28
|
liveResponseUpdater: {
|
|
27
29
|
push: (text: string) => void;
|
|
28
30
|
cancel: () => void;
|
|
@@ -33,10 +35,14 @@ export interface ConversationEventHandlerDeps<CommandMessageT extends CommandMes
|
|
|
33
35
|
cancel: () => void;
|
|
34
36
|
flush: () => void;
|
|
35
37
|
};
|
|
36
|
-
appendMessages: (messages:
|
|
37
|
-
setMessages: (updater: (prev:
|
|
38
|
-
setLiveResponse: (response:
|
|
39
|
-
|
|
38
|
+
appendMessages: (messages: MessageT[]) => void;
|
|
39
|
+
setMessages: (updater: (prev: MessageT[]) => MessageT[]) => void;
|
|
40
|
+
setLiveResponse: (response: {
|
|
41
|
+
id: number;
|
|
42
|
+
sender: 'bot';
|
|
43
|
+
text: string;
|
|
44
|
+
} | null) => void;
|
|
45
|
+
trimMessages: (messages: MessageT[]) => MessageT[];
|
|
40
46
|
annotateCommandMessage: (msg: CommandMessageT) => CommandMessageT;
|
|
41
47
|
}
|
|
42
48
|
/**
|
|
@@ -47,5 +53,5 @@ export interface ConversationEventHandlerDeps<CommandMessageT extends CommandMes
|
|
|
47
53
|
* @param state - Mutable streaming state object
|
|
48
54
|
* @returns Event handler function
|
|
49
55
|
*/
|
|
50
|
-
export declare function createConversationEventHandler<CommandMessageT extends CommandMessage = CommandMessage>(deps: ConversationEventHandlerDeps<CommandMessageT>, state: StreamingState): (event: ConversationEvent) => void;
|
|
56
|
+
export declare function createConversationEventHandler<MessageT extends UIMessage = UIMessage, CommandMessageT extends CommandMessage = CommandMessage>(deps: ConversationEventHandlerDeps<MessageT, CommandMessageT>, state: StreamingState): (event: ConversationEvent) => void;
|
|
51
57
|
//# sourceMappingURL=conversation-event-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-event-handler.d.ts","sourceRoot":"","sources":["../../source/utils/conversation-event-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAErG;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED
|
|
1
|
+
{"version":3,"file":"conversation-event-handler.d.ts","sourceRoot":"","sources":["../../source/utils/conversation-event-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAyC,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAErG;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,WAAW,4BAA4B,CAC3C,QAAQ,SAAS,SAAS,GAAG,SAAS,EACtC,eAAe,SAAS,cAAc,GAAG,cAAc;IAEvD,mBAAmB,EAAE;QACnB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,KAAK,EAAE,MAAM,IAAI,CAAC;KACnB,CAAC;IACF,gBAAgB,EAAE;QAChB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,MAAM,EAAE,MAAM,IAAI,CAAC;QACnB,KAAK,EAAE,MAAM,IAAI,CAAC;KACnB,CAAC;IACF,cAAc,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,CAAC;IAC/C,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,KAAK,IAAI,CAAC;IACjE,eAAe,EAAE,CAAC,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,KAAK,IAAI,CAAC;IACxF,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,CAAC;IACnD,sBAAsB,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,eAAe,CAAC;CACnE;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,SAAS,SAAS,GAAG,SAAS,EACtC,eAAe,SAAS,cAAc,GAAG,cAAc,EAEvD,IAAI,EAAE,4BAA4B,CAAC,QAAQ,EAAE,eAAe,CAAC,EAC7D,KAAK,EAAE,cAAc,GACpB,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAkJpC"}
|
|
@@ -119,6 +119,10 @@ export function createConversationEventHandler(deps, state) {
|
|
|
119
119
|
setMessages((prev) => [...prev, systemMessage]);
|
|
120
120
|
return;
|
|
121
121
|
}
|
|
122
|
+
case 'usage_update':
|
|
123
|
+
// Usage updates are handled separately in streaming-session-factory.ts
|
|
124
|
+
// This case exists for exhaustiveness and to document the event flow
|
|
125
|
+
return;
|
|
122
126
|
default:
|
|
123
127
|
// Ignore unknown events (approval_required, final, error handled elsewhere)
|
|
124
128
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-event-handler.js","sourceRoot":"","sources":["../../source/utils/conversation-event-handler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAuB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"conversation-event-handler.js","sourceRoot":"","sources":["../../source/utils/conversation-event-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-command-messages.repro.test.d.ts","sourceRoot":"","sources":["../../source/utils/extract-command-messages.repro.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { extractCommandMessages } from './extract-command-messages.js';
|
|
3
|
+
test('extractCommandMessages handles tool_call_id', t => {
|
|
4
|
+
const historyItem = {
|
|
5
|
+
role: 'tool',
|
|
6
|
+
tool_call_id: 'call_123',
|
|
7
|
+
content: JSON.stringify({ output: [{ success: false, error: 'failed' }] }),
|
|
8
|
+
name: 'shell' // OpenAI messages don't always have name on tool output, but let's assume it might be there or inferred
|
|
9
|
+
};
|
|
10
|
+
// normalizeToolItem requires name.
|
|
11
|
+
// In OpenAI history, the tool name is associated with the tool_call, not the tool output.
|
|
12
|
+
// But extractCommandMessages seems to expect name on the item.
|
|
13
|
+
// Let's see what normalizeToolItem expects.
|
|
14
|
+
// const toolName = rawItem?.name ?? item.name;
|
|
15
|
+
// If the history item doesn't have name, it returns null.
|
|
16
|
+
// So result.history must contain items that have name.
|
|
17
|
+
const item = {
|
|
18
|
+
type: 'function_call_result', // or tool_call_output_item
|
|
19
|
+
name: 'shell',
|
|
20
|
+
tool_call_id: 'call_123',
|
|
21
|
+
output: JSON.stringify({ output: [{ success: false, error: 'failed' }] })
|
|
22
|
+
};
|
|
23
|
+
const messages = extractCommandMessages([item]);
|
|
24
|
+
t.is(messages.length, 1);
|
|
25
|
+
// The ID should be derived from tool_call_id if possible
|
|
26
|
+
// But currently it checks id, callId.
|
|
27
|
+
// If tool_call_id is present but ignored, it uses timestamp-index.
|
|
28
|
+
const id = messages[0].id;
|
|
29
|
+
t.true(id.includes('call_123'), `ID ${id} should include call_123`);
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=extract-command-messages.repro.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract-command-messages.repro.test.js","sourceRoot":"","sources":["../../source/utils/extract-command-messages.repro.test.ts"],"names":[],"mappings":"AACA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,sBAAsB,EAAC,MAAM,+BAA+B,CAAC;AAErE,IAAI,CAAC,6CAA6C,EAAE,CAAC,CAAC,EAAE;IACpD,MAAM,WAAW,GAAG;QAChB,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,UAAU;QACxB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,CAAC,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAC,CAAC,EAAC,CAAC;QACtE,IAAI,EAAE,OAAO,CAAC,wGAAwG;KACzH,CAAC;IAEF,mCAAmC;IACnC,0FAA0F;IAC1F,+DAA+D;IAE/D,4CAA4C;IAC5C,+CAA+C;IAE/C,0DAA0D;IAE1D,uDAAuD;IAEvD,MAAM,IAAI,GAAG;QACT,IAAI,EAAE,sBAAsB,EAAE,2BAA2B;QACzD,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,UAAU;QACxB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,EAAC,MAAM,EAAE,CAAC,EAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAC,CAAC,EAAC,CAAC;KACxE,CAAC;IAEF,MAAM,QAAQ,GAAG,sBAAsB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzB,yDAAyD;IACzD,sCAAsC;IAEtC,mEAAmE;IACnE,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1B,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,0BAA0B,CAAC,CAAC;AACxE,CAAC,CAAC,CAAC"}
|
|
@@ -1,64 +1,57 @@
|
|
|
1
1
|
import test from 'ava';
|
|
2
|
-
import { extractCommandMessages } from '
|
|
2
|
+
import { extractCommandMessages } from '../../dist/utils/extract-command-messages.js';
|
|
3
3
|
const withStubbedNow = value => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
const realNow = Date.now;
|
|
5
|
+
Date.now = () => value;
|
|
6
|
+
return () => {
|
|
7
|
+
Date.now = realNow;
|
|
8
|
+
};
|
|
9
9
|
};
|
|
10
10
|
test('extracts bash command results from tool call output items', t => {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
finally {
|
|
34
|
-
restore();
|
|
35
|
-
}
|
|
11
|
+
const restore = withStubbedNow(1700000000000);
|
|
12
|
+
try {
|
|
13
|
+
const items = [{
|
|
14
|
+
type: 'tool_call_output_item',
|
|
15
|
+
output: '{"command":"date","output":"Mon Nov 24","success":true}',
|
|
16
|
+
rawItem: {
|
|
17
|
+
type: 'function_call_result',
|
|
18
|
+
name: 'bash'
|
|
19
|
+
}
|
|
20
|
+
}];
|
|
21
|
+
const messages = extractCommandMessages(items);
|
|
22
|
+
t.is(messages.length, 1);
|
|
23
|
+
t.deepEqual(messages[0], {
|
|
24
|
+
id: '1700000000000-0',
|
|
25
|
+
sender: 'command',
|
|
26
|
+
command: 'date',
|
|
27
|
+
output: 'Mon Nov 24',
|
|
28
|
+
success: true
|
|
29
|
+
});
|
|
30
|
+
} finally {
|
|
31
|
+
restore();
|
|
32
|
+
}
|
|
36
33
|
});
|
|
37
34
|
test('extracts commands from history function_call_result items', t => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
restore();
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
//# sourceMappingURL=extract-command-messages.test.js.map
|
|
35
|
+
const restore = withStubbedNow(1700000000100);
|
|
36
|
+
try {
|
|
37
|
+
const items = [{
|
|
38
|
+
type: 'function_call_result',
|
|
39
|
+
name: 'bash',
|
|
40
|
+
output: {
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: '{"command":"ls","output":"agent.js\\napp.js","success":false}'
|
|
43
|
+
}
|
|
44
|
+
}];
|
|
45
|
+
const messages = extractCommandMessages(items);
|
|
46
|
+
t.is(messages.length, 1);
|
|
47
|
+
t.deepEqual(messages[0], {
|
|
48
|
+
id: '1700000000100-0',
|
|
49
|
+
sender: 'command',
|
|
50
|
+
command: 'ls',
|
|
51
|
+
output: 'agent.js\napp.js',
|
|
52
|
+
success: false
|
|
53
|
+
});
|
|
54
|
+
} finally {
|
|
55
|
+
restore();
|
|
56
|
+
}
|
|
57
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
type MessageLike = {
|
|
2
|
+
id?: string | number;
|
|
3
|
+
sender?: string;
|
|
4
|
+
text?: string;
|
|
5
|
+
status?: string;
|
|
6
|
+
command?: string;
|
|
7
|
+
output?: string;
|
|
8
|
+
success?: boolean;
|
|
9
|
+
failureReason?: string;
|
|
10
|
+
toolName?: string;
|
|
11
|
+
toolArgs?: unknown;
|
|
12
|
+
isApprovalRejection?: boolean;
|
|
13
|
+
hadApproval?: boolean;
|
|
14
|
+
};
|
|
15
|
+
export declare const areMessageListsEqual: (prev: MessageLike[] | undefined, next: MessageLike[] | undefined) => boolean;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=message-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-utils.d.ts","sourceRoot":"","sources":["../../source/utils/message-utils.ts"],"names":[],"mappings":"AAAA,KAAK,WAAW,GAAG;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB,CAAC;AAuCF,eAAO,MAAM,oBAAoB,GAC7B,MAAM,WAAW,EAAE,GAAG,SAAS,EAC/B,MAAM,WAAW,EAAE,GAAG,SAAS,KAChC,OAiBF,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
const serializeValue = (value) => {
|
|
2
|
+
if (value == null)
|
|
3
|
+
return '';
|
|
4
|
+
if (typeof value === 'string')
|
|
5
|
+
return value;
|
|
6
|
+
if (typeof value === 'number' || typeof value === 'boolean') {
|
|
7
|
+
return String(value);
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
return JSON.stringify(value);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return String(value);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const buildMessageSignature = (message) => {
|
|
17
|
+
const base = `${serializeValue(message.id)}|${serializeValue(message.sender)}`;
|
|
18
|
+
if (message.sender === 'command') {
|
|
19
|
+
return [
|
|
20
|
+
base,
|
|
21
|
+
serializeValue(message.status),
|
|
22
|
+
serializeValue(message.command),
|
|
23
|
+
serializeValue(message.output),
|
|
24
|
+
serializeValue(message.success),
|
|
25
|
+
serializeValue(message.failureReason),
|
|
26
|
+
serializeValue(message.toolName),
|
|
27
|
+
serializeValue(message.toolArgs),
|
|
28
|
+
serializeValue(message.isApprovalRejection),
|
|
29
|
+
serializeValue(message.hadApproval),
|
|
30
|
+
].join('|');
|
|
31
|
+
}
|
|
32
|
+
return `${base}|${serializeValue(message.text)}`;
|
|
33
|
+
};
|
|
34
|
+
export const areMessageListsEqual = (prev, next) => {
|
|
35
|
+
if (prev === next)
|
|
36
|
+
return true;
|
|
37
|
+
if (!prev || !next)
|
|
38
|
+
return false;
|
|
39
|
+
if (prev.length !== next.length)
|
|
40
|
+
return false;
|
|
41
|
+
for (let index = 0; index < prev.length; index += 1) {
|
|
42
|
+
const prevMessage = prev[index];
|
|
43
|
+
const nextMessage = next[index];
|
|
44
|
+
if (prevMessage === nextMessage)
|
|
45
|
+
continue;
|
|
46
|
+
if (buildMessageSignature(prevMessage) !== buildMessageSignature(nextMessage)) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=message-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-utils.js","sourceRoot":"","sources":["../../source/utils/message-utils.ts"],"names":[],"mappings":"AAeA,MAAM,cAAc,GAAG,CAAC,KAAc,EAAU,EAAE;IAC9C,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAAC,OAAoB,EAAU,EAAE;IAC3D,MAAM,IAAI,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,cAAc,CACxD,OAAO,CAAC,MAAM,CACjB,EAAE,CAAC;IAEJ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACH,IAAI;YACJ,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;YAC/B,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC;YAC/B,cAAc,CAAC,OAAO,CAAC,aAAa,CAAC;YACrC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC;YAChC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC;YAChC,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC;YAC3C,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC;SACtC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,GAAG,IAAI,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAChC,IAA+B,EAC/B,IAA+B,EACxB,EAAE;IACT,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAE9C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,WAAW,KAAK,WAAW;YAAE,SAAS;QAE1C,IAAI,qBAAqB,CAAC,WAAW,CAAC,KAAK,qBAAqB,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5E,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-utils.test.d.ts","sourceRoot":"","sources":["../../source/utils/message-utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { areMessageListsEqual } from './message-utils.js';
|
|
3
|
+
test('areMessageListsEqual returns true for same content with new array refs', t => {
|
|
4
|
+
const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
|
|
5
|
+
const messagesB = [{ id: 1, sender: 'bot', text: 'Hello' }];
|
|
6
|
+
t.true(areMessageListsEqual(messagesA, messagesB));
|
|
7
|
+
});
|
|
8
|
+
test('areMessageListsEqual returns false when text changes', t => {
|
|
9
|
+
const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
|
|
10
|
+
const messagesB = [{ id: 1, sender: 'bot', text: 'Hello!' }];
|
|
11
|
+
t.false(areMessageListsEqual(messagesA, messagesB));
|
|
12
|
+
});
|
|
13
|
+
test('areMessageListsEqual returns false when command output changes', t => {
|
|
14
|
+
const messagesA = [
|
|
15
|
+
{
|
|
16
|
+
id: 'cmd-1',
|
|
17
|
+
sender: 'command',
|
|
18
|
+
status: 'completed',
|
|
19
|
+
command: 'ls',
|
|
20
|
+
output: 'file-a',
|
|
21
|
+
success: true,
|
|
22
|
+
toolName: 'shell',
|
|
23
|
+
toolArgs: { command: 'ls' },
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
const messagesB = [
|
|
27
|
+
{
|
|
28
|
+
id: 'cmd-1',
|
|
29
|
+
sender: 'command',
|
|
30
|
+
status: 'completed',
|
|
31
|
+
command: 'ls',
|
|
32
|
+
output: 'file-a\nfile-b',
|
|
33
|
+
success: true,
|
|
34
|
+
toolName: 'shell',
|
|
35
|
+
toolArgs: { command: 'ls' },
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
t.false(areMessageListsEqual(messagesA, messagesB));
|
|
39
|
+
});
|
|
40
|
+
test('areMessageListsEqual returns false when length differs', t => {
|
|
41
|
+
const messagesA = [{ id: 1, sender: 'bot', text: 'Hello' }];
|
|
42
|
+
const messagesB = [
|
|
43
|
+
{ id: 1, sender: 'bot', text: 'Hello' },
|
|
44
|
+
{ id: 2, sender: 'bot', text: 'World' },
|
|
45
|
+
];
|
|
46
|
+
t.false(areMessageListsEqual(messagesA, messagesB));
|
|
47
|
+
});
|
|
48
|
+
//# sourceMappingURL=message-utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-utils.test.js","sourceRoot":"","sources":["../../source/utils/message-utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,EAAC,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAExD,IAAI,CAAC,wEAAwE,EAAE,CAAC,CAAC,EAAE;IAC/E,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAE1D,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACvD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,CAAC,CAAC,EAAE;IAC7D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;IAE3D,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gEAAgE,EAAE,CAAC,CAAC,EAAE;IACvE,MAAM,SAAS,GAAG;QACd;YACI,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;SAC5B;KACJ,CAAC;IACF,MAAM,SAAS,GAAG;QACd;YACI,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;SAC5B;KACJ,CAAC;IAEF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,CAAC,CAAC,EAAE;IAC/D,MAAM,SAAS,GAAG,CAAC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG;QACd,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC;QACrC,EAAC,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAC;KACxC,CAAC;IAEF,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC"}
|
|
@@ -4,19 +4,19 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { ConversationEvent } from '../services/conversation-events.js';
|
|
6
6
|
import type { ILoggingService } from '../services/service-interfaces.js';
|
|
7
|
-
import { createConversationEventHandler, type ConversationEventHandlerDeps } from './conversation-event-handler.js';
|
|
7
|
+
import { createConversationEventHandler, type ConversationEventHandlerDeps, type UIMessage } from './conversation-event-handler.js';
|
|
8
8
|
import { type StreamingState } from './conversation-utils.js';
|
|
9
9
|
import { createStreamingUpdateCoordinator } from './streaming-updater.js';
|
|
10
10
|
import type { NormalizedUsage } from './token-usage.js';
|
|
11
|
-
export interface StreamingSessionFactoryDeps {
|
|
12
|
-
appendMessages: ConversationEventHandlerDeps['appendMessages'];
|
|
13
|
-
setMessages: ConversationEventHandlerDeps['setMessages'];
|
|
14
|
-
setLiveResponse: ConversationEventHandlerDeps['setLiveResponse'];
|
|
15
|
-
trimMessages: ConversationEventHandlerDeps['trimMessages'];
|
|
16
|
-
annotateCommandMessage: ConversationEventHandlerDeps['annotateCommandMessage'];
|
|
11
|
+
export interface StreamingSessionFactoryDeps<MessageT extends UIMessage = UIMessage> {
|
|
12
|
+
appendMessages: ConversationEventHandlerDeps<MessageT>['appendMessages'];
|
|
13
|
+
setMessages: ConversationEventHandlerDeps<MessageT>['setMessages'];
|
|
14
|
+
setLiveResponse: ConversationEventHandlerDeps<MessageT>['setLiveResponse'];
|
|
15
|
+
trimMessages: ConversationEventHandlerDeps<MessageT>['trimMessages'];
|
|
16
|
+
annotateCommandMessage: ConversationEventHandlerDeps<MessageT>['annotateCommandMessage'];
|
|
17
17
|
loggingService: ILoggingService;
|
|
18
18
|
setLastUsage: (usage: NormalizedUsage) => void;
|
|
19
|
-
createLiveResponseUpdater: (liveMessageId: number) => ConversationEventHandlerDeps['liveResponseUpdater'];
|
|
19
|
+
createLiveResponseUpdater: (liveMessageId: number) => ConversationEventHandlerDeps<MessageT>['liveResponseUpdater'];
|
|
20
20
|
reasoningThrottleMs: number;
|
|
21
21
|
now?: () => number;
|
|
22
22
|
createStreamingState?: () => StreamingState;
|
|
@@ -29,5 +29,5 @@ export interface StreamingSession {
|
|
|
29
29
|
streamingState: StreamingState;
|
|
30
30
|
applyConversationEvent: (event: ConversationEvent) => void;
|
|
31
31
|
}
|
|
32
|
-
export declare function createStreamingSession(deps: StreamingSessionFactoryDeps
|
|
32
|
+
export declare function createStreamingSession<MessageT extends UIMessage = UIMessage>(deps: StreamingSessionFactoryDeps<MessageT>, label: string): StreamingSession;
|
|
33
33
|
//# sourceMappingURL=streaming-session-factory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming-session-factory.d.ts","sourceRoot":"","sources":["../../source/utils/streaming-session-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,
|
|
1
|
+
{"version":3,"file":"streaming-session-factory.d.ts","sourceRoot":"","sources":["../../source/utils/streaming-session-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EACL,8BAA8B,EAC9B,KAAK,4BAA4B,EACjC,KAAK,SAAS,EACf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,WAAW,2BAA2B,CAAC,QAAQ,SAAS,SAAS,GAAG,SAAS;IACjF,cAAc,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACzE,WAAW,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,CAAC;IACnE,eAAe,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,iBAAiB,CAAC,CAAC;IAC3E,YAAY,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,CAAC;IACrE,sBAAsB,EAAE,4BAA4B,CAAC,QAAQ,CAAC,CAAC,wBAAwB,CAAC,CAAC;IACzF,cAAc,EAAE,eAAe,CAAC;IAChC,YAAY,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,yBAAyB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,4BAA4B,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC;IACpH,mBAAmB,EAAE,MAAM,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,cAAc,CAAC;IAC5C,gCAAgC,CAAC,EAAE,OAAO,gCAAgC,CAAC;IAC3E,8BAA8B,CAAC,EAAE,OAAO,8BAA8B,CAAC;CACxE;AAED,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE,4BAA4B,CAAC,qBAAqB,CAAC,CAAC;IACzE,gBAAgB,EAAE,4BAA4B,CAAC,kBAAkB,CAAC,CAAC;IACnE,cAAc,EAAE,cAAc,CAAC;IAC/B,sBAAsB,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CAC5D;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,SAAS,SAAS,GAAG,SAAS,EAC3E,IAAI,EAAE,2BAA2B,CAAC,QAAQ,CAAC,EAC3C,KAAK,EAAE,MAAM,GACZ,gBAAgB,CA8ElB"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Factory for creating streaming session helpers.
|
|
3
3
|
* Extracted from use-conversation.ts to enable testing.
|
|
4
4
|
*/
|
|
5
|
-
import { createConversationEventHandler } from './conversation-event-handler.js';
|
|
5
|
+
import { createConversationEventHandler, } from './conversation-event-handler.js';
|
|
6
6
|
import { createStreamingState } from './conversation-utils.js';
|
|
7
7
|
import { createStreamingUpdateCoordinator } from './streaming-updater.js';
|
|
8
8
|
export function createStreamingSession(deps, label) {
|
|
@@ -54,7 +54,12 @@ export function createStreamingSession(deps, label) {
|
|
|
54
54
|
annotateCommandMessage: deps.annotateCommandMessage,
|
|
55
55
|
}, streamingState);
|
|
56
56
|
const applyConversationEvent = (event) => {
|
|
57
|
-
if (event.type === '
|
|
57
|
+
if (event.type === 'usage_update') {
|
|
58
|
+
// Emit usage updates in real-time during streaming
|
|
59
|
+
deps.loggingService.debug(`UI received streaming usage (${label})`, { usage: event.usage });
|
|
60
|
+
deps.setLastUsage(event.usage);
|
|
61
|
+
}
|
|
62
|
+
else if (event.type === 'final') {
|
|
58
63
|
if (event.usage) {
|
|
59
64
|
deps.loggingService.debug(`UI received final usage (${label})`, { usage: event.usage });
|
|
60
65
|
deps.setLastUsage(event.usage);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming-session-factory.js","sourceRoot":"","sources":["../../source/utils/streaming-session-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,
|
|
1
|
+
{"version":3,"file":"streaming-session-factory.js","sourceRoot":"","sources":["../../source/utils/streaming-session-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,8BAA8B,GAG/B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAuB,MAAM,yBAAyB,CAAC;AACpF,OAAO,EAAE,gCAAgC,EAAE,MAAM,wBAAwB,CAAC;AA0B1E,MAAM,UAAU,sBAAsB,CACpC,IAA2C,EAC3C,KAAa;IAEb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACjC,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,IAAI,oBAAoB,CAAC;IACtE,MAAM,iBAAiB,GAAG,IAAI,CAAC,gCAAgC,IAAI,gCAAgC,CAAC;IACpG,MAAM,kBAAkB,GAAG,IAAI,CAAC,8BAA8B,IAAI,8BAA8B,CAAC;IAEjG,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC;IAC5B,IAAI,CAAC,eAAe,CAAC;QACnB,EAAE,EAAE,aAAa;QACjB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,EAAE;KACT,CAAC,CAAC;IACH,MAAM,mBAAmB,GAAG,IAAI,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC;IAE1E,MAAM,cAAc,GAAG,WAAW,EAAE,CAAC;IAErC,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,CAAC,gBAAwB,EAAE,EAAE;QACtE,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,cAAc,CAAC,yBAAyB,KAAK,IAAI,EAAE,CAAC;gBACtD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,cAAc,CAAC,yBAAyB,CAAC,CAAC;gBAC3F,IAAI,KAAK,KAAK,CAAC,CAAC;oBAAE,OAAO,IAAI,CAAC;gBAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBACnC,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC;YACpB,cAAc,CAAC,yBAAyB,GAAG,KAAK,CAAC;YACjD,OAAO,IAAI,CAAC,YAAY,CAAC;gBACvB,GAAG,IAAI;gBACP;oBACE,EAAE,EAAE,KAAK;oBACT,MAAM,EAAE,WAAW;oBACnB,IAAI,EAAE,gBAAgB;iBACvB;aACuB,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAE7B,MAAM,gBAAgB,GAAG,kBAAkB,CACzC;QACE,mBAAmB;QACnB,gBAAgB;QAChB,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;KACpD,EACD,cAAc,CACf,CAAC;IAEF,MAAM,sBAAsB,GAAG,CAAC,KAAwB,EAAE,EAAE;QAC1D,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,mDAAmD;YACnD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,gCAAgC,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5F,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBAChB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,4BAA4B,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;gBACxF,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,gCAAgC,KAAK,GAAG,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QACD,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC;IAEF,OAAO;QACL,mBAAmB;QACnB,gBAAgB;QAChB,cAAc;QACd,sBAAsB;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synchronized Output wrapper for terminal rendering.
|
|
3
|
+
*
|
|
4
|
+
* Wraps stdout.write() calls with DEC Mode 2026 escape sequences
|
|
5
|
+
* (\x1b[?2026h to begin, \x1b[?2026l to end) so that terminal
|
|
6
|
+
* emulators which support it (iTerm2, WezTerm, foot, etc.) will
|
|
7
|
+
* buffer the entire update and render it as a single atomic frame.
|
|
8
|
+
*
|
|
9
|
+
* This eliminates the flickering that occurs in iTerm2 because Ink's
|
|
10
|
+
* incremental renderer issues multiple ANSI cursor-movement + erase
|
|
11
|
+
* sequences per render cycle; without synchronized output the terminal
|
|
12
|
+
* may render intermediate states (partially erased content) between
|
|
13
|
+
* individual write() calls.
|
|
14
|
+
*
|
|
15
|
+
* Terminals that do NOT support mode 2026 will silently ignore the
|
|
16
|
+
* escape sequences, so this is safe to enable unconditionally.
|
|
17
|
+
*
|
|
18
|
+
* Reference: https://gist.github.com/christianparpart/d8a62cc1ab659194571cd32e76cfd588
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Check if the terminal likely supports synchronized output.
|
|
22
|
+
* iTerm2, WezTerm, foot, and many modern terminals support it.
|
|
23
|
+
* We enable it broadly since unsupported terminals just ignore the sequences.
|
|
24
|
+
*/
|
|
25
|
+
export declare function isSynchronizedOutputSupported(): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Wraps a stdout write so the content is emitted inside a synchronized
|
|
28
|
+
* output block (DEC Mode 2026). The wrapper preserves the original
|
|
29
|
+
* `write()` signature and injects begin/end markers around each call.
|
|
30
|
+
*
|
|
31
|
+
* Usage:
|
|
32
|
+
* patchStdoutForSynchronizedOutput(process.stdout);
|
|
33
|
+
*/
|
|
34
|
+
export declare function patchStdoutForSynchronizedOutput(stream: NodeJS.WriteStream): void;
|
|
35
|
+
//# sourceMappingURL=synchronized-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synchronized-output.d.ts","sourceRoot":"","sources":["../../source/utils/synchronized-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH;;;;GAIG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAIvD;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,IAAI,CAgCjF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synchronized Output wrapper for terminal rendering.
|
|
3
|
+
*
|
|
4
|
+
* Wraps stdout.write() calls with DEC Mode 2026 escape sequences
|
|
5
|
+
* (\x1b[?2026h to begin, \x1b[?2026l to end) so that terminal
|
|
6
|
+
* emulators which support it (iTerm2, WezTerm, foot, etc.) will
|
|
7
|
+
* buffer the entire update and render it as a single atomic frame.
|
|
8
|
+
*
|
|
9
|
+
* This eliminates the flickering that occurs in iTerm2 because Ink's
|
|
10
|
+
* incremental renderer issues multiple ANSI cursor-movement + erase
|
|
11
|
+
* sequences per render cycle; without synchronized output the terminal
|
|
12
|
+
* may render intermediate states (partially erased content) between
|
|
13
|
+
* individual write() calls.
|
|
14
|
+
*
|
|
15
|
+
* Terminals that do NOT support mode 2026 will silently ignore the
|
|
16
|
+
* escape sequences, so this is safe to enable unconditionally.
|
|
17
|
+
*
|
|
18
|
+
* Reference: https://gist.github.com/christianparpart/d8a62cc1ab659194571cd32e76cfd588
|
|
19
|
+
*/
|
|
20
|
+
const SYNC_START = '\x1b[?2026h';
|
|
21
|
+
const SYNC_END = '\x1b[?2026l';
|
|
22
|
+
/**
|
|
23
|
+
* Check if the terminal likely supports synchronized output.
|
|
24
|
+
* iTerm2, WezTerm, foot, and many modern terminals support it.
|
|
25
|
+
* We enable it broadly since unsupported terminals just ignore the sequences.
|
|
26
|
+
*/
|
|
27
|
+
export function isSynchronizedOutputSupported() {
|
|
28
|
+
// Always return true — unsupported terminals silently ignore mode 2026.
|
|
29
|
+
// This keeps the logic simple and avoids false negatives.
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Wraps a stdout write so the content is emitted inside a synchronized
|
|
34
|
+
* output block (DEC Mode 2026). The wrapper preserves the original
|
|
35
|
+
* `write()` signature and injects begin/end markers around each call.
|
|
36
|
+
*
|
|
37
|
+
* Usage:
|
|
38
|
+
* patchStdoutForSynchronizedOutput(process.stdout);
|
|
39
|
+
*/
|
|
40
|
+
export function patchStdoutForSynchronizedOutput(stream) {
|
|
41
|
+
if (!isSynchronizedOutputSupported()) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const originalWrite = stream.write.bind(stream);
|
|
45
|
+
// Track nesting to avoid double-wrapping when Ink's own clear/write
|
|
46
|
+
// sequences trigger multiple write calls synchronously.
|
|
47
|
+
let syncing = false;
|
|
48
|
+
stream.write = function (chunk, encodingOrCallback, callback) {
|
|
49
|
+
// Avoid double-wrapping and only wrap string data (ANSI sequences).
|
|
50
|
+
// Binary data or nested calls pass through unchanged.
|
|
51
|
+
if (syncing || typeof chunk !== 'string') {
|
|
52
|
+
return originalWrite(chunk, encodingOrCallback, callback);
|
|
53
|
+
}
|
|
54
|
+
syncing = true;
|
|
55
|
+
try {
|
|
56
|
+
// Prefix the payload with the sync-start marker and suffix with
|
|
57
|
+
// sync-end, all in a single write to minimise I/O calls.
|
|
58
|
+
const wrapped = SYNC_START + chunk + SYNC_END;
|
|
59
|
+
return originalWrite(wrapped, encodingOrCallback, callback);
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
syncing = false;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=synchronized-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synchronized-output.js","sourceRoot":"","sources":["../../source/utils/synchronized-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,UAAU,GAAG,aAAa,CAAC;AACjC,MAAM,QAAQ,GAAG,aAAa,CAAC;AAE/B;;;;GAIG;AACH,MAAM,UAAU,6BAA6B;IAC3C,wEAAwE;IACxE,0DAA0D;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gCAAgC,CAAC,MAA0B;IACzE,IAAI,CAAC,6BAA6B,EAAE,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAwB,CAAC;IAEvE,oEAAoE;IACpE,wDAAwD;IACxD,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,MAAM,CAAC,KAAK,GAAG,UACb,KAAU,EACV,kBAAsE,EACtE,QAAyC;QAEzC,oEAAoE;QACpE,sDAAsD;QACtD,IAAI,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACzC,OAAO,aAAa,CAAC,KAAK,EAAE,kBAAyB,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC;YACH,gEAAgE;YAChE,yDAAyD;YACzD,MAAM,OAAO,GAAG,UAAU,GAAG,KAAK,GAAG,QAAQ,CAAC;YAC9C,OAAO,aAAa,CAAC,OAAO,EAAE,kBAAyB,EAAE,QAAQ,CAAC,CAAC;QACrE,CAAC;gBAAS,CAAC;YACT,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;IACH,CAAwB,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synchronized-output.test.d.ts","sourceRoot":"","sources":["../../source/utils/synchronized-output.test.ts"],"names":[],"mappings":""}
|