@markusylisiurunen/tau 0.3.27 → 0.3.29

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 (93) hide show
  1. package/README.md +10 -8
  2. package/dist/core/config/runtime.js +5 -1
  3. package/dist/core/config/runtime.js.map +1 -1
  4. package/dist/core/config/runtime_config_snapshot.js +5 -1
  5. package/dist/core/config/runtime_config_snapshot.js.map +1 -1
  6. package/dist/core/config/schema.js.map +1 -1
  7. package/dist/core/diff_review/snapshot.js +3 -3
  8. package/dist/core/diff_review/snapshot.js.map +1 -1
  9. package/dist/core/index.js +0 -4
  10. package/dist/core/index.js.map +1 -1
  11. package/dist/core/runtime/runtime_bootstrap.js +5 -1
  12. package/dist/core/runtime/runtime_bootstrap.js.map +1 -1
  13. package/dist/core/session/direct_bash.js +1 -0
  14. package/dist/core/session/direct_bash.js.map +1 -1
  15. package/dist/core/session/runner.js +1 -0
  16. package/dist/core/session/runner.js.map +1 -1
  17. package/dist/core/session/session_engine.js +48 -12
  18. package/dist/core/session/session_engine.js.map +1 -1
  19. package/dist/core/subagents/control_plane.js +0 -37
  20. package/dist/core/subagents/control_plane.js.map +1 -1
  21. package/dist/core/subagents/subagent_engine.js +5 -8
  22. package/dist/core/subagents/subagent_engine.js.map +1 -1
  23. package/dist/core/telegram/adapter.js +51 -1
  24. package/dist/core/telegram/adapter.js.map +1 -1
  25. package/dist/core/telegram/config.js +0 -8
  26. package/dist/core/telegram/config.js.map +1 -1
  27. package/dist/core/telegram/session_manager.js +128 -49
  28. package/dist/core/telegram/session_manager.js.map +1 -1
  29. package/dist/core/telegram/workspace.js +18 -76
  30. package/dist/core/telegram/workspace.js.map +1 -1
  31. package/dist/core/tools/bash.js +16 -8
  32. package/dist/core/tools/bash.js.map +1 -1
  33. package/dist/core/tools/catalog.js +1 -5
  34. package/dist/core/tools/catalog.js.map +1 -1
  35. package/dist/core/tools/execution_backend.js +81 -153
  36. package/dist/core/tools/execution_backend.js.map +1 -1
  37. package/dist/core/tools/registry.js +0 -3
  38. package/dist/core/tools/registry.js.map +1 -1
  39. package/dist/core/tools/spawn_agent.js +1 -1
  40. package/dist/core/tools/spawn_agent.js.map +1 -1
  41. package/dist/core/tools/terminate_agent.js +5 -11
  42. package/dist/core/tools/terminate_agent.js.map +1 -1
  43. package/dist/core/tools/tool_names.js +0 -8
  44. package/dist/core/tools/tool_names.js.map +1 -1
  45. package/dist/core/tools/wait_for_agents.js +3 -11
  46. package/dist/core/tools/wait_for_agents.js.map +1 -1
  47. package/dist/core/utils/compact.js +53 -11
  48. package/dist/core/utils/compact.js.map +1 -1
  49. package/dist/core/utils/project_files.js +14 -1
  50. package/dist/core/utils/project_files.js.map +1 -1
  51. package/dist/core/utils/user_metadata.js +14 -0
  52. package/dist/core/utils/user_metadata.js.map +1 -1
  53. package/dist/core/version.js +1 -1
  54. package/dist/execution/cloudflare_sandbox_execution_environment.js +155 -112
  55. package/dist/execution/cloudflare_sandbox_execution_environment.js.map +1 -1
  56. package/dist/execution/fly_sprite_execution_environment.js +109 -91
  57. package/dist/execution/fly_sprite_execution_environment.js.map +1 -1
  58. package/dist/execution/sandbox_tool_helpers.js +0 -25
  59. package/dist/execution/sandbox_tool_helpers.js.map +1 -1
  60. package/dist/execution/tool_backend_execution_environment.js +4 -1
  61. package/dist/execution/tool_backend_execution_environment.js.map +1 -1
  62. package/dist/host/local_session_host.js +68 -53
  63. package/dist/host/local_session_host.js.map +1 -1
  64. package/dist/host/session_host.js +5 -0
  65. package/dist/host/session_host.js.map +1 -1
  66. package/dist/host/session_protocol_handler.js +108 -103
  67. package/dist/host/session_protocol_handler.js.map +1 -1
  68. package/dist/protocol/index.d.ts +2 -2
  69. package/dist/protocol/index.js +1 -1
  70. package/dist/protocol/index.js.map +1 -1
  71. package/dist/protocol/session_protocol.d.ts +21 -2
  72. package/dist/protocol/session_protocol.js +114 -28
  73. package/dist/protocol/session_protocol.js.map +1 -1
  74. package/dist/sdk/session.js +51 -2
  75. package/dist/sdk/session.js.map +1 -1
  76. package/dist/sdk/types.d.ts +5 -0
  77. package/dist/tui/session_chat_controller.js +5 -50
  78. package/dist/tui/session_chat_controller.js.map +1 -1
  79. package/dist/tui/session_tool_execution_backend.js +76 -98
  80. package/dist/tui/session_tool_execution_backend.js.map +1 -1
  81. package/dist/tui/ui/subagent_panel.js +0 -13
  82. package/dist/tui/ui/subagent_panel.js.map +1 -1
  83. package/package.json +1 -1
  84. package/dist/core/tools/emit_output.js +0 -58
  85. package/dist/core/tools/emit_output.js.map +0 -1
  86. package/dist/core/tools/grep.js +0 -250
  87. package/dist/core/tools/grep.js.map +0 -1
  88. package/dist/core/tools/list.js +0 -131
  89. package/dist/core/tools/list.js.map +0 -1
  90. package/dist/core/tools/read.js +0 -171
  91. package/dist/core/tools/read.js.map +0 -1
  92. package/dist/tui/ui/restricted_execution.js +0 -203
  93. package/dist/tui/ui/restricted_execution.js.map +0 -1
