@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.
- package/README.md +130 -75
- package/dist/core/async/cli.js +12 -2
- package/dist/core/async/cli.js.map +1 -1
- package/dist/core/async/http_protocol.js +7 -1
- package/dist/core/async/http_protocol.js.map +1 -1
- package/dist/core/async/http_server.js +9 -1
- package/dist/core/async/http_server.js.map +1 -1
- package/dist/core/async/index.js.map +1 -1
- package/dist/core/async/session_manager.js +94 -51
- package/dist/core/async/session_manager.js.map +1 -1
- package/dist/core/auth/auth_manager.js +0 -92
- package/dist/core/auth/auth_manager.js.map +1 -1
- package/dist/core/auth/credential_store.js +247 -0
- package/dist/core/auth/credential_store.js.map +1 -0
- package/dist/core/auth/index.js +0 -1
- package/dist/core/auth/index.js.map +1 -1
- package/dist/core/cli.js +12 -15
- package/dist/core/cli.js.map +1 -1
- package/dist/core/commands/registry.js +11 -55
- package/dist/core/commands/registry.js.map +1 -1
- package/dist/core/config/index.js.map +1 -1
- package/dist/core/config/runtime.js +0 -1
- package/dist/core/config/runtime.js.map +1 -1
- package/dist/core/config/schema.js +102 -17
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/debug.js +1 -20
- package/dist/core/debug.js.map +1 -1
- package/dist/core/diff_review/{session.js → bridge.js} +57 -114
- package/dist/core/diff_review/bridge.js.map +1 -0
- package/dist/core/diff_review/index.js +2 -3
- package/dist/core/diff_review/index.js.map +1 -1
- package/dist/core/diff_review/review_thread.js +48 -23
- package/dist/core/diff_review/review_thread.js.map +1 -1
- package/dist/core/diff_review/snapshot.js +40 -11
- package/dist/core/diff_review/snapshot.js.map +1 -1
- package/dist/core/events/parser.js +43 -12
- package/dist/core/events/parser.js.map +1 -1
- package/dist/core/index.js +1 -2
- package/dist/core/index.js.map +1 -1
- package/dist/core/models/catalog.js +3 -3
- package/dist/core/models/catalog.js.map +1 -1
- package/dist/core/modes/index.js +1 -2
- package/dist/core/modes/index.js.map +1 -1
- package/dist/core/modes/rpc_server.js +15 -325
- package/dist/core/modes/rpc_server.js.map +1 -1
- package/dist/core/modes/websocket_server.js +181 -0
- package/dist/core/modes/websocket_server.js.map +1 -0
- package/dist/core/personas.js +11 -1
- package/dist/core/personas.js.map +1 -1
- package/dist/core/runtime/chat_runtime.js +19 -12
- package/dist/core/runtime/chat_runtime.js.map +1 -1
- package/dist/core/runtime/conversation_turn_runtime.js +16 -1
- package/dist/core/runtime/conversation_turn_runtime.js.map +1 -1
- package/dist/core/runtime/runtime_bootstrap.js +326 -0
- package/dist/core/runtime/runtime_bootstrap.js.map +1 -1
- package/dist/core/runtime/steering.js +6 -0
- package/dist/core/runtime/steering.js.map +1 -0
- package/dist/core/session/compaction.js +225 -22
- package/dist/core/session/compaction.js.map +1 -1
- package/dist/core/session/core_session.js +9 -0
- package/dist/core/session/core_session.js.map +1 -1
- package/dist/core/session/direct_bash.js +34 -0
- package/dist/core/session/direct_bash.js.map +1 -0
- package/dist/core/session/pruning.js +595 -0
- package/dist/core/session/pruning.js.map +1 -0
- package/dist/core/session/runner.js +47 -8
- package/dist/core/session/runner.js.map +1 -1
- package/dist/core/session/session_engine.js +128 -55
- package/dist/core/session/session_engine.js.map +1 -1
- package/dist/core/static/prompts/diff-review-wrapper.md +1 -1
- package/dist/core/subagents/subagent_engine.js +19 -27
- package/dist/core/subagents/subagent_engine.js.map +1 -1
- package/dist/core/tools/catalog.js.map +1 -1
- package/dist/core/tools/diff_review.js +12 -12
- package/dist/core/tools/diff_review.js.map +1 -1
- package/dist/core/tools/execution_backend.js +9 -2
- package/dist/core/tools/execution_backend.js.map +1 -1
- package/dist/core/tools/registry.js.map +1 -1
- package/dist/core/usage/logs.js.map +1 -1
- package/dist/core/utils/compact.js +3 -1
- package/dist/core/utils/compact.js.map +1 -1
- package/dist/core/utils/context.js +1 -1
- package/dist/core/utils/context.js.map +1 -1
- package/dist/core/utils/context_builder.js +1 -18
- package/dist/core/utils/context_builder.js.map +1 -1
- package/dist/core/utils/gemini_speech.js +1 -1
- package/dist/core/utils/gemini_speech.js.map +1 -1
- package/dist/core/utils/model_stream.js +105 -14
- package/dist/core/utils/model_stream.js.map +1 -1
- package/dist/core/utils/project_files.js +11 -16
- package/dist/core/utils/project_files.js.map +1 -1
- package/dist/core/utils/spawn_capture.js +2 -2
- package/dist/core/utils/spawn_capture.js.map +1 -1
- package/dist/core/utils/user_metadata.js +35 -2
- package/dist/core/utils/user_metadata.js.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/core/version.js.map +1 -1
- package/dist/diff_tool/app/dist/assets/{index-jn1I_CPZ.js → index-ivRn2dP2.js} +34 -34
- package/dist/diff_tool/app/dist/index.html +1 -1
- package/dist/execution/cloudflare_sandbox_execution_environment.js +400 -0
- package/dist/execution/cloudflare_sandbox_execution_environment.js.map +1 -0
- package/dist/execution/execution_environment.js +24 -0
- package/dist/execution/execution_environment.js.map +1 -0
- package/dist/execution/fly_sprite_execution_environment.js +559 -0
- package/dist/execution/fly_sprite_execution_environment.js.map +1 -0
- package/dist/execution/local_execution_environment.js +93 -0
- package/dist/execution/local_execution_environment.js.map +1 -0
- package/dist/execution/runtime_config_snapshot.js +209 -0
- package/dist/execution/runtime_config_snapshot.js.map +1 -0
- package/dist/execution/sandbox_tool_helpers.js +55 -0
- package/dist/execution/sandbox_tool_helpers.js.map +1 -0
- package/dist/execution/tool_backend_execution_environment.js +55 -0
- package/dist/execution/tool_backend_execution_environment.js.map +1 -0
- package/dist/host/hosted_ephemeral_agent_session.js +286 -0
- package/dist/host/hosted_ephemeral_agent_session.js.map +1 -0
- package/dist/host/index.js +3 -0
- package/dist/host/index.js.map +1 -0
- package/dist/host/local_session_host.js +1464 -0
- package/dist/host/local_session_host.js.map +1 -0
- package/dist/host/session_host.js +2 -0
- package/dist/host/session_host.js.map +1 -0
- package/dist/host/session_protocol_handler.js +873 -0
- package/dist/host/session_protocol_handler.js.map +1 -0
- package/dist/main.js +537 -77
- package/dist/main.js.map +1 -1
- package/dist/protocol/index.d.ts +2 -0
- package/dist/protocol/index.js +2 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/session_protocol.d.ts +691 -0
- package/dist/protocol/session_protocol.js +2117 -0
- package/dist/protocol/session_protocol.js.map +1 -0
- package/dist/sdk/client.d.ts +2 -1
- package/dist/sdk/client.js +136 -392
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/index.d.ts +7 -4
- package/dist/sdk/index.js +4 -2
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/session.d.ts +5 -0
- package/dist/sdk/session.js +406 -0
- package/dist/sdk/session.js.map +1 -0
- package/dist/sdk/types.d.ts +97 -78
- package/dist/store/file_session_store.js +157 -0
- package/dist/store/file_session_store.js.map +1 -0
- package/dist/store/memory_session_store.js +24 -0
- package/dist/store/memory_session_store.js.map +1 -0
- package/dist/store/session_store.js +32 -0
- package/dist/store/session_store.js.map +1 -0
- package/dist/transport/errors.d.ts +29 -0
- package/dist/{sdk → transport}/errors.js +5 -5
- package/dist/transport/errors.js.map +1 -0
- package/dist/transport/in_process_session_transport.js +102 -0
- package/dist/transport/in_process_session_transport.js.map +1 -0
- package/dist/transport/index.d.ts +7 -0
- package/dist/transport/index.js +4 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/pending_session_protocol_requests.js +67 -0
- package/dist/transport/pending_session_protocol_requests.js.map +1 -0
- package/dist/transport/session_protocol_transport_helpers.js +98 -0
- package/dist/transport/session_protocol_transport_helpers.js.map +1 -0
- package/dist/transport/session_transport.d.ts +11 -0
- package/dist/transport/session_transport.js +2 -0
- package/dist/transport/session_transport.js.map +1 -0
- package/dist/transport/stdio_session_transport.d.ts +38 -0
- package/dist/transport/stdio_session_transport.js +243 -0
- package/dist/transport/stdio_session_transport.js.map +1 -0
- package/dist/transport/websocket_session_transport.d.ts +52 -0
- package/dist/transport/websocket_session_transport.js +235 -0
- package/dist/transport/websocket_session_transport.js.map +1 -0
- package/dist/tui/chat_controller/assistant_clipboard.js +39 -0
- package/dist/tui/chat_controller/assistant_clipboard.js.map +1 -0
- package/dist/tui/chat_controller/command_hints.js +43 -0
- package/dist/tui/chat_controller/command_hints.js.map +1 -0
- package/dist/tui/chat_controller/diff_review_service.js +9 -9
- package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
- package/dist/tui/chat_controller/diff_review_user_message.js +17 -0
- package/dist/tui/chat_controller/diff_review_user_message.js.map +1 -0
- package/dist/tui/chat_controller/history_labels.js +8 -0
- package/dist/tui/chat_controller/history_labels.js.map +1 -0
- package/dist/tui/chat_controller/history_message_model.js +36 -0
- package/dist/tui/chat_controller/history_message_model.js.map +1 -0
- package/dist/tui/chat_controller/queued_user_messages.js +18 -1
- package/dist/tui/chat_controller/queued_user_messages.js.map +1 -1
- package/dist/tui/chat_controller/status_format.js +22 -0
- package/dist/tui/chat_controller/status_format.js.map +1 -0
- package/dist/tui/chat_view.js +3 -1
- package/dist/tui/chat_view.js.map +1 -1
- package/dist/tui/index.js +1 -1
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/listen_capture.js +87 -0
- package/dist/tui/listen_capture.js.map +1 -0
- package/dist/tui/memory_mode.js +23 -0
- package/dist/tui/memory_mode.js.map +1 -0
- package/dist/tui/session_chat_app.js +227 -0
- package/dist/tui/session_chat_app.js.map +1 -0
- package/dist/tui/session_chat_controller.js +2167 -0
- package/dist/tui/session_chat_controller.js.map +1 -0
- package/dist/tui/session_tool_execution_backend.js +170 -0
- package/dist/tui/session_tool_execution_backend.js.map +1 -0
- package/dist/tui/speech_playback.js +107 -0
- package/dist/tui/speech_playback.js.map +1 -0
- package/dist/tui/ui/assistant_message.js +27 -21
- package/dist/tui/ui/assistant_message.js.map +1 -1
- package/dist/tui/ui/components/editor.js +17 -13
- package/dist/tui/ui/components/editor.js.map +1 -1
- package/dist/tui/ui/custom_editor.js +25 -5
- package/dist/tui/ui/custom_editor.js.map +1 -1
- package/dist/tui/ui/queued_messages.js +1 -1
- package/dist/tui/ui/queued_messages.js.map +1 -1
- package/dist/tui/ui/slash_autocomplete.js +14 -36
- package/dist/tui/ui/slash_autocomplete.js.map +1 -1
- package/dist/tui/ui/tool_ui_registry.js +21 -0
- package/dist/tui/ui/tool_ui_registry.js.map +1 -1
- package/package.json +14 -11
- package/dist/core/auth/credential_resolver.js +0 -36
- package/dist/core/auth/credential_resolver.js.map +0 -1
- package/dist/core/config/bash_commands.js +0 -44
- package/dist/core/config/bash_commands.js.map +0 -1
- package/dist/core/diff_review/session.js.map +0 -1
- package/dist/core/modes/rpc_adapter.js +0 -17
- package/dist/core/modes/rpc_adapter.js.map +0 -1
- package/dist/core/modes/rpc_protocol.js +0 -500
- package/dist/core/modes/rpc_protocol.js.map +0 -1
- package/dist/core/session/checkpoint.js +0 -34
- package/dist/core/session/checkpoint.js.map +0 -1
- package/dist/sdk/errors.d.ts +0 -33
- package/dist/sdk/errors.js.map +0 -1
- package/dist/tui/app.js +0 -64
- package/dist/tui/app.js.map +0 -1
- package/dist/tui/chat_controller/session_maintenance_service.js +0 -634
- package/dist/tui/chat_controller/session_maintenance_service.js.map +0 -1
- package/dist/tui/chat_controller.js +0 -2532
- package/dist/tui/chat_controller.js.map +0 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, readdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { basename, join } from "node:path";
|
|
5
|
+
import { validateSessionProtocolResult } from "../protocol/session_protocol.js";
|
|
6
|
+
import { assertExpectedSessionRevision, validateSessionStoreSnapshot, } from "./session_store.js";
|
|
7
|
+
const SNAPSHOT_FILE_EXTENSION = ".json";
|
|
8
|
+
const SNAPSHOT_LOCK_TIMEOUT_MS = 30_000;
|
|
9
|
+
const SNAPSHOT_LOCK_RETRY_MS = 10;
|
|
10
|
+
export function getDefaultSessionStoreDirectory(homeDir) {
|
|
11
|
+
return join(homeDir ?? homedir(), ".config", "tau", "sessions");
|
|
12
|
+
}
|
|
13
|
+
export class FileSessionStore {
|
|
14
|
+
directory;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.directory = options.directory;
|
|
17
|
+
}
|
|
18
|
+
async commitSessionSnapshot(snapshot, options = {}) {
|
|
19
|
+
const validated = validateSessionStoreSnapshot(snapshot);
|
|
20
|
+
await this.withSnapshotLock(validated.sessionId, async () => {
|
|
21
|
+
const current = await this.loadSessionUnlocked(validated.sessionId);
|
|
22
|
+
assertExpectedSessionRevision(validated.sessionId, options.expectedRevision, current);
|
|
23
|
+
const finalPath = this.snapshotPath(validated.sessionId);
|
|
24
|
+
const tempPath = `${finalPath}.${process.pid}.${Date.now()}.${randomUUID()}.tmp`;
|
|
25
|
+
await writeFile(tempPath, `${JSON.stringify(validated)}\n`, "utf8");
|
|
26
|
+
await rename(tempPath, finalPath);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async loadSession(sessionId) {
|
|
30
|
+
let raw;
|
|
31
|
+
try {
|
|
32
|
+
raw = await readFile(this.snapshotPath(sessionId), "utf8");
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (isNotFound(error)) {
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
return parseStoredSnapshot(sessionId, raw);
|
|
41
|
+
}
|
|
42
|
+
async listSessionSnapshots() {
|
|
43
|
+
const filenames = await this.snapshotFilenames();
|
|
44
|
+
const snapshots = [];
|
|
45
|
+
for (const filename of filenames) {
|
|
46
|
+
const sessionId = sessionIdFromSnapshotFilename(filename);
|
|
47
|
+
const snapshot = await this.loadSession(sessionId);
|
|
48
|
+
if (snapshot) {
|
|
49
|
+
snapshots.push(snapshot);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return snapshots;
|
|
53
|
+
}
|
|
54
|
+
async deleteSession(sessionId, options = {}) {
|
|
55
|
+
await this.withSnapshotLock(sessionId, async () => {
|
|
56
|
+
const current = await this.loadSessionUnlocked(sessionId);
|
|
57
|
+
assertExpectedSessionRevision(sessionId, options.expectedRevision, current);
|
|
58
|
+
await rm(this.snapshotPath(sessionId), { force: true });
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async loadSessionUnlocked(sessionId) {
|
|
62
|
+
let raw;
|
|
63
|
+
try {
|
|
64
|
+
raw = await readFile(this.snapshotPath(sessionId), "utf8");
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (isNotFound(error)) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
return parseStoredSnapshot(sessionId, raw);
|
|
73
|
+
}
|
|
74
|
+
async snapshotFilenames() {
|
|
75
|
+
let entries;
|
|
76
|
+
try {
|
|
77
|
+
entries = await readdir(this.directory);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (isNotFound(error)) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
return entries
|
|
86
|
+
.filter((entry) => entry.endsWith(SNAPSHOT_FILE_EXTENSION))
|
|
87
|
+
.sort((a, b) => a.localeCompare(b));
|
|
88
|
+
}
|
|
89
|
+
snapshotPath(sessionId) {
|
|
90
|
+
return join(this.directory, snapshotFilename(sessionId));
|
|
91
|
+
}
|
|
92
|
+
snapshotLockPath(sessionId) {
|
|
93
|
+
return `${this.snapshotPath(sessionId)}.lock`;
|
|
94
|
+
}
|
|
95
|
+
async withSnapshotLock(sessionId, handler) {
|
|
96
|
+
await mkdir(this.directory, { recursive: true });
|
|
97
|
+
const lockPath = this.snapshotLockPath(sessionId);
|
|
98
|
+
const startedAt = Date.now();
|
|
99
|
+
while (true) {
|
|
100
|
+
try {
|
|
101
|
+
await mkdir(lockPath);
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (!isAlreadyExists(error)) {
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
if (Date.now() - startedAt > SNAPSHOT_LOCK_TIMEOUT_MS) {
|
|
109
|
+
throw new Error(`timed out waiting for stored session snapshot lock: ${sessionId}`);
|
|
110
|
+
}
|
|
111
|
+
await sleep(SNAPSHOT_LOCK_RETRY_MS);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
return await handler();
|
|
116
|
+
}
|
|
117
|
+
finally {
|
|
118
|
+
await rm(lockPath, { recursive: true, force: true });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
function parseStoredSnapshot(sessionId, raw) {
|
|
123
|
+
let parsed;
|
|
124
|
+
try {
|
|
125
|
+
parsed = JSON.parse(raw);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
throw new Error(`stored session snapshot is not valid JSON: ${sessionId}`, { cause: error });
|
|
129
|
+
}
|
|
130
|
+
const snapshot = validateSessionProtocolResult("session.snapshot", parsed);
|
|
131
|
+
if (!snapshot.ok) {
|
|
132
|
+
throw new Error(`stored session snapshot is invalid: ${sessionId}`, {
|
|
133
|
+
cause: new Error(snapshot.error.message),
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
if (snapshot.value.sessionId !== sessionId) {
|
|
137
|
+
throw new Error(`stored session snapshot id mismatch: ${sessionId}`);
|
|
138
|
+
}
|
|
139
|
+
return snapshot.value;
|
|
140
|
+
}
|
|
141
|
+
function snapshotFilename(sessionId) {
|
|
142
|
+
return `${Buffer.from(sessionId, "utf8").toString("base64url")}${SNAPSHOT_FILE_EXTENSION}`;
|
|
143
|
+
}
|
|
144
|
+
function sessionIdFromSnapshotFilename(filename) {
|
|
145
|
+
const encoded = basename(filename, SNAPSHOT_FILE_EXTENSION);
|
|
146
|
+
return Buffer.from(encoded, "base64url").toString("utf8");
|
|
147
|
+
}
|
|
148
|
+
function isNotFound(error) {
|
|
149
|
+
return error instanceof Error && "code" in error && error.code === "ENOENT";
|
|
150
|
+
}
|
|
151
|
+
function isAlreadyExists(error) {
|
|
152
|
+
return error instanceof Error && "code" in error && error.code === "EEXIST";
|
|
153
|
+
}
|
|
154
|
+
function sleep(ms) {
|
|
155
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=file_session_store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file_session_store.js","sourceRoot":"","sources":["../../src/store/file_session_store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { assertExpectedSessionRevision, validateSessionStoreSnapshot, } from "./session_store.js";
|
|
2
|
+
export class MemorySessionStore {
|
|
3
|
+
snapshots = new Map();
|
|
4
|
+
async commitSessionSnapshot(snapshot, options = {}) {
|
|
5
|
+
const validated = validateSessionStoreSnapshot(snapshot);
|
|
6
|
+
assertExpectedSessionRevision(validated.sessionId, options.expectedRevision, this.snapshots.get(validated.sessionId));
|
|
7
|
+
this.snapshots.set(validated.sessionId, cloneSessionSnapshot(validated));
|
|
8
|
+
}
|
|
9
|
+
async loadSession(sessionId) {
|
|
10
|
+
const snapshot = this.snapshots.get(sessionId);
|
|
11
|
+
return snapshot ? cloneSessionSnapshot(snapshot) : undefined;
|
|
12
|
+
}
|
|
13
|
+
async listSessionSnapshots() {
|
|
14
|
+
return [...this.snapshots.values()].map((snapshot) => cloneSessionSnapshot(snapshot));
|
|
15
|
+
}
|
|
16
|
+
async deleteSession(sessionId, options = {}) {
|
|
17
|
+
assertExpectedSessionRevision(sessionId, options.expectedRevision, this.snapshots.get(sessionId));
|
|
18
|
+
this.snapshots.delete(sessionId);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function cloneSessionSnapshot(snapshot) {
|
|
22
|
+
return structuredClone(snapshot);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=memory_session_store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory_session_store.js","sourceRoot":"","sources":["../../src/store/memory_session_store.ts"],"names":[],"mappings":"AACA,OAAO,EACL,6BAA6B,EAI7B,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC;AAE5B,MAAM,OAAO,kBAAkB;IACZ,SAAS,GAAG,IAAI,GAAG,EAAmC,CAAC;IAExE,KAAK,CAAC,qBAAqB,CACzB,QAAiC,EACjC,UAAqC,EAAE;QAEvC,MAAM,SAAS,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QACzD,6BAA6B,CAC3B,SAAS,CAAC,SAAS,EACnB,OAAO,CAAC,gBAAgB,EACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CACxC,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,SAAiB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,oBAAoB;QACxB,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,UAAqC,EAAE;QAC5E,6BAA6B,CAC3B,SAAS,EACT,OAAO,CAAC,gBAAgB,EACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAC9B,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;CACF;AAED,SAAS,oBAAoB,CAAC,QAAiC;IAC7D,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { validateSessionProtocolResult } from "../protocol/session_protocol.js";
|
|
2
|
+
export class SessionStoreConflictError extends Error {
|
|
3
|
+
sessionId;
|
|
4
|
+
expectedRevision;
|
|
5
|
+
actualRevision;
|
|
6
|
+
constructor(sessionId, expectedRevision, actualRevision) {
|
|
7
|
+
super(`stored session snapshot revision conflict for ${sessionId}: expected ${expectedRevision}, found ${actualRevision}`);
|
|
8
|
+
this.sessionId = sessionId;
|
|
9
|
+
this.expectedRevision = expectedRevision;
|
|
10
|
+
this.actualRevision = actualRevision;
|
|
11
|
+
this.name = "SessionStoreConflictError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function validateSessionStoreSnapshot(snapshot) {
|
|
15
|
+
const parsed = validateSessionProtocolResult("session.snapshot", snapshot);
|
|
16
|
+
if (!parsed.ok) {
|
|
17
|
+
throw new Error("session snapshot is invalid", {
|
|
18
|
+
cause: new Error(parsed.error.message),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
return parsed.value;
|
|
22
|
+
}
|
|
23
|
+
export function assertExpectedSessionRevision(sessionId, expectedRevision, current) {
|
|
24
|
+
if (expectedRevision === undefined) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const actualRevision = current?.revision ?? 0;
|
|
28
|
+
if (actualRevision !== expectedRevision) {
|
|
29
|
+
throw new SessionStoreConflictError(sessionId, expectedRevision, actualRevision);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=session_store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session_store.js","sourceRoot":"","sources":["../../src/store/session_store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AAoBhF,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAEvC;IACA;IACA;IAHX,YACW,SAAiB,EACjB,gBAAwB,EACxB,cAAsB;QAE/B,KAAK,CACH,iDAAiD,SAAS,cAAc,gBAAgB,WAAW,cAAc,EAAE,CACpH,CAAC;QANO,cAAS,GAAT,SAAS,CAAQ;QACjB,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,mBAAc,GAAd,cAAc,CAAQ;QAK/B,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,UAAU,4BAA4B,CAC1C,QAAiC;IAEjC,MAAM,MAAM,GAAG,6BAA6B,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IAC3E,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,6BAA6B,EAAE;YAC7C,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,SAAiB,EACjB,gBAAoC,EACpC,OAA4C;IAE5C,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,EAAE,QAAQ,IAAI,CAAC,CAAC;IAC9C,IAAI,cAAc,KAAK,gBAAgB,EAAE,CAAC;QACxC,MAAM,IAAI,yBAAyB,CAAC,SAAS,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { SessionProtocolError, SessionProtocolErrorCode, SessionProtocolRequestId } from "../protocol/session_protocol.js";
|
|
2
|
+
export type TauSessionProtocolErrorCode = SessionProtocolErrorCode;
|
|
3
|
+
export type TauSessionProtocolError = SessionProtocolError;
|
|
4
|
+
export declare class TauSessionClientError extends Error {
|
|
5
|
+
constructor(message: string, options?: ErrorOptions);
|
|
6
|
+
}
|
|
7
|
+
export declare class TauSessionProtocolResponseError extends TauSessionClientError {
|
|
8
|
+
readonly code: TauSessionProtocolErrorCode;
|
|
9
|
+
readonly requestId: SessionProtocolRequestId;
|
|
10
|
+
readonly data?: unknown;
|
|
11
|
+
constructor(options: {
|
|
12
|
+
requestId: SessionProtocolRequestId;
|
|
13
|
+
error: TauSessionProtocolError;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
export declare class TauTransportError extends TauSessionClientError {
|
|
17
|
+
constructor(message: string, options?: ErrorOptions);
|
|
18
|
+
}
|
|
19
|
+
export declare class TauProcessError extends TauTransportError {
|
|
20
|
+
readonly exitCode: number | null;
|
|
21
|
+
readonly signal: NodeJS.Signals | null;
|
|
22
|
+
readonly stderr: string;
|
|
23
|
+
constructor(message: string, options?: {
|
|
24
|
+
exitCode?: number | null;
|
|
25
|
+
signal?: NodeJS.Signals | null;
|
|
26
|
+
stderr?: string;
|
|
27
|
+
cause?: unknown;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
export class
|
|
1
|
+
export class TauSessionClientError extends Error {
|
|
2
2
|
constructor(message, options) {
|
|
3
3
|
super(message, options);
|
|
4
|
-
this.name = "
|
|
4
|
+
this.name = "TauSessionClientError";
|
|
5
5
|
}
|
|
6
6
|
}
|
|
7
|
-
export class
|
|
7
|
+
export class TauSessionProtocolResponseError extends TauSessionClientError {
|
|
8
8
|
code;
|
|
9
9
|
requestId;
|
|
10
10
|
data;
|
|
11
11
|
constructor(options) {
|
|
12
12
|
super(options.error.message);
|
|
13
|
-
this.name = "
|
|
13
|
+
this.name = "TauSessionProtocolResponseError";
|
|
14
14
|
this.code = options.error.code;
|
|
15
15
|
this.requestId = options.requestId;
|
|
16
16
|
this.data = options.error.data;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
export class TauTransportError extends
|
|
19
|
+
export class TauTransportError extends TauSessionClientError {
|
|
20
20
|
constructor(message, options) {
|
|
21
21
|
super(message, options);
|
|
22
22
|
this.name = "TauTransportError";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/transport/errors.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,+BAAgC,SAAQ,qBAAqB;IAC/D,IAAI,CAA8B;IAClC,SAAS,CAA2B;IACpC,IAAI,CAAW;IAExB,YAAY,OAAgF;QAC1F,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,iCAAiC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,qBAAqB;IAC1D,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,iBAAiB;IAC3C,QAAQ,CAAgB;IACxB,MAAM,CAAwB;IAC9B,MAAM,CAAS;IAExB,YACE,OAAe,EACf,OAKC;QAED,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACpF,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,IAAI,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;IACtC,CAAC;CACF"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { SessionProtocolHandler } from "../host/session_protocol_handler.js";
|
|
2
|
+
import { TauTransportError } from "./errors.js";
|
|
3
|
+
import { PendingSessionProtocolRequests, } from "./pending_session_protocol_requests.js";
|
|
4
|
+
import { handleSessionProtocolTransportResponse, notifySessionProtocolDeltaListeners, notifySessionProtocolEphemeralListeners, } from "./session_protocol_transport_helpers.js";
|
|
5
|
+
export class InProcessSessionProtocolTransport {
|
|
6
|
+
handler;
|
|
7
|
+
closeMode;
|
|
8
|
+
deltaListeners = new Set();
|
|
9
|
+
ephemeralListeners = new Set();
|
|
10
|
+
pendingRequests = new PendingSessionProtocolRequests();
|
|
11
|
+
readyValue;
|
|
12
|
+
connectPromise;
|
|
13
|
+
isConnected = false;
|
|
14
|
+
isClosed = false;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
this.closeMode = options.closeMode ?? "detach";
|
|
17
|
+
this.handler = new SessionProtocolHandler({
|
|
18
|
+
host: options.host,
|
|
19
|
+
send: (message) => this.handleMessage(message),
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
get ready() {
|
|
23
|
+
if (!this.isConnected || !this.readyValue) {
|
|
24
|
+
throw new TauTransportError("tau in-process transport is not connected");
|
|
25
|
+
}
|
|
26
|
+
return this.readyValue;
|
|
27
|
+
}
|
|
28
|
+
async connect(initializeParams, timeoutMs) {
|
|
29
|
+
void timeoutMs;
|
|
30
|
+
if (this.isClosed) {
|
|
31
|
+
throw new TauTransportError("tau in-process transport is closed");
|
|
32
|
+
}
|
|
33
|
+
if (this.isConnected) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
this.connectPromise ??= this.establishConnection(initializeParams);
|
|
37
|
+
await this.connectPromise;
|
|
38
|
+
}
|
|
39
|
+
async establishConnection(initializeParams) {
|
|
40
|
+
await this.request("initialize", initializeParams);
|
|
41
|
+
this.isConnected = true;
|
|
42
|
+
}
|
|
43
|
+
request(method, params) {
|
|
44
|
+
if (this.isClosed) {
|
|
45
|
+
return Promise.reject(new TauTransportError("tau in-process transport is closed"));
|
|
46
|
+
}
|
|
47
|
+
let pending;
|
|
48
|
+
try {
|
|
49
|
+
pending = this.pendingRequests.create(method, params);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return Promise.reject(error);
|
|
53
|
+
}
|
|
54
|
+
void this.handler.handleRequest(pending.request).catch((error) => {
|
|
55
|
+
this.pendingRequests.reject(pending.request.id, error);
|
|
56
|
+
});
|
|
57
|
+
return pending.promise;
|
|
58
|
+
}
|
|
59
|
+
onDelta(listener) {
|
|
60
|
+
this.deltaListeners.add(listener);
|
|
61
|
+
return () => {
|
|
62
|
+
this.deltaListeners.delete(listener);
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
onEphemeral(listener) {
|
|
66
|
+
this.ephemeralListeners.add(listener);
|
|
67
|
+
return () => {
|
|
68
|
+
this.ephemeralListeners.delete(listener);
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
async close() {
|
|
72
|
+
if (this.isClosed) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.isClosed = true;
|
|
76
|
+
const closeError = new TauTransportError("tau in-process transport was closed");
|
|
77
|
+
this.pendingRequests.rejectAll(closeError);
|
|
78
|
+
this.deltaListeners.clear();
|
|
79
|
+
this.ephemeralListeners.clear();
|
|
80
|
+
await this.handler.close(this.closeMode);
|
|
81
|
+
}
|
|
82
|
+
handleMessage(message) {
|
|
83
|
+
if (message.type === "ready") {
|
|
84
|
+
this.readyValue = message;
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (message.type === "session.delta") {
|
|
88
|
+
notifySessionProtocolDeltaListeners(this.deltaListeners, message, {
|
|
89
|
+
ignoreListenerErrors: true,
|
|
90
|
+
});
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (message.type === "session.ephemeral") {
|
|
94
|
+
notifySessionProtocolEphemeralListeners(this.ephemeralListeners, message, {
|
|
95
|
+
ignoreListenerErrors: true,
|
|
96
|
+
});
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
handleSessionProtocolTransportResponse(message, this.pendingRequests, () => undefined);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=in_process_session_transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in_process_session_transport.js","sourceRoot":"","sources":["../../src/transport/in_process_session_transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { TauSessionProtocolError, TauSessionProtocolErrorCode } from "./errors.js";
|
|
2
|
+
export { TauProcessError, TauSessionClientError, TauSessionProtocolResponseError, TauTransportError, } from "./errors.js";
|
|
3
|
+
export type { SessionProtocolDeltaListener, SessionProtocolEphemeralListener, SessionProtocolTransport, } from "./session_transport.js";
|
|
4
|
+
export type { SessionProtocolSpawnedProcess } from "./stdio_session_transport.js";
|
|
5
|
+
export { StdioSessionProtocolTransport } from "./stdio_session_transport.js";
|
|
6
|
+
export type { WebSocketSessionProtocolTransportOptions } from "./websocket_session_transport.js";
|
|
7
|
+
export { WebSocketSessionProtocolTransport } from "./websocket_session_transport.js";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { TauProcessError, TauSessionClientError, TauSessionProtocolResponseError, TauTransportError, } from "./errors.js";
|
|
2
|
+
export { StdioSessionProtocolTransport } from "./stdio_session_transport.js";
|
|
3
|
+
export { WebSocketSessionProtocolTransport } from "./websocket_session_transport.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,+BAA+B,EAC/B,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAOrB,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAE7E,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { createSessionProtocolRequest, validateSessionProtocolResult, } from "../protocol/session_protocol.js";
|
|
3
|
+
import { TauSessionProtocolResponseError, TauTransportError } from "./errors.js";
|
|
4
|
+
export class PendingSessionProtocolRequests {
|
|
5
|
+
pendingRequests = new Map();
|
|
6
|
+
create(method, params) {
|
|
7
|
+
const requestId = randomUUID();
|
|
8
|
+
const request = createSessionProtocolRequest(requestId, method, params);
|
|
9
|
+
if (!request.ok) {
|
|
10
|
+
throw new TauSessionProtocolResponseError({
|
|
11
|
+
requestId,
|
|
12
|
+
error: request.error,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
let pending;
|
|
16
|
+
const promise = new Promise((resolve, reject) => {
|
|
17
|
+
pending = {
|
|
18
|
+
requestId,
|
|
19
|
+
resolve: (responseResult) => {
|
|
20
|
+
const result = validateSessionProtocolResult(method, responseResult);
|
|
21
|
+
if (!result.ok) {
|
|
22
|
+
reject(new TauTransportError(`received invalid session protocol response result: ${result.error.message}`));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
resolve(result.value);
|
|
26
|
+
},
|
|
27
|
+
reject,
|
|
28
|
+
};
|
|
29
|
+
});
|
|
30
|
+
this.pendingRequests.set(requestId, pending);
|
|
31
|
+
return {
|
|
32
|
+
request: request.value,
|
|
33
|
+
promise,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
resolveSuccess(id, result) {
|
|
37
|
+
const pending = this.pendingRequests.get(id);
|
|
38
|
+
if (!pending) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
this.pendingRequests.delete(id);
|
|
42
|
+
pending.resolve(result);
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
rejectProtocolError(id, error) {
|
|
46
|
+
return this.reject(id, new TauSessionProtocolResponseError({
|
|
47
|
+
requestId: id,
|
|
48
|
+
error,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
reject(id, error) {
|
|
52
|
+
const pending = this.pendingRequests.get(id);
|
|
53
|
+
if (!pending) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
this.pendingRequests.delete(id);
|
|
57
|
+
pending.reject(error);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
rejectAll(error) {
|
|
61
|
+
for (const pending of this.pendingRequests.values()) {
|
|
62
|
+
pending.reject(error);
|
|
63
|
+
}
|
|
64
|
+
this.pendingRequests.clear();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=pending_session_protocol_requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending_session_protocol_requests.js","sourceRoot":"","sources":["../../src/transport/pending_session_protocol_requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,4BAA4B,EAO5B,6BAA6B,GAC9B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,+BAA+B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAajF,MAAM,OAAO,8BAA8B;IACxB,eAAe,GAAG,IAAI,GAAG,EAA4C,CAAC;IAEvF,MAAM,CACJ,MAAS,EACT,MAAwC;QAExC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACxE,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,MAAM,IAAI,+BAA+B,CAAC;gBACxC,SAAS;gBACT,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAwB,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,OAAO,CAAmC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChF,OAAO,GAAG;gBACR,SAAS;gBACT,OAAO,EAAE,CAAC,cAAc,EAAE,EAAE;oBAC1B,MAAM,MAAM,GAAG,6BAA6B,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;oBACrE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;wBACf,MAAM,CACJ,IAAI,iBAAiB,CACnB,sDAAsD,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAC7E,CACF,CAAC;wBACF,OAAO;oBACT,CAAC;oBAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACxB,CAAC;gBACD,MAAM;aACP,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAE7C,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,KAAK;YACtB,OAAO;SACR,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,EAA4B,EAAE,MAAe;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB,CAAC,EAA4B,EAAE,KAA2B;QAC3E,OAAO,IAAI,CAAC,MAAM,CAChB,EAAE,EACF,IAAI,+BAA+B,CAAC;YAClC,SAAS,EAAE,EAAE;YACb,KAAK;SACN,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,EAA4B,EAAE,KAAc;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;YACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { TauTransportError } from "./errors.js";
|
|
2
|
+
export function createDeferred() {
|
|
3
|
+
let resolve;
|
|
4
|
+
let reject;
|
|
5
|
+
const promise = new Promise((res, rej) => {
|
|
6
|
+
resolve = res;
|
|
7
|
+
reject = rej;
|
|
8
|
+
});
|
|
9
|
+
return { promise, resolve, reject };
|
|
10
|
+
}
|
|
11
|
+
export function withTimeout(promise, timeoutMs, timeoutError) {
|
|
12
|
+
let timeout;
|
|
13
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
14
|
+
timeout = setTimeout(() => reject(timeoutError), timeoutMs);
|
|
15
|
+
timeout.unref?.();
|
|
16
|
+
});
|
|
17
|
+
return Promise.race([promise, timeoutPromise]).finally(() => {
|
|
18
|
+
clearTimeout(timeout);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function delay(timeoutMs) {
|
|
22
|
+
return new Promise((resolve) => {
|
|
23
|
+
const timeout = setTimeout(resolve, timeoutMs);
|
|
24
|
+
timeout.unref?.();
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
export async function waitForPromiseOrTimeout(promise, timeoutMs) {
|
|
28
|
+
await Promise.race([promise, delay(timeoutMs)]);
|
|
29
|
+
}
|
|
30
|
+
export function notifySessionProtocolDeltaListeners(listeners, message, options = {}) {
|
|
31
|
+
for (const listener of [...listeners]) {
|
|
32
|
+
if (!options.ignoreListenerErrors) {
|
|
33
|
+
listener(message);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
listener(message);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// listener failures must not break transport processing
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function notifySessionProtocolEphemeralListeners(listeners, message, options = {}) {
|
|
45
|
+
for (const listener of [...listeners]) {
|
|
46
|
+
if (!options.ignoreListenerErrors) {
|
|
47
|
+
listener(message);
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
listener(message);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// listener failures must not break transport processing
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function handleSessionProtocolTransportResponse(message, pendingRequests, failTransport) {
|
|
59
|
+
if (message.ok) {
|
|
60
|
+
const resolved = pendingRequests.resolveSuccess(message.id, message.result);
|
|
61
|
+
if (!resolved) {
|
|
62
|
+
failTransport(new TauTransportError(`received response for unknown session protocol request '${message.id}'`));
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (message.id === null) {
|
|
67
|
+
failTransport(new TauTransportError("received uncorrelated session protocol error response"));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const rejected = pendingRequests.rejectProtocolError(message.id, message.error);
|
|
71
|
+
if (!rejected) {
|
|
72
|
+
failTransport(new TauTransportError(`received response for unknown session protocol request '${message.id}'`));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function handleSessionProtocolTransportParseFailure(options) {
|
|
76
|
+
const { failure, pendingRequests, failTransport, malformedJsonPeer, invalidPayloadPeer } = options;
|
|
77
|
+
if (failure.messageType === "response" && failure.id !== null) {
|
|
78
|
+
const rejected = pendingRequests.reject(failure.id, new TauTransportError("received malformed session protocol response"));
|
|
79
|
+
if (!rejected) {
|
|
80
|
+
failTransport(new TauTransportError(`received malformed response for unknown session protocol request '${failure.id}'`));
|
|
81
|
+
}
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (failure.reason === "parse_error") {
|
|
85
|
+
failTransport(new TauTransportError(`received malformed JSON from ${malformedJsonPeer}`));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (failure.reason === "response_invalid_id") {
|
|
89
|
+
failTransport(new TauTransportError("received response without a valid request id"));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (failure.reason === "unsupported_version" || failure.reason === "unsupported_message_type") {
|
|
93
|
+
failTransport(new TauTransportError(`received ${failure.error.message} from ${invalidPayloadPeer}`));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
failTransport(new TauTransportError(`received invalid session protocol payload from ${invalidPayloadPeer}: ${failure.error.message}`));
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=session_protocol_transport_helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session_protocol_transport_helpers.js","sourceRoot":"","sources":["../../src/transport/session_protocol_transport_helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SessionProtocolDeltaMessage, SessionProtocolEphemeralMessage, SessionProtocolInitializeParams, SessionProtocolMethod, SessionProtocolParamsByMethod, SessionProtocolReadyMessage, SessionProtocolResultByMethod } from "../protocol/session_protocol.js";
|
|
2
|
+
export type SessionProtocolDeltaListener = (delta: SessionProtocolDeltaMessage) => void;
|
|
3
|
+
export type SessionProtocolEphemeralListener = (message: SessionProtocolEphemeralMessage) => void;
|
|
4
|
+
export type SessionProtocolTransport = {
|
|
5
|
+
readonly ready: SessionProtocolReadyMessage;
|
|
6
|
+
connect(initializeParams: SessionProtocolInitializeParams, timeoutMs: number): Promise<void>;
|
|
7
|
+
request<M extends SessionProtocolMethod>(method: M, params: SessionProtocolParamsByMethod[M]): Promise<SessionProtocolResultByMethod[M]>;
|
|
8
|
+
onDelta(listener: SessionProtocolDeltaListener): () => void;
|
|
9
|
+
onEphemeral(listener: SessionProtocolEphemeralListener): () => void;
|
|
10
|
+
close(): Promise<void>;
|
|
11
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session_transport.js","sourceRoot":"","sources":["../../src/transport/session_transport.ts"],"names":[],"mappings":""}
|