@markusylisiurunen/tau 0.2.128 → 0.3.0

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 (232) hide show
  1. package/README.md +130 -75
  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/auth/auth_manager.js +0 -92
  12. package/dist/core/auth/auth_manager.js.map +1 -1
  13. package/dist/core/auth/credential_store.js +247 -0
  14. package/dist/core/auth/credential_store.js.map +1 -0
  15. package/dist/core/auth/index.js +0 -1
  16. package/dist/core/auth/index.js.map +1 -1
  17. package/dist/core/cli.js +12 -15
  18. package/dist/core/cli.js.map +1 -1
  19. package/dist/core/commands/registry.js +11 -55
  20. package/dist/core/commands/registry.js.map +1 -1
  21. package/dist/core/config/index.js.map +1 -1
  22. package/dist/core/config/runtime.js +0 -1
  23. package/dist/core/config/runtime.js.map +1 -1
  24. package/dist/core/config/schema.js +102 -17
  25. package/dist/core/config/schema.js.map +1 -1
  26. package/dist/core/debug.js +1 -20
  27. package/dist/core/debug.js.map +1 -1
  28. package/dist/core/diff_review/{session.js → bridge.js} +57 -114
  29. package/dist/core/diff_review/bridge.js.map +1 -0
  30. package/dist/core/diff_review/index.js +2 -3
  31. package/dist/core/diff_review/index.js.map +1 -1
  32. package/dist/core/diff_review/review_thread.js +48 -23
  33. package/dist/core/diff_review/review_thread.js.map +1 -1
  34. package/dist/core/diff_review/snapshot.js +40 -11
  35. package/dist/core/diff_review/snapshot.js.map +1 -1
  36. package/dist/core/events/parser.js +43 -12
  37. package/dist/core/events/parser.js.map +1 -1
  38. package/dist/core/index.js +1 -2
  39. package/dist/core/index.js.map +1 -1
  40. package/dist/core/models/catalog.js +3 -3
  41. package/dist/core/models/catalog.js.map +1 -1
  42. package/dist/core/modes/index.js +1 -2
  43. package/dist/core/modes/index.js.map +1 -1
  44. package/dist/core/modes/rpc_server.js +15 -325
  45. package/dist/core/modes/rpc_server.js.map +1 -1
  46. package/dist/core/modes/websocket_server.js +181 -0
  47. package/dist/core/modes/websocket_server.js.map +1 -0
  48. package/dist/core/personas.js +11 -1
  49. package/dist/core/personas.js.map +1 -1
  50. package/dist/core/runtime/chat_runtime.js +19 -12
  51. package/dist/core/runtime/chat_runtime.js.map +1 -1
  52. package/dist/core/runtime/conversation_turn_runtime.js +16 -1
  53. package/dist/core/runtime/conversation_turn_runtime.js.map +1 -1
  54. package/dist/core/runtime/runtime_bootstrap.js +326 -0
  55. package/dist/core/runtime/runtime_bootstrap.js.map +1 -1
  56. package/dist/core/runtime/steering.js +6 -0
  57. package/dist/core/runtime/steering.js.map +1 -0
  58. package/dist/core/session/compaction.js +225 -22
  59. package/dist/core/session/compaction.js.map +1 -1
  60. package/dist/core/session/core_session.js +9 -0
  61. package/dist/core/session/core_session.js.map +1 -1
  62. package/dist/core/session/direct_bash.js +34 -0
  63. package/dist/core/session/direct_bash.js.map +1 -0
  64. package/dist/core/session/pruning.js +595 -0
  65. package/dist/core/session/pruning.js.map +1 -0
  66. package/dist/core/session/runner.js +47 -8
  67. package/dist/core/session/runner.js.map +1 -1
  68. package/dist/core/session/session_engine.js +128 -55
  69. package/dist/core/session/session_engine.js.map +1 -1
  70. package/dist/core/static/prompts/diff-review-wrapper.md +1 -1
  71. package/dist/core/subagents/subagent_engine.js +19 -27
  72. package/dist/core/subagents/subagent_engine.js.map +1 -1
  73. package/dist/core/tools/catalog.js.map +1 -1
  74. package/dist/core/tools/diff_review.js +12 -12
  75. package/dist/core/tools/diff_review.js.map +1 -1
  76. package/dist/core/tools/execution_backend.js +9 -2
  77. package/dist/core/tools/execution_backend.js.map +1 -1
  78. package/dist/core/tools/registry.js.map +1 -1
  79. package/dist/core/usage/logs.js.map +1 -1
  80. package/dist/core/utils/compact.js +3 -1
  81. package/dist/core/utils/compact.js.map +1 -1
  82. package/dist/core/utils/context.js +1 -1
  83. package/dist/core/utils/context.js.map +1 -1
  84. package/dist/core/utils/context_builder.js +1 -18
  85. package/dist/core/utils/context_builder.js.map +1 -1
  86. package/dist/core/utils/gemini_speech.js +1 -1
  87. package/dist/core/utils/gemini_speech.js.map +1 -1
  88. package/dist/core/utils/model_stream.js +105 -14
  89. package/dist/core/utils/model_stream.js.map +1 -1
  90. package/dist/core/utils/project_files.js +11 -16
  91. package/dist/core/utils/project_files.js.map +1 -1
  92. package/dist/core/utils/spawn_capture.js +2 -2
  93. package/dist/core/utils/spawn_capture.js.map +1 -1
  94. package/dist/core/utils/user_metadata.js +35 -2
  95. package/dist/core/utils/user_metadata.js.map +1 -1
  96. package/dist/core/version.js +1 -1
  97. package/dist/core/version.js.map +1 -1
  98. package/dist/diff_tool/app/dist/assets/{index-jn1I_CPZ.js → index-ivRn2dP2.js} +34 -34
  99. package/dist/diff_tool/app/dist/index.html +1 -1
  100. package/dist/execution/cloudflare_sandbox_execution_environment.js +400 -0
  101. package/dist/execution/cloudflare_sandbox_execution_environment.js.map +1 -0
  102. package/dist/execution/execution_environment.js +24 -0
  103. package/dist/execution/execution_environment.js.map +1 -0
  104. package/dist/execution/fly_sprite_execution_environment.js +559 -0
  105. package/dist/execution/fly_sprite_execution_environment.js.map +1 -0
  106. package/dist/execution/local_execution_environment.js +93 -0
  107. package/dist/execution/local_execution_environment.js.map +1 -0
  108. package/dist/execution/runtime_config_snapshot.js +209 -0
  109. package/dist/execution/runtime_config_snapshot.js.map +1 -0
  110. package/dist/execution/sandbox_tool_helpers.js +55 -0
  111. package/dist/execution/sandbox_tool_helpers.js.map +1 -0
  112. package/dist/execution/tool_backend_execution_environment.js +55 -0
  113. package/dist/execution/tool_backend_execution_environment.js.map +1 -0
  114. package/dist/host/hosted_ephemeral_agent_session.js +286 -0
  115. package/dist/host/hosted_ephemeral_agent_session.js.map +1 -0
  116. package/dist/host/index.js +3 -0
  117. package/dist/host/index.js.map +1 -0
  118. package/dist/host/local_session_host.js +1464 -0
  119. package/dist/host/local_session_host.js.map +1 -0
  120. package/dist/host/session_host.js +2 -0
  121. package/dist/host/session_host.js.map +1 -0
  122. package/dist/host/session_protocol_handler.js +873 -0
  123. package/dist/host/session_protocol_handler.js.map +1 -0
  124. package/dist/main.js +537 -77
  125. package/dist/main.js.map +1 -1
  126. package/dist/protocol/index.d.ts +2 -0
  127. package/dist/protocol/index.js +2 -0
  128. package/dist/protocol/index.js.map +1 -0
  129. package/dist/protocol/session_protocol.d.ts +691 -0
  130. package/dist/protocol/session_protocol.js +2117 -0
  131. package/dist/protocol/session_protocol.js.map +1 -0
  132. package/dist/sdk/client.d.ts +2 -1
  133. package/dist/sdk/client.js +136 -392
  134. package/dist/sdk/client.js.map +1 -1
  135. package/dist/sdk/index.d.ts +7 -4
  136. package/dist/sdk/index.js +4 -2
  137. package/dist/sdk/index.js.map +1 -1
  138. package/dist/sdk/session.d.ts +5 -0
  139. package/dist/sdk/session.js +406 -0
  140. package/dist/sdk/session.js.map +1 -0
  141. package/dist/sdk/types.d.ts +97 -78
  142. package/dist/store/file_session_store.js +157 -0
  143. package/dist/store/file_session_store.js.map +1 -0
  144. package/dist/store/memory_session_store.js +24 -0
  145. package/dist/store/memory_session_store.js.map +1 -0
  146. package/dist/store/session_store.js +32 -0
  147. package/dist/store/session_store.js.map +1 -0
  148. package/dist/transport/errors.d.ts +29 -0
  149. package/dist/{sdk → transport}/errors.js +5 -5
  150. package/dist/transport/errors.js.map +1 -0
  151. package/dist/transport/in_process_session_transport.js +102 -0
  152. package/dist/transport/in_process_session_transport.js.map +1 -0
  153. package/dist/transport/index.d.ts +7 -0
  154. package/dist/transport/index.js +4 -0
  155. package/dist/transport/index.js.map +1 -0
  156. package/dist/transport/pending_session_protocol_requests.js +67 -0
  157. package/dist/transport/pending_session_protocol_requests.js.map +1 -0
  158. package/dist/transport/session_protocol_transport_helpers.js +98 -0
  159. package/dist/transport/session_protocol_transport_helpers.js.map +1 -0
  160. package/dist/transport/session_transport.d.ts +11 -0
  161. package/dist/transport/session_transport.js +2 -0
  162. package/dist/transport/session_transport.js.map +1 -0
  163. package/dist/transport/stdio_session_transport.d.ts +38 -0
  164. package/dist/transport/stdio_session_transport.js +243 -0
  165. package/dist/transport/stdio_session_transport.js.map +1 -0
  166. package/dist/transport/websocket_session_transport.d.ts +52 -0
  167. package/dist/transport/websocket_session_transport.js +235 -0
  168. package/dist/transport/websocket_session_transport.js.map +1 -0
  169. package/dist/tui/chat_controller/assistant_clipboard.js +39 -0
  170. package/dist/tui/chat_controller/assistant_clipboard.js.map +1 -0
  171. package/dist/tui/chat_controller/command_hints.js +43 -0
  172. package/dist/tui/chat_controller/command_hints.js.map +1 -0
  173. package/dist/tui/chat_controller/diff_review_service.js +9 -9
  174. package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
  175. package/dist/tui/chat_controller/diff_review_user_message.js +17 -0
  176. package/dist/tui/chat_controller/diff_review_user_message.js.map +1 -0
  177. package/dist/tui/chat_controller/history_labels.js +8 -0
  178. package/dist/tui/chat_controller/history_labels.js.map +1 -0
  179. package/dist/tui/chat_controller/history_message_model.js +36 -0
  180. package/dist/tui/chat_controller/history_message_model.js.map +1 -0
  181. package/dist/tui/chat_controller/queued_user_messages.js +18 -1
  182. package/dist/tui/chat_controller/queued_user_messages.js.map +1 -1
  183. package/dist/tui/chat_controller/status_format.js +22 -0
  184. package/dist/tui/chat_controller/status_format.js.map +1 -0
  185. package/dist/tui/chat_view.js +3 -1
  186. package/dist/tui/chat_view.js.map +1 -1
  187. package/dist/tui/index.js +1 -1
  188. package/dist/tui/index.js.map +1 -1
  189. package/dist/tui/listen_capture.js +87 -0
  190. package/dist/tui/listen_capture.js.map +1 -0
  191. package/dist/tui/memory_mode.js +23 -0
  192. package/dist/tui/memory_mode.js.map +1 -0
  193. package/dist/tui/session_chat_app.js +227 -0
  194. package/dist/tui/session_chat_app.js.map +1 -0
  195. package/dist/tui/session_chat_controller.js +2167 -0
  196. package/dist/tui/session_chat_controller.js.map +1 -0
  197. package/dist/tui/session_tool_execution_backend.js +170 -0
  198. package/dist/tui/session_tool_execution_backend.js.map +1 -0
  199. package/dist/tui/speech_playback.js +107 -0
  200. package/dist/tui/speech_playback.js.map +1 -0
  201. package/dist/tui/ui/assistant_message.js +27 -21
  202. package/dist/tui/ui/assistant_message.js.map +1 -1
  203. package/dist/tui/ui/components/editor.js +17 -13
  204. package/dist/tui/ui/components/editor.js.map +1 -1
  205. package/dist/tui/ui/custom_editor.js +25 -5
  206. package/dist/tui/ui/custom_editor.js.map +1 -1
  207. package/dist/tui/ui/queued_messages.js +1 -1
  208. package/dist/tui/ui/queued_messages.js.map +1 -1
  209. package/dist/tui/ui/slash_autocomplete.js +14 -36
  210. package/dist/tui/ui/slash_autocomplete.js.map +1 -1
  211. package/dist/tui/ui/tool_ui_registry.js +21 -0
  212. package/dist/tui/ui/tool_ui_registry.js.map +1 -1
  213. package/package.json +14 -11
  214. package/dist/core/auth/credential_resolver.js +0 -36
  215. package/dist/core/auth/credential_resolver.js.map +0 -1
  216. package/dist/core/config/bash_commands.js +0 -44
  217. package/dist/core/config/bash_commands.js.map +0 -1
  218. package/dist/core/diff_review/session.js.map +0 -1
  219. package/dist/core/modes/rpc_adapter.js +0 -17
  220. package/dist/core/modes/rpc_adapter.js.map +0 -1
  221. package/dist/core/modes/rpc_protocol.js +0 -500
  222. package/dist/core/modes/rpc_protocol.js.map +0 -1
  223. package/dist/core/session/checkpoint.js +0 -34
  224. package/dist/core/session/checkpoint.js.map +0 -1
  225. package/dist/sdk/errors.d.ts +0 -33
  226. package/dist/sdk/errors.js.map +0 -1
  227. package/dist/tui/app.js +0 -64
  228. package/dist/tui/app.js.map +0 -1
  229. package/dist/tui/chat_controller/session_maintenance_service.js +0 -634
  230. package/dist/tui/chat_controller/session_maintenance_service.js.map +0 -1
  231. package/dist/tui/chat_controller.js +0 -2532
  232. package/dist/tui/chat_controller.js.map +0 -1
