@qduc/term2 0.1.6 → 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/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/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/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/lib/openai-agent-client.d.ts.map +1 -1
- package/dist/lib/openai-agent-client.js +2 -1
- package/dist/lib/openai-agent-client.js.map +1 -1
- package/dist/lib/openai-strict-tool-schema.d.ts +10 -0
- package/dist/lib/openai-strict-tool-schema.d.ts.map +1 -0
- package/dist/lib/openai-strict-tool-schema.js +39 -0
- package/dist/lib/openai-strict-tool-schema.js.map +1 -0
- package/dist/lib/openai-strict-tool-schema.test.d.ts +2 -0
- package/dist/lib/openai-strict-tool-schema.test.d.ts.map +1 -0
- package/dist/lib/openai-strict-tool-schema.test.js +26 -0
- package/dist/lib/openai-strict-tool-schema.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/simple.md +4 -0
- package/dist/providers/openai-compatible/model.js +3 -3
- package/dist/providers/openai-compatible/model.js.map +1 -1
- package/dist/providers/openai-compatible/reasoning-content.test.js +70 -0
- package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
- package/dist/providers/openrouter/model.js +3 -3
- package/dist/providers/openrouter/model.js.map +1 -1
- package/dist/providers/openrouter/utils.d.ts +1 -0
- package/dist/providers/openrouter/utils.d.ts.map +1 -1
- package/dist/providers/openrouter/utils.js +3 -0
- package/dist/providers/openrouter/utils.js.map +1 -1
- package/dist/providers/openrouter.test.js +64 -0
- package/dist/providers/openrouter.test.js.map +1 -1
- 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-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-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-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/tools/ask-mentor.d.ts +1 -1
- package/dist/tools/ask-mentor.js +1 -1
- package/dist/tools/ask-mentor.js.map +1 -1
- package/dist/tools/ask-mentor.test.js +9 -3
- package/dist/tools/ask-mentor.test.js.map +1 -1
- package/dist/tools/find-files.d.ts +2 -2
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +2 -4
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/find-files.test.js +7 -19
- package/dist/tools/find-files.test.js.map +1 -1
- package/dist/tools/grep.d.ts +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +1 -5
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/read-file.d.ts +2 -2
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +2 -4
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/read-file.test.js +22 -13
- package/dist/tools/read-file.test.js.map +1 -1
- package/dist/tools/search-replace.d.ts +1 -1
- package/dist/tools/search-replace.d.ts.map +1 -1
- package/dist/tools/search-replace.js +158 -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/search.d.ts +4 -4
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +5 -14
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/shell.d.ts +2 -2
- package/dist/tools/shell.d.ts.map +1 -1
- package/dist/tools/shell.js +2 -4
- package/dist/tools/shell.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/tool-parameter-schema.test.d.ts +2 -0
- package/dist/tools/tool-parameter-schema.test.d.ts.map +1 -0
- package/dist/tools/tool-parameter-schema.test.js +88 -0
- package/dist/tools/tool-parameter-schema.test.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/tools/web-fetch.d.ts +3 -3
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +3 -2
- package/dist/tools/web-fetch.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/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/tools/types.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ZodObject } from 'zod';
|
|
2
|
+
import type { ApprovalPresentationCapability } from './tool-capabilities.js';
|
|
2
3
|
export interface CommandMessage {
|
|
3
4
|
id: string;
|
|
4
5
|
sender: 'command';
|
|
@@ -9,13 +10,14 @@ export interface CommandMessage {
|
|
|
9
10
|
failureReason?: string;
|
|
10
11
|
isApprovalRejection?: boolean;
|
|
11
12
|
toolName?: string;
|
|
12
|
-
toolArgs?:
|
|
13
|
+
toolArgs?: unknown;
|
|
13
14
|
callId?: string;
|
|
14
15
|
}
|
|
15
16
|
export interface ToolDefinition<Params = any> {
|
|
16
17
|
name: string;
|
|
17
18
|
description: string;
|
|
18
19
|
parameters: ZodObject<any, any>;
|
|
20
|
+
approvalPresentation?: ApprovalPresentationCapability;
|
|
19
21
|
needsApproval: (params: Params, context?: unknown) => Promise<boolean> | boolean;
|
|
20
22
|
execute: (params: Params, context?: unknown) => Promise<any> | any;
|
|
21
23
|
/**
|
|
@@ -25,6 +27,6 @@ export interface ToolDefinition<Params = any> {
|
|
|
25
27
|
* @param toolCallArgumentsById - Map of call IDs to their arguments for fallback lookup
|
|
26
28
|
* @returns Array of CommandMessage objects to display to the user
|
|
27
29
|
*/
|
|
28
|
-
formatCommandMessage: (item:
|
|
30
|
+
formatCommandMessage: (item: unknown, index: number, toolCallArgumentsById: Map<string, unknown>) => CommandMessage[];
|
|
29
31
|
}
|
|
30
32
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../source/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../source/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAE7E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc,CAAC,MAAM,GAAG,GAAG;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChC,oBAAoB,CAAC,EAAE,8BAA8B,CAAC;IACtD,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACjF,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACnE;;;;;;OAMG;IACH,oBAAoB,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,cAAc,EAAE,CAAC;CACvH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../source/tools/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../source/tools/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,MAAsB,EAC/B,OAAO,CAAC,EAAE;IACR;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,GACA,MAAM,CAwBR;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,6BAAoB,CAAC"}
|
package/dist/tools/utils.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
|
+
import { homedir } from 'os';
|
|
2
3
|
import { z } from 'zod';
|
|
3
4
|
/**
|
|
4
5
|
* Resolves a relative path and ensures it's within the workspace
|
|
5
6
|
*/
|
|
6
7
|
export function resolveWorkspacePath(relativePath, baseDir = process.cwd(), options) {
|
|
7
8
|
const allowOutsideWorkspace = options?.allowOutsideWorkspace ?? false;
|
|
8
|
-
|
|
9
|
+
// Expand ~ if the path starts with it
|
|
10
|
+
const expandedPath = relativePath.startsWith('~') ? relativePath.replace(/^~/, homedir()) : relativePath;
|
|
11
|
+
const resolved = path.isAbsolute(expandedPath) ? path.normalize(expandedPath) : path.resolve(baseDir, expandedPath);
|
|
9
12
|
if (allowOutsideWorkspace) {
|
|
10
13
|
return resolved;
|
|
11
14
|
}
|
package/dist/tools/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../source/tools/utils.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAoB,EACpB,UAAkB,OAAO,CAAC,GAAG,EAAE,EAC/B,OAMC;IAED,MAAM,qBAAqB,GAAG,OAAO,EAAE,qBAAqB,IAAI,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../source/tools/utils.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,YAAoB,EACpB,UAAkB,OAAO,CAAC,GAAG,EAAE,EAC/B,OAMC;IAED,MAAM,qBAAqB,GAAG,OAAO,EAAE,qBAAqB,IAAI,KAAK,CAAC;IAEtE,sCAAsC;IACtC,MAAM,YAAY,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IAEzG,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAEpH,IAAI,qBAAqB,EAAE,CAAC;QAC1B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAElD,kHAAkH;IAClH,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3G,MAAM,QAAQ,GAAG,kBAAkB,KAAK,iBAAiB,IAAI,kBAAkB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAEvG,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../source/tools/utils.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { resolveWorkspacePath } from './utils.js';
|
|
5
|
+
test('resolveWorkspacePath: expands ~ to home directory', (t) => {
|
|
6
|
+
const home = homedir();
|
|
7
|
+
const workspace = '/Users/test/workspace';
|
|
8
|
+
// Test ~/ expansion
|
|
9
|
+
const resolved = resolveWorkspacePath('~/documents/file.txt', workspace, { allowOutsideWorkspace: true });
|
|
10
|
+
t.is(resolved, path.join(home, 'documents', 'file.txt'));
|
|
11
|
+
// Test ~ expansion
|
|
12
|
+
const resolvedHome = resolveWorkspacePath('~', workspace, { allowOutsideWorkspace: true });
|
|
13
|
+
t.is(resolvedHome, home);
|
|
14
|
+
});
|
|
15
|
+
test('resolveWorkspacePath: throws if ~ expanded path is outside workspace and not allowed', (t) => {
|
|
16
|
+
const workspace = '/tmp/workspace';
|
|
17
|
+
t.throws(() => {
|
|
18
|
+
resolveWorkspacePath('~/somefile', workspace, { allowOutsideWorkspace: false });
|
|
19
|
+
}, { message: /Operation outside workspace/ });
|
|
20
|
+
});
|
|
21
|
+
test('resolveWorkspacePath: handles regular relative paths', (t) => {
|
|
22
|
+
const workspace = '/tmp/workspace';
|
|
23
|
+
const resolved = resolveWorkspacePath('src/main.ts', workspace);
|
|
24
|
+
t.is(resolved, path.join(workspace, 'src/main.ts'));
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=utils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../source/tools/utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,KAAK,CAAC;AACvB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD,IAAI,CAAC,mDAAmD,EAAE,CAAC,CAAC,EAAE,EAAE;IAC9D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,uBAAuB,CAAC;IAE1C,oBAAoB;IACpB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,sBAAsB,EAAE,SAAS,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1G,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IAEzD,mBAAmB;IACnB,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,qBAAqB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3F,CAAC,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sFAAsF,EAAE,CAAC,CAAC,EAAE,EAAE;IACjG,MAAM,SAAS,GAAG,gBAAgB,CAAC;IAEnC,CAAC,CAAC,MAAM,CACN,GAAG,EAAE;QACH,oBAAoB,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE,qBAAqB,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,CAAC,EACD,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAC3C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sDAAsD,EAAE,CAAC,CAAC,EAAE,EAAE;IACjE,MAAM,SAAS,GAAG,gBAAgB,CAAC;IACnC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAChE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC"}
|
|
@@ -3,9 +3,9 @@ import type { ToolDefinition, CommandMessage } from './types.js';
|
|
|
3
3
|
import type { ISettingsService, ILoggingService } from '../services/service-interfaces.js';
|
|
4
4
|
declare const webFetchSchema: z.ZodObject<{
|
|
5
5
|
url: z.ZodString;
|
|
6
|
-
max_chars: z.ZodDefault<z.ZodNumber
|
|
7
|
-
heading: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]
|
|
8
|
-
continuation_token: z.
|
|
6
|
+
max_chars: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
7
|
+
heading: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>>;
|
|
8
|
+
continuation_token: z.ZodOptional<z.ZodString>;
|
|
9
9
|
}, z.core.$strip>;
|
|
10
10
|
export type WebFetchParams = z.infer<typeof webFetchSchema>;
|
|
11
11
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../source/tools/web-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAK3F,QAAA,MAAM,cAAc;;;;;
|
|
1
|
+
{"version":3,"file":"web-fetch.d.ts","sourceRoot":"","sources":["../../source/tools/web-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAK3F,QAAA,MAAM,cAAc;;;;;iBAkBlB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,4BAA4B,GACvC,MAAM,GAAG,EACT,OAAO,MAAM,EACb,uBAAuB,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1C,cAAc,EAoBhB,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,MAAM;IACjD,eAAe,EAAE,gBAAgB,CAAC;IAClC,cAAc,EAAE,eAAe,CAAC;CACjC,KAAG,cAAc,CAAC,OAAO,CAAC,cAAc,CAAC,CAyCzC,CAAC"}
|
package/dist/tools/web-fetch.js
CHANGED
|
@@ -9,16 +9,17 @@ const webFetchSchema = z.object({
|
|
|
9
9
|
.number()
|
|
10
10
|
.min(200)
|
|
11
11
|
.max(MAX_CHARS_LIMIT)
|
|
12
|
+
.optional()
|
|
12
13
|
.default(DEFAULT_MAX_CHARS)
|
|
13
14
|
.describe(`Maximum number of characters to return (default: ${DEFAULT_MAX_CHARS}).`),
|
|
14
15
|
heading: z
|
|
15
16
|
.array(z.union([z.string(), z.number()]))
|
|
17
|
+
.optional()
|
|
16
18
|
.default([])
|
|
17
19
|
.describe('Optional: Array of headings (h1-h3) to retrieve content from.'),
|
|
18
20
|
continuation_token: z
|
|
19
21
|
.string()
|
|
20
|
-
.
|
|
21
|
-
.default(null)
|
|
22
|
+
.optional()
|
|
22
23
|
.describe('Optional: Token from previous response to fetch the next chunk of content.'),
|
|
23
24
|
});
|
|
24
25
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../source/tools/web-fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGlH,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;IAC7D,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,GAAG,CAAC;SACR,GAAG,CAAC,eAAe,CAAC;SACpB,OAAO,CAAC,iBAAiB,CAAC;SAC1B,QAAQ,CAAC,oDAAoD,iBAAiB,IAAI,CAAC;IACtF,OAAO,EAAE,CAAC;SACP,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;SACxC,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,+DAA+D,CAAC;IAC5E,kBAAkB,EAAE,CAAC;SAClB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../source/tools/web-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|
|
@@ -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":""}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { patchStdoutForSynchronizedOutput, isSynchronizedOutputSupported } from './synchronized-output.js';
|
|
3
|
+
import { Writable } from 'stream';
|
|
4
|
+
test('isSynchronizedOutputSupported returns true', (t) => {
|
|
5
|
+
t.true(isSynchronizedOutputSupported());
|
|
6
|
+
});
|
|
7
|
+
test('patchStdoutForSynchronizedOutput wraps string writes with sync markers', (t) => {
|
|
8
|
+
const chunks = [];
|
|
9
|
+
const fakeStream = new Writable({
|
|
10
|
+
write(chunk, _encoding, callback) {
|
|
11
|
+
chunks.push(chunk.toString());
|
|
12
|
+
callback();
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
// Add columns property to mimic a WriteStream
|
|
16
|
+
fakeStream.columns = 80;
|
|
17
|
+
patchStdoutForSynchronizedOutput(fakeStream);
|
|
18
|
+
fakeStream.write('hello');
|
|
19
|
+
t.is(chunks.length, 1);
|
|
20
|
+
t.is(chunks[0], '\x1b[?2026hhello\x1b[?2026l');
|
|
21
|
+
});
|
|
22
|
+
test('patchStdoutForSynchronizedOutput passes through non-string writes', (t) => {
|
|
23
|
+
const chunks = [];
|
|
24
|
+
const fakeStream = new Writable({
|
|
25
|
+
write(chunk, _encoding, callback) {
|
|
26
|
+
chunks.push(Buffer.from(chunk));
|
|
27
|
+
callback();
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
fakeStream.columns = 80;
|
|
31
|
+
patchStdoutForSynchronizedOutput(fakeStream);
|
|
32
|
+
const buf = Buffer.from([0x01, 0x02, 0x03]);
|
|
33
|
+
fakeStream.write(buf);
|
|
34
|
+
t.is(chunks.length, 1);
|
|
35
|
+
// Buffer writes should NOT be wrapped with sync markers
|
|
36
|
+
t.deepEqual(chunks[0], buf);
|
|
37
|
+
});
|
|
38
|
+
test('patchStdoutForSynchronizedOutput handles nested writes without double-wrapping', (t) => {
|
|
39
|
+
const chunks = [];
|
|
40
|
+
let writeImpl;
|
|
41
|
+
const fakeStream = {
|
|
42
|
+
columns: 80,
|
|
43
|
+
write(chunk, encoding, callback) {
|
|
44
|
+
return writeImpl(chunk, encoding, callback);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
writeImpl = (chunk, _encoding, _callback) => {
|
|
48
|
+
chunks.push(typeof chunk === 'string' ? chunk : chunk.toString());
|
|
49
|
+
return true;
|
|
50
|
+
};
|
|
51
|
+
patchStdoutForSynchronizedOutput(fakeStream);
|
|
52
|
+
// Save the patched write
|
|
53
|
+
const patchedWrite = fakeStream.write;
|
|
54
|
+
// Simulate a nested write (e.g., Ink calling clear then write in sequence)
|
|
55
|
+
writeImpl = (chunk, _encoding, _callback) => {
|
|
56
|
+
chunks.push(typeof chunk === 'string' ? chunk : chunk.toString());
|
|
57
|
+
// Simulate a nested write during the original write
|
|
58
|
+
if (chunks.length === 1) {
|
|
59
|
+
patchedWrite.call(fakeStream, 'nested');
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
};
|
|
63
|
+
fakeStream.write('outer');
|
|
64
|
+
// The outer write should be wrapped, and the nested write should also be
|
|
65
|
+
// handled (not double-wrapped since syncing flag is set)
|
|
66
|
+
t.true(chunks.some((c) => c.includes('\x1b[?2026h')));
|
|
67
|
+
// Nested call should NOT contain sync markers (double-wrapping prevented)
|
|
68
|
+
t.is(chunks[1], 'nested');
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=synchronized-output.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synchronized-output.test.js","sourceRoot":"","sources":["../../source/utils/synchronized-output.test.ts"],"names":[],"mappings":"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"}
|