@mquan/portal 0.0.1
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 +168 -0
- package/dist/src/api.d.ts +5 -0
- package/dist/src/api.js +357 -0
- package/dist/src/api.js.map +1 -0
- package/dist/src/cli.d.ts +17 -0
- package/dist/src/cli.js +618 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/daemon-lifecycle.d.ts +24 -0
- package/dist/src/daemon-lifecycle.js +107 -0
- package/dist/src/daemon-lifecycle.js.map +1 -0
- package/dist/src/daemon.d.ts +17 -0
- package/dist/src/daemon.js +90 -0
- package/dist/src/daemon.js.map +1 -0
- package/dist/src/doctor.d.ts +14 -0
- package/dist/src/doctor.js +51 -0
- package/dist/src/doctor.js.map +1 -0
- package/dist/src/entrypoint.d.ts +2 -0
- package/dist/src/entrypoint.js +14 -0
- package/dist/src/entrypoint.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/launch.d.ts +41 -0
- package/dist/src/launch.js +186 -0
- package/dist/src/launch.js.map +1 -0
- package/dist/src/mcp.d.ts +9 -0
- package/dist/src/mcp.js +132 -0
- package/dist/src/mcp.js.map +1 -0
- package/dist/src/network/client.d.ts +67 -0
- package/dist/src/network/client.js +540 -0
- package/dist/src/network/client.js.map +1 -0
- package/dist/src/network/coordinator.d.ts +83 -0
- package/dist/src/network/coordinator.js +225 -0
- package/dist/src/network/coordinator.js.map +1 -0
- package/dist/src/network/protocol.d.ts +1352 -0
- package/dist/src/network/protocol.js +360 -0
- package/dist/src/network/protocol.js.map +1 -0
- package/dist/src/network/server.d.ts +28 -0
- package/dist/src/network/server.js +474 -0
- package/dist/src/network/server.js.map +1 -0
- package/dist/src/network/tasks.d.ts +65 -0
- package/dist/src/network/tasks.js +276 -0
- package/dist/src/network/tasks.js.map +1 -0
- package/dist/src/portal-index.d.ts +21 -0
- package/dist/src/portal-index.js +140 -0
- package/dist/src/portal-index.js.map +1 -0
- package/dist/src/provider/claude-managed.d.ts +34 -0
- package/dist/src/provider/claude-managed.js +125 -0
- package/dist/src/provider/claude-managed.js.map +1 -0
- package/dist/src/provider/claude.d.ts +24 -0
- package/dist/src/provider/claude.js +114 -0
- package/dist/src/provider/claude.js.map +1 -0
- package/dist/src/provider/codex/app-server-client.d.ts +43 -0
- package/dist/src/provider/codex/app-server-client.js +143 -0
- package/dist/src/provider/codex/app-server-client.js.map +1 -0
- package/dist/src/provider/codex/index.d.ts +3 -0
- package/dist/src/provider/codex/index.js +4 -0
- package/dist/src/provider/codex/index.js.map +1 -0
- package/dist/src/provider/codex/managed-runner.d.ts +12 -0
- package/dist/src/provider/codex/managed-runner.js +162 -0
- package/dist/src/provider/codex/managed-runner.js.map +1 -0
- package/dist/src/provider/codex/probe.d.ts +2 -0
- package/dist/src/provider/codex/probe.js +33 -0
- package/dist/src/provider/codex/probe.js.map +1 -0
- package/dist/src/provider/codex/protocol.d.ts +193 -0
- package/dist/src/provider/codex/protocol.js +10 -0
- package/dist/src/provider/codex/protocol.js.map +1 -0
- package/dist/src/provider/codex/provider.d.ts +35 -0
- package/dist/src/provider/codex/provider.js +289 -0
- package/dist/src/provider/codex/provider.js.map +1 -0
- package/dist/src/provider/codex/remote-app-server.d.ts +16 -0
- package/dist/src/provider/codex/remote-app-server.js +80 -0
- package/dist/src/provider/codex/remote-app-server.js.map +1 -0
- package/dist/src/provider/codex/websocket-client.d.ts +40 -0
- package/dist/src/provider/codex/websocket-client.js +174 -0
- package/dist/src/provider/codex/websocket-client.js.map +1 -0
- package/dist/src/provider/types.d.ts +35 -0
- package/dist/src/provider/types.js +2 -0
- package/dist/src/provider/types.js.map +1 -0
- package/dist/src/recall/embedding.d.ts +28 -0
- package/dist/src/recall/embedding.js +142 -0
- package/dist/src/recall/embedding.js.map +1 -0
- package/dist/src/recall/types.d.ts +35 -0
- package/dist/src/recall/types.js +2 -0
- package/dist/src/recall/types.js.map +1 -0
- package/dist/src/rpc/client.d.ts +6 -0
- package/dist/src/rpc/client.js +58 -0
- package/dist/src/rpc/client.js.map +1 -0
- package/dist/src/rpc/protocol.d.ts +21 -0
- package/dist/src/rpc/protocol.js +11 -0
- package/dist/src/rpc/protocol.js.map +1 -0
- package/dist/src/rpc/server.d.ts +12 -0
- package/dist/src/rpc/server.js +154 -0
- package/dist/src/rpc/server.js.map +1 -0
- package/dist/src/runtime/paths.d.ts +8 -0
- package/dist/src/runtime/paths.js +18 -0
- package/dist/src/runtime/paths.js.map +1 -0
- package/dist/src/service.d.ts +127 -0
- package/dist/src/service.js +637 -0
- package/dist/src/service.js.map +1 -0
- package/dist/src/session-profile.d.ts +39 -0
- package/dist/src/session-profile.js +186 -0
- package/dist/src/session-profile.js.map +1 -0
- package/dist/src/storage/database.d.ts +9 -0
- package/dist/src/storage/database.js +354 -0
- package/dist/src/storage/database.js.map +1 -0
- package/dist/src/storage/repository.d.ts +275 -0
- package/dist/src/storage/repository.js +1291 -0
- package/dist/src/storage/repository.js.map +1 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +2 -0
- package/dist/src/version.js.map +1 -0
- package/docs/architecture-plan.md +191 -0
- package/docs/mvp-plan.md +111 -0
- package/docs/remote-demo.md +346 -0
- package/package.json +47 -0
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import { chmodSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { DatabaseSync } from "node:sqlite";
|
|
4
|
+
const MIGRATIONS = [
|
|
5
|
+
{
|
|
6
|
+
version: 1,
|
|
7
|
+
name: "durable_portal_records",
|
|
8
|
+
sql: `
|
|
9
|
+
CREATE TABLE sessions (
|
|
10
|
+
portal_session_id TEXT PRIMARY KEY,
|
|
11
|
+
provider TEXT NOT NULL CHECK (provider IN ('codex', 'claude')),
|
|
12
|
+
installation TEXT NOT NULL,
|
|
13
|
+
account_fingerprint TEXT NOT NULL,
|
|
14
|
+
vendor_session_id TEXT NOT NULL,
|
|
15
|
+
workspace TEXT,
|
|
16
|
+
title TEXT,
|
|
17
|
+
observed_at INTEGER NOT NULL,
|
|
18
|
+
updated_at INTEGER,
|
|
19
|
+
state TEXT NOT NULL CHECK (state IN ('active', 'idle', 'historical', 'unknown')),
|
|
20
|
+
state_confidence TEXT NOT NULL CHECK (state_confidence IN ('verified', 'inferred', 'unavailable')),
|
|
21
|
+
indexed INTEGER NOT NULL DEFAULT 0 CHECK (indexed IN (0, 1)),
|
|
22
|
+
connected INTEGER NOT NULL DEFAULT 0 CHECK (connected IN (0, 1)),
|
|
23
|
+
messageable INTEGER NOT NULL DEFAULT 0 CHECK (messageable IN (0, 1)),
|
|
24
|
+
UNIQUE (provider, installation, account_fingerprint, vendor_session_id)
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
CREATE INDEX sessions_workspace_updated_idx
|
|
28
|
+
ON sessions (workspace, updated_at DESC);
|
|
29
|
+
|
|
30
|
+
CREATE TABLE transcript_entries (
|
|
31
|
+
entry_id TEXT PRIMARY KEY,
|
|
32
|
+
session_id TEXT NOT NULL REFERENCES sessions(portal_session_id) ON DELETE CASCADE,
|
|
33
|
+
source_id TEXT NOT NULL,
|
|
34
|
+
role TEXT NOT NULL CHECK (role IN ('user', 'assistant', 'tool', 'system', 'other')),
|
|
35
|
+
text TEXT NOT NULL,
|
|
36
|
+
occurred_at INTEGER,
|
|
37
|
+
content_hash TEXT NOT NULL,
|
|
38
|
+
created_at INTEGER NOT NULL,
|
|
39
|
+
updated_at INTEGER NOT NULL,
|
|
40
|
+
UNIQUE (session_id, source_id)
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
CREATE INDEX transcript_entries_session_time_idx
|
|
44
|
+
ON transcript_entries (session_id, occurred_at, entry_id);
|
|
45
|
+
CREATE INDEX transcript_entries_hash_idx
|
|
46
|
+
ON transcript_entries (content_hash);
|
|
47
|
+
|
|
48
|
+
CREATE TABLE ingestion_cursors (
|
|
49
|
+
provider TEXT NOT NULL CHECK (provider IN ('codex', 'claude')),
|
|
50
|
+
source_scope TEXT NOT NULL,
|
|
51
|
+
cursor TEXT,
|
|
52
|
+
watermark TEXT,
|
|
53
|
+
last_success INTEGER,
|
|
54
|
+
last_error TEXT,
|
|
55
|
+
updated_at INTEGER NOT NULL,
|
|
56
|
+
PRIMARY KEY (provider, source_scope)
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
CREATE TABLE messages (
|
|
60
|
+
message_id TEXT PRIMARY KEY,
|
|
61
|
+
sender_session_id TEXT NOT NULL REFERENCES sessions(portal_session_id),
|
|
62
|
+
target_session_id TEXT NOT NULL REFERENCES sessions(portal_session_id),
|
|
63
|
+
body TEXT NOT NULL,
|
|
64
|
+
state TEXT NOT NULL CHECK (state IN ('queued', 'delivering', 'delivered', 'failed', 'replied')),
|
|
65
|
+
created_at INTEGER NOT NULL,
|
|
66
|
+
delivered_at INTEGER,
|
|
67
|
+
reply_to TEXT REFERENCES messages(message_id),
|
|
68
|
+
idempotency_key TEXT NOT NULL,
|
|
69
|
+
error TEXT,
|
|
70
|
+
UNIQUE (sender_session_id, idempotency_key)
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
CREATE INDEX messages_target_state_created_idx
|
|
74
|
+
ON messages (target_session_id, state, created_at);
|
|
75
|
+
`,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
version: 2,
|
|
79
|
+
name: "recall_index",
|
|
80
|
+
sql: `
|
|
81
|
+
CREATE TABLE chunks (
|
|
82
|
+
chunk_id TEXT PRIMARY KEY,
|
|
83
|
+
session_id TEXT NOT NULL REFERENCES sessions(portal_session_id) ON DELETE CASCADE,
|
|
84
|
+
first_entry_id TEXT NOT NULL REFERENCES transcript_entries(entry_id) ON DELETE CASCADE,
|
|
85
|
+
last_entry_id TEXT NOT NULL REFERENCES transcript_entries(entry_id) ON DELETE CASCADE,
|
|
86
|
+
ordinal INTEGER NOT NULL,
|
|
87
|
+
text TEXT NOT NULL,
|
|
88
|
+
content_hash TEXT NOT NULL,
|
|
89
|
+
occurred_at INTEGER,
|
|
90
|
+
embedding_model TEXT,
|
|
91
|
+
embedding_json TEXT,
|
|
92
|
+
UNIQUE (first_entry_id, ordinal)
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
CREATE INDEX chunks_session_time_idx ON chunks (session_id, occurred_at, chunk_id);
|
|
96
|
+
CREATE INDEX chunks_embedding_model_idx ON chunks (embedding_model, chunk_id);
|
|
97
|
+
|
|
98
|
+
CREATE VIRTUAL TABLE chunks_fts USING fts5(
|
|
99
|
+
text,
|
|
100
|
+
content='chunks',
|
|
101
|
+
content_rowid='rowid',
|
|
102
|
+
tokenize='porter unicode61 remove_diacritics 2'
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
CREATE TRIGGER chunks_fts_insert AFTER INSERT ON chunks BEGIN
|
|
106
|
+
INSERT INTO chunks_fts(rowid, text) VALUES (new.rowid, new.text);
|
|
107
|
+
END;
|
|
108
|
+
|
|
109
|
+
CREATE TRIGGER chunks_fts_delete AFTER DELETE ON chunks BEGIN
|
|
110
|
+
INSERT INTO chunks_fts(chunks_fts, rowid, text)
|
|
111
|
+
VALUES ('delete', old.rowid, old.text);
|
|
112
|
+
END;
|
|
113
|
+
|
|
114
|
+
CREATE TRIGGER chunks_fts_update AFTER UPDATE OF text ON chunks BEGIN
|
|
115
|
+
INSERT INTO chunks_fts(chunks_fts, rowid, text)
|
|
116
|
+
VALUES ('delete', old.rowid, old.text);
|
|
117
|
+
INSERT INTO chunks_fts(rowid, text) VALUES (new.rowid, new.text);
|
|
118
|
+
END;
|
|
119
|
+
|
|
120
|
+
CREATE TABLE embedding_buckets (
|
|
121
|
+
model TEXT NOT NULL,
|
|
122
|
+
bucket TEXT NOT NULL,
|
|
123
|
+
chunk_id TEXT NOT NULL REFERENCES chunks(chunk_id) ON DELETE CASCADE,
|
|
124
|
+
PRIMARY KEY (model, bucket, chunk_id)
|
|
125
|
+
) WITHOUT ROWID;
|
|
126
|
+
|
|
127
|
+
CREATE INDEX embedding_buckets_chunk_idx
|
|
128
|
+
ON embedding_buckets (model, chunk_id);
|
|
129
|
+
`,
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
version: 3,
|
|
133
|
+
name: "session_credentials",
|
|
134
|
+
sql: `
|
|
135
|
+
CREATE TABLE session_credentials (
|
|
136
|
+
credential_id TEXT PRIMARY KEY,
|
|
137
|
+
session_id TEXT NOT NULL REFERENCES sessions(portal_session_id) ON DELETE CASCADE,
|
|
138
|
+
secret_hash TEXT NOT NULL,
|
|
139
|
+
created_at INTEGER NOT NULL,
|
|
140
|
+
revoked_at INTEGER
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
CREATE INDEX session_credentials_session_idx
|
|
144
|
+
ON session_credentials (session_id, revoked_at);
|
|
145
|
+
`,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
version: 4,
|
|
149
|
+
name: "connection_leases",
|
|
150
|
+
sql: `
|
|
151
|
+
CREATE TABLE connection_leases (
|
|
152
|
+
session_id TEXT PRIMARY KEY REFERENCES sessions(portal_session_id) ON DELETE CASCADE,
|
|
153
|
+
last_seen INTEGER NOT NULL,
|
|
154
|
+
expires_at INTEGER NOT NULL
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
CREATE INDEX connection_leases_expiry_idx ON connection_leases (expires_at);
|
|
158
|
+
`,
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
version: 5,
|
|
162
|
+
name: "credential_expiration",
|
|
163
|
+
sql: `
|
|
164
|
+
ALTER TABLE session_credentials ADD COLUMN expires_at INTEGER;
|
|
165
|
+
UPDATE session_credentials
|
|
166
|
+
SET expires_at = created_at + 86400000
|
|
167
|
+
WHERE expires_at IS NULL;
|
|
168
|
+
`,
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
version: 6,
|
|
172
|
+
name: "inbox_delivery_claims",
|
|
173
|
+
sql: `
|
|
174
|
+
ALTER TABLE messages ADD COLUMN delivery_claimed_at INTEGER;
|
|
175
|
+
ALTER TABLE messages ADD COLUMN delivery_attempts INTEGER NOT NULL DEFAULT 0;
|
|
176
|
+
CREATE INDEX messages_claim_expiry_idx
|
|
177
|
+
ON messages (target_session_id, state, delivery_claimed_at);
|
|
178
|
+
`,
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
version: 7,
|
|
182
|
+
name: "managed_session_names",
|
|
183
|
+
sql: `
|
|
184
|
+
ALTER TABLE sessions ADD COLUMN managed_name TEXT;
|
|
185
|
+
CREATE INDEX sessions_workspace_managed_name_idx
|
|
186
|
+
ON sessions (workspace, managed_name) WHERE managed_name IS NOT NULL;
|
|
187
|
+
`,
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
version: 8,
|
|
191
|
+
name: "managed_message_delivery",
|
|
192
|
+
sql: `
|
|
193
|
+
CREATE TABLE runner_leases (
|
|
194
|
+
session_id TEXT PRIMARY KEY REFERENCES sessions(portal_session_id) ON DELETE CASCADE,
|
|
195
|
+
last_seen INTEGER NOT NULL,
|
|
196
|
+
expires_at INTEGER NOT NULL
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
CREATE INDEX runner_leases_expiry_idx ON runner_leases (expires_at);
|
|
200
|
+
|
|
201
|
+
CREATE TABLE message_receipts (
|
|
202
|
+
message_id TEXT PRIMARY KEY REFERENCES messages(message_id) ON DELETE CASCADE,
|
|
203
|
+
target_turn_id TEXT,
|
|
204
|
+
received_at INTEGER,
|
|
205
|
+
completed_at INTEGER,
|
|
206
|
+
status TEXT NOT NULL CHECK (status IN ('claimed', 'running', 'completed', 'failed')),
|
|
207
|
+
answer TEXT,
|
|
208
|
+
tool_results_json TEXT,
|
|
209
|
+
error TEXT
|
|
210
|
+
);
|
|
211
|
+
`,
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
version: 9,
|
|
215
|
+
name: "session_profiles",
|
|
216
|
+
sql: `
|
|
217
|
+
CREATE TABLE session_profiles (
|
|
218
|
+
session_id TEXT PRIMARY KEY REFERENCES sessions(portal_session_id) ON DELETE CASCADE,
|
|
219
|
+
display_name TEXT NOT NULL,
|
|
220
|
+
description TEXT NOT NULL,
|
|
221
|
+
topics_json TEXT NOT NULL,
|
|
222
|
+
source TEXT NOT NULL CHECK (source IN ('explicit', 'derived')),
|
|
223
|
+
transcript_watermark TEXT,
|
|
224
|
+
updated_at INTEGER NOT NULL
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
CREATE INDEX session_profiles_updated_idx
|
|
228
|
+
ON session_profiles (updated_at DESC, session_id);
|
|
229
|
+
`,
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
version: 10,
|
|
233
|
+
name: "remote_task_events",
|
|
234
|
+
sql: `
|
|
235
|
+
CREATE TABLE remote_tasks (
|
|
236
|
+
server_url TEXT NOT NULL,
|
|
237
|
+
task_id TEXT NOT NULL,
|
|
238
|
+
local_session_id TEXT NOT NULL REFERENCES sessions(portal_session_id) ON DELETE CASCADE,
|
|
239
|
+
local_route_id TEXT NOT NULL,
|
|
240
|
+
remote_route_id TEXT NOT NULL,
|
|
241
|
+
direction TEXT NOT NULL CHECK (direction IN ('inbound', 'outbound')),
|
|
242
|
+
state TEXT NOT NULL CHECK (state IN ('offered', 'accepted', 'declined', 'running', 'completed', 'failed')),
|
|
243
|
+
created_at INTEGER NOT NULL,
|
|
244
|
+
updated_at INTEGER NOT NULL,
|
|
245
|
+
expires_at INTEGER NOT NULL,
|
|
246
|
+
PRIMARY KEY (server_url, task_id)
|
|
247
|
+
);
|
|
248
|
+
|
|
249
|
+
CREATE INDEX remote_tasks_local_state_idx
|
|
250
|
+
ON remote_tasks (local_session_id, state, updated_at DESC);
|
|
251
|
+
|
|
252
|
+
CREATE TABLE remote_task_events (
|
|
253
|
+
server_url TEXT NOT NULL,
|
|
254
|
+
event_id TEXT NOT NULL,
|
|
255
|
+
envelope_id TEXT NOT NULL,
|
|
256
|
+
task_id TEXT NOT NULL,
|
|
257
|
+
local_session_id TEXT NOT NULL REFERENCES sessions(portal_session_id) ON DELETE CASCADE,
|
|
258
|
+
local_route_id TEXT NOT NULL,
|
|
259
|
+
remote_route_id TEXT NOT NULL,
|
|
260
|
+
direction TEXT NOT NULL CHECK (direction IN ('inbound', 'outbound')),
|
|
261
|
+
kind TEXT NOT NULL CHECK (kind IN (
|
|
262
|
+
'offer', 'accepted', 'declined', 'running', 'progress',
|
|
263
|
+
'question', 'answer', 'completed', 'failed'
|
|
264
|
+
)),
|
|
265
|
+
state TEXT NOT NULL CHECK (state IN ('offered', 'accepted', 'declined', 'running', 'completed', 'failed')),
|
|
266
|
+
payload_json TEXT NOT NULL CHECK (json_valid(payload_json)),
|
|
267
|
+
sender_label TEXT NOT NULL,
|
|
268
|
+
sender_reference TEXT NOT NULL,
|
|
269
|
+
authenticated INTEGER NOT NULL DEFAULT 0 CHECK (authenticated = 0),
|
|
270
|
+
local_message_id TEXT REFERENCES messages(message_id) ON DELETE SET NULL,
|
|
271
|
+
occurred_at INTEGER NOT NULL,
|
|
272
|
+
expires_at INTEGER NOT NULL,
|
|
273
|
+
recorded_at INTEGER NOT NULL,
|
|
274
|
+
delivery_state TEXT NOT NULL CHECK (delivery_state IN ('queued', 'delivering', 'delivered', 'failed', 'not_applicable')),
|
|
275
|
+
delivery_claimed_at INTEGER,
|
|
276
|
+
delivery_attempts INTEGER NOT NULL DEFAULT 0,
|
|
277
|
+
runner_started_at INTEGER,
|
|
278
|
+
target_turn_id TEXT,
|
|
279
|
+
received_at INTEGER,
|
|
280
|
+
completed_at INTEGER,
|
|
281
|
+
answer TEXT,
|
|
282
|
+
tool_results_json TEXT CHECK (tool_results_json IS NULL OR json_valid(tool_results_json)),
|
|
283
|
+
error TEXT,
|
|
284
|
+
PRIMARY KEY (server_url, event_id),
|
|
285
|
+
UNIQUE (server_url, envelope_id),
|
|
286
|
+
UNIQUE (local_message_id),
|
|
287
|
+
FOREIGN KEY (server_url, task_id) REFERENCES remote_tasks(server_url, task_id) ON DELETE CASCADE
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
CREATE INDEX remote_task_events_task_time_idx
|
|
291
|
+
ON remote_task_events (server_url, task_id, occurred_at, event_id);
|
|
292
|
+
CREATE INDEX remote_task_events_runner_queue_idx
|
|
293
|
+
ON remote_task_events (local_session_id, direction, delivery_state, delivery_claimed_at, occurred_at);
|
|
294
|
+
`,
|
|
295
|
+
},
|
|
296
|
+
];
|
|
297
|
+
export class PortalDatabase {
|
|
298
|
+
filename;
|
|
299
|
+
connection;
|
|
300
|
+
constructor(filename) {
|
|
301
|
+
this.filename = filename;
|
|
302
|
+
if (filename !== ":memory:") {
|
|
303
|
+
const directory = dirname(filename);
|
|
304
|
+
mkdirSync(directory, { recursive: true, mode: 0o700 });
|
|
305
|
+
chmodSync(directory, 0o700);
|
|
306
|
+
}
|
|
307
|
+
this.connection = new DatabaseSync(filename);
|
|
308
|
+
if (filename !== ":memory:")
|
|
309
|
+
chmodSync(filename, 0o600);
|
|
310
|
+
this.connection.exec("PRAGMA foreign_keys = ON; PRAGMA busy_timeout = 5000;");
|
|
311
|
+
if (filename !== ":memory:") {
|
|
312
|
+
this.connection.exec("PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL;");
|
|
313
|
+
}
|
|
314
|
+
this.migrate();
|
|
315
|
+
}
|
|
316
|
+
close() {
|
|
317
|
+
this.connection.close();
|
|
318
|
+
}
|
|
319
|
+
transaction(operation) {
|
|
320
|
+
this.connection.exec("BEGIN IMMEDIATE");
|
|
321
|
+
try {
|
|
322
|
+
const result = operation();
|
|
323
|
+
this.connection.exec("COMMIT");
|
|
324
|
+
return result;
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
this.connection.exec("ROLLBACK");
|
|
328
|
+
throw error;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
migrate() {
|
|
332
|
+
this.connection.exec(`
|
|
333
|
+
CREATE TABLE IF NOT EXISTS schema_migrations (
|
|
334
|
+
version INTEGER PRIMARY KEY,
|
|
335
|
+
name TEXT NOT NULL,
|
|
336
|
+
applied_at INTEGER NOT NULL
|
|
337
|
+
);
|
|
338
|
+
`);
|
|
339
|
+
for (const migration of MIGRATIONS) {
|
|
340
|
+
this.transaction(() => {
|
|
341
|
+
const applied = this.connection
|
|
342
|
+
.prepare("SELECT 1 AS applied FROM schema_migrations WHERE version = ?")
|
|
343
|
+
.get(migration.version);
|
|
344
|
+
if (applied !== undefined)
|
|
345
|
+
return;
|
|
346
|
+
this.connection.exec(migration.sql);
|
|
347
|
+
this.connection
|
|
348
|
+
.prepare("INSERT INTO schema_migrations(version, name, applied_at) VALUES (?, ?, ?)")
|
|
349
|
+
.run(migration.version, migration.name, Date.now());
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/storage/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C,MAAM,UAAU,GAAyB;IACvC;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,wBAAwB;QAC9B,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmEJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,cAAc;QACpB,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAiDJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,qBAAqB;QAC3B,GAAG,EAAE;;;;;;;;;;;KAWJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,mBAAmB;QACzB,GAAG,EAAE;;;;;;;;KAQJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,uBAAuB;QAC7B,GAAG,EAAE;;;;;KAKJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,uBAAuB;QAC7B,GAAG,EAAE;;;;;KAKJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,uBAAuB;QAC7B,GAAG,EAAE;;;;KAIJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,0BAA0B;QAChC,GAAG,EAAE;;;;;;;;;;;;;;;;;;;KAmBJ;KACF;IACD;QACE,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,kBAAkB;QACxB,GAAG,EAAE;;;;;;;;;;;;;KAaJ;KACF;IACD;QACE,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,oBAAoB;QAC1B,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4DJ;KACF;CACF,CAAC;AAEF,MAAM,OAAO,cAAc;IAGJ,QAAQ;IAFpB,UAAU,CAAe;IAElC,YAAqB,QAAgB;wBAAhB,QAAQ;QAC3B,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,QAAQ,KAAK,UAAU;YAAE,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QAC9E,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;IAED,WAAW,CAAI,SAAkB;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACjC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,OAAO;QACb,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;;;;;;KAMpB,CAAC,CAAC;QAEH,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE;gBACpB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU;qBAC5B,OAAO,CAAC,8DAA8D,CAAC;qBACvE,GAAG,CAAC,SAAS,CAAC,OAAO,CAAoC,CAAC;gBAC7D,IAAI,OAAO,KAAK,SAAS;oBAAE,OAAO;gBAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACpC,IAAI,CAAC,UAAU;qBACZ,OAAO,CAAC,2EAA2E,CAAC;qBACpF,GAAG,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import type { CapabilityConfidence, ProviderName, SessionState, TranscriptEntry } from "../provider/types.js";
|
|
2
|
+
import type { RecallCitation } from "../recall/types.js";
|
|
3
|
+
import { PortalDatabase } from "./database.js";
|
|
4
|
+
export interface SessionIdentity {
|
|
5
|
+
provider: ProviderName;
|
|
6
|
+
vendorSessionId: string;
|
|
7
|
+
installation?: string;
|
|
8
|
+
accountFingerprint?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SessionUpsert extends SessionIdentity {
|
|
11
|
+
workspace: string | null;
|
|
12
|
+
title: string | null;
|
|
13
|
+
managedName?: string | null;
|
|
14
|
+
observedAt?: Date;
|
|
15
|
+
updatedAt: Date | null;
|
|
16
|
+
state: SessionState;
|
|
17
|
+
stateConfidence: CapabilityConfidence;
|
|
18
|
+
indexed: boolean;
|
|
19
|
+
connected: boolean;
|
|
20
|
+
messageable: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface StoredSession extends Required<SessionIdentity> {
|
|
23
|
+
portalSessionId: string;
|
|
24
|
+
workspace: string | null;
|
|
25
|
+
title: string | null;
|
|
26
|
+
managedName: string | null;
|
|
27
|
+
observedAt: Date;
|
|
28
|
+
updatedAt: Date | null;
|
|
29
|
+
state: SessionState;
|
|
30
|
+
stateConfidence: CapabilityConfidence;
|
|
31
|
+
indexed: boolean;
|
|
32
|
+
connected: boolean;
|
|
33
|
+
messageable: boolean;
|
|
34
|
+
}
|
|
35
|
+
export type SessionProfileSource = "explicit" | "derived";
|
|
36
|
+
export interface SessionProfileUpsert {
|
|
37
|
+
sessionId: string;
|
|
38
|
+
displayName: string;
|
|
39
|
+
description: string;
|
|
40
|
+
topics: readonly string[];
|
|
41
|
+
source: SessionProfileSource;
|
|
42
|
+
transcriptWatermark: string | null;
|
|
43
|
+
updatedAt?: Date;
|
|
44
|
+
}
|
|
45
|
+
export interface StoredSessionProfile {
|
|
46
|
+
sessionId: string;
|
|
47
|
+
displayName: string;
|
|
48
|
+
description: string;
|
|
49
|
+
topics: string[];
|
|
50
|
+
source: SessionProfileSource;
|
|
51
|
+
transcriptWatermark: string | null;
|
|
52
|
+
updatedAt: Date;
|
|
53
|
+
}
|
|
54
|
+
export interface IngestionResult {
|
|
55
|
+
inserted: number;
|
|
56
|
+
updated: number;
|
|
57
|
+
unchanged: number;
|
|
58
|
+
removed: number;
|
|
59
|
+
chunkIds: string[];
|
|
60
|
+
}
|
|
61
|
+
export interface StoredChunk {
|
|
62
|
+
chunkId: string;
|
|
63
|
+
sessionId: string;
|
|
64
|
+
text: string;
|
|
65
|
+
embeddingModel: string | null;
|
|
66
|
+
embedding: readonly number[] | null;
|
|
67
|
+
}
|
|
68
|
+
export interface LexicalCandidate {
|
|
69
|
+
chunkId: string;
|
|
70
|
+
text: string;
|
|
71
|
+
lexicalRank: number;
|
|
72
|
+
citation: RecallCitation;
|
|
73
|
+
}
|
|
74
|
+
export interface SemanticCandidate {
|
|
75
|
+
chunkId: string;
|
|
76
|
+
text: string;
|
|
77
|
+
similarity: number;
|
|
78
|
+
citation: RecallCitation;
|
|
79
|
+
}
|
|
80
|
+
export interface CandidateQuery {
|
|
81
|
+
workspace: string;
|
|
82
|
+
providers?: readonly ProviderName[];
|
|
83
|
+
occurredAfter?: Date;
|
|
84
|
+
occurredBefore?: Date;
|
|
85
|
+
limit: number;
|
|
86
|
+
}
|
|
87
|
+
export interface IngestionCursor {
|
|
88
|
+
provider: ProviderName;
|
|
89
|
+
sourceScope: string;
|
|
90
|
+
cursor: string | null;
|
|
91
|
+
watermark: string | null;
|
|
92
|
+
lastSuccess: Date | null;
|
|
93
|
+
lastError: string | null;
|
|
94
|
+
updatedAt: Date;
|
|
95
|
+
}
|
|
96
|
+
export type MessageState = "queued" | "delivering" | "delivered" | "failed" | "replied";
|
|
97
|
+
export interface StoredMessage {
|
|
98
|
+
messageId: string;
|
|
99
|
+
senderSessionId: string;
|
|
100
|
+
targetSessionId: string;
|
|
101
|
+
body: string;
|
|
102
|
+
state: MessageState;
|
|
103
|
+
createdAt: Date;
|
|
104
|
+
deliveredAt: Date | null;
|
|
105
|
+
replyTo: string | null;
|
|
106
|
+
idempotencyKey: string;
|
|
107
|
+
error: string | null;
|
|
108
|
+
}
|
|
109
|
+
export interface MessageReceipt {
|
|
110
|
+
messageId: string;
|
|
111
|
+
targetTurnId: string | null;
|
|
112
|
+
receivedAt: Date | null;
|
|
113
|
+
completedAt: Date | null;
|
|
114
|
+
status: "claimed" | "running" | "completed" | "failed";
|
|
115
|
+
answer: string | null;
|
|
116
|
+
toolResults: unknown[];
|
|
117
|
+
error: string | null;
|
|
118
|
+
}
|
|
119
|
+
export type RemoteTaskDirection = "inbound" | "outbound";
|
|
120
|
+
export type RemoteTaskState = "offered" | "accepted" | "declined" | "running" | "completed" | "failed";
|
|
121
|
+
export type RemoteTaskEventKind = "offer" | "accepted" | "declined" | "running" | "progress" | "question" | "answer" | "completed" | "failed";
|
|
122
|
+
export type RemoteEventDeliveryState = "queued" | "delivering" | "delivered" | "failed" | "not_applicable";
|
|
123
|
+
export interface RemoteTaskEventInput {
|
|
124
|
+
serverUrl: string;
|
|
125
|
+
taskId: string;
|
|
126
|
+
eventId: string;
|
|
127
|
+
envelopeId: string;
|
|
128
|
+
localSessionId: string;
|
|
129
|
+
localRouteId: string;
|
|
130
|
+
remoteRouteId: string;
|
|
131
|
+
direction: RemoteTaskDirection;
|
|
132
|
+
kind: RemoteTaskEventKind;
|
|
133
|
+
state: RemoteTaskState;
|
|
134
|
+
payload: unknown;
|
|
135
|
+
senderLabel: string;
|
|
136
|
+
senderReference: string;
|
|
137
|
+
authenticated?: false;
|
|
138
|
+
localMessageId?: string | null;
|
|
139
|
+
occurredAt: Date;
|
|
140
|
+
expiresAt: Date;
|
|
141
|
+
recordedAt?: Date;
|
|
142
|
+
}
|
|
143
|
+
export interface StoredRemoteTask {
|
|
144
|
+
serverUrl: string;
|
|
145
|
+
taskId: string;
|
|
146
|
+
localSessionId: string;
|
|
147
|
+
localRouteId: string;
|
|
148
|
+
remoteRouteId: string;
|
|
149
|
+
direction: RemoteTaskDirection;
|
|
150
|
+
state: RemoteTaskState;
|
|
151
|
+
createdAt: Date;
|
|
152
|
+
updatedAt: Date;
|
|
153
|
+
expiresAt: Date;
|
|
154
|
+
}
|
|
155
|
+
export interface StoredRemoteTaskEvent {
|
|
156
|
+
serverUrl: string;
|
|
157
|
+
taskId: string;
|
|
158
|
+
eventId: string;
|
|
159
|
+
envelopeId: string;
|
|
160
|
+
localSessionId: string;
|
|
161
|
+
localRouteId: string;
|
|
162
|
+
remoteRouteId: string;
|
|
163
|
+
direction: RemoteTaskDirection;
|
|
164
|
+
kind: RemoteTaskEventKind;
|
|
165
|
+
state: RemoteTaskState;
|
|
166
|
+
payload: unknown;
|
|
167
|
+
senderLabel: string;
|
|
168
|
+
senderReference: string;
|
|
169
|
+
authenticated: boolean;
|
|
170
|
+
localMessageId: string | null;
|
|
171
|
+
occurredAt: Date;
|
|
172
|
+
expiresAt: Date;
|
|
173
|
+
recordedAt: Date;
|
|
174
|
+
deliveryState: RemoteEventDeliveryState;
|
|
175
|
+
deliveryClaimedAt: Date | null;
|
|
176
|
+
deliveryAttempts: number;
|
|
177
|
+
runnerStartedAt: Date | null;
|
|
178
|
+
targetTurnId: string | null;
|
|
179
|
+
receivedAt: Date | null;
|
|
180
|
+
completedAt: Date | null;
|
|
181
|
+
answer: string | null;
|
|
182
|
+
toolResults: unknown[];
|
|
183
|
+
error: string | null;
|
|
184
|
+
}
|
|
185
|
+
export interface RemoteTaskEventRecord {
|
|
186
|
+
task: StoredRemoteTask;
|
|
187
|
+
event: StoredRemoteTaskEvent;
|
|
188
|
+
inserted: boolean;
|
|
189
|
+
}
|
|
190
|
+
export declare class PortalRepository {
|
|
191
|
+
readonly database: PortalDatabase;
|
|
192
|
+
constructor(database: PortalDatabase);
|
|
193
|
+
upsertSession(input: SessionUpsert): StoredSession;
|
|
194
|
+
getSession(portalSessionId: string): StoredSession | null;
|
|
195
|
+
bindSessionVendorId(portalSessionId: string, vendorSessionId: string): StoredSession;
|
|
196
|
+
findSession(identity: SessionIdentity): StoredSession | null;
|
|
197
|
+
listSessions(workspace?: string): StoredSession[];
|
|
198
|
+
upsertSessionProfile(input: SessionProfileUpsert): StoredSessionProfile;
|
|
199
|
+
getSessionProfile(sessionId: string): StoredSessionProfile | null;
|
|
200
|
+
listSessionProfiles(workspace?: string): StoredSessionProfile[];
|
|
201
|
+
ingestTranscript(portalSessionId: string, entries: readonly TranscriptEntry[]): IngestionResult;
|
|
202
|
+
markSessionIndexed(portalSessionId: string): void;
|
|
203
|
+
chunksNeedingEmbedding(portalSessionId: string, model: string): StoredChunk[];
|
|
204
|
+
saveEmbedding(chunkId: string, model: string, vector: readonly number[]): void;
|
|
205
|
+
saveEmbeddings(model: string, embeddings: readonly {
|
|
206
|
+
chunkId: string;
|
|
207
|
+
vector: readonly number[];
|
|
208
|
+
}[]): void;
|
|
209
|
+
lexicalCandidates(ftsQuery: string, query: CandidateQuery): LexicalCandidate[];
|
|
210
|
+
semanticCandidates(model: string, vector: readonly number[], query: CandidateQuery): SemanticCandidate[];
|
|
211
|
+
explainLexicalQuery(ftsQuery: string, query: CandidateQuery): string[];
|
|
212
|
+
workspaceFreshness(workspace: string): Date | null;
|
|
213
|
+
upsertCursor(input: Omit<IngestionCursor, "updatedAt">): IngestionCursor;
|
|
214
|
+
getCursor(provider: ProviderName, sourceScope: string): IngestionCursor | null;
|
|
215
|
+
countTranscriptEntries(sessionId: string): number;
|
|
216
|
+
enqueueMessage(input: {
|
|
217
|
+
senderSessionId: string;
|
|
218
|
+
targetSessionId: string;
|
|
219
|
+
body: string;
|
|
220
|
+
idempotencyKey: string;
|
|
221
|
+
replyTo?: string | null;
|
|
222
|
+
}): StoredMessage;
|
|
223
|
+
createMessageIdempotencyKey(): string;
|
|
224
|
+
countMessagesSince(senderSessionId: string, since: Date): number;
|
|
225
|
+
hasRunningDelivery(senderSessionId: string, targetSessionId: string): boolean;
|
|
226
|
+
getMessage(messageId: string): StoredMessage | null;
|
|
227
|
+
getMessageByIdempotency(senderSessionId: string, idempotencyKey: string): StoredMessage | null;
|
|
228
|
+
updateMessageState(messageId: string, state: MessageState, options?: {
|
|
229
|
+
deliveredAt?: Date | null;
|
|
230
|
+
error?: string | null;
|
|
231
|
+
}): StoredMessage;
|
|
232
|
+
listInbox(targetSessionId: string, state?: MessageState): StoredMessage[];
|
|
233
|
+
receiveQueuedMessages(targetSessionId: string, acknowledgements?: readonly string[], claimTtlMs?: number): StoredMessage[];
|
|
234
|
+
touchRunnerLease(sessionId: string, ttlMs?: number): Date;
|
|
235
|
+
hasActiveRunnerLease(sessionId: string, now?: Date): boolean;
|
|
236
|
+
clearRunnerLease(sessionId: string): void;
|
|
237
|
+
claimNextRunnerMessage(targetSessionId: string, claimTtlMs?: number): StoredMessage | null;
|
|
238
|
+
markRunnerMessageReceived(messageId: string, targetSessionId: string, turnId: string): MessageReceipt;
|
|
239
|
+
markRunnerMessageStarting(messageId: string, targetSessionId: string): MessageReceipt;
|
|
240
|
+
completeRunnerMessage(messageId: string, targetSessionId: string, input: {
|
|
241
|
+
turnId: string;
|
|
242
|
+
answer: string | null;
|
|
243
|
+
toolResults: readonly unknown[];
|
|
244
|
+
}): MessageReceipt;
|
|
245
|
+
failRunnerMessage(messageId: string, targetSessionId: string, error: string): MessageReceipt;
|
|
246
|
+
getMessageReceipt(messageId: string): MessageReceipt | null;
|
|
247
|
+
private requireMessageReceipt;
|
|
248
|
+
recordRemoteTaskEvent(input: RemoteTaskEventInput): RemoteTaskEventRecord;
|
|
249
|
+
getRemoteTask(serverUrl: string, taskId: string): StoredRemoteTask | null;
|
|
250
|
+
getRemoteTaskEvent(serverUrl: string, eventId: string): StoredRemoteTaskEvent | null;
|
|
251
|
+
getRemoteTaskEventByEnvelope(serverUrl: string, envelopeId: string): StoredRemoteTaskEvent | null;
|
|
252
|
+
getRemoteTaskEventByLocalMessage(localMessageId: string): StoredRemoteTaskEvent | null;
|
|
253
|
+
listRemoteTaskEvents(serverUrl: string, taskId: string): StoredRemoteTaskEvent[];
|
|
254
|
+
linkRemoteTaskEventToLocalMessage(serverUrl: string, eventId: string, localMessageId: string): StoredRemoteTaskEvent;
|
|
255
|
+
claimNextRemoteTaskEvent(localSessionId: string, claimTtlMs?: number): StoredRemoteTaskEvent | null;
|
|
256
|
+
markRemoteTaskEventStarting(serverUrl: string, eventId: string, localSessionId: string): StoredRemoteTaskEvent;
|
|
257
|
+
markRemoteTaskEventReceived(serverUrl: string, eventId: string, localSessionId: string, turnId: string): StoredRemoteTaskEvent;
|
|
258
|
+
completeRemoteTaskEvent(serverUrl: string, eventId: string, localSessionId: string, input: {
|
|
259
|
+
turnId: string;
|
|
260
|
+
answer: string | null;
|
|
261
|
+
toolResults: readonly unknown[];
|
|
262
|
+
}): StoredRemoteTaskEvent;
|
|
263
|
+
failRemoteTaskEvent(serverUrl: string, eventId: string, localSessionId: string, error: string): StoredRemoteTaskEvent;
|
|
264
|
+
private requireRemoteTask;
|
|
265
|
+
private requireRemoteTaskEvent;
|
|
266
|
+
private validateRemoteLocalMessage;
|
|
267
|
+
issueSessionCredential(sessionId: string): string;
|
|
268
|
+
authenticateSession(sessionId: string, token: string): StoredSession;
|
|
269
|
+
revokeSessionCredential(token: string): void;
|
|
270
|
+
touchConnectionLease(sessionId: string, ttlMs?: number): Date;
|
|
271
|
+
hasActiveConnectionLease(sessionId: string, now?: Date): boolean;
|
|
272
|
+
clearConnectionLease(sessionId: string): void;
|
|
273
|
+
private validateReply;
|
|
274
|
+
}
|
|
275
|
+
export declare function compileFtsQuery(query: string): string;
|