@markusylisiurunen/tau 0.2.38 → 0.2.40

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 (36) hide show
  1. package/README.md +63 -2
  2. package/dist/core/async/cli.js +508 -0
  3. package/dist/core/async/cli.js.map +1 -0
  4. package/dist/core/async/http_protocol.js +60 -0
  5. package/dist/core/async/http_protocol.js.map +1 -0
  6. package/dist/core/async/http_server.js +260 -0
  7. package/dist/core/async/http_server.js.map +1 -0
  8. package/dist/core/async/index.js +8 -0
  9. package/dist/core/async/index.js.map +1 -0
  10. package/dist/core/async/server_config.js +282 -0
  11. package/dist/core/async/server_config.js.map +1 -0
  12. package/dist/core/async/session_manager.js +431 -0
  13. package/dist/core/async/session_manager.js.map +1 -0
  14. package/dist/core/async/telegram.js +560 -0
  15. package/dist/core/async/telegram.js.map +1 -0
  16. package/dist/core/async/workspace.js +90 -0
  17. package/dist/core/async/workspace.js.map +1 -0
  18. package/dist/core/cli.js +2 -0
  19. package/dist/core/cli.js.map +1 -1
  20. package/dist/core/config/index.js.map +1 -1
  21. package/dist/core/config/schema.js +199 -0
  22. package/dist/core/config/schema.js.map +1 -1
  23. package/dist/core/index.js +1 -0
  24. package/dist/core/index.js.map +1 -1
  25. package/dist/core/platform_support.js +7 -0
  26. package/dist/core/platform_support.js.map +1 -0
  27. package/dist/core/utils/type_guards.js +4 -0
  28. package/dist/core/utils/type_guards.js.map +1 -0
  29. package/dist/core/version.js +1 -1
  30. package/dist/main.js +30 -1
  31. package/dist/main.js.map +1 -1
  32. package/dist/starter/prompts/plan.md +1 -53
  33. package/dist/starter/skills/plan/SKILL.md +53 -0
  34. package/dist/tui/clipboard.js +81 -8
  35. package/dist/tui/clipboard.js.map +1 -1
  36. package/package.json +2 -1
package/README.md CHANGED
@@ -88,10 +88,39 @@ tau can run without the TUI via NDJSON RPC over stdin/stdout:
88
88
  tau rpc --persona gpt-5.2-coder --risk read-only
