@markusylisiurunen/tau 0.2.129 → 0.3.1

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 (208) hide show
  1. package/README.md +111 -59
  2. package/dist/core/async/cli.js +12 -2
  3. package/dist/core/async/cli.js.map +1 -1
  4. package/dist/core/async/http_protocol.js +7 -1
  5. package/dist/core/async/http_protocol.js.map +1 -1
  6. package/dist/core/async/http_server.js +9 -1
  7. package/dist/core/async/http_server.js.map +1 -1
  8. package/dist/core/async/index.js.map +1 -1
  9. package/dist/core/async/session_manager.js +94 -51
  10. package/dist/core/async/session_manager.js.map +1 -1
  11. package/dist/core/cli.js +12 -15
  12. package/dist/core/cli.js.map +1 -1
  13. package/dist/core/commands/registry.js +9 -55
  14. package/dist/core/commands/registry.js.map +1 -1
  15. package/dist/core/config/index.js.map +1 -1
  16. package/dist/core/config/runtime.js +0 -1
  17. package/dist/core/config/runtime.js.map +1 -1
  18. package/dist/core/config/schema.js +102 -17
  19. package/dist/core/config/schema.js.map +1 -1
  20. package/dist/core/debug.js +1 -20
  21. package/dist/core/debug.js.map +1 -1
  22. package/dist/core/diff_review/{session.js → bridge.js} +57 -114
  23. package/dist/core/diff_review/bridge.js.map +1 -0
  24. package/dist/core/diff_review/index.js +2 -3
  25. package/dist/core/diff_review/index.js.map +1 -1
  26. package/dist/core/diff_review/review_thread.js +48 -23
  27. package/dist/core/diff_review/review_thread.js.map +1 -1
  28. package/dist/core/diff_review/snapshot.js +40 -11
  29. package/dist/core/diff_review/snapshot.js.map +1 -1
  30. package/dist/core/events/parser.js +43 -12
  31. package/dist/core/events/parser.js.map +1 -1
  32. package/dist/core/index.js +0 -1
  33. package/dist/core/index.js.map +1 -1
  34. package/dist/core/modes/index.js +1 -2
  35. package/dist/core/modes/index.js.map +1 -1
  36. package/dist/core/modes/rpc_server.js +15 -321
  37. package/dist/core/modes/rpc_server.js.map +1 -1
  38. package/dist/core/modes/websocket_server.js +181 -0
  39. package/dist/core/modes/websocket_server.js.map +1 -0
  40. package/dist/core/personas.js +11 -1
  41. package/dist/core/personas.js.map +1 -1
  42. package/dist/core/runtime/chat_runtime.js +19 -12
  43. package/dist/core/runtime/chat_runtime.js.map +1 -1
  44. package/dist/core/runtime/conversation_turn_runtime.js +16 -1
  45. package/dist/core/runtime/conversation_turn_runtime.js.map +1 -1
  46. package/dist/core/runtime/runtime_bootstrap.js +326 -0
  47. package/dist/core/runtime/runtime_bootstrap.js.map +1 -1
  48. package/dist/core/session/compaction.js +13 -11
  49. package/dist/core/session/compaction.js.map +1 -1
  50. package/dist/core/session/core_session.js +9 -0
  51. package/dist/core/session/core_session.js.map +1 -1
  52. package/dist/core/session/direct_bash.js +34 -0
  53. package/dist/core/session/direct_bash.js.map +1 -0
  54. package/dist/core/session/pruning.js +595 -0
  55. package/dist/core/session/pruning.js.map +1 -0
  56. package/dist/core/session/runner.js +45 -5
  57. package/dist/core/session/runner.js.map +1 -1
  58. package/dist/core/session/session_engine.js +84 -10
  59. package/dist/core/session/session_engine.js.map +1 -1
  60. package/dist/core/static/prompts/diff-review-wrapper.md +1 -1
  61. package/dist/core/subagents/subagent_engine.js +1 -1
  62. package/dist/core/subagents/subagent_engine.js.map +1 -1
  63. package/dist/core/tools/catalog.js.map +1 -1
  64. package/dist/core/tools/diff_review.js +12 -12
  65. package/dist/core/tools/diff_review.js.map +1 -1
  66. package/dist/core/tools/execution_backend.js +9 -2
  67. package/dist/core/tools/execution_backend.js.map +1 -1
  68. package/dist/core/tools/registry.js.map +1 -1
  69. package/dist/core/usage/logs.js.map +1 -1
  70. package/dist/core/utils/context.js +1 -1
  71. package/dist/core/utils/context.js.map +1 -1
  72. package/dist/core/utils/context_builder.js +1 -18
  73. package/dist/core/utils/context_builder.js.map +1 -1
  74. package/dist/core/utils/gemini_speech.js +1 -1
  75. package/dist/core/utils/gemini_speech.js.map +1 -1
  76. package/dist/core/utils/project_files.js +11 -16
  77. package/dist/core/utils/project_files.js.map +1 -1
  78. package/dist/core/utils/spawn_capture.js +2 -2
  79. package/dist/core/utils/spawn_capture.js.map +1 -1
  80. package/dist/core/version.js +1 -1
  81. package/dist/core/version.js.map +1 -1
  82. package/dist/execution/cloudflare_sandbox_execution_environment.js +400 -0
  83. package/dist/execution/cloudflare_sandbox_execution_environment.js.map +1 -0
  84. package/dist/execution/execution_environment.js +24 -0
  85. package/dist/execution/execution_environment.js.map +1 -0
  86. package/dist/execution/fly_sprite_execution_environment.js +559 -0
  87. package/dist/execution/fly_sprite_execution_environment.js.map +1 -0
  88. package/dist/execution/local_execution_environment.js +93 -0
  89. package/dist/execution/local_execution_environment.js.map +1 -0
  90. package/dist/execution/runtime_config_snapshot.js +209 -0
  91. package/dist/execution/runtime_config_snapshot.js.map +1 -0
  92. package/dist/execution/sandbox_tool_helpers.js +55 -0
  93. package/dist/execution/sandbox_tool_helpers.js.map +1 -0
  94. package/dist/execution/tool_backend_execution_environment.js +55 -0
  95. package/dist/execution/tool_backend_execution_environment.js.map +1 -0
  96. package/dist/host/hosted_ephemeral_agent_session.js +286 -0
  97. package/dist/host/hosted_ephemeral_agent_session.js.map +1 -0
  98. package/dist/host/index.js +3 -0
  99. package/dist/host/index.js.map +1 -0
  100. package/dist/host/local_session_host.js +1464 -0
  101. package/dist/host/local_session_host.js.map +1 -0
  102. package/dist/host/session_host.js +2 -0
  103. package/dist/host/session_host.js.map +1 -0
  104. package/dist/host/session_protocol_handler.js +873 -0
  105. package/dist/host/session_protocol_handler.js.map +1 -0
  106. package/dist/main.js +537 -77
  107. package/dist/main.js.map +1 -1
  108. package/dist/protocol/index.d.ts +2 -0
  109. package/dist/protocol/index.js +2 -0
  110. package/dist/protocol/index.js.map +1 -0
  111. package/dist/protocol/session_protocol.d.ts +691 -0
  112. package/dist/protocol/session_protocol.js +2117 -0
  113. package/dist/protocol/session_protocol.js.map +1 -0
  114. package/dist/sdk/client.d.ts +2 -1
  115. package/dist/sdk/client.js +136 -392
  116. package/dist/sdk/client.js.map +1 -1
  117. package/dist/sdk/index.d.ts +7 -4
  118. package/dist/sdk/index.js +4 -2
  119. package/dist/sdk/index.js.map +1 -1
  120. package/dist/sdk/session.d.ts +5 -0
  121. package/dist/sdk/session.js +406 -0
  122. package/dist/sdk/session.js.map +1 -0
  123. package/dist/sdk/types.d.ts +97 -78
  124. package/dist/store/file_session_store.js +157 -0
  125. package/dist/store/file_session_store.js.map +1 -0
  126. package/dist/store/memory_session_store.js +24 -0
  127. package/dist/store/memory_session_store.js.map +1 -0
  128. package/dist/store/session_store.js +32 -0
  129. package/dist/store/session_store.js.map +1 -0
  130. package/dist/transport/errors.d.ts +29 -0
  131. package/dist/{sdk → transport}/errors.js +5 -5
  132. package/dist/transport/errors.js.map +1 -0
  133. package/dist/transport/in_process_session_transport.js +102 -0
  134. package/dist/transport/in_process_session_transport.js.map +1 -0
  135. package/dist/transport/index.d.ts +7 -0
  136. package/dist/transport/index.js +4 -0
  137. package/dist/transport/index.js.map +1 -0
  138. package/dist/transport/pending_session_protocol_requests.js +67 -0
  139. package/dist/transport/pending_session_protocol_requests.js.map +1 -0
  140. package/dist/transport/session_protocol_transport_helpers.js +98 -0
  141. package/dist/transport/session_protocol_transport_helpers.js.map +1 -0
  142. package/dist/transport/session_transport.d.ts +11 -0
  143. package/dist/transport/session_transport.js +2 -0
  144. package/dist/transport/session_transport.js.map +1 -0
  145. package/dist/transport/stdio_session_transport.d.ts +38 -0
  146. package/dist/transport/stdio_session_transport.js +243 -0
  147. package/dist/transport/stdio_session_transport.js.map +1 -0
  148. package/dist/transport/websocket_session_transport.d.ts +52 -0
  149. package/dist/transport/websocket_session_transport.js +235 -0
  150. package/dist/transport/websocket_session_transport.js.map +1 -0
  151. package/dist/tui/chat_controller/assistant_clipboard.js +39 -0
  152. package/dist/tui/chat_controller/assistant_clipboard.js.map +1 -0
  153. package/dist/tui/chat_controller/command_hints.js +43 -0
  154. package/dist/tui/chat_controller/command_hints.js.map +1 -0
  155. package/dist/tui/chat_controller/diff_review_service.js +9 -9
  156. package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
  157. package/dist/tui/chat_controller/diff_review_user_message.js +17 -0
  158. package/dist/tui/chat_controller/diff_review_user_message.js.map +1 -0
  159. package/dist/tui/chat_controller/history_labels.js +8 -0
  160. package/dist/tui/chat_controller/history_labels.js.map +1 -0
  161. package/dist/tui/chat_controller/history_message_model.js +36 -0
  162. package/dist/tui/chat_controller/history_message_model.js.map +1 -0
  163. package/dist/tui/chat_controller/status_format.js +22 -0
  164. package/dist/tui/chat_controller/status_format.js.map +1 -0
  165. package/dist/tui/chat_view.js +0 -1
  166. package/dist/tui/chat_view.js.map +1 -1
  167. package/dist/tui/index.js +1 -1
  168. package/dist/tui/index.js.map +1 -1
  169. package/dist/tui/listen_capture.js +87 -0
  170. package/dist/tui/listen_capture.js.map +1 -0
  171. package/dist/tui/memory_mode.js +23 -0
  172. package/dist/tui/memory_mode.js.map +1 -0
  173. package/dist/tui/session_chat_app.js +227 -0
  174. package/dist/tui/session_chat_app.js.map +1 -0
  175. package/dist/tui/session_chat_controller.js +2176 -0
  176. package/dist/tui/session_chat_controller.js.map +1 -0
  177. package/dist/tui/session_tool_execution_backend.js +170 -0
  178. package/dist/tui/session_tool_execution_backend.js.map +1 -0
  179. package/dist/tui/speech_playback.js +107 -0
  180. package/dist/tui/speech_playback.js.map +1 -0
  181. package/dist/tui/ui/assistant_message.js +27 -21
  182. package/dist/tui/ui/assistant_message.js.map +1 -1
  183. package/dist/tui/ui/chat_container.js +4 -0
  184. package/dist/tui/ui/chat_container.js.map +1 -1
  185. package/dist/tui/ui/custom_editor.js +0 -5
  186. package/dist/tui/ui/custom_editor.js.map +1 -1
  187. package/dist/tui/ui/slash_autocomplete.js +14 -36
  188. package/dist/tui/ui/slash_autocomplete.js.map +1 -1
  189. package/dist/tui/ui/tool_ui_registry.js +21 -0
  190. package/dist/tui/ui/tool_ui_registry.js.map +1 -1
  191. package/package.json +6 -3
  192. package/dist/core/config/bash_commands.js +0 -44
  193. package/dist/core/config/bash_commands.js.map +0 -1
  194. package/dist/core/diff_review/session.js.map +0 -1
  195. package/dist/core/modes/rpc_adapter.js +0 -17
  196. package/dist/core/modes/rpc_adapter.js.map +0 -1
  197. package/dist/core/modes/rpc_protocol.js +0 -500
  198. package/dist/core/modes/rpc_protocol.js.map +0 -1
  199. package/dist/core/session/checkpoint.js +0 -34
  200. package/dist/core/session/checkpoint.js.map +0 -1
  201. package/dist/sdk/errors.d.ts +0 -33
  202. package/dist/sdk/errors.js.map +0 -1
  203. package/dist/tui/app.js +0 -64
  204. package/dist/tui/app.js.map +0 -1
  205. package/dist/tui/chat_controller/session_maintenance_service.js +0 -634
  206. package/dist/tui/chat_controller/session_maintenance_service.js.map +0 -1
  207. package/dist/tui/chat_controller.js +0 -2579
  208. package/dist/tui/chat_controller.js.map +0 -1