@@ -1,6 +1,8 @@
1
1
  import type { AssistantMessage, Message, TextContent, ThinkingContent, Tool, ToolCall } from "@earendil-works/pi-ai";
2
- export declare const SESSION_PROTOCOL_VERSION: 2;
3
- export declare const SESSION_PROTOCOL_METHODS: readonly ["initialize", "session.create", "session.list", "session.observe", "session.unobserve", "session.record", "session.submit", "session.queue", "session.steer", "session.cancelPendingMessages", "session.retry", "session.exec", "session.sample", "session.interrupt", "session.snapshot", "session.setReasoning", "session.setPersona", "session.resolvePrompt", "session.autocompletePaths", "session.reload", "session.compact", "session.prune", "session.rewind", "session.terminateSubagent", "session.ephemeral.create", "session.ephemeral.submit", "session.ephemeral.close", "session.clientTool.ack", "session.clientTool.result"];
2
+ export declare const SESSION_PROTOCOL_VERSION: 3;
3
+ export declare const SESSION_PROTOCOL_MAX_EXEC_CAPTURE_BYTES: number;
4
+ export declare const SESSION_PROTOCOL_MAX_EXEC_STDIN_BYTES: number;
5
+ export declare const SESSION_PROTOCOL_METHODS: readonly ["initialize", "session.create", "session.list", "session.observe", "session.unobserve", "session.record", "session.submit", "session.queue", "session.steer", "session.cancelPendingMessages", "session.retry", "session.exec", "session.cancelExec", "session.sample", "session.interrupt", "session.snapshot", "session.setReasoning", "session.setPersona", "session.resolvePrompt", "session.autocompletePaths", "session.reload", "session.compact", "session.prune", "session.rewind", "session.terminateSubagent", "session.ephemeral.create", "session.ephemeral.submit", "session.ephemeral.close", "session.clientTool.ack", "session.clientTool.result"];
4
6
  export type SessionProtocolMethod = (typeof SESSION_PROTOCOL_METHODS)[number];