89
89
  ```
90
90
 
91
- RPC mode reuses the same startup config/persona/risk/sandbox loading as interactive mode. stdin/stdout are reserved for protocol traffic in this mode (piped stdin is **not** treated as an initial user message).
91
+ RPC mode reuses the same startup config/persona/risk/sandbox loading as interactive mode. stdin/stdout are reserved for protocol traffic in this mode (piped stdin is **not** treated as an initial user message). `--caffeinated` is a macOS-only TUI flag and is rejected in RPC mode.
92
92
 
93
93
  for protocol details and examples, see [docs/rpc.md](docs/rpc.md).
94
94
 
95
+ ## async daemon (http + telegram)
96
+
97
+ tau also supports an async daemon for queued/background sessions:
98
+
99
+ ```sh
100
+ tau async daemon --config-file <path>
101
+ ```
102
+
103
+ client command surface:
104
+
105
+ ```sh
106
+ tau async --project <id> <prompt...>
107
+ tau async <prompt...>
108
+ tau async -- <prompt...>
109
+ tau async list
110
+ tau async status <id>
111
+ tau async logs <id>
112
+ tau async send <id> <text...>
113
+ tau async cancel <id>
114
+ ```
115
+
116
+ project id for `tau async <prompt...>` resolves from `--project <id>` first, then
117
+ `async.client.defaultProjectId` from config.
118
+
119
+ use `tau async -- <prompt...>` when prompt text starts with a reserved command word (for example,
120
+ `list`).
121
+
122
+ for daemon/api/telegram details, see [docs/async.md](docs/async.md).
123
+
95
124
  ## sdk usage (node)
96
125
 
97
126
  tau also ships a Node SDK at `@markusylisiurunen/tau/sdk` that talks to the same rpc subprocess (`tau rpc`) behind the scenes.
@@ -146,7 +175,7 @@ note that there is no confirmation step before tool execution. the model runs co
146
175
 
147
176
  ## getting started
148
177
 
149
- tau requires Node.js 24.x and runs on macOS.
178
+ tau requires Node.js 24.x and runs on macOS and Linux (Windows is unsupported).
150
179
 
151
180
  for development from source:
152
181
 
@@ -441,6 +470,38 @@ if `disableBuiltinPersonas` is set to `true`, tau will not load built-in persona
441
470
 
442
471
  the `sandbox` field configures docker sandboxing. `sandbox.image` is required when you start tau with `--sandbox`. `sandbox.mountPath` defaults to `/workspace`. `sandbox.pruneAfterHours` controls when old containers are auto-pruned (default `72`). `sandbox.extraDockerArgs` lets you pass additional `docker run` flags. `sandbox.environmentInfo` (optional) is injected into the system prompt to describe the container environment to the model.
443
472
 
473
+ the `async` field in normal tau config is client-side only:
474
+
475
+ - `async.client.defaultTarget` + `async.client.targets`: client-side URL/token target definitions for `tau async ...` commands.
476
+ - `async.client.defaultProjectId`: default project id used by `tau async <prompt...>` when `--project` is omitted.
477
+
478
+ example (`~/.config/tau/config.json` or `.tau/config.json`):
479
+
480
+ ```json
481
+ {
482
+ "async": {
483
+ "client": {
484
+ "defaultTarget": "local",
485
+ "defaultProjectId": "tau",
486
+ "targets": {
487
+ "local": {
488
+ "url": "http://127.0.0.1:7788",
489
+ "token": "replace-me"
490
+ }
491
+ }
492
+ }
493
+ }
494
+ }
495
+ ```
496
+
497
+ daemon-side async settings are in a separate config file passed to:
498
+
499
+ ```sh
500
+ tau async daemon --config-file <path>
501
+ ```
502
+
503
+ see [docs/async.md](docs/async.md) for daemon config schema (`host`, `port`, `authToken`, `telegram`, `projects`, `workspaceRoot`) and GitHub repo requirements (`owner/repo`, cloned via `gh repo clone`).
504
+
444
505
  ### project bash commands
445
506
 
446
507
  define shortcuts for common shell commands in any in-scope config file (`~/.config/tau/config.json` when cwd is under home, or `.tau/config.json` in the cwd ancestry). entries merge by `id` with the most specific level winning:
@@ -0,0 +1,508 @@
1
+ import { loadConfig } from "../config/schema.js";
2
+ import { startAsyncHttpServer } from "./http_server.js";
3
+ import { AsyncDaemonConfigError, loadAsyncDaemonConfig } from "./server_config.js";
4
+ import { createAsyncSessionManager } from "./session_manager.js";
5
+ import { startAsyncTelegramAdapter } from "./telegram.js";
6
+ export class AsyncCliError extends Error {
7
+ constructor(message) {
8
+ super(message);
9
+ this.name = "AsyncCliError";
10
+ }
11
+ }
12
+ function parseValue(arg, argv, index) {
13
+ const eqIndex = arg.indexOf("=");
14
+ if (eqIndex !== -1) {
15
+ const value = arg.slice(eqIndex + 1).trim();
16
+ if (!value) {
17
+ throw new AsyncCliError(`missing value for ${arg.slice(0, eqIndex)}`);
18
+ }
19
+ return { value, nextIndex: index };
20
+ }
21
+ const next = argv[index + 1];
22
+ if (!next || next.startsWith("-")) {
23
+ throw new AsyncCliError(`missing value for ${arg}`);
24
+ }
25
+ const value = next.trim();
26
+ if (!value) {
27
+ throw new AsyncCliError(`missing value for ${arg}`);
28
+ }
29
+ return { value, nextIndex: index + 1 };
30
+ }
31
+ function parseAsyncArgs(argv) {
32
+ let help = false;
33
+ let projectId;
34
+ let targetId;
35
+ let url;
36
+ let token;
37
+ let configFilePath;
38
+ let forcePrompt = false;
39
+ const positional = [];
40
+ for (let i = 0; i < argv.length; i += 1) {
41
+ const arg = argv[i];
42
+ if (forcePrompt) {
43
+ positional.push(arg);
44
+ continue;
45
+ }
46
+ if (arg === "--") {
47
+ forcePrompt = true;
48
+ continue;
49
+ }
50
+ if (arg === "--help" || arg === "-h") {
51
+ help = true;
52
+ continue;
53
+ }
54
+ if (arg === "--project" || arg.startsWith("--project=")) {
55
+ const parsed = parseValue(arg, argv, i);
56
+ i = parsed.nextIndex;
57
+ projectId = parsed.value;
58
+ continue;
59
+ }
60
+ if (arg === "--target" || arg.startsWith("--target=")) {
61
+ const parsed = parseValue(arg, argv, i);
62
+ i = parsed.nextIndex;
63
+ targetId = parsed.value;
64
+ continue;
65
+ }
66
+ if (arg === "--url" || arg.startsWith("--url=")) {
67
+ const parsed = parseValue(arg, argv, i);
68
+ i = parsed.nextIndex;
69
+ url = parsed.value;
70
+ continue;
71
+ }
72
+ if (arg === "--token" || arg.startsWith("--token=")) {
73
+ const parsed = parseValue(arg, argv, i);
74
+ i = parsed.nextIndex;
75
+ token = parsed.value;
76
+ continue;
77
+ }
78
+ if (arg === "--config-file" || arg.startsWith("--config-file=")) {
79
+ const parsed = parseValue(arg, argv, i);
80
+ i = parsed.nextIndex;
81
+ configFilePath = parsed.value;
82
+ continue;
83
+ }
84
+ if (arg.startsWith("-")) {
85
+ throw new AsyncCliError(`unknown option: ${arg}`);
86
+ }
87
+ positional.push(arg);
88
+ }
89
+ const toCreateArgs = () => {
90
+ const prompt = positional.join(" ").trim();
91
+ if (!prompt) {
92
+ throw new AsyncCliError("missing prompt text");
93
+ }
94
+ return {
95
+ help,
96
+ command: "create",
97
+ prompt,
98
+ projectId,
99
+ targetId,
100
+ url,
101
+ token,
102
+ configFilePath,
103
+ };
104
+ };
105
+ const first = positional[0];
106
+ if (!first) {
107
+ if (help) {
108
+ return { help: true, command: "list", projectId, targetId, url, token, configFilePath };
109
+ }
110
+ throw new AsyncCliError("missing async command or prompt");
111
+ }
112
+ if (forcePrompt) {
113
+ return toCreateArgs();
114
+ }
115
+ if (first === "daemon") {
116
+ if (positional.length === 1) {
117
+ return { help, command: "daemon", projectId, targetId, url, token, configFilePath };
118
+ }
119
+ return toCreateArgs();
120
+ }
121
+ if (first === "list") {
122
+ if (positional.length === 1) {
123
+ return { help, command: "list", projectId, targetId, url, token, configFilePath };
124
+ }
125
+ return toCreateArgs();
126
+ }
127
+ if (first === "status") {
128
+ if (positional.length === 1) {
129
+ throw new AsyncCliError("missing session id for status");
130
+ }
131
+ if (positional.length === 2) {
132
+ const sessionId = positional[1]?.trim();
133
+ if (!sessionId) {
134
+ throw new AsyncCliError("missing session id for status");
135
+ }
136
+ return {
137
+ help,
138
+ command: "status",
139
+ sessionId,
140
+ projectId,
141
+ targetId,
142
+ url,
143
+ token,
144
+ configFilePath,
145
+ };
146
+ }
147
+ return toCreateArgs();
148
+ }
149
+ if (first === "logs") {
150
+ if (positional.length === 1) {
151
+ throw new AsyncCliError("missing session id for logs");
152
+ }
153
+ if (positional.length === 2) {
154
+ const sessionId = positional[1]?.trim();
155
+ if (!sessionId) {
156
+ throw new AsyncCliError("missing session id for logs");
157
+ }
158
+ return {
159
+ help,
160
+ command: "logs",
161
+ sessionId,
162
+ projectId,
163
+ targetId,
164
+ url,
165
+ token,
166
+ configFilePath,
167
+ };
168
+ }
169
+ return toCreateArgs();
170
+ }
171
+ if (first === "send") {
172
+ if (positional.length === 1) {
173
+ throw new AsyncCliError("missing session id for send");
174
+ }
175
+ const sessionId = positional[1]?.trim();
176
+ if (!sessionId) {
177
+ throw new AsyncCliError("missing session id for send");
178
+ }
179
+ if (positional.length === 2) {
180
+ throw new AsyncCliError("missing message text for send");
181
+ }
182
+ const text = positional.slice(2).join(" ").trim();
183
+ if (!text) {
184
+ throw new AsyncCliError("missing message text for send");
185
+ }
186
+ return {
187
+ help,
188
+ command: "send",
189
+ sessionId,
190
+ text,
191
+ projectId,
192
+ targetId,
193
+ url,
194
+ token,
195
+ configFilePath,
196
+ };
197
+ }
198
+ if (first === "cancel") {
199
+ if (positional.length === 1) {
200
+ throw new AsyncCliError("missing session id for cancel");
201
+ }
202
+ if (positional.length === 2) {
203
+ const sessionId = positional[1]?.trim();
204
+ if (!sessionId) {
205
+ throw new AsyncCliError("missing session id for cancel");
206
+ }
207
+ return {
208
+ help,
209
+ command: "cancel",
210
+ sessionId,
211
+ projectId,
212
+ targetId,
213
+ url,
214
+ token,
215
+ configFilePath,
216
+ };
217
+ }
218
+ return toCreateArgs();
219
+ }
220
+ return toCreateArgs();
221
+ }
222
+ function getTrimmedEnvValue(key, env) {
223
+ const value = env[key];
224
+ if (typeof value !== "string") {
225
+ return undefined;
226
+ }
227
+ const trimmed = value.trim();
228
+ return trimmed || undefined;
229
+ }
230
+ function resolveProjectId(args, config) {
231
+ const configured = config.async?.client?.defaultProjectId;
232
+ const projectId = args.projectId?.trim() || configured?.trim();
233
+ if (!projectId) {
234
+ throw new AsyncCliError("missing project id. use --project <id> or set async.client.defaultProjectId");
235
+ }
236
+ return projectId;
237
+ }
238
+ function resolveTarget(config, args) {
239
+ const targets = config.async?.client?.targets ?? {};
240
+ const configuredDefault = config.async?.client?.defaultTarget;
241
+ const targetIds = Object.keys(targets);
242
+ let selectedTargetId = args.targetId;
243
+ if (!selectedTargetId && (args.url === undefined || args.token === undefined)) {
244
+ selectedTargetId = configuredDefault ?? (targetIds.length === 1 ? targetIds[0] : undefined);
245
+ }
246
+ const selectedTarget = selectedTargetId ? targets[selectedTargetId] : undefined;
247
+ if (selectedTargetId && !selectedTarget) {
248
+ throw new AsyncCliError(`unknown async target '${selectedTargetId}'`);
249
+ }
250
+ const url = args.url ?? selectedTarget?.url;
251
+ const token = args.token ?? selectedTarget?.token;
252
+ const timeoutMs = selectedTarget?.timeoutMs;
253
+ if (!url) {
254
+ throw new AsyncCliError("missing async target url. set --url or config.async.client.targets");
255
+ }
256
+ if (!token) {
257
+ throw new AsyncCliError("missing async target token. set --token or config.async.client.targets");
258
+ }
259
+ return { url, token, timeoutMs };
260
+ }
261
+ function buildUrl(baseUrl, path) {
262
+ const base = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
263
+ return new URL(path.startsWith("/") ? path.slice(1) : path, base).toString();
264
+ }
265
+ async function requestJson(args) {
266
+ const controller = new AbortController();
267
+ const timeoutMs = args.target.timeoutMs ?? 30_000;
268
+ const timeout = setTimeout(() => {
269
+ controller.abort();
270
+ }, timeoutMs);
271
+ timeout.unref?.();
272
+ try {
273
+ const response = await args.fetchImpl(buildUrl(args.target.url, args.path), {
274
+ method: args.method,
275
+ headers: {
276
+ authorization: `Bearer ${args.target.token}`,
277
+ accept: "application/json",
278
+ ...(args.body === undefined
279
+ ? {}
280
+ : {
281
+ "content-type": "application/json",
282
+ }),
283
+ },
284
+ ...(args.body === undefined ? {} : { body: JSON.stringify(args.body) }),
285
+ signal: controller.signal,
286
+ });
287
+ const text = await response.text();
288
+ let payload;
289
+ if (text.trim()) {
290
+ try {
291
+ payload = JSON.parse(text);
292
+ }
293
+ catch {
294
+ payload = text;
295
+ }
296
+ }
297
+ if (!response.ok) {
298
+ if (payload && typeof payload === "object" && payload !== null && "error" in payload) {
299
+ throw new AsyncCliError(`request failed (${response.status}): ${String(payload.error)}`);
300
+ }
301
+ throw new AsyncCliError(`request failed (${response.status})`);
302
+ }
303
+ return payload;
304
+ }
305
+ catch (error) {
306
+ if (error instanceof AsyncCliError) {
307
+ throw error;
308
+ }
309
+ if (error.name === "AbortError") {
310
+ throw new AsyncCliError(`request timed out after ${timeoutMs}ms`);
311
+ }
312
+ throw new AsyncCliError(`request failed: ${error instanceof Error ? error.message : String(error)}`);
313
+ }
314
+ finally {
315
+ clearTimeout(timeout);
316
+ }
317
+ }
318
+ function toJsonLine(value) {
319
+ return JSON.stringify(value, null, 2);
320
+ }
321
+ export function printAsyncHelp(log = console.log) {
322
+ log([
323
+ "usage:",
324
+ " tau async daemon --config-file <path>",
325
+ " tau async --project <id> <prompt...>",
326
+ " tau async <prompt...>",
327
+ " tau async list",
328
+ " tau async status <id>",
329
+ " tau async logs <id>",
330
+ " tau async send <id> <text...>",
331
+ " tau async cancel <id>",
332
+ "",
333
+ "options:",
334
+ " --project <id> project id for session creation (overrides config).",
335
+ " --config-file <path> daemon config file path (daemon mode only).",
336
+ " --target <id> target id from config.async.client.targets.",
337
+ " --url <url> override async target base URL.",
338
+ " --token <token> override async bearer token.",
339
+ " -- treat remaining args as prompt text.",
340
+ " --help show this help and exit.",
341
+ ].join("\n"));
342
+ }
343
+ async function runDaemon(args) {
344
+ let daemonConfig;
345
+ try {
346
+ daemonConfig = loadAsyncDaemonConfig(args.configFilePath);
347
+ }
348
+ catch (error) {
349
+ if (error instanceof AsyncDaemonConfigError) {
350
+ throw new AsyncCliError(error.message);
351
+ }
352
+ throw error;
353
+ }
354
+ const authToken = getTrimmedEnvValue("TAU_ASYNC_AUTH_TOKEN", args.env) ?? daemonConfig.authToken;
355
+ if (!authToken) {
356
+ throw new AsyncCliError("missing async auth token. set authToken in daemon config or TAU_ASYNC_AUTH_TOKEN");
357
+ }
358
+ const sessionManager = createAsyncSessionManager({
359
+ projects: daemonConfig.projects,
360
+ workspaceRoot: daemonConfig.workspaceRoot,
361
+ maxSessions: daemonConfig.maxSessions,
362
+ });
363
+ const handle = await startAsyncHttpServer({
364
+ host: daemonConfig.host,
365
+ port: daemonConfig.port,
366
+ authToken,
367
+ sessionManager,
368
+ });
369
+ const telegramConfig = daemonConfig.telegram;
370
+ let telegramHandle;
371
+ try {
372
+ if (telegramConfig?.botToken) {
373
+ telegramHandle = await startAsyncTelegramAdapter({
374
+ botToken: telegramConfig.botToken,
375
+ projects: daemonConfig.projects,
376
+ defaultProjectId: telegramConfig.defaultProjectId,
377
+ allowedUserIds: telegramConfig.allowedUserIds,
378
+ allowedChatIds: telegramConfig.allowedChatIds,
379
+ pollIntervalMs: telegramConfig.pollIntervalMs,
380
+ requestTimeoutSeconds: telegramConfig.requestTimeoutSeconds,
381
+ sessionManager,
382
+ onLog: (entry) => {
383
+ args.stdout(`[telegram:${entry.level}] ${entry.message}`);
384
+ },
385
+ });
386
+ args.stdout("tau async telegram adapter enabled");
387
+ }
388
+ }
389
+ catch (error) {
390
+ await Promise.allSettled([handle.close(), sessionManager.close()]);
391
+ throw new AsyncCliError(`failed to start telegram adapter: ${error instanceof Error ? error.message : String(error)}`);
392
+ }
393
+ args.stdout(`tau async daemon listening on ${handle.baseUrl}`);
394
+ await new Promise((resolvePromise) => {
395
+ let shuttingDown = false;
396
+ const onSignal = () => {
397
+ if (shuttingDown) {
398
+ return;
399
+ }
400
+ shuttingDown = true;
401
+ process.off("SIGINT", onSignal);
402
+ process.off("SIGTERM", onSignal);
403
+ void Promise.allSettled([
404
+ handle.close(),
405
+ ...(telegramHandle ? [telegramHandle.close()] : []),
406
+ sessionManager.close(),
407
+ ]).then(() => {
408
+ resolvePromise();
409
+ });
410
+ };
411
+ process.on("SIGINT", onSignal);
412
+ process.on("SIGTERM", onSignal);
413
+ });
414
+ }
415
+ export async function runAsyncCommand(argv, options = {}) {
416
+ const parsed = parseAsyncArgs(argv);
417
+ const stdout = options.stdout ?? console.log;
418
+ if (parsed.help) {
419
+ printAsyncHelp(stdout);
420
+ return;
421
+ }
422
+ const cwd = options.cwd ?? process.cwd();
423
+ const env = options.env ?? process.env;
424
+ const config = options.config ?? loadConfig(cwd);
425
+ if (parsed.command === "daemon") {
426
+ if (!parsed.configFilePath) {
427
+ throw new AsyncCliError("missing --config-file <path> for daemon mode");
428
+ }
429
+ await runDaemon({ configFilePath: parsed.configFilePath, env, stdout });
430
+ return;
431
+ }
432
+ if (parsed.configFilePath) {
433
+ throw new AsyncCliError("--config-file can only be used with 'tau async daemon'");
434
+ }
435
+ const target = resolveTarget(config, parsed);
436
+ const fetchImpl = options.fetchImpl ?? fetch;
437
+ if (parsed.command === "create") {
438
+ const projectId = resolveProjectId(parsed, config);
439
+ const payload = await requestJson({
440
+ target,
441
+ method: "POST",
442
+ path: "/v1/sessions",
443
+ body: {
444
+ projectId,
445
+ prompt: parsed.prompt,
446
+ },
447
+ fetchImpl,
448
+ });
449
+ stdout(toJsonLine(payload));
450
+ return;
451
+ }
452
+ if (parsed.command === "list") {
453
+ const payload = await requestJson({
454
+ target,
455
+ method: "GET",
456
+ path: "/v1/sessions",
457
+ fetchImpl,
458
+ });
459
+ stdout(toJsonLine(payload));
460
+ return;
461
+ }
462
+ if (parsed.command === "status") {
463
+ const payload = await requestJson({
464
+ target,
465
+ method: "GET",
466
+ path: `/v1/sessions/${encodeURIComponent(parsed.sessionId ?? "")}`,
467
+ fetchImpl,
468
+ });
469
+ stdout(toJsonLine(payload));
470
+ return;
471
+ }
472
+ if (parsed.command === "logs") {
473
+ const payload = await requestJson({
474
+ target,
475
+ method: "GET",
476
+ path: `/v1/sessions/${encodeURIComponent(parsed.sessionId ?? "")}/logs`,
477
+ fetchImpl,
478
+ });
479
+ stdout(toJsonLine(payload));
480
+ return;
481
+ }
482
+ if (parsed.command === "send") {
483
+ const payload = await requestJson({
484
+ target,
485
+ method: "POST",
486
+ path: `/v1/sessions/${encodeURIComponent(parsed.sessionId ?? "")}/messages`,
487
+ body: {
488
+ text: parsed.text,
489
+ },
490
+ fetchImpl,
491
+ });
492
+ stdout(toJsonLine(payload));
493
+ return;
494
+ }
495
+ if (parsed.command === "cancel") {
496
+ const payload = await requestJson({
497
+ target,
498
+ method: "POST",
499
+ path: `/v1/sessions/${encodeURIComponent(parsed.sessionId ?? "")}/cancel`,
500
+ body: {},
501
+ fetchImpl,
502
+ });
503
+ stdout(toJsonLine(payload));
504
+ return;
505
+ }
506
+ throw new AsyncCliError("unsupported async command");
507
+ }
508
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/core/async/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { isRecord } from "../utils/type_guards.js";
2
+ const DEFAULT_MAX_JSON_BODY_BYTES = 1_000_000;
3
+ export class AsyncHttpBodyTooLargeError extends Error {
4
+ maxBytes;
5
+ constructor(maxBytes) {
6
+ super(`request body exceeds ${maxBytes} bytes`);
7
+ this.name = "AsyncHttpBodyTooLargeError";
8
+ this.maxBytes = maxBytes;
9
+ }
10
+ }
11
+ export class AsyncHttpBodyParseError extends Error {
12
+ constructor() {
13
+ super("request body is not valid json");
14
+ this.name = "AsyncHttpBodyParseError";
15
+ }
16
+ }
17
+ export async function readJsonBody(request, options) {
18
+ const maxBytes = options?.maxBytes ?? DEFAULT_MAX_JSON_BODY_BYTES;
19
+ let body = "";
20
+ let bytes = 0;
21
+ request.setEncoding("utf8");
22
+ for await (const chunk of request) {
23
+ const textChunk = typeof chunk === "string" ? chunk : String(chunk);
24
+ bytes += Buffer.byteLength(textChunk);
25
+ if (bytes > maxBytes) {
26
+ throw new AsyncHttpBodyTooLargeError(maxBytes);
27
+ }
28
+ body += textChunk;
29
+ }
30
+ if (!body.trim()) {
31
+ return {};
32
+ }
33
+ try {
34
+ return JSON.parse(body);
35
+ }
36
+ catch {
37
+ throw new AsyncHttpBodyParseError();
38
+ }
39
+ }
40
+ export function sendJson(response, statusCode, payload) {
41
+ response.statusCode = statusCode;
42
+ response.setHeader("content-type", "application/json; charset=utf-8");
43
+ response.end(`${JSON.stringify(payload)}\n`);
44
+ }
45
+ export function sendError(response, statusCode, error) {
46
+ sendJson(response, statusCode, { error });
47
+ }
48
+ export function sendOk(response, statusCode, data) {
49
+ sendJson(response, statusCode, { ok: true, data });
50
+ }
51
+ export { isRecord };
52
+ export function readStringField(source, key) {
53
+ const value = source[key];
54
+ if (typeof value !== "string") {
55
+ return undefined;
56
+ }
57
+ const trimmed = value.trim();
58
+ return trimmed || undefined;
59
+ }
60
+ //# sourceMappingURL=http_protocol.js.map