@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.
Files changed (146) hide show
  1. package/dist/cli.js +5 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/components/BottomArea.d.ts +1 -8
  4. package/dist/components/BottomArea.d.ts.map +1 -1
  5. package/dist/components/BottomArea.js.map +1 -1
  6. package/dist/components/InputBox.d.ts +6 -0
  7. package/dist/components/InputBox.d.ts.map +1 -1
  8. package/dist/components/InputBox.js +25 -3
  9. package/dist/components/InputBox.js.map +1 -1
  10. package/dist/components/InputBox.test.js +10 -1
  11. package/dist/components/InputBox.test.js.map +1 -1
  12. package/dist/contracts/conversation.d.ts +27 -0
  13. package/dist/contracts/conversation.d.ts.map +1 -0
  14. package/dist/contracts/conversation.js +2 -0
  15. package/dist/contracts/conversation.js.map +1 -0
  16. package/dist/hooks/use-conversation.d.ts +3 -14
  17. package/dist/hooks/use-conversation.d.ts.map +1 -1
  18. package/dist/hooks/use-conversation.js +15 -87
  19. package/dist/hooks/use-conversation.js.map +1 -1
  20. package/dist/lib/openai-agent-client.d.ts.map +1 -1
  21. package/dist/lib/openai-agent-client.js +2 -1
  22. package/dist/lib/openai-agent-client.js.map +1 -1
  23. package/dist/lib/openai-strict-tool-schema.d.ts +10 -0
  24. package/dist/lib/openai-strict-tool-schema.d.ts.map +1 -0
  25. package/dist/lib/openai-strict-tool-schema.js +39 -0
  26. package/dist/lib/openai-strict-tool-schema.js.map +1 -0
  27. package/dist/lib/openai-strict-tool-schema.test.d.ts +2 -0
  28. package/dist/lib/openai-strict-tool-schema.test.d.ts.map +1 -0
  29. package/dist/lib/openai-strict-tool-schema.test.js +26 -0
  30. package/dist/lib/openai-strict-tool-schema.test.js.map +1 -0
  31. package/dist/lib/tool-invoke.d.ts +13 -0
  32. package/dist/lib/tool-invoke.d.ts.map +1 -1
  33. package/dist/lib/tool-invoke.js +61 -3
  34. package/dist/lib/tool-invoke.js.map +1 -1
  35. package/dist/lib/tool-invoke.test.js +139 -1
  36. package/dist/lib/tool-invoke.test.js.map +1 -1
  37. package/dist/prompts/simple.md +4 -0
  38. package/dist/providers/openai-compatible/model.js +3 -3
  39. package/dist/providers/openai-compatible/model.js.map +1 -1
  40. package/dist/providers/openai-compatible/reasoning-content.test.js +70 -0
  41. package/dist/providers/openai-compatible/reasoning-content.test.js.map +1 -1
  42. package/dist/providers/openrouter/model.js +3 -3
  43. package/dist/providers/openrouter/model.js.map +1 -1
  44. package/dist/providers/openrouter/utils.d.ts +1 -0
  45. package/dist/providers/openrouter/utils.d.ts.map +1 -1
  46. package/dist/providers/openrouter/utils.js +3 -0
  47. package/dist/providers/openrouter/utils.js.map +1 -1
  48. package/dist/providers/openrouter.test.js +64 -0
  49. package/dist/providers/openrouter.test.js.map +1 -1
  50. package/dist/services/approval-presentation-policy.d.ts +17 -0
  51. package/dist/services/approval-presentation-policy.d.ts.map +1 -0
  52. package/dist/services/approval-presentation-policy.js +44 -0
  53. package/dist/services/approval-presentation-policy.js.map +1 -0
  54. package/dist/services/approval-presentation-policy.test.d.ts +2 -0
  55. package/dist/services/approval-presentation-policy.test.d.ts.map +1 -0
  56. package/dist/services/approval-presentation-policy.test.js +74 -0
  57. package/dist/services/approval-presentation-policy.test.js.map +1 -0
  58. package/dist/services/approval-state.d.ts +4 -4
  59. package/dist/services/approval-state.d.ts.map +1 -1
  60. package/dist/services/conversation-events.d.ts +12 -9
  61. package/dist/services/conversation-events.d.ts.map +1 -1
  62. package/dist/services/conversation-service.d.ts +7 -5
  63. package/dist/services/conversation-service.d.ts.map +1 -1
  64. package/dist/services/conversation-service.js +1 -1
  65. package/dist/services/conversation-service.js.map +1 -1
  66. package/dist/services/conversation-session.d.ts +4 -24
  67. package/dist/services/conversation-session.d.ts.map +1 -1
  68. package/dist/services/conversation-session.js +172 -229
  69. package/dist/services/conversation-session.js.map +1 -1
  70. package/dist/services/conversation-store.d.ts +6 -0
  71. package/dist/services/conversation-store.d.ts.map +1 -1
  72. package/dist/services/conversation-store.js +13 -0
  73. package/dist/services/conversation-store.js.map +1 -1
  74. package/dist/tools/ask-mentor.d.ts +1 -1
  75. package/dist/tools/ask-mentor.js +1 -1
  76. package/dist/tools/ask-mentor.js.map +1 -1
  77. package/dist/tools/ask-mentor.test.js +9 -3
  78. package/dist/tools/ask-mentor.test.js.map +1 -1
  79. package/dist/tools/find-files.d.ts +2 -2
  80. package/dist/tools/find-files.d.ts.map +1 -1
  81. package/dist/tools/find-files.js +2 -4
  82. package/dist/tools/find-files.js.map +1 -1
  83. package/dist/tools/find-files.test.js +7 -19
  84. package/dist/tools/find-files.test.js.map +1 -1
  85. package/dist/tools/grep.d.ts +1 -1
  86. package/dist/tools/grep.d.ts.map +1 -1
  87. package/dist/tools/grep.js +1 -5
  88. package/dist/tools/grep.js.map +1 -1
  89. package/dist/tools/read-file.d.ts +2 -2
  90. package/dist/tools/read-file.d.ts.map +1 -1
  91. package/dist/tools/read-file.js +2 -4
  92. package/dist/tools/read-file.js.map +1 -1
  93. package/dist/tools/read-file.test.js +22 -13
  94. package/dist/tools/read-file.test.js.map +1 -1
  95. package/dist/tools/search-replace.d.ts +1 -1
  96. package/dist/tools/search-replace.d.ts.map +1 -1
  97. package/dist/tools/search-replace.js +158 -1
  98. package/dist/tools/search-replace.js.map +1 -1
  99. package/dist/tools/search-replace.test.js +177 -0
  100. package/dist/tools/search-replace.test.js.map +1 -1
  101. package/dist/tools/search.d.ts +4 -4
  102. package/dist/tools/search.d.ts.map +1 -1
  103. package/dist/tools/search.js +5 -14
  104. package/dist/tools/search.js.map +1 -1
  105. package/dist/tools/shell.d.ts +2 -2
  106. package/dist/tools/shell.d.ts.map +1 -1
  107. package/dist/tools/shell.js +2 -4
  108. package/dist/tools/shell.js.map +1 -1
  109. package/dist/tools/tool-capabilities.d.ts +6 -0
  110. package/dist/tools/tool-capabilities.d.ts.map +1 -0
  111. package/dist/tools/tool-capabilities.js +17 -0
  112. package/dist/tools/tool-capabilities.js.map +1 -0
  113. package/dist/tools/tool-parameter-schema.test.d.ts +2 -0
  114. package/dist/tools/tool-parameter-schema.test.d.ts.map +1 -0
  115. package/dist/tools/tool-parameter-schema.test.js +88 -0
  116. package/dist/tools/tool-parameter-schema.test.js.map +1 -0
  117. package/dist/tools/types.d.ts +4 -2
  118. package/dist/tools/types.d.ts.map +1 -1
  119. package/dist/tools/utils.d.ts.map +1 -1
  120. package/dist/tools/utils.js +4 -1
  121. package/dist/tools/utils.js.map +1 -1
  122. package/dist/tools/utils.test.d.ts +2 -0
  123. package/dist/tools/utils.test.d.ts.map +1 -0
  124. package/dist/tools/utils.test.js +26 -0
  125. package/dist/tools/utils.test.js.map +1 -0
  126. package/dist/tools/web-fetch.d.ts +3 -3
  127. package/dist/tools/web-fetch.d.ts.map +1 -1
  128. package/dist/tools/web-fetch.js +3 -2
  129. package/dist/tools/web-fetch.js.map +1 -1
  130. package/dist/utils/conversation-event-handler.d.ts +16 -10
  131. package/dist/utils/conversation-event-handler.d.ts.map +1 -1
  132. package/dist/utils/conversation-event-handler.js +4 -0
  133. package/dist/utils/conversation-event-handler.js.map +1 -1
  134. package/dist/utils/streaming-session-factory.d.ts +9 -9
  135. package/dist/utils/streaming-session-factory.d.ts.map +1 -1
  136. package/dist/utils/streaming-session-factory.js +7 -2
  137. package/dist/utils/streaming-session-factory.js.map +1 -1
  138. package/dist/utils/synchronized-output.d.ts +35 -0
  139. package/dist/utils/synchronized-output.d.ts.map +1 -0
  140. package/dist/utils/synchronized-output.js +66 -0
  141. package/dist/utils/synchronized-output.js.map +1 -0
  142. package/dist/utils/synchronized-output.test.d.ts +2 -0
  143. package/dist/utils/synchronized-output.test.d.ts.map +1 -0
  144. package/dist/utils/synchronized-output.test.js +70 -0
  145. package/dist/utils/synchronized-output.test.js.map +1 -0
  146. package/package.json +1 -1