5
7
  export declare const SESSION_PROTOCOL_ERROR_CODES: {
6
8
  readonly parseError: "parse_error";
@@ -70,9 +72,17 @@ export type SessionProtocolRecordParams = SessionProtocolSessionIdParams & {
70
72
  };
71
73
  export type SessionProtocolRetryParams = SessionProtocolSessionIdParams;
72
74
  export type SessionProtocolExecParams = SessionProtocolSessionIdParams & {
75
+ execId: string;
73
76
  command: string;
77
+ args?: string[];
78
+ env?: Record<string, string>;
79
+ stdinBase64?: string;
74
80
  cwd?: string;
75
81
  timeoutMs?: number;
82
+ maxCaptureBytes?: number;
83
+ };
84
+ export type SessionProtocolCancelExecParams = SessionProtocolSessionIdParams & {
85
+ execId: string;
76
86
  };
77
87
  export type SessionProtocolSampleContext = {
78
88
  systemPrompt: string;
@@ -159,6 +169,7 @@ export type SessionProtocolParamsByMethod = {
159
169
  "session.cancelPendingMessages": SessionProtocolCancelPendingMessagesParams;
160
170
  "session.retry": SessionProtocolRetryParams;
161
171
  "session.exec": SessionProtocolExecParams;
172
+ "session.cancelExec": SessionProtocolCancelExecParams;
162
173
  "session.sample": SessionProtocolSampleParams;
163
174
  "session.interrupt": SessionProtocolSessionIdParams;
164
175
  "session.snapshot": SessionProtocolSessionIdParams;
@@ -236,6 +247,12 @@ export type SessionProtocolExecResult = {
236
247
  stderr: string;
237
248
  exitCode: number | null;
238
249
  truncated: boolean;
250
+ timedOut: boolean;
251
+ aborted: boolean;
252
+ closeSignal: string | null;
253
+ };
254
+ export type SessionProtocolCancelExecResult = {
255
+ cancelled: boolean;
239
256
  };
240
257
  export type SessionProtocolSampleResult = {
241
258
  message: AssistantMessage;
@@ -550,6 +567,7 @@ export type SessionProtocolResultByMethod = {
550
567
  "session.cancelPendingMessages": SessionProtocolCancelPendingMessagesResult;
551
568
  "session.retry": SessionProtocolRetryResult;
552
569
  "session.exec": SessionProtocolExecResult;
570
+ "session.cancelExec": SessionProtocolCancelExecResult;
553
571
  "session.sample": SessionProtocolSampleResult;
554
572
  "session.interrupt": SessionProtocolInterruptResult;
555
573
  "session.snapshot": SessionProtocolSnapshot;
@@ -797,6 +815,7 @@ export declare function validateSessionProtocolParams(method: "session.steer", p
797
815
  export declare function validateSessionProtocolParams(method: "session.cancelPendingMessages", params: unknown): SessionProtocolParamsValidationResult<SessionProtocolCancelPendingMessagesParams>;
798
816
  export declare function validateSessionProtocolParams(method: "session.retry", params: unknown): SessionProtocolParamsValidationResult<SessionProtocolRetryParams>;
799
817
  export declare function validateSessionProtocolParams(method: "session.exec", params: unknown): SessionProtocolParamsValidationResult<SessionProtocolExecParams>;
818
+ export declare function validateSessionProtocolParams(method: "session.cancelExec", params: unknown): SessionProtocolParamsValidationResult<SessionProtocolCancelExecParams>;
800
819
  export declare function validateSessionProtocolParams(method: "session.sample", params: unknown): SessionProtocolParamsValidationResult<SessionProtocolSampleParams>;
801
820
  export declare function validateSessionProtocolParams(method: "session.interrupt", params: unknown): SessionProtocolParamsValidationResult<SessionProtocolSessionIdParams>;
802
821
  export declare function validateSessionProtocolParams(method: "session.snapshot", params: unknown): SessionProtocolParamsValidationResult<SessionProtocolSessionIdParams>;
@@ -1,5 +1,7 @@
1
1
  import { z } from "zod";
2
- export const SESSION_PROTOCOL_VERSION = 2;
2
+ export const SESSION_PROTOCOL_VERSION = 3;
3
+ export const SESSION_PROTOCOL_MAX_EXEC_CAPTURE_BYTES = 24 * 1024 * 1024;
4
+ export const SESSION_PROTOCOL_MAX_EXEC_STDIN_BYTES = 16 * 1024 * 1024;
3
5
  export const SESSION_PROTOCOL_METHODS = [
4
6
  "initialize",
5
7
  "session.create",
@@ -13,6 +15,7 @@ export const SESSION_PROTOCOL_METHODS = [
13
15
  "session.cancelPendingMessages",
14
16
  "session.retry",
15
17
  "session.exec",
18
+ "session.cancelExec",
16
19
  "session.sample",
17
20
  "session.interrupt",
18
21
  "session.snapshot",
@@ -83,6 +86,47 @@ const nonEmptyStringSchema = z
83
86
  .refine((value) => value.trim().length > 0);
84
87
  const sessionProtocolRequestIdSchema = nonEmptyStringSchema;
85
88
  const nullableSessionProtocolRequestIdSchema = sessionProtocolRequestIdSchema.nullable();
89
+ const absolutePathSchema = nonEmptyStringSchema.refine((value) => value.startsWith("/"));
90
+ const environmentVariableNameSchema = z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/);
91
+ const environmentVariableValueSchema = z.string().refine((value) => !value.includes("\0"));
92
+ const environmentVariablesSchema = z
93
+ .record(environmentVariableNameSchema, environmentVariableValueSchema)
94
+ .refine((value) => !("HOME" in value), "HOME is controlled by the execution environment");
95
+ const processArgumentsSchema = z
96
+ .array(z.string())
97
+ .refine((values) => values.every((value) => !value.includes("\0")));
98
+ const nonEmptyProcessStringSchema = nonEmptyStringSchema.refine((value) => !value.includes("\0"));
99
+ const base64Schema = z.string().refine(isValidBase64, "must be valid base64");
100
+ const boundedExecStdinBase64Schema = base64Schema
101
+ .max(4 * Math.ceil(SESSION_PROTOCOL_MAX_EXEC_STDIN_BYTES / 3))
102
+ .refine((value) => decodedBase64ByteLength(value) <= SESSION_PROTOCOL_MAX_EXEC_STDIN_BYTES, "decoded content exceeds maximum size");
103
+ function isValidBase64(value) {
104
+ if (value.length % 4 !== 0)
105
+ return false;
106
+ const padding = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
107
+ const contentLength = value.length - padding;
108
+ for (let index = 0; index < contentLength; index += 1) {
109
+ const code = value.charCodeAt(index);
110
+ const valid = (code >= 65 && code <= 90) ||
111
+ (code >= 97 && code <= 122) ||
112
+ (code >= 48 && code <= 57) ||
113
+ code === 43 ||
114
+ code === 47;
115
+ if (!valid)
116
+ return false;
117
+ }
118
+ for (let index = contentLength; index < value.length; index += 1) {
119
+ if (value.charCodeAt(index) !== 61)
120
+ return false;
121
+ }
122
+ return true;
123
+ }
124
+ function decodedBase64ByteLength(value) {
125
+ if (!value)
126
+ return 0;
127
+ const padding = value.endsWith("==") ? 2 : value.endsWith("=") ? 1 : 0;
128
+ return (value.length * 3) / 4 - padding;
129
+ }
86
130
  const modelTextContentSchema = z
87
131
  .object({
88
132
  type: z.literal("text"),
@@ -306,9 +350,25 @@ const sessionProtocolRecordParamsSchema = sessionProtocolUserMessageParamsSchema
306
350
  const sessionProtocolExecParamsSchema = z
307
351
  .object({
308
352
  sessionId: nonEmptyStringSchema,
309
- command: nonEmptyStringSchema,
310
- cwd: nonEmptyStringSchema.optional(),
353
+ execId: nonEmptyStringSchema,
354
+ command: nonEmptyProcessStringSchema,
355
+ args: processArgumentsSchema.optional(),
356
+ env: environmentVariablesSchema.optional(),
357
+ stdinBase64: boundedExecStdinBase64Schema.optional(),
358
+ cwd: nonEmptyProcessStringSchema.optional(),
311
359
  timeoutMs: z.number().int().positive().optional(),
360
+ maxCaptureBytes: z
361
+ .number()
362
+ .int()
363
+ .positive()
364
+ .max(SESSION_PROTOCOL_MAX_EXEC_CAPTURE_BYTES)
365
+ .optional(),
366
+ })
367
+ .strip();
368
+ const sessionProtocolCancelExecParamsSchema = z
369
+ .object({
370
+ sessionId: nonEmptyStringSchema,
371
+ execId: nonEmptyStringSchema,
312
372
  })
313
373
  .strip();
314
374
  const sessionProtocolReasoningEffortSchema = z.enum([
@@ -456,10 +516,6 @@ const sessionProtocolClientToolResultParamsSchema = z.discriminatedUnion("ok", [
456
516
  })
457
517
  .strip(),
458
518
  ]);
459
- const absolutePathSchema = nonEmptyStringSchema.refine((value) => value.startsWith("/"));
460
- const environmentVariableNameSchema = z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/);
461
- const environmentVariableValueSchema = z.string().refine((value) => !value.includes("\0"));
462
- const environmentVariablesSchema = z.record(environmentVariableNameSchema, environmentVariableValueSchema);
463
519
  const sessionProtocolLocalExecutionEnvironmentInputSchema = z
464
520
  .object({
465
521
  kind: z.literal("local"),
@@ -1257,6 +1313,14 @@ const sessionProtocolExecResultSchema = z
1257
1313
  stderr: z.string(),
1258
1314
  exitCode: z.number().int().nullable(),
1259
1315
  truncated: z.boolean(),
1316
+ timedOut: z.boolean(),
1317
+ aborted: z.boolean(),
1318
+ closeSignal: z.string().nullable(),
1319
+ })
1320
+ .strip();
1321
+ const sessionProtocolCancelExecResultSchema = z
1322
+ .object({
1323
+ cancelled: z.boolean(),
1260
1324
  })
1261
1325
  .strip();
1262
1326
  const sessionProtocolSampleResultSchema = z
@@ -1868,6 +1932,8 @@ export function validateSessionProtocolParams(method, params) {
1868
1932
  return validateUserMessageParams(method, params);
1869
1933
  case "session.exec":
1870
1934
  return validateExecParams(params);
1935
+ case "session.cancelExec":
1936
+ return validateCancelExecParams(params);
1871
1937
  case "session.sample":
1872
1938
  return validateSampleParams(params);
1873
1939
  case "session.list":
@@ -1959,6 +2025,8 @@ export function validateSessionProtocolResult(method, result) {
1959
2025
  return validateResult(method, result, sessionProtocolRetryResultSchema);
1960
2026
  case "session.exec":
1961
2027
  return validateResult(method, result, sessionProtocolExecResultSchema);
2028
+ case "session.cancelExec":
2029
+ return validateResult(method, result, sessionProtocolCancelExecResultSchema);
1962
2030
  case "session.sample":
1963
2031
  return validateResult(method, result, sessionProtocolSampleResultSchema);
1964
2032
  case "session.interrupt":
@@ -2064,24 +2132,40 @@ function validateExecParams(params) {
2064
2132
  ? "session.exec params must be an object"
2065
2133
  : hasIssue(parsed.error, ["sessionId"])
2066
2134
  ? "session.exec params.sessionId must be a non-empty string"
2067
- : hasIssue(parsed.error, ["command"])
2068
- ? "session.exec params.command must be a non-empty string"
2069
- : hasIssue(parsed.error, ["cwd"])
2070
- ? "session.exec params.cwd must be a non-empty string when provided"
2071
- : hasIssue(parsed.error, ["timeoutMs"])
2072
- ? "session.exec params.timeoutMs must be a positive integer when provided"
2073
- : `session.exec params are invalid: ${formatZodError(parsed.error)}`;
2135
+ : hasIssue(parsed.error, ["execId"])
2136
+ ? "session.exec params.execId must be a non-empty string"
2137
+ : hasIssue(parsed.error, ["command"])
2138
+ ? "session.exec params.command must be a non-empty string without null bytes"
2139
+ : hasIssue(parsed.error, ["args"])
2140
+ ? "session.exec params.args must be an array of strings without null bytes when provided"
2141
+ : hasIssue(parsed.error, ["env"])
2142
+ ? "session.exec params.env must use valid environment variable names and string values without null bytes and cannot override HOME"
2143
+ : hasIssue(parsed.error, ["stdinBase64"])
2144
+ ? `session.exec params.stdinBase64 must be valid base64 encoding at most ${SESSION_PROTOCOL_MAX_EXEC_STDIN_BYTES} bytes`
2145
+ : hasIssue(parsed.error, ["cwd"])
2146
+ ? "session.exec params.cwd must be a non-empty string without null bytes when provided"
2147
+ : hasIssue(parsed.error, ["timeoutMs"])
2148
+ ? "session.exec params.timeoutMs must be a positive integer when provided"
2149
+ : hasIssue(parsed.error, ["maxCaptureBytes"])
2150
+ ? `session.exec params.maxCaptureBytes must be a positive integer no greater than ${SESSION_PROTOCOL_MAX_EXEC_CAPTURE_BYTES} when provided`
2151
+ : `session.exec params are invalid: ${formatZodError(parsed.error)}`;
2074
2152
  return invalidParams(message);
2075
2153
  }
2076
- return {
2077
- ok: true,
2078
- value: {
2079
- sessionId: parsed.data.sessionId,
2080
- command: parsed.data.command,
2081
- ...(parsed.data.cwd !== undefined ? { cwd: parsed.data.cwd } : {}),
2082
- ...(parsed.data.timeoutMs !== undefined ? { timeoutMs: parsed.data.timeoutMs } : {}),
2083
- },
2084
- };
2154
+ return { ok: true, value: parsed.data };
2155
+ }
2156
+ function validateCancelExecParams(params) {
2157
+ const parsed = sessionProtocolCancelExecParamsSchema.safeParse(params);
2158
+ if (!parsed.success) {
2159
+ const message = hasIssue(parsed.error, [], "invalid_type")
2160
+ ? "session.cancelExec params must be an object"
2161
+ : hasIssue(parsed.error, ["sessionId"])
2162
+ ? "session.cancelExec params.sessionId must be a non-empty string"
2163
+ : hasIssue(parsed.error, ["execId"])
2164
+ ? "session.cancelExec params.execId must be a non-empty string"
2165
+ : `session.cancelExec params are invalid: ${formatZodError(parsed.error)}`;
2166
+ return invalidParams(message);
2167
+ }
2168
+ return { ok: true, value: parsed.data };
2085
2169
  }
2086
2170
  function validateSampleParams(params) {
2087
2171
  const parsed = sessionProtocolSampleParamsSchema.safeParse(params);
@@ -2371,11 +2455,13 @@ function validateCreateParams(params) {
2371
2455
  ? "session.create params.executionEnvironment.kind must be 'local', 'cloudflare-sandbox', or 'fly-sprite'"
2372
2456
  : hasIssue(parsed.error, ["executionEnvironment", "cwd"])
2373
2457
  ? "session.create params.executionEnvironment.cwd must be an absolute path"
2374
- : hasIssue(parsed.error, ["personaId"])
2375
- ? "session.create params.personaId must be a non-empty string"
2376
- : hasIssue(parsed.error, ["reasoning"])
2377
- ? "session.create params.reasoning must be one of none, minimal, low, medium, high, xhigh, or max"
2378
- : `session.create params are invalid: ${formatZodError(parsed.error)}`;
2458
+ : hasIssue(parsed.error, ["executionEnvironment", "env"])
2459
+ ? "session.create params.executionEnvironment.env must use valid environment variable names and string values without null bytes and cannot override HOME"
2460
+ : hasIssue(parsed.error, ["personaId"])
2461
+ ? "session.create params.personaId must be a non-empty string"
2462
+ : hasIssue(parsed.error, ["reasoning"])
2463
+ ? "session.create params.reasoning must be one of none, minimal, low, medium, high, xhigh, or max"
2464
+ : `session.create params are invalid: ${formatZodError(parsed.error)}`;
2379
2465
  return invalidParams(message);
2380
2466
  }
2381
2467
  return {