@markusylisiurunen/tau 0.3.49 → 0.3.51

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 (114) hide show
  1. package/README.md +22 -908
  2. package/dist/code_mode/command.js +26 -14
  3. package/dist/code_mode/command.js.map +1 -1
  4. package/dist/code_mode/index.d.ts +2 -1
  5. package/dist/code_mode/index.js +1 -0
  6. package/dist/code_mode/index.js.map +1 -1
  7. package/dist/core/cli.js +0 -11
  8. package/dist/core/cli.js.map +1 -1
  9. package/dist/core/client_tools/command_client_tools.js +236 -151
  10. package/dist/core/client_tools/command_client_tools.js.map +1 -1
  11. package/dist/core/commands/registry.js +4 -4
  12. package/dist/core/commands/registry.js.map +1 -1
  13. package/dist/core/modes/index.js +0 -1
  14. package/dist/core/modes/index.js.map +1 -1
  15. package/dist/core/personas.js +19 -10
  16. package/dist/core/personas.js.map +1 -1
  17. package/dist/core/runtime/runtime_bootstrap.js +14 -9
  18. package/dist/core/runtime/runtime_bootstrap.js.map +1 -1
  19. package/dist/core/static/tau_docs/client-tools.md +428 -0
  20. package/dist/core/static/tau_docs/config-reference.md +422 -0
  21. package/dist/core/static/tau_docs/configuration.md +210 -0
  22. package/dist/core/static/tau_docs/credentials.md +200 -0
  23. package/dist/core/static/tau_docs/getting-started.md +140 -0
  24. package/dist/core/static/tau_docs/history.md +163 -0
  25. package/dist/core/static/tau_docs/index.md +40 -0
  26. package/dist/core/static/tau_docs/manifest.json +28 -0
  27. package/dist/core/static/tau_docs/models.md +198 -0
  28. package/dist/core/static/tau_docs/node-sdk.md +406 -0
  29. package/dist/core/static/tau_docs/nook.md +264 -0
  30. package/dist/core/static/tau_docs/ownership-and-scope.md +103 -0
  31. package/dist/core/static/tau_docs/personas.md +199 -0
  32. package/dist/core/static/tau_docs/prompts-and-project-context.md +181 -0
  33. package/dist/core/static/tau_docs/remote-sessions.md +231 -0
  34. package/dist/core/static/tau_docs/security.md +184 -0
  35. package/dist/core/static/tau_docs/session-protocol-methods.md +618 -0
  36. package/dist/core/static/tau_docs/session-protocol.md +265 -0
  37. package/dist/core/static/tau_docs/sessions.md +224 -0
  38. package/dist/core/static/tau_docs/skills.md +176 -0
  39. package/dist/core/static/tau_docs/subagents.md +203 -0
  40. package/dist/core/static/tau_docs/telegram.md +346 -0
  41. package/dist/core/static/tau_docs/tools.md +203 -0
  42. package/dist/core/static/tau_docs/troubleshooting.md +290 -0
  43. package/dist/core/static/tau_docs/tui.md +222 -0
  44. package/dist/core/telegram/adapter.js +226 -18
  45. package/dist/core/telegram/adapter.js.map +1 -1
  46. package/dist/core/telegram/config.js +1 -1
  47. package/dist/core/telegram/config.js.map +1 -1
  48. package/dist/core/telegram/project_preferences.js +42 -12
  49. package/dist/core/telegram/project_preferences.js.map +1 -1
  50. package/dist/core/telegram/runtime.js +6 -1
  51. package/dist/core/telegram/runtime.js.map +1 -1
  52. package/dist/core/telegram/session_manager.js +54 -7
  53. package/dist/core/telegram/session_manager.js.map +1 -1
  54. package/dist/core/telegram/tts.js +137 -0
  55. package/dist/core/telegram/tts.js.map +1 -0
  56. package/dist/core/tools/catalog.js +3 -1
  57. package/dist/core/tools/catalog.js.map +1 -1
  58. package/dist/core/tools/presentation.js +67 -18
  59. package/dist/core/tools/presentation.js.map +1 -1
  60. package/dist/core/tools/tau_docs.js +115 -0
  61. package/dist/core/tools/tau_docs.js.map +1 -0
  62. package/dist/core/tools/tool_names.js +8 -0
  63. package/dist/core/tools/tool_names.js.map +1 -1
  64. package/dist/core/utils/gemini_speech.js +122 -41
  65. package/dist/core/utils/gemini_speech.js.map +1 -1
  66. package/dist/core/utils/repository.js +19 -0
  67. package/dist/core/utils/repository.js.map +1 -1
  68. package/dist/core/version.js +1 -1
  69. package/dist/host/client_tool_broker.js +74 -35
  70. package/dist/host/client_tool_broker.js.map +1 -1
  71. package/dist/host/local_session_host.js +2 -2
  72. package/dist/host/local_session_host.js.map +1 -1
  73. package/dist/host/session_host.js.map +1 -1
  74. package/dist/host/session_protocol_handler.js +17 -6
  75. package/dist/host/session_protocol_handler.js.map +1 -1
  76. package/dist/main.js +18 -92
  77. package/dist/main.js.map +1 -1
  78. package/dist/protocol/session_protocol.d.ts +23 -2
  79. package/dist/protocol/session_protocol.js +49 -4
  80. package/dist/protocol/session_protocol.js.map +1 -1
  81. package/dist/sdk/client_tool_command.d.ts +41 -13
  82. package/dist/sdk/client_tool_command.js +157 -39
  83. package/dist/sdk/client_tool_command.js.map +1 -1
  84. package/dist/sdk/client_tool_presentation.d.ts +17 -0
  85. package/dist/sdk/client_tool_presentation.js +9 -0
  86. package/dist/sdk/client_tool_presentation.js.map +1 -0
  87. package/dist/sdk/code_mode.js +10 -1
  88. package/dist/sdk/code_mode.js.map +1 -1
  89. package/dist/sdk/index.d.ts +5 -4
  90. package/dist/sdk/index.js +2 -1
  91. package/dist/sdk/index.js.map +1 -1
  92. package/dist/sdk/session.js +28 -9
  93. package/dist/sdk/session.js.map +1 -1
  94. package/dist/sdk/types.d.ts +11 -1
  95. package/dist/transport/errors.d.ts +0 -11
  96. package/dist/transport/errors.js +0 -12
  97. package/dist/transport/errors.js.map +1 -1
  98. package/dist/transport/index.d.ts +1 -3
  99. package/dist/transport/index.js +1 -2
  100. package/dist/transport/index.js.map +1 -1
  101. package/dist/tui/session_chat_app.js +29 -15
  102. package/dist/tui/session_chat_app.js.map +1 -1
  103. package/dist/tui/session_chat_controller.js +13 -64
  104. package/dist/tui/session_chat_controller.js.map +1 -1
  105. package/dist/tui/session_creation_attributes.js +3 -3
  106. package/dist/tui/session_creation_attributes.js.map +1 -1
  107. package/dist/tui/speech_playback.js +3 -3
  108. package/dist/tui/speech_playback.js.map +1 -1
  109. package/package.json +2 -2
  110. package/dist/core/modes/rpc_server.js +0 -105
  111. package/dist/core/modes/rpc_server.js.map +0 -1
  112. package/dist/transport/stdio_session_transport.d.ts +0 -48
  113. package/dist/transport/stdio_session_transport.js +0 -338
  114. package/dist/transport/stdio_session_transport.js.map +0 -1