@@ -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?: any;
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: any, index: number, toolCallArgumentsById: Map<string, unknown>) => CommandMessage[];
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;AAErC,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,GAAG,CAAC;IACf,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,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,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,qBAAqB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,cAAc,EAAE,CAAC;CACnH"}
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":"AACA,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,CAoBR;AAED;;;;GAIG;AACH,eAAO,MAAM,aAAa,6BAAoB,CAAC"}
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"}
@@ -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
- const resolved = path.isAbsolute(relativePath) ? path.normalize(relativePath) : path.resolve(baseDir, relativePath);
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
  }
@@ -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;IACtE,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"}
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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -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.ZodDefault<z.ZodNullable<z.ZodString>>;
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;;;;;iBAiBlB,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"}
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"}
@@ -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
- .nullable()
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":"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"}
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
- * Dependencies injected into the event handler factory.
23
- * Uses `any` for React setState compatibility - internal utility.
24
- */
25
- export interface ConversationEventHandlerDeps<CommandMessageT extends CommandMessage = CommandMessage> {
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: any[]) => void;
37
- setMessages: (updater: (prev: any[]) => any[]) => void;
38
- setLiveResponse: (response: any) => void;
39
- trimMessages: (messages: any[]) => any[];
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;;;GAGG;AACH,MAAM,WAAW,4BAA4B,CAAC,eAAe,SAAS,cAAc,GAAG,cAAc;IACnG,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,GAAG,EAAE,KAAK,IAAI,CAAC;IAC1C,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC;IACvD,eAAe,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC;IACzC,YAAY,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,GAAG,EAAE,CAAC;IACzC,sBAAsB,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,eAAe,CAAC;CACnE;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAAC,eAAe,SAAS,cAAc,GAAG,cAAc,EACpG,IAAI,EAAE,4BAA4B,CAAC,eAAe,CAAC,EACnD,KAAK,EAAE,cAAc,GACpB,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CA6IpC"}
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;AAuCrG;;;;;;;GAOG;AACH,MAAM,UAAU,8BAA8B,CAC5C,IAAmD,EACnD,KAAqB;IAErB,MAAM,EACJ,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,eAAe,EACf,YAAY,EACZ,sBAAsB,GACvB,GAAG,IAAI,CAAC;IAET,OAAO,CAAC,KAAwB,EAAE,EAAE;QAClC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,KAAK,CAAC;gBACrC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBAChD,OAAO;YACT,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,iBAAiB,GAAG,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;gBAC/C,0DAA0D;gBAC1D,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;gBAC/E,KAAK,CAAC,wBAAwB,GAAG,gBAAgB,CAAC;gBAElD,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE;oBAAE,OAAO;gBACrC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YAED,KAAK,cAAc,CAAC,CAAC,CAAC;gBACpB,wBAAwB;gBACxB,IAAI,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1C,gBAAgB,CAAC,KAAK,EAAE,CAAC;oBACzB,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC;oBACtE,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC;oBACpC,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC;gBACzC,CAAC;gBAED,0DAA0D;gBAC1D,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;oBACjC,MAAM,WAAW,GAAe;wBAC9B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;wBAClB,MAAM,EAAE,KAAK;wBACb,IAAI,EAAE,KAAK,CAAC,eAAe;qBAC5B,CAAC;oBACF,cAAc,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;oBAC9B,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;oBAC3B,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC5B,mBAAmB,CAAC,MAAM,EAAE,CAAC;oBAC7B,eAAe,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;gBAED,4DAA4D;gBAC5D,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;gBAE3D,kEAAkE;gBAClE,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAA+B,CAAC,CAAC;gBAE7E,MAAM,cAAc,GAAmB;oBACrC,EAAE,EAAE,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;oBACpC,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,SAAS;oBACjB,OAAO;oBACP,MAAM,EAAE,EAAE;oBACV,MAAM,EAAE,UAAU;oBAClB,QAAQ;oBACR,QAAQ,EAAE,IAAI;iBACf,CAAC;gBAEF,cAAc,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;gBACjC,OAAO;YACT,CAAC;YAED,KAAK,iBAAiB,CAAC,CAAC,CAAC;gBACvB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC7B,MAAM,SAAS,GAAG,sBAAsB,CAAC,MAAyB,CAAC,CAAC;gBAEpE,MAAM,aAAa,GAAiB,EAAE,CAAC;gBAEvC,wBAAwB;gBACxB,IAAI,KAAK,CAAC,wBAAwB,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1C,gBAAgB,CAAC,KAAK,EAAE,CAAC;oBACzB,KAAK,CAAC,sBAAsB,IAAI,KAAK,CAAC,wBAAwB,CAAC,MAAM,CAAC;oBACtE,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC;oBACpC,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC;gBACzC,CAAC;gBAED,2DAA2D;gBAC3D,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC;oBACjC,MAAM,WAAW,GAAe;wBAC9B,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC;wBAClB,MAAM,EAAE,KAAK;wBACb,IAAI,EAAE,KAAK,CAAC,eAAe;qBAC5B,CAAC;oBACF,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;oBAChC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;oBAC3B,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC9B,CAAC;gBAED,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,cAAc,CAAC,aAAa,CAAC,CAAC;oBAC9B,mBAAmB,CAAC,MAAM,EAAE,CAAC;oBAC7B,eAAe,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;gBAED,sEAAsE;gBACtE,WAAW,CAAC,CAAC,IAAW,EAAE,EAAE;oBAC1B,MAAM,YAAY,GAAG,SAAS,CAAC,MAAM;wBACnC,CAAC,CAAC,IAAI,CAAC,SAAS,CACZ,CAAC,GAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,CACtG;wBACH,CAAC,CAAC,CAAC,CAAC,CAAC;oBAEP,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;wBACxB,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;wBACvB,IAAI,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;wBAC/B,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;oBAC5B,CAAC;oBAED,OAAO,YAAY,CAAC,CAAC,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,aAAa,GAAkB;oBACnC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;oBACd,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,gCAAgC,KAAK,CAAC,QAAQ,2BAA2B,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,UAAU,GAAG;iBACpH,CAAC;gBACF,WAAW,CAAC,CAAC,IAAW,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC;gBACvD,OAAO;YACT,CAAC;YAED;gBACE,4EAA4E;gBAC5E,OAAO;QACX,CAAC;IACH,CAAC,CAAC;AACJ,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, label: string): StreamingSession;
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,EAAE,8BAA8B,EAAE,KAAK,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AACpH,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;IAC1C,cAAc,EAAE,4BAA4B,CAAC,gBAAgB,CAAC,CAAC;IAC/D,WAAW,EAAE,4BAA4B,CAAC,aAAa,CAAC,CAAC;IACzD,eAAe,EAAE,4BAA4B,CAAC,iBAAiB,CAAC,CAAC;IACjE,YAAY,EAAE,4BAA4B,CAAC,cAAc,CAAC,CAAC;IAC3D,sBAAsB,EAAE,4BAA4B,CAAC,wBAAwB,CAAC,CAAC;IAC/E,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,qBAAqB,CAAC,CAAC;IAC1G,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,IAAI,EAAE,2BAA2B,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CA0EzG"}
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 === 'final') {
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":"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"}
1
+ {"version":3,"file":"streaming-session-factory.js","sourceRoot":"","sources":["../../source/utils/streaming-session-factory.ts"],"names":[],"mappings":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=synchronized-output.test.d.ts.map
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qduc/term2",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "A terminal-based AI assistant that can help you get things done on your computer",
5
5
  "license": "MIT",
6
6
  "author": "qduc",