@@ -1,355 +1,45 @@
1
1
  import { createInterface } from "node:readline";
2
- import { wrapCoreEvent } from "../events/types.js";
3
- import { createRpcErrorResponse, createRpcEventMessage, createRpcReadyMessage, createRpcSuccessResponse, parseRpcRequestLine, RPC_ERROR_CODES, RPC_METHODS, RPC_PROTOCOL_VERSION, serializeRpcMessage, } from "./rpc_protocol.js";
2
+ import { SessionProtocolHandler, } from "../../host/session_protocol_handler.js";
3
+ import { createSessionProtocolErrorResponse, parseSessionProtocolRequestLine, serializeSessionProtocolMessage, } from "../../protocol/session_protocol.js";
4
4
  export class RpcServer {
5
- runtime;
5
+ handler;
6
6
  send;
7
- unsubscribeEvent;
8
- activeSubmit;
9
- activeSubmitRequestId;
10
- pendingSteeringSubmits = [];
11
- submitRequestByUserHistoryEntryId = new Map();
12
- mutationQueue = Promise.resolve();
13
- pendingSessionMutations = 0;
14
- initialized = false;
15
- rpcShutdown = false;
16
7
  closed = false;
17
8
  constructor(options) {
18
- this.runtime = options.runtime;
19
9
  this.send = options.send;
20
- this.unsubscribeEvent = this.runtime.session.onEvent((event) => {
21
- if (this.rpcShutdown || this.closed) {
22
- return;
23
- }
24
- const requestId = this.resolveEventRequestId(event);
25
- this.sendMessage(createRpcEventMessage(wrapCoreEvent(event), { requestId }));
10
+ this.handler = new SessionProtocolHandler({
11
+ host: options.host,
12
+ send: (message) => this.send(serializeSessionProtocolMessage(message)),
26
13
  });
27
- if (options.emitReadyOnStart ?? true) {
28
- this.emitReady();
29
- }
30
14
  }
31
15
  async handleLine(line) {
32
16
  if (this.closed) {
33
17
  return;
34
18
  }
35
- const parsed = parseRpcRequestLine(line);
19
+ const parsed = parseSessionProtocolRequestLine(line);
36
20
  if (!parsed.ok) {
37
21
  this.sendParseFailure(parsed);
38
22
  return;
39
23
  }
40
- const request = parsed.request;
41
- if (this.rpcShutdown && request.method !== "initialize") {
42
- this.sendServerShutdownError(request.id);
43
- return;
44
- }
45
- try {
46
- switch (request.method) {
47
- case "initialize":
48
- this.handleInitialize(request);
49
- return;
50
- case "session.submit":
51
- await this.handleSubmit(request);
52
- return;
53
- case "session.interrupt":
54
- this.handleInterrupt(request);
55
- return;
56
- case "session.snapshot":
57
- this.handleSnapshot(request);
58
- return;
59
- case "session.reset":
60
- await this.handleReset(request);
61
- return;
62
- case "session.shutdown":
63
- await this.handleShutdown(request);
64
- return;
65
- }
66
- }
67
- catch (error) {
68
- this.sendMessage(createRpcErrorResponse(request.id, RPC_ERROR_CODES.internalError, "rpc request failed", {
69
- cause: error instanceof Error ? error.message : String(error),
70
- }));
71
- }
24
+ await this.handler.handleRequest(parsed.request);
72
25
  }
73
- async close(options = {}) {
74
- if (this.closed) {
75
- return;
76
- }
26
+ async close() {
77
27
  this.closed = true;
78
- this.clearEventCorrelationState();
79
- this.unsubscribeEventListener();
80
- if (options.interruptActiveSubmit && (this.activeSubmit || this.runtime.isTurnRunning)) {
81
- this.runtime.interruptTurn();
82
- }
83
- this.runtime.session.dispose();
84
- }
85
- async shutdown(options = {}) {
86
- await this.close(options);
28
+ await this.handler.close("shutdown-host");
87
29
  }
88
- emitReady() {
89
- this.sendMessage(createRpcReadyMessage({
90
- sessionId: this.runtime.session.sessionId,
91
- }));
30
+ async shutdown() {
31
+ await this.close();
92
32
  }
93
33
  sendParseFailure(parsed) {
94
- this.sendMessage(createRpcErrorResponse(parsed.id, parsed.error.code, parsed.error.message, parsed.error.data));
95
- }
96
- handleInitialize(request) {
97
- const result = {
98
- protocolVersion: RPC_PROTOCOL_VERSION,
99
- sessionId: this.runtime.session.sessionId,
100
- methods: [...RPC_METHODS],
101
- alreadyInitialized: this.initialized,
102
- };
103
- this.initialized = true;
104
- this.sendMessage(createRpcSuccessResponse(request.id, result));
105
- }
106
- async handleSubmit(request) {
107
- if (this.pendingSessionMutations > 0) {
108
- this.sendSubmitBusy(request.id);
109
- return;
110
- }
111
- const startedSubmit = await this.enqueueMutation(() => this.startSubmit(request));
112
- if (!startedSubmit) {
113
- return;
114
- }
115
- const { submitPromise } = startedSubmit;
116
- try {
117
- await submitPromise;
118
- }
119
- finally {
120
- await this.enqueueMutation(() => {
121
- if (this.activeSubmit === submitPromise) {
122
- this.activeSubmit = undefined;
123
- this.activeSubmitRequestId = undefined;
124
- }
125
- });
126
- void this.drainPendingSteeringSubmits();
127
- }
128
- }
129
- startSubmit(request) {
130
- if (this.rpcShutdown) {
131
- this.sendServerShutdownError(request.id);
132
- return undefined;
133
- }
134
- if (this.activeSubmit || this.runtime.isTurnRunning) {
135
- if (request.params.mode === "steer") {
136
- this.pendingSteeringSubmits.push(request);
137
- this.runtime.requestTurnBoundaryStop();
138
- }
139
- else {
140
- this.sendSubmitBusy(request.id);
141
- }
142
- return undefined;
143
- }
144
- const addOptions = request.params.historyEntryId
145
- ? { historyEntryId: request.params.historyEntryId }
146
- : undefined;
147
- const userHistoryEntryId = this.runtime.session.addUserText(request.params.text, addOptions);
148
- this.submitRequestByUserHistoryEntryId.set(userHistoryEntryId, request.id);
149
- this.activeSubmitRequestId = request.id;
150
- const submitPromise = this.executeSubmit(request.id, userHistoryEntryId);
151
- this.activeSubmit = submitPromise;
152
- return {
153
- submitPromise,
154
- };
155
- }
156
- async drainPendingSteeringSubmits() {
157
- const batch = await this.enqueueMutation(() => {
158
- if (this.rpcShutdown ||
159
- this.pendingSteeringSubmits.length === 0 ||
160
- this.activeSubmit ||
161
- this.runtime.isTurnRunning) {
162
- return undefined;
163
- }
164
- const requests = this.pendingSteeringSubmits.splice(0);
165
- const primaryRequest = requests[0];
166
- const preferredHistoryEntryId = requests.length === 1 ? primaryRequest.params.historyEntryId : undefined;
167
- const userHistoryEntryId = this.runtime.session.addUserText(this.formatSteeringUserMessage(requests.map((item) => item.params.text)), preferredHistoryEntryId ? { historyEntryId: preferredHistoryEntryId } : undefined);
168
- this.submitRequestByUserHistoryEntryId.set(userHistoryEntryId, primaryRequest.id);
169
- this.activeSubmitRequestId = primaryRequest.id;
170
- const submitPromise = this.executeSubmit(primaryRequest.id, userHistoryEntryId, requests);
171
- this.activeSubmit = submitPromise;
172
- return { submitPromise };
173
- });
174
- if (!batch) {
175
- return;
176
- }
177
- try {
178
- await batch.submitPromise;
179
- }
180
- finally {
181
- await this.enqueueMutation(() => {
182
- if (this.activeSubmit === batch.submitPromise) {
183
- this.activeSubmit = undefined;
184
- this.activeSubmitRequestId = undefined;
185
- }
186
- });
187
- void this.drainPendingSteeringSubmits();
188
- }
189
- }
190
- async executeSubmit(requestId, userHistoryEntryId, responseRequests) {
191
- try {
192
- const turnResult = await this.runtime.runTurn();
193
- const result = {
194
- userHistoryEntryId,
195
- turn: {
196
- aborted: turnResult.aborted,
197
- ...(turnResult.blocked ? { blocked: turnResult.blocked } : {}),
198
- },
199
- };
200
- if (responseRequests) {
201
- for (const request of responseRequests) {
202
- this.sendMessage(createRpcSuccessResponse(request.id, result));
203
- }
204
- }
205
- else {
206
- this.sendMessage(createRpcSuccessResponse(requestId, result));
207
- }
208
- }
209
- catch (error) {
210
- const requests = responseRequests ?? [{ id: requestId }];
211
- for (const request of requests) {
212
- this.sendMessage(createRpcErrorResponse(request.id, RPC_ERROR_CODES.internalError, "failed to run session turn", { cause: error instanceof Error ? error.message : String(error) }));
213
- }
214
- }
215
- }
216
- formatSteeringUserMessage(messages) {
217
- const guidance = "The user sent the following message(s) while you were already working. Treat them as steering for the current task: incorporate them immediately, adjust your plan if needed, and do not continue down the previous path if this changes the requested direction.";
218
- const body = messages.join("\n\n");
219
- return `<system>\n${guidance}\n</system>\n${body}`;
220
- }
221
- handleInterrupt(request) {
222
- const interrupted = this.runtime.interruptTurn();
223
- this.rejectPendingSteeringSubmits("session was interrupted");
224
- const result = {
225
- interrupted,
226
- isTurnRunning: this.runtime.isTurnRunning,
227
- };
228
- this.sendMessage(createRpcSuccessResponse(request.id, result));
229
- }
230
- handleSnapshot(request) {
231
- const result = {
232
- sessionId: this.runtime.session.sessionId,
233
- isTurnRunning: this.runtime.isTurnRunning,
234
- historyLength: this.runtime.session.history.length,
235
- history: [...this.runtime.session.history],
236
- historyEntries: this.runtime.session.historyEntries.map((entry) => ({
237
- id: entry.id,
238
- message: entry.message,
239
- })),
240
- };
241
- this.sendMessage(createRpcSuccessResponse(request.id, result));
242
- }
243
- async handleReset(request) {
244
- await this.runSessionMutation(async () => {
245
- if (this.rpcShutdown) {
246
- this.sendServerShutdownError(request.id);
247
- return;
248
- }
249
- await this.interruptAndWaitForActiveSubmit();
250
- this.rejectPendingSteeringSubmits("session was reset");
251
- const previousSessionId = this.runtime.session.sessionId;
252
- this.runtime.session.reset();
253
- this.clearEventCorrelationState();
254
- const result = {
255
- previousSessionId,
256
- sessionId: this.runtime.session.sessionId,
257
- };
258
- this.sendMessage(createRpcSuccessResponse(request.id, result));
259
- });
260
- }
261
- async handleShutdown(request) {
262
- await this.runSessionMutation(async () => {
263
- if (this.rpcShutdown) {
264
- const result = {
265
- shutdown: true,
266
- };
267
- this.sendMessage(createRpcSuccessResponse(request.id, result));
268
- return;
269
- }
270
- await this.interruptAndWaitForActiveSubmit();
271
- this.rpcShutdown = true;
272
- this.rejectPendingSteeringSubmits("rpc server is shut down");
273
- this.clearEventCorrelationState();
274
- this.unsubscribeEventListener();
275
- const result = {
276
- shutdown: true,
277
- };
278
- this.sendMessage(createRpcSuccessResponse(request.id, result));
279
- });
280
- }
281
- rejectPendingSteeringSubmits(message) {
282
- const requests = this.pendingSteeringSubmits.splice(0);
283
- for (const request of requests) {
284
- this.sendMessage(createRpcErrorResponse(request.id, RPC_ERROR_CODES.invalidRequest, message));
285
- }
286
- }
287
- sendServerShutdownError(id) {
288
- this.sendMessage(createRpcErrorResponse(id, RPC_ERROR_CODES.invalidRequest, "rpc server is shut down"));
289
- }
290
- sendSubmitBusy(id) {
291
- const message = this.pendingSessionMutations > 0
292
- ? "a mutating session request is in progress"
293
- : "a session turn is already running";
294
- this.sendMessage(createRpcErrorResponse(id, RPC_ERROR_CODES.busy, message));
295
- }
296
- enqueueMutation(handler) {
297
- const run = this.mutationQueue.then(handler);
298
- this.mutationQueue = run.then(() => undefined, () => undefined);
299
- return run;
300
- }
301
- async runSessionMutation(handler) {
302
- this.pendingSessionMutations += 1;
303
- try {
304
- return await this.enqueueMutation(handler);
305
- }
306
- finally {
307
- this.pendingSessionMutations -= 1;
308
- }
309
- }
310
- async interruptAndWaitForActiveSubmit() {
311
- if (!this.activeSubmit && !this.runtime.isTurnRunning) {
312
- return;
313
- }
314
- this.runtime.interruptTurn();
315
- if (!this.activeSubmit) {
316
- return;
317
- }
318
- try {
319
- await this.activeSubmit;
320
- }
321
- catch {
322
- // ignore submit failure while finishing active mutation
323
- }
324
- }
325
- resolveEventRequestId(event) {
326
- if (event.type === "subagent_ui") {
327
- return this.submitRequestByUserHistoryEntryId.get(event.originHistoryEntryId);
328
- }
329
- return this.activeSubmitRequestId;
330
- }
331
- clearEventCorrelationState() {
332
- this.activeSubmitRequestId = undefined;
333
- this.submitRequestByUserHistoryEntryId.clear();
334
- }
335
- unsubscribeEventListener() {
336
- if (!this.unsubscribeEvent) {
337
- return;
338
- }
339
- this.unsubscribeEvent();
340
- this.unsubscribeEvent = undefined;
341
- }
342
- sendMessage(message) {
343
- this.send(serializeRpcMessage(message));
34
+ this.send(serializeSessionProtocolMessage(createSessionProtocolErrorResponse(parsed.id, parsed.error.code, parsed.error.message, parsed.error.data)));
344
35
  }
345
36
  }
346
37
  export async function runRpcServer(options) {
347
38
  const server = new RpcServer({
348
- runtime: options.runtime,
39
+ host: options.host,
349
40
  send: (line) => {
350
41
  options.output.write(`${line}\n`);
351
42
  },
352
- emitReadyOnStart: true,
353
43
  });
354
44
  const lineReader = createInterface({
355
45
  input: options.input,
@@ -403,7 +93,7 @@ export async function runRpcServer(options) {
403
93
  finally {
404
94
  lineReader.off("line", onLine);
405
95
  options.signal?.removeEventListener("abort", onAbort);
406
- await server.shutdown({ interruptActiveSubmit: true });
96
+ await server.shutdown();
407
97
  if (inFlightHandlers.size > 0) {
408
98
  await Promise.allSettled([...inFlightHandlers]);
409
99
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rpc_server.js","sourceRoot":"","sources":["../../../src/core/modes/rpc_server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rpc_server.js","sourceRoot":"","sources":["../../../src/core/modes/rpc_server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ import { createServer } from "node:http";
2
+ import { WebSocketServer } from "ws";
3
+ import { SessionProtocolHandler } from "../../host/session_protocol_handler.js";
4
+ import { createSessionProtocolErrorResponse, parseSessionProtocolRequestLine, serializeSessionProtocolMessage, } from "../../protocol/session_protocol.js";
5
+ export class WebSocketSessionServer {
6
+ host;
7
+ authToken;
8
+ clients = new Set();
9
+ closed = false;
10
+ constructor(options) {
11
+ this.host = options.host;
12
+ this.authToken = options.authToken;
13
+ }
14
+ accept(socket, requestUrl) {
15
+ if (this.closed) {
16
+ socket.close(1012, "server closed");
17
+ return;
18
+ }
19
+ if (!this.isAuthorized(requestUrl)) {
20
+ socket.close(1008, "unauthorized");
21
+ return;
22
+ }
23
+ const state = {
24
+ socket,
25
+ inFlightHandlers: new Set(),
26
+ handler: new SessionProtocolHandler({
27
+ host: this.host,
28
+ send: (message) => {
29
+ this.sendSocketMessage(socket, serializeSessionProtocolMessage(message));
30
+ },
31
+ }),
32
+ };
33
+ this.clients.add(state);
34
+ socket.on("message", (data, isBinary) => {
35
+ if (isBinary) {
36
+ socket.close(1003, "session protocol requires text messages");
37
+ return;
38
+ }
39
+ const handler = this.handleSocketMessage(state, data.toString("utf8"));
40
+ state.inFlightHandlers.add(handler);
41
+ void handler
42
+ .catch(() => {
43
+ if (socket.readyState === socket.OPEN) {
44
+ socket.close(1011, "session protocol request failed");
45
+ }
46
+ })
47
+ .finally(() => {
48
+ state.inFlightHandlers.delete(handler);
49
+ });
50
+ });
51
+ socket.once("close", () => {
52
+ this.clients.delete(state);
53
+ void this.closeClient(state);
54
+ });
55
+ }
56
+ async close() {
57
+ if (this.closed) {
58
+ return;
59
+ }
60
+ this.closed = true;
61
+ const states = [...this.clients];
62
+ this.clients.clear();
63
+ await Promise.allSettled(states.map(async (state) => {
64
+ state.socket.terminate();
65
+ await this.closeClient(state, { mode: "interrupt" });
66
+ }));
67
+ await this.host.shutdown();
68
+ }
69
+ async handleSocketMessage(state, payload) {
70
+ const parsed = parseSessionProtocolRequestLine(payload);
71
+ if (!parsed.ok) {
72
+ this.sendParseFailure(state.socket, parsed);
73
+ return;
74
+ }
75
+ await state.handler.handleRequest(parsed.request);
76
+ }
77
+ async closeClient(state, options = {}) {
78
+ await state.handler.close(options.mode ?? (this.closed ? "interrupt" : "detach"));
79
+ if (options.waitForInFlight !== false && state.inFlightHandlers.size > 0) {
80
+ await Promise.allSettled([...state.inFlightHandlers]);
81
+ }
82
+ }
83
+ sendParseFailure(socket, parsed) {
84
+ this.sendSocketMessage(socket, serializeSessionProtocolMessage(createSessionProtocolErrorResponse(parsed.id, parsed.error.code, parsed.error.message, parsed.error.data)));
85
+ }
86
+ sendSocketMessage(socket, message) {
87
+ if (socket.readyState !== socket.OPEN) {
88
+ return;
89
+ }
90
+ try {
91
+ socket.send(message);
92
+ }
93
+ catch {
94
+ socket.close(1011, "session protocol send failed");
95
+ }
96
+ }
97
+ isAuthorized(requestUrl) {
98
+ if (this.authToken === undefined) {
99
+ return true;
100
+ }
101
+ if (requestUrl === undefined) {
102
+ return false;
103
+ }
104
+ const url = new URL(requestUrl, "ws://localhost");
105
+ return url.searchParams.get("tau_token") === this.authToken;
106
+ }
107
+ }
108
+ export async function runWebSocketSessionServer(options) {
109
+ const httpServer = createServer();
110
+ const socketServer = new WebSocketServer({ server: httpServer });
111
+ const sessionServer = new WebSocketSessionServer({
112
+ host: options.host,
113
+ authToken: options.authToken,
114
+ });
115
+ socketServer.on("connection", (socket, request) => {
116
+ sessionServer.accept(socket, request.url);
117
+ });
118
+ const listeningPromise = new Promise((resolve, reject) => {
119
+ const rejectListening = (error) => {
120
+ httpServer.off("error", rejectListening);
121
+ socketServer.off("error", rejectListening);
122
+ reject(error);
123
+ };
124
+ httpServer.once("error", rejectListening);
125
+ socketServer.once("error", rejectListening);
126
+ httpServer.listen(options.port, options.hostname, () => {
127
+ httpServer.off("error", rejectListening);
128
+ socketServer.off("error", rejectListening);
129
+ const address = httpServer.address();
130
+ if (typeof address === "object" && address !== null) {
131
+ resolve({
132
+ hostname: options.hostname,
133
+ port: address.port,
134
+ });
135
+ return;
136
+ }
137
+ reject(new Error("websocket server did not expose a TCP address"));
138
+ });
139
+ });
140
+ let didStartListening = false;
141
+ let removeAbortListener;
142
+ try {
143
+ const address = await listeningPromise;
144
+ didStartListening = true;
145
+ options.onListening?.(address);
146
+ const stopPromise = new Promise((resolve) => {
147
+ const requestStop = () => resolve();
148
+ if (options.signal) {
149
+ if (options.signal.aborted) {
150
+ resolve();
151
+ return;
152
+ }
153
+ options.signal.addEventListener("abort", requestStop, { once: true });
154
+ removeAbortListener = () => options.signal?.removeEventListener("abort", requestStop);
155
+ }
156
+ });
157
+ await stopPromise;
158
+ }
159
+ finally {
160
+ removeAbortListener?.();
161
+ await sessionServer.close();
162
+ if (didStartListening) {
163
+ await new Promise((resolve, reject) => {
164
+ socketServer.close((socketError) => {
165
+ if (socketError) {
166
+ reject(socketError);
167
+ return;
168
+ }
169
+ httpServer.close((httpError) => {
170
+ if (httpError) {
171
+ reject(httpError);
172
+ return;
173
+ }
174
+ resolve();
175
+ });
176
+ });
177
+ });
178
+ }
179
+ }
180
+ }
181
+ //# sourceMappingURL=websocket_server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket_server.js","sourceRoot":"","sources":["../../../src/core/modes/websocket_server.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ Prioritize accuracy over agreement. If the user's assumption is wrong, say so di
11
11
  const BLOCK_CODER_PREAMBLE = `
12
12
  You are an expert software engineer working alongside the user in their codebase. Your role is to understand their intent and execute: implement features, fix bugs, refactor code, write tests, debug issues, and answer technical questions. The code you write should be indistinguishable from what a skilled teammate would write: it matches existing patterns, style, and conventions exactly.
13
13
 
14
- Be direct and concise. Skip pleasantries and filler. When the user asks for a change, make it; don't narrate what you're about to do or ask for permission unless truly necessary.
14
+ Be direct and concise. Skip pleasantries and filler. When the user asks for a change, make it; brief narration is welcome for non-trivial work, but don't ask for permission unless truly necessary.
15
15
 
16
16
  Prioritize technical accuracy over agreeing with the user. If their assumption is wrong or their approach has issues, say so directly. Investigate before confirming; respectful correction beats false agreement.
17
17
  `.trim();
@@ -52,6 +52,15 @@ const BLOCK_TOOL_USE_GUIDELINES_CODER = `
52
52
 
53
53
  **Safety**: File modification tools require read-write risk level. If permissions don't match, stop and tell the user. For destructive operations (deleting files, dropping data, force-pushing), confirm intent even if the user seems confident.
54
54
  `.trim();
55
+ const BLOCK_CODER_PROGRESS_UPDATES = `
56
+ ### Intermediary updates
57
+
58
+ For non-trivial work, provide brief user-facing updates in the commentary channel at natural checkpoints. They are not final answers; they are a way to keep the user naturally oriented and make longer work easy to follow without leaving long stretches of silence.
59
+
60
+ Treat these updates as a place to think out loud in a calm, casual, companionable way. Explain what you are doing and why in one or two concrete sentences, and include enough context that the user can follow the thread of the work. Good moments include finishing a meaningful exploration chunk, changing direction, finding an important clue, deciding on an approach, or preparing a substantial edit.
61
+
62
+ Keep updates informative and varied, but stay concise. Do not let them become a constant stream or a drumbeat at a fixed cadence, and do not start every update the same way. Never praise your plan by contrasting it with an implied worse alternative, such as "I'll do this carefully instead of rushing" or "I'll update the focused code, not random files." Skip updates for trivial reads, quick answers, or back-to-back small tool calls where the tool UI already makes progress obvious.
63
+ `.trim();
55
64
  const BLOCK_FILE_MENTIONS = `
56
65
  ### File, skill, and agent mentions
57
66
 
@@ -153,6 +162,7 @@ const CODER_SYSTEM_PROMPT = [
153
162
  BLOCK_CODER_PREAMBLE,
154
163
  BLOCK_OUTPUT_STYLE_GUIDELINES,
155
164
  BLOCK_TOOL_USE_GUIDELINES_CODER,
165
+ BLOCK_CODER_PROGRESS_UPDATES,
156
166
  BLOCK_RISK_LEVELS,
157
167
  BLOCK_FILE_MENTIONS,
158
168
  BLOCK_FILE_EDIT_GUIDELINES,