@@ -0,0 +1,38 @@
1
+ import type { ChildProcessWithoutNullStreams } from "node:child_process";
2
+ import { type SessionProtocolInitializeParams, type SessionProtocolMethod, type SessionProtocolParamsByMethod, type SessionProtocolReadyMessage, type SessionProtocolResultByMethod } from "../protocol/session_protocol.js";
3
+ import type { SessionProtocolDeltaListener, SessionProtocolEphemeralListener, SessionProtocolTransport } from "./session_transport.js";
4
+ export type SessionProtocolSpawnedProcess = ChildProcessWithoutNullStreams;
5
+ export declare class StdioSessionProtocolTransport implements SessionProtocolTransport {
6
+ private readonly process;
7
+ private readonly deltaListeners;
8
+ private readonly ephemeralListeners;
9
+ private readonly pendingRequests;
10
+ private readonly readyDeferred;
11
+ private readonly exitDeferred;
12
+ private readyValue?;
13
+ private stdoutBuffer;
14
+ private stderrBuffer;
15
+ private connectPromise?;
16
+ private closePromise?;
17
+ private isConnected;
18
+ private isClosed;
19
+ private isExited;
20
+ private fatalError?;
21
+ constructor(process: SessionProtocolSpawnedProcess);
22
+ get ready(): SessionProtocolReadyMessage;
23
+ connect(initializeParams: SessionProtocolInitializeParams, timeoutMs: number): Promise<void>;
24
+ private establishConnection;
25
+ onDelta(listener: SessionProtocolDeltaListener): () => void;
26
+ onEphemeral(listener: SessionProtocolEphemeralListener): () => void;
27
+ request<M extends SessionProtocolMethod>(method: M, params: SessionProtocolParamsByMethod[M]): Promise<SessionProtocolResultByMethod[M]>;
28
+ close(): Promise<void>;
29
+ private readonly handleStdoutData;
30
+ private readonly handleStderrData;
31
+ private readonly handleProcessError;
32
+ private readonly handleProcessExit;
33
+ private readonly handleProcessClose;
34
+ private onProcessTerminated;
35
+ private handleSessionProtocolLine;
36
+ private failTransport;
37
+ private rejectReadyIfPending;
38
+ }
@@ -0,0 +1,243 @@
1
+ import { parseSessionProtocolOutgoingLine, } from "../protocol/session_protocol.js";
2
+ import { TauProcessError, TauTransportError } from "./errors.js";
3
+ import { PendingSessionProtocolRequests, } from "./pending_session_protocol_requests.js";
4
+ import { createDeferred, handleSessionProtocolTransportParseFailure, handleSessionProtocolTransportResponse, notifySessionProtocolDeltaListeners, notifySessionProtocolEphemeralListeners, waitForPromiseOrTimeout, withTimeout, } from "./session_protocol_transport_helpers.js";
5
+ const CLOSE_TIMEOUT_MS = 2_000;
6
+ export class StdioSessionProtocolTransport {
7
+ process;
8
+ deltaListeners = new Set();
9
+ ephemeralListeners = new Set();
10
+ pendingRequests = new PendingSessionProtocolRequests();
11
+ readyDeferred = createDeferred();
12
+ exitDeferred = createDeferred();
13
+ readyValue;
14
+ stdoutBuffer = "";
15
+ stderrBuffer = "";
16
+ connectPromise;
17
+ closePromise;
18
+ isConnected = false;
19
+ isClosed = false;
20
+ isExited = false;
21
+ fatalError;
22
+ constructor(process) {
23
+ this.process = process;
24
+ this.process.stdout.setEncoding("utf8");
25
+ this.process.stderr.setEncoding("utf8");
26
+ this.process.stdout.on("data", this.handleStdoutData);
27
+ this.process.stderr.on("data", this.handleStderrData);
28
+ this.process.on("error", this.handleProcessError);
29
+ this.process.on("exit", this.handleProcessExit);
30
+ this.process.on("close", this.handleProcessClose);
31
+ }
32
+ get ready() {
33
+ if (!this.readyValue) {
34
+ throw new TauTransportError("tau sdk client is not connected");
35
+ }
36
+ return this.readyValue;
37
+ }
38
+ async connect(initializeParams, timeoutMs) {
39
+ if (this.isClosed) {
40
+ throw new TauTransportError("tau sdk client is closed");
41
+ }
42
+ if (this.fatalError) {
43
+ throw this.fatalError;
44
+ }
45
+ if (this.isConnected) {
46
+ return;
47
+ }
48
+ this.connectPromise ??= this.establishConnection(initializeParams, timeoutMs);
49
+ await this.connectPromise;
50
+ }
51
+ async establishConnection(initializeParams, timeoutMs) {
52
+ const ready = await withTimeout(this.readyDeferred.promise, timeoutMs, new TauTransportError(`timed out waiting for session protocol ready message after ${timeoutMs}ms`));
53
+ this.readyValue = ready;
54
+ await this.request("initialize", initializeParams);
55
+ this.isConnected = true;
56
+ }
57
+ onDelta(listener) {
58
+ this.deltaListeners.add(listener);
59
+ return () => {
60
+ this.deltaListeners.delete(listener);
61
+ };
62
+ }
63
+ onEphemeral(listener) {
64
+ this.ephemeralListeners.add(listener);
65
+ return () => {
66
+ this.ephemeralListeners.delete(listener);
67
+ };
68
+ }
69
+ request(method, params) {
70
+ if (this.isClosed) {
71
+ return Promise.reject(new TauTransportError("tau sdk client is closed"));
72
+ }
73
+ if (this.fatalError) {
74
+ return Promise.reject(this.fatalError);
75
+ }
76
+ let pending;
77
+ try {
78
+ pending = this.pendingRequests.create(method, params);
79
+ }
80
+ catch (error) {
81
+ return Promise.reject(error);
82
+ }
83
+ const payload = JSON.stringify(pending.request);
84
+ const requestId = pending.request.id;
85
+ try {
86
+ this.process.stdin.write(`${payload}\n`, "utf8", (error) => {
87
+ if (!error) {
88
+ return;
89
+ }
90
+ this.pendingRequests.reject(requestId, new TauTransportError("failed to write request to tau rpc process", { cause: error }));
91
+ });
92
+ }
93
+ catch (error) {
94
+ this.pendingRequests.reject(requestId, new TauTransportError("failed to write request to tau rpc process", { cause: error }));
95
+ }
96
+ return pending.promise;
97
+ }
98
+ async close() {
99
+ if (this.closePromise) {
100
+ return this.closePromise;
101
+ }
102
+ this.isClosed = true;
103
+ const closeError = new TauTransportError("tau sdk client was closed");
104
+ this.pendingRequests.rejectAll(closeError);
105
+ this.rejectReadyIfPending(closeError);
106
+ this.deltaListeners.clear();
107
+ this.ephemeralListeners.clear();
108
+ this.process.stdout.off("data", this.handleStdoutData);
109
+ this.process.stderr.off("data", this.handleStderrData);
110
+ this.closePromise = (async () => {
111
+ if (!this.isExited) {
112
+ try {
113
+ this.process.stdin.end();
114
+ }
115
+ catch {
116
+ // ignore transport shutdown errors
117
+ }
118
+ try {
119
+ this.process.kill("SIGTERM");
120
+ }
121
+ catch {
122
+ // ignore transport shutdown errors
123
+ }
124
+ await waitForExitOrTimeout(this.exitDeferred.promise, CLOSE_TIMEOUT_MS);
125
+ if (!this.isExited) {
126
+ try {
127
+ this.process.kill("SIGKILL");
128
+ }
129
+ catch {
130
+ // ignore transport shutdown errors
131
+ }
132
+ await waitForExitOrTimeout(this.exitDeferred.promise, CLOSE_TIMEOUT_MS);
133
+ }
134
+ }
135
+ this.process.off("error", this.handleProcessError);
136
+ this.process.off("exit", this.handleProcessExit);
137
+ this.process.off("close", this.handleProcessClose);
138
+ })();
139
+ return this.closePromise;
140
+ }
141
+ handleStdoutData = (chunk) => {
142
+ this.stdoutBuffer += chunk.toString();
143
+ while (true) {
144
+ const nextLineIndex = this.stdoutBuffer.indexOf("\n");
145
+ if (nextLineIndex === -1) {
146
+ break;
147
+ }
148
+ const line = this.stdoutBuffer.slice(0, nextLineIndex).trim();
149
+ this.stdoutBuffer = this.stdoutBuffer.slice(nextLineIndex + 1);
150
+ if (!line) {
151
+ continue;
152
+ }
153
+ this.handleSessionProtocolLine(line);
154
+ }
155
+ };
156
+ handleStderrData = (chunk) => {
157
+ this.stderrBuffer += chunk.toString();
158
+ };
159
+ handleProcessError = (error) => {
160
+ this.failTransport(new TauProcessError("tau rpc process transport failure", {
161
+ stderr: this.stderrBuffer,
162
+ cause: error,
163
+ }));
164
+ };
165
+ handleProcessExit = (code, signal) => {
166
+ this.onProcessTerminated({ code, signal });
167
+ };
168
+ handleProcessClose = (code, signal) => {
169
+ this.onProcessTerminated({ code, signal });
170
+ };
171
+ onProcessTerminated(exit) {
172
+ if (!this.isExited) {
173
+ this.isExited = true;
174
+ this.exitDeferred.resolve(exit);
175
+ }
176
+ if (this.isClosed) {
177
+ return;
178
+ }
179
+ this.isClosed = true;
180
+ const message = [
181
+ "tau rpc process exited unexpectedly",
182
+ `code=${exit.code ?? "null"}`,
183
+ `signal=${exit.signal ?? "null"}`,
184
+ ].join(" ");
185
+ this.failTransport(new TauProcessError(message, {
186
+ exitCode: exit.code,
187
+ signal: exit.signal,
188
+ stderr: this.stderrBuffer,
189
+ }));
190
+ }
191
+ handleSessionProtocolLine(line) {
192
+ const parsed = parseSessionProtocolOutgoingLine(line);
193
+ if (!parsed.ok) {
194
+ handleSessionProtocolTransportParseFailure({
195
+ failure: parsed,
196
+ pendingRequests: this.pendingRequests,
197
+ failTransport: (error) => this.failTransport(error),
198
+ malformedJsonPeer: "tau rpc process",
199
+ invalidPayloadPeer: "tau process",
200
+ });
201
+ return;
202
+ }
203
+ const message = parsed.message;
204
+ if (message.type === "ready") {
205
+ if (!this.readyValue) {
206
+ this.readyValue = message;
207
+ this.readyDeferred.resolve(message);
208
+ }
209
+ return;
210
+ }
211
+ if (message.type === "session.delta") {
212
+ notifySessionProtocolDeltaListeners(this.deltaListeners, message, {
213
+ ignoreListenerErrors: true,
214
+ });
215
+ return;
216
+ }
217
+ if (message.type === "session.ephemeral") {
218
+ notifySessionProtocolEphemeralListeners(this.ephemeralListeners, message, {
219
+ ignoreListenerErrors: true,
220
+ });
221
+ return;
222
+ }
223
+ handleSessionProtocolTransportResponse(message, this.pendingRequests, (error) => this.failTransport(error));
224
+ }
225
+ failTransport(error) {
226
+ if (this.fatalError) {
227
+ return;
228
+ }
229
+ this.fatalError = error;
230
+ this.pendingRequests.rejectAll(error);
231
+ this.rejectReadyIfPending(error);
232
+ }
233
+ rejectReadyIfPending(error) {
234
+ if (this.readyValue || !this.connectPromise) {
235
+ return;
236
+ }
237
+ this.readyDeferred.reject(error);
238
+ }
239
+ }
240
+ async function waitForExitOrTimeout(exitPromise, timeoutMs) {
241
+ await waitForPromiseOrTimeout(exitPromise, timeoutMs);
242
+ }
243
+ //# sourceMappingURL=stdio_session_transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio_session_transport.js","sourceRoot":"","sources":["../../src/transport/stdio_session_transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { type SessionProtocolInitializeParams, type SessionProtocolMethod, type SessionProtocolParamsByMethod, type SessionProtocolReadyMessage, type SessionProtocolResultByMethod } from "../protocol/session_protocol.js";
2
+ import type { SessionProtocolDeltaListener, SessionProtocolEphemeralListener, SessionProtocolTransport } from "./session_transport.js";
3
+ type WebSocketEventName = "open" | "message" | "error" | "close";
4
+ type WebSocketLike = {
5
+ readonly readyState: number;
6
+ send(data: string): void;
7
+ close(code?: number, reason?: string): void;
8
+ addEventListener(type: WebSocketEventName, listener: (event: unknown) => void): void;
9
+ removeEventListener(type: WebSocketEventName, listener: (event: unknown) => void): void;
10
+ };
11
+ export type WebSocketSessionProtocolTransportOptions = {
12
+ url: string;
13
+ authToken?: string;
14
+ webSocketFactory?: (url: string) => WebSocketLike;
15
+ };
16
+ export declare class WebSocketSessionProtocolTransport implements SessionProtocolTransport {
17
+ private readonly url;
18
+ private readonly authToken?;
19
+ private readonly webSocketFactory?;
20
+ private readonly deltaListeners;
21
+ private readonly ephemeralListeners;
22
+ private readonly pendingRequests;
23
+ private readonly readyDeferred;
24
+ private readonly openDeferred;
25
+ private readonly closeDeferred;
26
+ private socket?;
27
+ private readyValue?;
28
+ private connectPromise?;
29
+ private closePromise?;
30
+ private isConnected;
31
+ private isClosed;
32
+ private isSocketOpen;
33
+ private fatalError?;
34
+ constructor(options: WebSocketSessionProtocolTransportOptions);
35
+ get ready(): SessionProtocolReadyMessage;
36
+ connect(initializeParams: SessionProtocolInitializeParams, timeoutMs: number): Promise<void>;
37
+ private establishConnection;
38
+ private createSocket;
39
+ request<M extends SessionProtocolMethod>(method: M, params: SessionProtocolParamsByMethod[M]): Promise<SessionProtocolResultByMethod[M]>;
40
+ onDelta(listener: SessionProtocolDeltaListener): () => void;
41
+ onEphemeral(listener: SessionProtocolEphemeralListener): () => void;
42
+ close(): Promise<void>;
43
+ private readonly handleOpen;
44
+ private readonly handleMessage;
45
+ private readonly handleError;
46
+ private readonly handleClose;
47
+ private handleSessionProtocolPayload;
48
+ private failTransport;
49
+ private rejectReadyIfPending;
50
+ private removeSocketListeners;
51
+ }
52
+ export {};
@@ -0,0 +1,235 @@
1
+ import { parseSessionProtocolOutgoingLine, } from "../protocol/session_protocol.js";
2
+ import { TauTransportError } from "./errors.js";
3
+ import { PendingSessionProtocolRequests, } from "./pending_session_protocol_requests.js";
4
+ import { createDeferred, handleSessionProtocolTransportParseFailure, handleSessionProtocolTransportResponse, notifySessionProtocolDeltaListeners, notifySessionProtocolEphemeralListeners, waitForPromiseOrTimeout, withTimeout, } from "./session_protocol_transport_helpers.js";
5
+ const WEB_SOCKET_OPEN = 1;
6
+ const WEB_SOCKET_CLOSING = 2;
7
+ const WEB_SOCKET_CLOSED = 3;
8
+ const WEB_SOCKET_CLOSE_TIMEOUT_MS = 2_000;
9
+ export class WebSocketSessionProtocolTransport {
10
+ url;
11
+ authToken;
12
+ webSocketFactory;
13
+ deltaListeners = new Set();
14
+ ephemeralListeners = new Set();
15
+ pendingRequests = new PendingSessionProtocolRequests();
16
+ readyDeferred = createDeferred();
17
+ openDeferred = createDeferred();
18
+ closeDeferred = createDeferred();
19
+ socket;
20
+ readyValue;
21
+ connectPromise;
22
+ closePromise;
23
+ isConnected = false;
24
+ isClosed = false;
25
+ isSocketOpen = false;
26
+ fatalError;
27
+ constructor(options) {
28
+ this.url = options.url;
29
+ this.authToken = options.authToken;
30
+ this.webSocketFactory = options.webSocketFactory;
31
+ }
32
+ get ready() {
33
+ if (!this.readyValue) {
34
+ throw new TauTransportError("tau websocket transport is not connected");
35
+ }
36
+ return this.readyValue;
37
+ }
38
+ async connect(initializeParams, timeoutMs) {
39
+ if (this.isClosed) {
40
+ throw new TauTransportError("tau websocket transport is closed");
41
+ }
42
+ if (this.fatalError) {
43
+ throw this.fatalError;
44
+ }
45
+ if (this.isConnected) {
46
+ return;
47
+ }
48
+ this.connectPromise ??= this.establishConnection(initializeParams, timeoutMs);
49
+ await this.connectPromise;
50
+ }
51
+ async establishConnection(initializeParams, timeoutMs) {
52
+ const socket = this.createSocket();
53
+ this.socket = socket;
54
+ socket.addEventListener("open", this.handleOpen);
55
+ socket.addEventListener("message", this.handleMessage);
56
+ socket.addEventListener("error", this.handleError);
57
+ socket.addEventListener("close", this.handleClose);
58
+ await withTimeout(this.openDeferred.promise, timeoutMs, new TauTransportError(`timed out opening websocket after ${timeoutMs}ms`));
59
+ const ready = await withTimeout(this.readyDeferred.promise, timeoutMs, new TauTransportError(`timed out waiting for session protocol ready message after ${timeoutMs}ms`));
60
+ this.readyValue = ready;
61
+ await this.request("initialize", initializeParams);
62
+ this.isConnected = true;
63
+ }
64
+ createSocket() {
65
+ const url = withAuthToken(this.url, this.authToken);
66
+ if (this.webSocketFactory) {
67
+ return this.webSocketFactory(url);
68
+ }
69
+ const WebSocketConstructor = globalThis.WebSocket;
70
+ if (!WebSocketConstructor) {
71
+ throw new TauTransportError("global WebSocket is not available in this runtime");
72
+ }
73
+ return new WebSocketConstructor(url);
74
+ }
75
+ request(method, params) {
76
+ if (this.isClosed) {
77
+ return Promise.reject(new TauTransportError("tau websocket transport is closed"));
78
+ }
79
+ if (this.fatalError) {
80
+ return Promise.reject(this.fatalError);
81
+ }
82
+ const socket = this.socket;
83
+ if (!socket || socket.readyState !== WEB_SOCKET_OPEN) {
84
+ return Promise.reject(new TauTransportError("tau websocket transport is not open"));
85
+ }
86
+ let pending;
87
+ try {
88
+ pending = this.pendingRequests.create(method, params);
89
+ }
90
+ catch (error) {
91
+ return Promise.reject(error);
92
+ }
93
+ try {
94
+ socket.send(JSON.stringify(pending.request));
95
+ }
96
+ catch (error) {
97
+ this.pendingRequests.reject(pending.request.id, new TauTransportError("failed to write request to tau websocket", { cause: error }));
98
+ }
99
+ return pending.promise;
100
+ }
101
+ onDelta(listener) {
102
+ this.deltaListeners.add(listener);
103
+ return () => {
104
+ this.deltaListeners.delete(listener);
105
+ };
106
+ }
107
+ onEphemeral(listener) {
108
+ this.ephemeralListeners.add(listener);
109
+ return () => {
110
+ this.ephemeralListeners.delete(listener);
111
+ };
112
+ }
113
+ async close() {
114
+ if (this.closePromise) {
115
+ return this.closePromise;
116
+ }
117
+ this.isClosed = true;
118
+ const closeError = new TauTransportError("tau websocket transport was closed");
119
+ this.pendingRequests.rejectAll(closeError);
120
+ this.rejectReadyIfPending(closeError);
121
+ this.deltaListeners.clear();
122
+ this.ephemeralListeners.clear();
123
+ this.closePromise = (async () => {
124
+ const socket = this.socket;
125
+ if (socket) {
126
+ if (socket.readyState !== WEB_SOCKET_CLOSING && socket.readyState !== WEB_SOCKET_CLOSED) {
127
+ socket.close(1000, "client closed");
128
+ }
129
+ if (socket.readyState === WEB_SOCKET_OPEN || socket.readyState === WEB_SOCKET_CLOSING) {
130
+ await waitForCloseOrTimeout(this.closeDeferred.promise, WEB_SOCKET_CLOSE_TIMEOUT_MS);
131
+ }
132
+ this.removeSocketListeners(socket);
133
+ }
134
+ })();
135
+ return this.closePromise;
136
+ }
137
+ handleOpen = () => {
138
+ this.isSocketOpen = true;
139
+ this.openDeferred.resolve();
140
+ };
141
+ handleMessage = (event) => {
142
+ const data = readMessageEventData(event);
143
+ if (typeof data !== "string") {
144
+ this.failTransport(new TauTransportError("received non-text websocket message"));
145
+ return;
146
+ }
147
+ this.handleSessionProtocolPayload(data);
148
+ };
149
+ handleError = (event) => {
150
+ this.failTransport(new TauTransportError("tau websocket transport failure", { cause: event }));
151
+ };
152
+ handleClose = () => {
153
+ this.closeDeferred.resolve();
154
+ if (this.isClosed) {
155
+ return;
156
+ }
157
+ this.isClosed = true;
158
+ this.failTransport(new TauTransportError("tau websocket closed unexpectedly"));
159
+ };
160
+ handleSessionProtocolPayload(payload) {
161
+ const parsed = parseSessionProtocolOutgoingLine(payload);
162
+ if (!parsed.ok) {
163
+ handleSessionProtocolTransportParseFailure({
164
+ failure: parsed,
165
+ pendingRequests: this.pendingRequests,
166
+ failTransport: (error) => this.failTransport(error),
167
+ malformedJsonPeer: "tau websocket",
168
+ invalidPayloadPeer: "tau websocket",
169
+ });
170
+ return;
171
+ }
172
+ const message = parsed.message;
173
+ if (message.type === "ready") {
174
+ if (!this.readyValue) {
175
+ this.readyValue = message;
176
+ this.readyDeferred.resolve(message);
177
+ }
178
+ return;
179
+ }
180
+ if (message.type === "session.delta") {
181
+ notifySessionProtocolDeltaListeners(this.deltaListeners, message, {
182
+ ignoreListenerErrors: true,
183
+ });
184
+ return;
185
+ }
186
+ if (message.type === "session.ephemeral") {
187
+ notifySessionProtocolEphemeralListeners(this.ephemeralListeners, message, {
188
+ ignoreListenerErrors: true,
189
+ });
190
+ return;
191
+ }
192
+ handleSessionProtocolTransportResponse(message, this.pendingRequests, (error) => this.failTransport(error));
193
+ }
194
+ failTransport(error) {
195
+ if (this.fatalError) {
196
+ return;
197
+ }
198
+ this.fatalError = error;
199
+ this.pendingRequests.rejectAll(error);
200
+ this.rejectReadyIfPending(error);
201
+ }
202
+ rejectReadyIfPending(error) {
203
+ if (this.readyValue || !this.connectPromise) {
204
+ return;
205
+ }
206
+ if (this.isSocketOpen) {
207
+ this.readyDeferred.reject(error);
208
+ }
209
+ this.openDeferred.reject(error);
210
+ }
211
+ removeSocketListeners(socket) {
212
+ socket.removeEventListener("open", this.handleOpen);
213
+ socket.removeEventListener("message", this.handleMessage);
214
+ socket.removeEventListener("error", this.handleError);
215
+ socket.removeEventListener("close", this.handleClose);
216
+ }
217
+ }
218
+ function withAuthToken(url, authToken) {
219
+ if (authToken === undefined) {
220
+ return url;
221
+ }
222
+ const parsed = new URL(url);
223
+ parsed.searchParams.set("tau_token", authToken);
224
+ return parsed.toString();
225
+ }
226
+ function readMessageEventData(event) {
227
+ if (typeof event === "object" && event !== null && "data" in event) {
228
+ return event.data;
229
+ }
230
+ return undefined;
231
+ }
232
+ async function waitForCloseOrTimeout(closePromise, timeoutMs) {
233
+ await waitForPromiseOrTimeout(closePromise, timeoutMs);
234
+ }
235
+ //# sourceMappingURL=websocket_session_transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket_session_transport.js","sourceRoot":"","sources":["../../src/transport/websocket_session_transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { extractAllFencedCodeBlocks, extractAssistantText } from "../../core/utils/messages.js";
2
+ import { copyTextToClipboard } from "../clipboard.js";
3
+ export async function copyAssistantTextToClipboard(options) {
4
+ if (!options.message) {
5
+ options.view.addSystemMessage("no assistant message to copy yet.", "warn");
6
+ return;
7
+ }
8
+ const text = extractAssistantText(options.message);
9
+ if (!text.trim()) {
10
+ options.view.addSystemMessage("last assistant message was empty.", "warn");
11
+ return;
12
+ }
13
+ try {
14
+ await copyTextToClipboard(text);
15
+ options.view.addSystemMessage("copied last assistant message to clipboard.", "success");
16
+ }
17
+ catch (error) {
18
+ options.view.addSystemMessage(`clipboard copy failed: ${error.message}`, "error");
19
+ }
20
+ }
21
+ export async function copyAssistantCodeToClipboard(options) {
22
+ if (!options.message) {
23
+ options.view.addSystemMessage("no assistant message to copy yet.", "warn");
24
+ return;
25
+ }
26
+ const code = extractAllFencedCodeBlocks(extractAssistantText(options.message));
27
+ if (!code) {
28
+ options.view.addSystemMessage("no code block to copy yet.", "warn");
29
+ return;
30
+ }
31
+ try {
32
+ await copyTextToClipboard(code);
33
+ options.view.addSystemMessage("copied all code blocks to clipboard.", "success");
34
+ }
35
+ catch (error) {
36
+ options.view.addSystemMessage(`clipboard copy failed: ${error.message}`, "error");
37
+ }
38
+ }
39
+ //# sourceMappingURL=assistant_clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant_clipboard.js","sourceRoot":"","sources":["../../../src/tui/chat_controller/assistant_clipboard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEhG,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,OAGlD;IACC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,6CAA6C,EAAE,SAAS,CAAC,CAAC;IAC1F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,0BAA2B,KAAe,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,OAGlD;IACC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,mCAAmC,EAAE,MAAM,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,0BAA0B,CAAC,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,4BAA4B,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,sCAAsC,EAAE,SAAS,CAAC,CAAC;IACnF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,0BAA2B,KAAe,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC"}