@@ -1,48 +0,0 @@
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 { SessionProtocolClientToolListener, SessionProtocolDeltaListener, SessionProtocolEphemeralListener, SessionProtocolFailureListener, SessionProtocolPendingUserMessagesListener, SessionProtocolSubagentActivitiesListener, 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 pendingUserMessagesListeners;
10
- private readonly subagentActivitiesListeners;
11
- private readonly clientToolListeners;
12
- private readonly failureListeners;
13
- private readonly pendingRequests;
14
- private readonly readyDeferred;
15
- private readonly exitDeferred;
16
- private readyValue?;
17
- private readonly stdoutBuffer;
18
- private stderrBuffer;
19
- private stderrTruncated;
20
- private connectPromise?;
21
- private closePromise?;
22
- private isConnected;
23
- private isClosed;
24
- private isExited;
25
- private fatalError?;
26
- constructor(process: SessionProtocolSpawnedProcess);
27
- get ready(): SessionProtocolReadyMessage;
28
- connect(initializeParams: SessionProtocolInitializeParams, timeoutMs: number): Promise<void>;
29
- private establishConnection;
30
- onDelta(listener: SessionProtocolDeltaListener): () => void;
31
- onEphemeral(listener: SessionProtocolEphemeralListener): () => void;
32
- onPendingUserMessages(listener: SessionProtocolPendingUserMessagesListener): () => void;
33
- onSubagentActivities(listener: SessionProtocolSubagentActivitiesListener): () => void;
34
- onClientTool(listener: SessionProtocolClientToolListener): () => void;
35
- onFailure(listener: SessionProtocolFailureListener): () => void;
36
- request<M extends SessionProtocolMethod>(method: M, params: SessionProtocolParamsByMethod[M]): Promise<SessionProtocolResultByMethod[M]>;
37
- close(): Promise<void>;
38
- private readonly handleStdoutData;
39
- private readonly handleStderrData;
40
- private readonly handleProcessError;
41
- private readonly handleProcessExit;
42
- private readonly handleProcessClose;
43
- private onProcessTerminated;
44
- private getStderrDiagnostic;
45
- private handleSessionProtocolLine;
46
- private failTransport;
47
- private rejectReadyIfPending;
48
- }
@@ -1,338 +0,0 @@
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, notifySessionProtocolClientToolListeners, notifySessionProtocolDeltaListeners, notifySessionProtocolEphemeralListeners, notifySessionProtocolFailureListeners, notifySessionProtocolPendingUserMessagesListeners, notifySessionProtocolSubagentActivitiesListeners, waitForPromiseOrTimeout, withTimeout, } from "./session_protocol_transport_helpers.js";
5
- const CLOSE_TIMEOUT_MS = 2_000;
6
- const STDERR_DIAGNOSTIC_MAX_BYTES = 64 * 1024;
7
- const STDERR_TRUNCATION_MARKER = "[stderr truncated; showing tail]\n";
8
- const STDERR_TRUNCATION_MARKER_BYTES = Buffer.byteLength(STDERR_TRUNCATION_MARKER, "utf8");
9
- function truncateUtf8Tail(value, maxBytes) {
10
- const buffer = Buffer.from(value, "utf8");
11
- if (buffer.byteLength <= maxBytes) {
12
- return value;
13
- }
14
- let start = buffer.byteLength - maxBytes;
15
- while (start < buffer.byteLength && (buffer[start] & 0xc0) === 0x80) {
16
- start += 1;
17
- }
18
- return buffer.subarray(start).toString("utf8");
19
- }
20
- export class StdioSessionProtocolTransport {
21
- process;
22
- deltaListeners = new Set();
23
- ephemeralListeners = new Set();
24
- pendingUserMessagesListeners = new Set();
25
- subagentActivitiesListeners = new Set();
26
- clientToolListeners = new Set();
27
- failureListeners = new Set();
28
- pendingRequests = new PendingSessionProtocolRequests();
29
- readyDeferred = createDeferred();
30
- exitDeferred = createDeferred();
31
- readyValue;
32
- stdoutBuffer = new LineBuffer();
33
- stderrBuffer = "";
34
- stderrTruncated = false;
35
- connectPromise;
36
- closePromise;
37
- isConnected = false;
38
- isClosed = false;
39
- isExited = false;
40
- fatalError;
41
- constructor(process) {
42
- this.process = process;
43
- this.process.stdout.setEncoding("utf8");
44
- this.process.stderr.setEncoding("utf8");
45
- this.process.stdout.on("data", this.handleStdoutData);
46
- this.process.stderr.on("data", this.handleStderrData);
47
- this.process.on("error", this.handleProcessError);
48
- this.process.on("exit", this.handleProcessExit);
49
- this.process.on("close", this.handleProcessClose);
50
- }
51
- get ready() {
52
- if (!this.readyValue) {
53
- throw new TauTransportError("tau sdk client is not connected");
54
- }
55
- return this.readyValue;
56
- }
57
- async connect(initializeParams, timeoutMs) {
58
- if (this.isClosed) {
59
- throw new TauTransportError("tau sdk client is closed");
60
- }
61
- if (this.fatalError) {
62
- throw this.fatalError;
63
- }
64
- if (this.isConnected) {
65
- return;
66
- }
67
- this.connectPromise ??= this.establishConnection(initializeParams, timeoutMs);
68
- await this.connectPromise;
69
- }
70
- async establishConnection(initializeParams, timeoutMs) {
71
- const ready = await withTimeout(this.readyDeferred.promise, timeoutMs, new TauTransportError(`timed out waiting for session protocol ready message after ${timeoutMs}ms`));
72
- this.readyValue = ready;
73
- await this.request("initialize", initializeParams);
74
- this.isConnected = true;
75
- }
76
- onDelta(listener) {
77
- this.deltaListeners.add(listener);
78
- return () => {
79
- this.deltaListeners.delete(listener);
80
- };
81
- }
82
- onEphemeral(listener) {
83
- this.ephemeralListeners.add(listener);
84
- return () => {
85
- this.ephemeralListeners.delete(listener);
86
- };
87
- }
88
- onPendingUserMessages(listener) {
89
- this.pendingUserMessagesListeners.add(listener);
90
- return () => {
91
- this.pendingUserMessagesListeners.delete(listener);
92
- };
93
- }
94
- onSubagentActivities(listener) {
95
- this.subagentActivitiesListeners.add(listener);
96
- return () => {
97
- this.subagentActivitiesListeners.delete(listener);
98
- };
99
- }
100
- onClientTool(listener) {
101
- this.clientToolListeners.add(listener);
102
- return () => {
103
- this.clientToolListeners.delete(listener);
104
- };
105
- }
106
- onFailure(listener) {
107
- this.failureListeners.add(listener);
108
- return () => {
109
- this.failureListeners.delete(listener);
110
- };
111
- }
112
- request(method, params) {
113
- if (this.isClosed) {
114
- return Promise.reject(new TauTransportError("tau sdk client is closed"));
115
- }
116
- if (this.fatalError) {
117
- return Promise.reject(this.fatalError);
118
- }
119
- let pending;
120
- try {
121
- pending = this.pendingRequests.create(method, params);
122
- }
123
- catch (error) {
124
- return Promise.reject(error);
125
- }
126
- const payload = JSON.stringify(pending.request);
127
- try {
128
- this.process.stdin.write(`${payload}\n`, "utf8", (error) => {
129
- if (error) {
130
- this.failTransport(new TauTransportError("failed to write request to tau rpc process", { cause: error }));
131
- }
132
- });
133
- }
134
- catch (error) {
135
- this.failTransport(new TauTransportError("failed to write request to tau rpc process", { cause: error }));
136
- }
137
- return pending.promise;
138
- }
139
- async close() {
140
- if (this.closePromise) {
141
- return this.closePromise;
142
- }
143
- this.isClosed = true;
144
- const closeError = new TauTransportError("tau sdk client was closed");
145
- this.pendingRequests.rejectAll(closeError);
146
- this.rejectReadyIfPending(closeError);
147
- this.deltaListeners.clear();
148
- this.ephemeralListeners.clear();
149
- this.pendingUserMessagesListeners.clear();
150
- this.subagentActivitiesListeners.clear();
151
- this.clientToolListeners.clear();
152
- this.failureListeners.clear();
153
- this.process.stdout.off("data", this.handleStdoutData);
154
- this.process.stderr.off("data", this.handleStderrData);
155
- this.closePromise = (async () => {
156
- if (!this.isExited) {
157
- try {
158
- this.process.stdin.end();
159
- }
160
- catch {
161
- // ignore transport shutdown errors
162
- }
163
- try {
164
- this.process.kill("SIGTERM");
165
- }
166
- catch {
167
- // ignore transport shutdown errors
168
- }
169
- await waitForExitOrTimeout(this.exitDeferred.promise, CLOSE_TIMEOUT_MS);
170
- if (!this.isExited) {
171
- try {
172
- this.process.kill("SIGKILL");
173
- }
174
- catch {
175
- // ignore transport shutdown errors
176
- }
177
- await waitForExitOrTimeout(this.exitDeferred.promise, CLOSE_TIMEOUT_MS);
178
- }
179
- }
180
- this.process.off("error", this.handleProcessError);
181
- this.process.off("exit", this.handleProcessExit);
182
- this.process.off("close", this.handleProcessClose);
183
- })();
184
- return this.closePromise;
185
- }
186
- handleStdoutData = (chunk) => {
187
- for (const line of this.stdoutBuffer.push(chunk.toString())) {
188
- if (!line) {
189
- continue;
190
- }
191
- this.handleSessionProtocolLine(line);
192
- }
193
- };
194
- handleStderrData = (chunk) => {
195
- const next = `${this.stderrBuffer}${chunk.toString()}`;
196
- const maxTailBytes = STDERR_DIAGNOSTIC_MAX_BYTES - STDERR_TRUNCATION_MARKER_BYTES;
197
- if (this.stderrTruncated || Buffer.byteLength(next, "utf8") > STDERR_DIAGNOSTIC_MAX_BYTES) {
198
- this.stderrBuffer = truncateUtf8Tail(next, maxTailBytes);
199
- this.stderrTruncated = true;
200
- return;
201
- }
202
- this.stderrBuffer = next;
203
- };
204
- handleProcessError = (error) => {
205
- this.failTransport(new TauProcessError("tau rpc process transport failure", {
206
- stderr: this.getStderrDiagnostic(),
207
- cause: error,
208
- }));
209
- };
210
- handleProcessExit = (code, signal) => {
211
- this.onProcessTerminated({ code, signal });
212
- };
213
- handleProcessClose = (code, signal) => {
214
- this.onProcessTerminated({ code, signal });
215
- };
216
- onProcessTerminated(exit) {
217
- if (!this.isExited) {
218
- this.isExited = true;
219
- this.exitDeferred.resolve(exit);
220
- }
221
- if (this.isClosed) {
222
- return;
223
- }
224
- this.isClosed = true;
225
- const message = [
226
- "tau rpc process exited unexpectedly",
227
- `code=${exit.code ?? "null"}`,
228
- `signal=${exit.signal ?? "null"}`,
229
- ].join(" ");
230
- this.failTransport(new TauProcessError(message, {
231
- exitCode: exit.code,
232
- signal: exit.signal,
233
- stderr: this.getStderrDiagnostic(),
234
- }));
235
- }
236
- getStderrDiagnostic() {
237
- return this.stderrTruncated
238
- ? `${STDERR_TRUNCATION_MARKER}${this.stderrBuffer}`
239
- : this.stderrBuffer;
240
- }
241
- handleSessionProtocolLine(line) {
242
- const parsed = parseSessionProtocolOutgoingLine(line);
243
- if (!parsed.ok) {
244
- handleSessionProtocolTransportParseFailure({
245
- failure: parsed,
246
- pendingRequests: this.pendingRequests,
247
- failTransport: (error) => this.failTransport(error),
248
- malformedJsonPeer: "tau rpc process",
249
- invalidPayloadPeer: "tau process",
250
- });
251
- return;
252
- }
253
- const message = parsed.message;
254
- if (message.type === "ready") {
255
- if (!this.readyValue) {
256
- this.readyValue = message;
257
- this.readyDeferred.resolve(message);
258
- }
259
- return;
260
- }
261
- if (message.type === "session.delta") {
262
- notifySessionProtocolDeltaListeners(this.deltaListeners, message, {
263
- ignoreListenerErrors: true,
264
- });
265
- return;
266
- }
267
- if (message.type === "session.ephemeral") {
268
- notifySessionProtocolEphemeralListeners(this.ephemeralListeners, message, {
269
- ignoreListenerErrors: true,
270
- });
271
- return;
272
- }
273
- if (message.type === "session.pendingUserMessages") {
274
- notifySessionProtocolPendingUserMessagesListeners(this.pendingUserMessagesListeners, message, {
275
- ignoreListenerErrors: true,
276
- });
277
- return;
278
- }
279
- if (message.type === "session.subagentActivities") {
280
- notifySessionProtocolSubagentActivitiesListeners(this.subagentActivitiesListeners, message, {
281
- ignoreListenerErrors: true,
282
- });
283
- return;
284
- }
285
- if (message.type === "session.clientTool.call" ||
286
- message.type === "session.clientTool.cancel") {
287
- notifySessionProtocolClientToolListeners(this.clientToolListeners, message, {
288
- ignoreListenerErrors: true,
289
- });
290
- return;
291
- }
292
- handleSessionProtocolTransportResponse(message, this.pendingRequests, (error) => this.failTransport(error));
293
- }
294
- failTransport(error) {
295
- if (this.fatalError) {
296
- return;
297
- }
298
- this.fatalError = error;
299
- notifySessionProtocolFailureListeners(this.failureListeners, error);
300
- this.pendingRequests.rejectAll(error);
301
- this.rejectReadyIfPending(error);
302
- }
303
- rejectReadyIfPending(error) {
304
- if (this.readyValue || !this.connectPromise) {
305
- return;
306
- }
307
- this.readyDeferred.reject(error);
308
- }
309
- }
310
- async function waitForExitOrTimeout(exitPromise, timeoutMs) {
311
- await waitForPromiseOrTimeout(exitPromise, timeoutMs);
312
- }
313
- class LineBuffer {
314
- chunks = [];
315
- push(chunk) {
316
- const lines = [];
317
- let start = 0;
318
- while (true) {
319
- const newlineIndex = chunk.indexOf("\n", start);
320
- if (newlineIndex === -1) {
321
- break;
322
- }
323
- this.chunks.push(chunk.slice(start, newlineIndex));
324
- lines.push(this.flushLine());
325
- start = newlineIndex + 1;
326
- }
327
- if (start < chunk.length) {
328
- this.chunks.push(chunk.slice(start));
329
- }
330
- return lines;
331
- }
332
- flushLine() {
333
- const line = this.chunks.length === 1 ? this.chunks[0] : this.chunks.join("");
334
- this.chunks.length = 0;
335
- return line.trim();
336
- }
337
- }
338
- //# sourceMappingURL=stdio_session_transport.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stdio_session_transport.js","sourceRoot":"","sources":["../../src/transport/stdio_session_transport.ts"],"names":[],"mappings":"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"}