@agentshouse/mdruntime 0.1.0-c7bd7ca3faee4 → 0.1.0-c7dd6612b99d5
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 +21 -8
- package/dist/adapter.d.ts +139 -32
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +5 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +38 -4
- package/dist/attempt.d.ts +16 -0
- package/dist/attempt.d.ts.map +1 -0
- package/dist/attempt.js +70 -0
- package/dist/binary.d.ts +18 -0
- package/dist/binary.d.ts.map +1 -0
- package/dist/binary.js +8 -0
- package/dist/bootstrap.d.ts +37 -6
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +196 -48
- package/dist/chain.d.ts +11 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +68 -0
- package/dist/change-set.d.ts +9 -14
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -56
- package/dist/change.d.ts +45 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +34 -0
- package/dist/client.d.ts +33 -14
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +123 -21
- package/dist/collection.d.ts +14 -13
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +66 -54
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +771 -0
- package/dist/connection.d.ts +61 -20
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +3883 -746
- package/dist/conversation.d.ts +44 -15
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +690 -192
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/durability.d.ts +5 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +20 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +151 -0
- package/dist/expectation.d.ts +21 -0
- package/dist/expectation.d.ts.map +1 -0
- package/dist/expectation.js +70 -0
- package/dist/failure.d.ts +13 -0
- package/dist/failure.d.ts.map +1 -0
- package/dist/failure.js +19 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/file.d.ts +2 -19
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +7 -122
- package/dist/fulltext.d.ts +27 -0
- package/dist/fulltext.d.ts.map +1 -0
- package/dist/fulltext.js +370 -0
- package/dist/host.d.ts +15 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +134 -22
- package/dist/identity.d.ts +4 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +16 -1
- package/dist/index.d.ts +19 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/live.d.ts +22 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +124 -0
- package/dist/media.d.ts +8 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +208 -0
- package/dist/memory.d.ts +13 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +137 -34
- package/dist/messages.d.ts +28 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +90 -0
- package/dist/model.d.ts +13 -4
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +17 -2
- package/dist/name.d.ts +4 -0
- package/dist/name.d.ts.map +1 -0
- package/dist/name.js +122 -0
- package/dist/observation.d.ts +20 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +113 -12
- package/dist/open.d.ts +2 -0
- package/dist/open.d.ts.map +1 -0
- package/dist/open.js +1 -0
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/outcome.d.ts +73 -3
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +81 -1
- package/dist/overlay.d.ts +15 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +136 -180
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +4 -0
- package/dist/query.d.ts +70 -4
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +51 -7
- package/dist/reach.d.ts +18 -4
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +246 -68
- package/dist/react.d.ts +12 -8
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +8 -17
- package/dist/readiness.d.ts +63 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +33 -0
- package/dist/reads.d.ts +11 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +91 -0
- package/dist/recovery.d.ts +25 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +198 -0
- package/dist/refresh.d.ts +19 -8
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +125 -57
- package/dist/replica.d.ts +59 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +321 -155
- package/dist/room-draft.d.ts +57 -10
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +222 -39
- package/dist/rows.d.ts +39 -35
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +176 -99
- package/dist/save.d.ts +73 -4
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +825 -150
- package/dist/search.d.ts +41 -29
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +37 -105
- package/dist/seed.d.ts +16 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +75 -0
- package/dist/shared.d.ts +16 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +431 -0
- package/dist/status.d.ts +11 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +3 -9
- package/dist/store.d.ts +121 -61
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +352 -354
- package/dist/stored.d.ts +135 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +568 -0
- package/dist/tables.d.ts +352 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +621 -0
- package/dist/turn.d.ts +9 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +75 -0
- package/dist/validation.d.ts +30 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +162 -0
- package/dist/windows.d.ts +22 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +89 -0
- package/dist/wire.d.ts +172 -33
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +68 -31
- package/dist/words.d.ts +19 -0
- package/dist/words.d.ts.map +1 -0
- package/dist/words.js +156 -0
- package/package.json +26 -15
- package/AGENTS.md +0 -253
- package/dist/attachment.d.ts +0 -3
- package/dist/attachment.d.ts.map +0 -1
- package/dist/attachment.js +0 -8
- package/dist/read-side.d.ts +0 -18
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -433
package/dist/change.js
CHANGED
|
@@ -11,3 +11,37 @@ function frozen(value) {
|
|
|
11
11
|
export function immutable(batch) {
|
|
12
12
|
return frozen(batch);
|
|
13
13
|
}
|
|
14
|
+
export function partnerOf(batch, locator) {
|
|
15
|
+
const between = batch.between;
|
|
16
|
+
if (between === undefined)
|
|
17
|
+
return null;
|
|
18
|
+
return between.source.room === locator ? between.destination.room : between.source.room;
|
|
19
|
+
}
|
|
20
|
+
export function leaving(batch, locator) {
|
|
21
|
+
return batch.between?.source.room === locator;
|
|
22
|
+
}
|
|
23
|
+
export function landing(changes, index, path) {
|
|
24
|
+
let at = path;
|
|
25
|
+
for (const change of changes.slice(index + 1)) {
|
|
26
|
+
if (change.path !== at)
|
|
27
|
+
continue;
|
|
28
|
+
if (change.kind === 'remove')
|
|
29
|
+
return null;
|
|
30
|
+
if (change.kind === 'move')
|
|
31
|
+
at = change.to;
|
|
32
|
+
}
|
|
33
|
+
return at;
|
|
34
|
+
}
|
|
35
|
+
export function departure(changes, index) {
|
|
36
|
+
let at = changes[index].path;
|
|
37
|
+
for (const change of changes.slice(0, index).reverse()) {
|
|
38
|
+
if (change.kind === 'move' && change.to === at)
|
|
39
|
+
at = change.path;
|
|
40
|
+
}
|
|
41
|
+
return at;
|
|
42
|
+
}
|
|
43
|
+
export function queuedFile(batch, path, localId) {
|
|
44
|
+
return batch.changes.findIndex((change, index) => change.kind === 'binary' &&
|
|
45
|
+
change.localId === localId &&
|
|
46
|
+
landing(batch.changes, index, change.path) === path);
|
|
47
|
+
}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,37 +1,40 @@
|
|
|
1
|
-
import type { AppRoom, ConnectionRefusal, HistoryQuery, RoomSchemas, SavedRoomDraft, SaveResult } from './connection.js';
|
|
2
|
-
import type {
|
|
3
|
-
import type { ChatDraft, ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
|
|
1
|
+
import type { AppRoom, ConnectionRefusal, HistoryQuery, RoomSchemas, SavedParts, SavedRoomDraft, SaveResult } from './connection.js';
|
|
2
|
+
import type { Member, ServiceMode } from './adapter.js';
|
|
3
|
+
import type { ChatDraft, ConversationAgent, ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
|
|
4
4
|
import { type Observation } from './observation.js';
|
|
5
|
-
import type { CallResult, QueueEntry } from './outcome.js';
|
|
6
|
-
import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult } from './query.js';
|
|
5
|
+
import type { AttachAnswer, BinaryAnswer, CallResult, DownloadAnswer, HistoryAnswer, Offline, QueueEntry, Resolution } from './outcome.js';
|
|
6
|
+
import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult, PendingResult } from './query.js';
|
|
7
7
|
import type { RoomDraft, RoomDraftParts, RoomDraftWrite } from './room-draft.js';
|
|
8
8
|
import type { SearchRequest, SearchResult } from './search.js';
|
|
9
|
+
import type { Readiness } from './readiness.js';
|
|
9
10
|
import type { SyncStatus } from './status.js';
|
|
10
11
|
import { type RuntimePort } from './wire.js';
|
|
11
12
|
export type MdRuntimeClient = {
|
|
12
13
|
rooms(): Promise<readonly AppRoom[]>;
|
|
13
14
|
query: {
|
|
14
|
-
(query: DocumentQuery): Promise<DocumentResult>;
|
|
15
|
-
(query: GroupQuery): Promise<GroupResult>;
|
|
15
|
+
(query: DocumentQuery): Promise<DocumentResult | PendingResult>;
|
|
16
|
+
(query: GroupQuery): Promise<GroupResult | PendingResult>;
|
|
16
17
|
};
|
|
17
18
|
search(request: SearchRequest): Promise<SearchResult>;
|
|
18
19
|
types(locator: string): Promise<RoomSchemas>;
|
|
19
20
|
roomDraft: {
|
|
20
21
|
list(): Promise<readonly RoomDraft[]>;
|
|
21
22
|
read(room: string, path: string): Promise<RoomDraft | null>;
|
|
22
|
-
write(room: string, path: string, revision: string | null, parts: RoomDraftParts): Promise<RoomDraftWrite>;
|
|
23
|
+
write(room: string, path: string, revision: string | null, parts: RoomDraftParts, next?: string): Promise<RoomDraftWrite>;
|
|
23
24
|
discard(room: string, path: string, revision: string): Promise<RoomDraftWrite>;
|
|
24
25
|
};
|
|
25
26
|
save(room: string, roomDrafts: readonly SavedRoomDraft[]): Promise<SaveResult>;
|
|
27
|
+
saveParts(room: string, parts: readonly SavedParts[]): Promise<SaveResult>;
|
|
26
28
|
presentation: {
|
|
27
29
|
read(): Promise<unknown>;
|
|
28
30
|
write(value: unknown): Promise<void>;
|
|
31
|
+
edit(members: Readonly<Record<string, unknown>>): Promise<void>;
|
|
29
32
|
};
|
|
30
33
|
conversation: {
|
|
31
34
|
list(): Promise<readonly ConversationEntry[]>;
|
|
32
35
|
read(conversation: string, options?: ConversationOptions): Promise<ConversationView>;
|
|
33
36
|
create(input: unknown): Promise<CallResult>;
|
|
34
|
-
send(conversation: string): Promise<CallResult>;
|
|
37
|
+
send(conversation: string, operation?: string, draft?: ChatDraft): Promise<CallResult | Offline>;
|
|
35
38
|
answer(conversation: string, answer: unknown): Promise<CallResult>;
|
|
36
39
|
interrupt(conversation: string): Promise<CallResult>;
|
|
37
40
|
kill(conversation: string): Promise<CallResult>;
|
|
@@ -39,34 +42,50 @@ export type MdRuntimeClient = {
|
|
|
39
42
|
delete(conversation: string): Promise<CallResult>;
|
|
40
43
|
};
|
|
41
44
|
chatDraft: {
|
|
42
|
-
write(conversation: string, draft: ChatDraft): Promise<void>;
|
|
45
|
+
write(conversation: string, draft: ChatDraft, revision?: string): Promise<void>;
|
|
46
|
+
prepend(conversation: string, draft: ChatDraft): Promise<void>;
|
|
43
47
|
discard(conversation: string): Promise<void>;
|
|
44
48
|
};
|
|
45
|
-
history(locator: string, path: string, query?: HistoryQuery): Promise<
|
|
49
|
+
history(locator: string, path: string, query?: HistoryQuery): Promise<HistoryAnswer>;
|
|
50
|
+
resolve(room: string, path: string, destination: string): Promise<Resolution>;
|
|
51
|
+
binaryFile: {
|
|
52
|
+
read(room: string, path: string, revision?: string): Promise<BinaryAnswer>;
|
|
53
|
+
attach(room: string, file: File): Promise<AttachAnswer>;
|
|
54
|
+
download(room: string, path: string, revision?: string): Promise<DownloadAnswer>;
|
|
55
|
+
};
|
|
46
56
|
call(name: string, input: unknown): Promise<CallResult>;
|
|
47
57
|
reached(locator: string, roomVersion: string, path?: string): Promise<boolean>;
|
|
48
58
|
log(): Promise<string>;
|
|
49
59
|
persistence(): Promise<boolean>;
|
|
60
|
+
retry(): Promise<void>;
|
|
61
|
+
cleanUp(): Promise<number>;
|
|
50
62
|
observe: {
|
|
51
63
|
(topic: 'deployment-facts'): Promise<Observation<unknown>>;
|
|
52
64
|
(topic: 'rooms'): Promise<Observation<readonly AppRoom[]>>;
|
|
65
|
+
(topic: 'readiness'): Promise<Observation<Readiness>>;
|
|
53
66
|
(topic: 'connection-refusal'): Promise<Observation<ConnectionRefusal | null>>;
|
|
54
67
|
(topic: 'storage-loss'): Promise<Observation<string | null>>;
|
|
55
68
|
(topic: 'sync-status'): Promise<Observation<SyncStatus>>;
|
|
56
69
|
(topic: 'service-mode'): Promise<Observation<ServiceMode>>;
|
|
57
70
|
(topic: 'member'): Promise<Observation<Member | null>>;
|
|
58
|
-
(topic: 'query', query: DocumentQuery): Promise<Observation<DocumentResult>>;
|
|
59
|
-
(topic: 'query', query: GroupQuery): Promise<Observation<GroupResult>>;
|
|
71
|
+
(topic: 'query', query: DocumentQuery): Promise<Observation<DocumentResult | PendingResult>>;
|
|
72
|
+
(topic: 'query', query: GroupQuery): Promise<Observation<GroupResult | PendingResult>>;
|
|
60
73
|
(topic: 'queue', locator: string): Promise<Observation<readonly QueueEntry[]>>;
|
|
61
74
|
(topic: 'room-drafts'): Promise<Observation<readonly RoomDraft[]>>;
|
|
62
75
|
(topic: 'presentation'): Promise<Observation<unknown>>;
|
|
63
76
|
(topic: 'conversation', conversation: string, options: ConversationOptions): Promise<Observation<ConversationView>>;
|
|
64
77
|
(topic: 'conversations'): Promise<Observation<readonly ConversationEntry[]>>;
|
|
78
|
+
(topic: 'agents'): Promise<Observation<readonly ConversationAgent[]>>;
|
|
65
79
|
};
|
|
66
80
|
reauthorize(): Promise<void>;
|
|
67
81
|
settled(): Promise<void>;
|
|
68
82
|
};
|
|
69
83
|
export declare function connectMdRuntime(port: RuntimePort): MdRuntimeClient;
|
|
84
|
+
export declare function inTurn(client: MdRuntimeClient, work: () => Promise<void>): Promise<void>;
|
|
85
|
+
export { chainedWindows, type WindowAnswer, type WindowChain } from './chain.js';
|
|
86
|
+
export { roomDraftRevision } from './identity.js';
|
|
87
|
+
export { defineRoomMedia, ROOM_MEDIA } from './media.js';
|
|
70
88
|
export type { Observation } from './observation.js';
|
|
71
|
-
export type {
|
|
89
|
+
export type { Open } from './open.js';
|
|
90
|
+
export { unanswered, type RuntimePort, type WireMember } from './wire.js';
|
|
72
91
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,UAAU,EACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,28 @@
|
|
|
1
|
+
import { shownBy } from './media.js';
|
|
1
2
|
import { observed } from './observation.js';
|
|
3
|
+
import { runtimeError } from './failure.js';
|
|
2
4
|
import { answer, AUTHORIZATION_ENDED, PORT_CLOSED, } from './wire.js';
|
|
5
|
+
// React renders an arrived value in a later task and opens what that render observes as it commits, so this many frames opening nothing mean the page drew what it observes.
|
|
6
|
+
const SETTLED_FRAMES = 2;
|
|
7
|
+
// A browser reads a download's address only after the click that hands it returns, so a copy's address is released a minute later.
|
|
8
|
+
const HANDED_COPY_MS = 60_000;
|
|
9
|
+
const PAGE = /\.html?$/iu;
|
|
10
|
+
const STARTED = { kind: 'started' };
|
|
11
|
+
const BLOCKED = {
|
|
12
|
+
kind: 'blocked',
|
|
13
|
+
code: 'popup-blocked',
|
|
14
|
+
fields: {},
|
|
15
|
+
retryable: true,
|
|
16
|
+
};
|
|
17
|
+
function handed(url, name) {
|
|
18
|
+
const anchor = document.createElement('a');
|
|
19
|
+
anchor.href = url;
|
|
20
|
+
anchor.download = name;
|
|
21
|
+
anchor.click();
|
|
22
|
+
}
|
|
23
|
+
function refused(refusal) {
|
|
24
|
+
return runtimeError(refusal.code, refusal.code, refusal.retryable);
|
|
25
|
+
}
|
|
3
26
|
export function connectMdRuntime(port) {
|
|
4
27
|
let sequence = 0;
|
|
5
28
|
let refusal = null;
|
|
@@ -27,7 +50,7 @@ export function connectMdRuntime(port) {
|
|
|
27
50
|
if (topic === 'connection-refusal')
|
|
28
51
|
handle.receive(reported);
|
|
29
52
|
}
|
|
30
|
-
const failure =
|
|
53
|
+
const failure = refused(reported);
|
|
31
54
|
for (const [id, waiting] of opening) {
|
|
32
55
|
if (waiting.topic === 'connection-refusal')
|
|
33
56
|
waiting.settle(begin(id, waiting.topic, reported));
|
|
@@ -40,11 +63,10 @@ export function connectMdRuntime(port) {
|
|
|
40
63
|
calls.clear();
|
|
41
64
|
drawing?.();
|
|
42
65
|
}
|
|
43
|
-
function end(
|
|
66
|
+
function end(failure) {
|
|
44
67
|
if (ended !== null)
|
|
45
68
|
return;
|
|
46
|
-
ended =
|
|
47
|
-
const failure = new Error(reason);
|
|
69
|
+
ended = failure;
|
|
48
70
|
for (const waiting of opening.values())
|
|
49
71
|
waiting.fail(failure);
|
|
50
72
|
opening.clear();
|
|
@@ -69,7 +91,7 @@ export function connectMdRuntime(port) {
|
|
|
69
91
|
if (topic === 'member')
|
|
70
92
|
handle.receive(null);
|
|
71
93
|
}
|
|
72
|
-
end(AUTHORIZATION_ENDED);
|
|
94
|
+
end(runtimeError('authorization-ended', AUTHORIZATION_ENDED));
|
|
73
95
|
return;
|
|
74
96
|
}
|
|
75
97
|
if (message.kind === 'event') {
|
|
@@ -79,8 +101,9 @@ export function connectMdRuntime(port) {
|
|
|
79
101
|
const waiting = opening.get(message.id);
|
|
80
102
|
if (waiting !== undefined) {
|
|
81
103
|
opening.delete(message.id);
|
|
82
|
-
if (message.kind === 'failure')
|
|
83
|
-
waiting.fail(
|
|
104
|
+
if (message.kind === 'failure') {
|
|
105
|
+
waiting.fail(runtimeError(message.code, message.message, message.retryable));
|
|
106
|
+
}
|
|
84
107
|
else
|
|
85
108
|
waiting.settle(begin(message.id, waiting.topic, message.value));
|
|
86
109
|
drawing?.();
|
|
@@ -90,21 +113,22 @@ export function connectMdRuntime(port) {
|
|
|
90
113
|
if (called === undefined)
|
|
91
114
|
return;
|
|
92
115
|
calls.delete(message.id);
|
|
93
|
-
if (message.kind === 'failure')
|
|
94
|
-
called.fail(
|
|
116
|
+
if (message.kind === 'failure') {
|
|
117
|
+
called.fail(runtimeError(message.code, message.message, message.retryable));
|
|
118
|
+
}
|
|
95
119
|
else
|
|
96
120
|
called.settle(message.value);
|
|
97
121
|
});
|
|
98
122
|
port.addEventListener('close', () => {
|
|
99
|
-
end(PORT_CLOSED);
|
|
123
|
+
end(runtimeError('port-closed', PORT_CLOSED));
|
|
100
124
|
});
|
|
101
125
|
port.start();
|
|
102
126
|
send({ kind: 'hello' });
|
|
103
127
|
function ask(member, input) {
|
|
104
128
|
if (ended !== null)
|
|
105
|
-
return Promise.reject(
|
|
129
|
+
return Promise.reject(ended);
|
|
106
130
|
if (refusal !== null)
|
|
107
|
-
return Promise.reject(
|
|
131
|
+
return Promise.reject(refused(refusal));
|
|
108
132
|
const id = (sequence += 1);
|
|
109
133
|
return new Promise((settle, fail) => {
|
|
110
134
|
calls.set(id, { settle: settle, fail });
|
|
@@ -113,12 +137,12 @@ export function connectMdRuntime(port) {
|
|
|
113
137
|
}
|
|
114
138
|
function watch(topic, input) {
|
|
115
139
|
if (ended !== null)
|
|
116
|
-
return Promise.reject(
|
|
140
|
+
return Promise.reject(ended);
|
|
117
141
|
const id = (sequence += 1);
|
|
118
142
|
if (refusal !== null) {
|
|
119
143
|
return topic === 'connection-refusal'
|
|
120
144
|
? Promise.resolve(begin(id, topic, refusal))
|
|
121
|
-
: Promise.reject(
|
|
145
|
+
: Promise.reject(refused(refusal));
|
|
122
146
|
}
|
|
123
147
|
return new Promise((settle, fail) => {
|
|
124
148
|
opening.set(id, { topic, settle, fail });
|
|
@@ -126,6 +150,57 @@ export function connectMdRuntime(port) {
|
|
|
126
150
|
drawing?.();
|
|
127
151
|
});
|
|
128
152
|
}
|
|
153
|
+
function streamed(answer) {
|
|
154
|
+
if (answer.kind !== 'binary')
|
|
155
|
+
return answer;
|
|
156
|
+
const { file, byteLength, mediaType } = answer;
|
|
157
|
+
let part = 0;
|
|
158
|
+
let received = 0;
|
|
159
|
+
const stream = new ReadableStream({
|
|
160
|
+
async pull(controller) {
|
|
161
|
+
const bytes = await ask('binaryFile.part', [file, part]);
|
|
162
|
+
if (bytes === null) {
|
|
163
|
+
if (received === byteLength)
|
|
164
|
+
controller.close();
|
|
165
|
+
else
|
|
166
|
+
controller.error(runtimeError('binary-file-absent', 'The file ended early'));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
part += 1;
|
|
170
|
+
received += bytes.byteLength;
|
|
171
|
+
controller.enqueue(bytes);
|
|
172
|
+
},
|
|
173
|
+
}, { highWaterMark: 0 });
|
|
174
|
+
return { kind: 'binary', stream, byteLength, mediaType };
|
|
175
|
+
}
|
|
176
|
+
async function download(room, path, revision) {
|
|
177
|
+
const tab = PAGE.test(path) ? globalThis.open('', '_blank') : null;
|
|
178
|
+
const linked = await ask('binaryFile.link', [room, path, revision]);
|
|
179
|
+
if (linked.kind === 'link' && PAGE.test(linked.name)) {
|
|
180
|
+
const away = tab ?? globalThis.open('', '_blank');
|
|
181
|
+
if (away === null)
|
|
182
|
+
return BLOCKED;
|
|
183
|
+
away.location.replace(linked.url);
|
|
184
|
+
return STARTED;
|
|
185
|
+
}
|
|
186
|
+
tab?.close();
|
|
187
|
+
if (linked.kind === 'link') {
|
|
188
|
+
handed(linked.url, linked.name);
|
|
189
|
+
return STARTED;
|
|
190
|
+
}
|
|
191
|
+
if (linked.kind !== 'absent')
|
|
192
|
+
return linked;
|
|
193
|
+
const read = streamed(await ask('binaryFile.read', [room, path, revision]));
|
|
194
|
+
if (read.kind !== 'binary')
|
|
195
|
+
return read;
|
|
196
|
+
const copy = await new Response(read.stream, {
|
|
197
|
+
headers: { 'content-type': read.mediaType },
|
|
198
|
+
}).blob();
|
|
199
|
+
const url = URL.createObjectURL(copy);
|
|
200
|
+
handed(url, path.slice(path.lastIndexOf('/') + 1));
|
|
201
|
+
setTimeout(() => URL.revokeObjectURL(url), HANDED_COPY_MS);
|
|
202
|
+
return STARTED;
|
|
203
|
+
}
|
|
129
204
|
function settled() {
|
|
130
205
|
if (settling !== null)
|
|
131
206
|
return settling;
|
|
@@ -136,21 +211,27 @@ export function connectMdRuntime(port) {
|
|
|
136
211
|
if (opening.size > 0)
|
|
137
212
|
return;
|
|
138
213
|
const at = moved;
|
|
139
|
-
|
|
214
|
+
const waited = (frames) => {
|
|
140
215
|
requestAnimationFrame(() => {
|
|
216
|
+
if (frames < SETTLED_FRAMES) {
|
|
217
|
+
waited(frames + 1);
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
141
220
|
if (moved !== at || opening.size > 0)
|
|
142
221
|
return;
|
|
143
222
|
drawing = null;
|
|
144
223
|
resolve();
|
|
145
224
|
});
|
|
146
|
-
}
|
|
225
|
+
};
|
|
226
|
+
waited(1);
|
|
147
227
|
};
|
|
148
228
|
drawing = check;
|
|
149
229
|
check();
|
|
150
230
|
});
|
|
151
231
|
return settling;
|
|
152
232
|
}
|
|
153
|
-
|
|
233
|
+
const show = (room, path, revision) => ask('binaryFile.show', [room, path, revision]).then((shown) => streamed(shown));
|
|
234
|
+
return shownBy(show, {
|
|
154
235
|
rooms: () => ask('rooms', []),
|
|
155
236
|
query: ((query) => ask('query', [query])),
|
|
156
237
|
search: (request) => ask('search', [request]),
|
|
@@ -158,19 +239,21 @@ export function connectMdRuntime(port) {
|
|
|
158
239
|
roomDraft: {
|
|
159
240
|
list: () => ask('roomDraft.list', []),
|
|
160
241
|
read: (room, path) => ask('roomDraft.read', [room, path]),
|
|
161
|
-
write: (room, path, revision, parts) => ask('roomDraft.write', [room, path, revision, parts]),
|
|
242
|
+
write: (room, path, revision, parts, next) => ask('roomDraft.write', next === undefined ? [room, path, revision, parts] : [room, path, revision, parts, next]),
|
|
162
243
|
discard: (room, path, revision) => ask('roomDraft.discard', [room, path, revision]),
|
|
163
244
|
},
|
|
164
245
|
save: (room, roomDrafts) => ask('save', [room, roomDrafts]),
|
|
246
|
+
saveParts: (room, parts) => ask('saveParts', [room, parts]),
|
|
165
247
|
presentation: {
|
|
166
248
|
read: () => ask('presentation.read', []),
|
|
167
249
|
write: (value) => ask('presentation.write', [value]),
|
|
250
|
+
edit: (members) => ask('presentation.edit', [members]),
|
|
168
251
|
},
|
|
169
252
|
conversation: {
|
|
170
253
|
list: () => ask('conversation.list', []),
|
|
171
254
|
read: (conversation, options) => ask('conversation.read', [conversation, options]),
|
|
172
255
|
create: (input) => ask('conversation.create', [input]),
|
|
173
|
-
send: (conversation) => ask('conversation.send', [conversation]),
|
|
256
|
+
send: (conversation, operation, draft) => ask('conversation.send', [conversation, operation, draft]),
|
|
174
257
|
answer: (conversation, answer) => ask('conversation.answer', [conversation, answer]),
|
|
175
258
|
interrupt: (conversation) => ask('conversation.interrupt', [conversation]),
|
|
176
259
|
kill: (conversation) => ask('conversation.kill', [conversation]),
|
|
@@ -178,16 +261,35 @@ export function connectMdRuntime(port) {
|
|
|
178
261
|
delete: (conversation) => ask('conversation.delete', [conversation]),
|
|
179
262
|
},
|
|
180
263
|
chatDraft: {
|
|
181
|
-
write: (conversation, draft) => ask('chatDraft.write', [conversation, draft]),
|
|
264
|
+
write: (conversation, draft, revision) => ask('chatDraft.write', [conversation, draft, revision]),
|
|
265
|
+
prepend: (conversation, draft) => ask('chatDraft.prepend', [conversation, draft]),
|
|
182
266
|
discard: (conversation) => ask('chatDraft.discard', [conversation]),
|
|
183
267
|
},
|
|
184
268
|
history: (locator, path, query) => ask('history', [locator, path, query]),
|
|
269
|
+
resolve: (room, path, destination) => ask('resolve', [room, path, destination]),
|
|
270
|
+
binaryFile: {
|
|
271
|
+
read: (room, path, revision) => ask('binaryFile.read', [room, path, revision]).then((read) => streamed(read)),
|
|
272
|
+
attach: (room, file) => ask('binaryFile.attach', [room, file]),
|
|
273
|
+
download,
|
|
274
|
+
},
|
|
185
275
|
call: (name, input) => ask('call', [name, input]),
|
|
186
276
|
reached: (locator, roomVersion, path) => ask('reached', [locator, roomVersion, path]),
|
|
187
277
|
log: () => ask('log', []),
|
|
188
278
|
persistence: () => ask('persistence', []),
|
|
279
|
+
retry: () => ask('retry', []),
|
|
280
|
+
cleanUp: () => ask('cleanUp', []),
|
|
189
281
|
observe: ((topic, ...input) => watch(topic, input)),
|
|
190
282
|
reauthorize: () => ask('reauthorize', []),
|
|
191
283
|
settled,
|
|
192
|
-
};
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
const turns = new WeakMap();
|
|
287
|
+
export function inTurn(client, work) {
|
|
288
|
+
const turn = (turns.get(client) ?? Promise.resolve()).then(work);
|
|
289
|
+
turns.set(client, turn.then(() => undefined, () => undefined));
|
|
290
|
+
return turn;
|
|
193
291
|
}
|
|
292
|
+
export { chainedWindows } from './chain.js';
|
|
293
|
+
export { roomDraftRevision } from './identity.js';
|
|
294
|
+
export { defineRoomMedia, ROOM_MEDIA } from './media.js';
|
|
295
|
+
export { unanswered } from './wire.js';
|
package/dist/collection.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { type Document
|
|
1
|
+
import { type Document } from '@agentshouse/mdmodel';
|
|
2
2
|
import type { ModelState } from './model.js';
|
|
3
3
|
import type { MdModelIdentity } from './adapter.js';
|
|
4
|
+
import { type Paths } from './shared.js';
|
|
4
5
|
import type { Refused } from './transfer.js';
|
|
5
6
|
export declare const MD_MODEL: MdModelIdentity;
|
|
6
7
|
export type Collection = {
|
|
7
|
-
|
|
8
|
+
text: Readonly<Record<string, string>>;
|
|
8
9
|
composition: Composition;
|
|
10
|
+
document(path: string): Document | undefined;
|
|
9
11
|
};
|
|
10
12
|
export type Composition = {
|
|
11
13
|
model: ModelState;
|
|
@@ -14,17 +16,16 @@ export type Composition = {
|
|
|
14
16
|
model: ModelState;
|
|
15
17
|
} | null;
|
|
16
18
|
};
|
|
17
|
-
export
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
collection: Collection;
|
|
19
|
+
export type Composed = {
|
|
20
|
+
readonly composition: Composition;
|
|
21
|
+
readonly fingerprint: string;
|
|
21
22
|
};
|
|
22
|
-
export declare function
|
|
23
|
-
export declare function
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
export declare function composedOf(composition: Composition): Composed;
|
|
24
|
+
export declare function selected(composition: Composition, path: string): boolean;
|
|
25
|
+
export declare function governing(composition: Composition, path: string): ModelState;
|
|
26
|
+
export declare function collectionOf(text: Readonly<Record<string, string>>, composition: Composition): Collection;
|
|
27
|
+
export declare function documentsOf(collection: Collection): Generator<number, Iterable<readonly [string, Document]>, void>;
|
|
28
|
+
export declare function unreadable(text: Paths<string>, paths?: Iterable<string> | null): Generator<number, Refused | null, void>;
|
|
27
29
|
export declare function validRoot(root: unknown): root is string;
|
|
28
|
-
export declare function
|
|
29
|
-
export {};
|
|
30
|
+
export declare function available(composition: Composition): boolean;
|
|
30
31
|
//# sourceMappingURL=collection.d.ts.map
|
package/dist/collection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAsB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,QAAQ,EAAE,eAAwE,CAAC;AAEhG,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE;QAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAc3F,wBAAgB,UAAU,CAAC,WAAW,EAAE,WAAW,GAAG,QAAQ,CAS7D;AAED,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKxE;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAI5E;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,WAAW,EAAE,WAAW,GACvB,UAAU,CAcZ;AAED,wBAAiB,WAAW,CAC1B,UAAU,EAAE,UAAU,GACrB,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAQhE;AAED,wBAAiB,UAAU,CACzB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EACnB,KAAK,GAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAW,GACpC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,CAazC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEvD;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAE3D"}
|
package/dist/collection.js
CHANGED
|
@@ -1,8 +1,31 @@
|
|
|
1
|
-
import { parse,
|
|
1
|
+
import { parse, VERSION } from '@agentshouse/mdmodel';
|
|
2
2
|
import { beneath, normalize } from './paths.js';
|
|
3
|
+
import { hashed } from './observation.js';
|
|
4
|
+
import { keysIn, sortedKeys } from './shared.js';
|
|
5
|
+
import { ROW_WEIGHT } from './turn.js';
|
|
3
6
|
export const MD_MODEL = { identity: '@agentshouse/mdmodel', version: VERSION };
|
|
4
|
-
const
|
|
5
|
-
function
|
|
7
|
+
const typesPrinted = new WeakMap();
|
|
8
|
+
function typesPrint(model) {
|
|
9
|
+
if (model.status === 'unavailable')
|
|
10
|
+
return '';
|
|
11
|
+
let print = typesPrinted.get(model.types);
|
|
12
|
+
if (print === undefined) {
|
|
13
|
+
print = hashed(JSON.stringify(model.types)).toString(36);
|
|
14
|
+
typesPrinted.set(model.types, print);
|
|
15
|
+
}
|
|
16
|
+
return print;
|
|
17
|
+
}
|
|
18
|
+
export function composedOf(composition) {
|
|
19
|
+
const { model, selection } = composition;
|
|
20
|
+
return {
|
|
21
|
+
composition,
|
|
22
|
+
fingerprint: JSON.stringify([
|
|
23
|
+
typesPrint(model),
|
|
24
|
+
selection === null ? null : [selection.roots, typesPrint(selection.model)],
|
|
25
|
+
]),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function selected(composition, path) {
|
|
6
29
|
return (composition.selection !== null &&
|
|
7
30
|
composition.selection.roots.some((root) => beneath(root, path)));
|
|
8
31
|
}
|
|
@@ -11,62 +34,51 @@ export function governing(composition, path) {
|
|
|
11
34
|
? composition.selection.model
|
|
12
35
|
: composition.model;
|
|
13
36
|
}
|
|
14
|
-
function
|
|
15
|
-
const
|
|
16
|
-
return
|
|
17
|
-
|
|
18
|
-
|
|
37
|
+
export function collectionOf(text, composition) {
|
|
38
|
+
const parsed = new Map();
|
|
39
|
+
return {
|
|
40
|
+
text,
|
|
41
|
+
composition,
|
|
42
|
+
document(path) {
|
|
43
|
+
if (parsed.has(path))
|
|
44
|
+
return parsed.get(path) ?? undefined;
|
|
45
|
+
const content = text[path];
|
|
46
|
+
if (content === undefined)
|
|
47
|
+
return undefined;
|
|
48
|
+
const read = parse(content, path);
|
|
49
|
+
parsed.set(path, read.ok ? read.document : null);
|
|
50
|
+
return read.ok ? read.document : undefined;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
19
53
|
}
|
|
20
|
-
export function
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
54
|
+
export function* documentsOf(collection) {
|
|
55
|
+
const paths = yield* sortedKeys(collection.text);
|
|
56
|
+
return (function* () {
|
|
57
|
+
for (const path of paths) {
|
|
58
|
+
const document = collection.document(path);
|
|
59
|
+
if (document !== undefined)
|
|
60
|
+
yield [path, document];
|
|
61
|
+
}
|
|
62
|
+
})();
|
|
28
63
|
}
|
|
29
|
-
export function
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
64
|
+
export function* unreadable(text, paths = null) {
|
|
65
|
+
const named = paths ?? (yield* keysIn(text));
|
|
66
|
+
let least = null;
|
|
67
|
+
for (const path of named) {
|
|
68
|
+
const content = Object.hasOwn(text, path) ? text[path] : undefined;
|
|
69
|
+
if (content === undefined)
|
|
70
|
+
continue;
|
|
71
|
+
const read = parse(content, path);
|
|
72
|
+
if (!read.ok && (least === null || path < least.path)) {
|
|
73
|
+
least = { path, refused: { kind: 'refused', refusal: read.refusal } };
|
|
74
|
+
}
|
|
75
|
+
yield ROW_WEIGHT + content.length;
|
|
36
76
|
}
|
|
37
|
-
return
|
|
77
|
+
return least?.refused ?? null;
|
|
38
78
|
}
|
|
39
79
|
export function validRoot(root) {
|
|
40
80
|
return typeof root === 'string' && normalize(root) === root;
|
|
41
81
|
}
|
|
42
|
-
function
|
|
43
|
-
|
|
44
|
-
const typed = Object.entries(documents).find(([, content]) => {
|
|
45
|
-
const parsed = parse(content);
|
|
46
|
-
return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';
|
|
47
|
-
});
|
|
48
|
-
if (typed !== undefined)
|
|
49
|
-
return { verdict: 'refuse', rule: 'model-unavailable', file: typed[0] };
|
|
50
|
-
}
|
|
51
|
-
return validate(documents, { binaryTargets }, model.status === 'unavailable' ? NO_TYPES : { types: model.types });
|
|
52
|
-
}
|
|
53
|
-
export function validateCollection(text, binaryTargets, composition) {
|
|
54
|
-
const collection = {};
|
|
55
|
-
const selection = {};
|
|
56
|
-
for (const [path, content] of Object.entries(text)) {
|
|
57
|
-
if (selected(composition, path))
|
|
58
|
-
selection[path] = content;
|
|
59
|
-
else
|
|
60
|
-
collection[path] = content;
|
|
61
|
-
}
|
|
62
|
-
const verdicts = [
|
|
63
|
-
validateAgainst(collection, binaryTargets.filter((path) => !selected(composition, path)), composition.model),
|
|
64
|
-
];
|
|
65
|
-
if (composition.selection !== null) {
|
|
66
|
-
verdicts.push(validateAgainst(selection, binaryTargets.filter((path) => selected(composition, path)), composition.selection.model));
|
|
67
|
-
}
|
|
68
|
-
const refusals = verdicts.filter((verdict) => verdict.verdict === 'refuse');
|
|
69
|
-
if (refusals.length === 0)
|
|
70
|
-
return verdicts[0];
|
|
71
|
-
return refusals.find((refusal) => refusal.rule !== 'model-unavailable') ?? refusals[0];
|
|
82
|
+
export function available(composition) {
|
|
83
|
+
return composition.model.status !== 'unavailable';
|
|
72
84
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Plan, QueryRows } from './query.js';
|
|
2
|
+
import type { Connection, Value } from './tables.js';
|
|
3
|
+
export type QueryRoom = {
|
|
4
|
+
readonly locator: string;
|
|
5
|
+
readonly key: number;
|
|
6
|
+
};
|
|
7
|
+
export type Fragment = {
|
|
8
|
+
readonly sql: string;
|
|
9
|
+
readonly bind: readonly Value[];
|
|
10
|
+
};
|
|
11
|
+
export type QueryAnswer = QueryRows & {
|
|
12
|
+
readonly more?: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function selected(connection: Connection, plan: Plan, rooms: readonly QueryRoom[]): Fragment;
|
|
15
|
+
export declare function answerQuery(connection: Connection, plan: Plan, rooms: readonly QueryRoom[], budget?: number | null): QueryAnswer;
|
|
16
|
+
//# sourceMappingURL=compile.d.ts.map
|