@agentshouse/mdruntime 0.1.0-cde2b99d2fcbc → 0.1.0-ce131cb435f8b
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/AGENTS.md +271 -290
- package/README.md +8 -8
- package/dist/adapter.d.ts +52 -10
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attempt.d.ts.map +1 -1
- package/dist/attempt.js +14 -1
- package/dist/bootstrap.d.ts +3 -2
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +33 -7
- package/dist/change-set.d.ts +2 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +36 -10
- package/dist/chat/acts.d.ts +3 -4
- package/dist/chat/acts.d.ts.map +1 -1
- package/dist/chat/acts.js +10 -10
- package/dist/chat/earlier.d.ts +10 -0
- package/dist/chat/earlier.d.ts.map +1 -0
- package/dist/chat/earlier.js +54 -0
- package/dist/chat/kit.d.ts +2 -1
- package/dist/chat/kit.d.ts.map +1 -1
- package/dist/chat/kit.js +3 -3
- package/dist/chat/list.d.ts +8 -1
- package/dist/chat/list.d.ts.map +1 -1
- package/dist/chat/list.js +48 -8
- package/dist/chat/markdown.d.ts +2 -1
- package/dist/chat/markdown.d.ts.map +1 -1
- package/dist/chat/markdown.js +7 -6
- package/dist/chat/message.d.ts.map +1 -1
- package/dist/chat/message.js +2 -2
- package/dist/chat/messages.d.ts +1 -0
- package/dist/chat/messages.d.ts.map +1 -1
- package/dist/chat/messages.js +4 -0
- package/dist/chat/provider.d.ts +1 -1
- package/dist/chat/provider.d.ts.map +1 -1
- package/dist/chat/provider.js +62 -79
- package/dist/chat/question.d.ts +1 -1
- package/dist/chat/question.d.ts.map +1 -1
- package/dist/chat/question.js +7 -18
- package/dist/chat/ready.d.ts +1 -0
- package/dist/chat/ready.d.ts.map +1 -1
- package/dist/chat/ready.js +4 -4
- package/dist/chat/style.js +5 -5
- package/dist/client.d.ts +17 -9
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +19 -6
- package/dist/collection.d.ts +20 -5
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +309 -33
- package/dist/connection.d.ts +31 -9
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1620 -397
- package/dist/conversation.d.ts +20 -7
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +474 -163
- package/dist/durability.d.ts +7 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +17 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +157 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/host.d.ts +15 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +94 -12
- package/dist/identity.d.ts +2 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +6 -0
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/memory.d.ts +8 -2
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +33 -6
- package/dist/model.d.ts +4 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +10 -1
- package/dist/observation.d.ts +7 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +29 -12
- package/dist/outcome.d.ts +12 -2
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +4 -0
- package/dist/overlay.d.ts +3 -0
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +62 -55
- package/dist/query.d.ts +56 -4
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +36 -7
- package/dist/reach.d.ts +6 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +30 -5
- package/dist/react.d.ts +8 -6
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +7 -17
- package/dist/read-side.d.ts +16 -7
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +484 -100
- package/dist/readiness.d.ts +53 -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 +98 -0
- package/dist/recovery.d.ts +25 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +197 -0
- package/dist/refresh.d.ts +4 -4
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +18 -11
- package/dist/replica.d.ts +10 -5
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +96 -44
- package/dist/room-draft.d.ts +13 -1
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +2 -2
- package/dist/rows.d.ts +6 -13
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +10 -13
- package/dist/save.d.ts +9 -3
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +68 -22
- package/dist/search.d.ts +49 -6
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +192 -47
- 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 +14 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +394 -0
- package/dist/status.d.ts +4 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/store.d.ts +64 -16
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +447 -178
- package/dist/turn.d.ts +9 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +64 -0
- package/dist/windows.d.ts +26 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +93 -0
- package/dist/wire.d.ts +152 -32
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +52 -31
- package/package.json +12 -8
package/dist/chat/provider.js
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
import { createContext, createElement, useCallback, useContext, useEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore, } from 'react';
|
|
2
2
|
import { AssistantRuntimeProvider, createMessageQueue, generateId, useExternalStoreRuntime, } from '@assistant-ui/react';
|
|
3
3
|
import { attempts } from '../attempt.js';
|
|
4
|
+
import { newChat, } from '../conversation.js';
|
|
4
5
|
import { expectedList } from '../expectation.js';
|
|
5
6
|
import { chatDraftRevision } from '../identity.js';
|
|
6
7
|
import { useObserve } from '../react.js';
|
|
7
8
|
import { accepted, answeredOf, outcomeOf, sender, unanswered, } from './acts.js';
|
|
9
|
+
import { CHAT_WINDOW, useEarlier } from './earlier.js';
|
|
8
10
|
import { askedBefore, chatMessages, contextOf } from './messages.js';
|
|
9
11
|
import { conversationChanged, conversationGone, conversationListed, optionChosen, overlay, questionAnswered, sentMessage, } from './overlay.js';
|
|
10
12
|
import { commandIn, commandsOf, optionsOf } from './process.js';
|
|
11
13
|
import { loneOf, questionsOf } from './questions.js';
|
|
12
14
|
import { record, text } from './read.js';
|
|
13
15
|
const SHARED = new WeakMap();
|
|
16
|
+
const LATEST = { limit: CHAT_WINDOW };
|
|
14
17
|
function sharedOf(client) {
|
|
15
18
|
const held = SHARED.get(client);
|
|
16
19
|
if (held !== undefined)
|
|
@@ -19,53 +22,18 @@ function sharedOf(client) {
|
|
|
19
22
|
SHARED.set(client, fresh);
|
|
20
23
|
return fresh;
|
|
21
24
|
}
|
|
22
|
-
function newChat(agent) {
|
|
23
|
-
return `new:${agent}`;
|
|
24
|
-
}
|
|
25
25
|
function ready(observed) {
|
|
26
26
|
return observed.state === 'ready' ? observed.value : null;
|
|
27
27
|
}
|
|
28
|
-
async function alike(one, other) {
|
|
29
|
-
if (one.type !== other.type || one.size !== other.size)
|
|
30
|
-
return false;
|
|
31
|
-
const [mine, theirs] = await Promise.all([one.arrayBuffer(), other.arrayBuffer()]);
|
|
32
|
-
const bytes = new Uint8Array(theirs);
|
|
33
|
-
return new Uint8Array(mine).every((byte, at) => byte === bytes[at]);
|
|
34
|
-
}
|
|
35
|
-
async function same(one, other) {
|
|
36
|
-
if (one.text !== other.text || one.files.length !== other.files.length)
|
|
37
|
-
return false;
|
|
38
|
-
const files = await Promise.all(one.files.map(async (file, at) => {
|
|
39
|
-
const twin = other.files[at];
|
|
40
|
-
return twin !== undefined && file.name === twin.name && (await alike(file.blob, twin.blob));
|
|
41
|
-
}));
|
|
42
|
-
return files.every(Boolean);
|
|
43
|
-
}
|
|
44
28
|
function turnOf(result) {
|
|
45
29
|
return accepted(result) ? text(record(result.result), 'turn') : null;
|
|
46
30
|
}
|
|
47
|
-
async function deliver(client, send, conversation, said, key,
|
|
48
|
-
const
|
|
49
|
-
const kept = chatDraftRevision();
|
|
50
|
-
noted(conversation, kept);
|
|
51
|
-
await client.chatDraft.write(conversation, said, kept);
|
|
52
|
-
const result = await send.carried('conversation.send', { conversation, key }, () => {
|
|
53
|
-
noted(conversation, null);
|
|
54
|
-
noted(conversation, kept);
|
|
55
|
-
return client.conversation.send(conversation);
|
|
56
|
-
});
|
|
57
|
-
if (typed !== null && !(await same(typed, said))) {
|
|
58
|
-
const now = (await client.conversation.read(conversation)).chatDraft;
|
|
59
|
-
if (now === null || now.revision === kept) {
|
|
60
|
-
const back = chatDraftRevision();
|
|
61
|
-
noted(conversation, back);
|
|
62
|
-
await client.chatDraft.write(conversation, typed, back);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
31
|
+
async function deliver(client, send, conversation, said, key, idle) {
|
|
32
|
+
const result = await send.numbered('conversation.send', { conversation, key }, (operation) => client.conversation.send(conversation, operation, said));
|
|
65
33
|
if (accepted(result))
|
|
66
34
|
send.expect(sentMessage(key, [conversation], said, turnOf(result)));
|
|
67
35
|
else if (!unanswered(result))
|
|
68
|
-
|
|
36
|
+
idle();
|
|
69
37
|
return result;
|
|
70
38
|
}
|
|
71
39
|
const IDLE = { busy: false, outcome: null };
|
|
@@ -206,11 +174,14 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
206
174
|
}, []);
|
|
207
175
|
const listedHeld = ready(useObserve(client, 'conversations'));
|
|
208
176
|
const agentsHeld = ready(useObserve(client, 'agents'));
|
|
209
|
-
const
|
|
177
|
+
const readiness = ready(useObserve(client, 'readiness'));
|
|
210
178
|
const refusal = ready(useObserve(client, 'connection-refusal'));
|
|
211
|
-
const online =
|
|
212
|
-
const thread = open.conversation ??
|
|
213
|
-
|
|
179
|
+
const online = readiness?.connection !== 'unreachable' && refusal === null;
|
|
180
|
+
const thread = open.conversation ??
|
|
181
|
+
(open.agent === null ? null : (shared.created.get(open.agent) ?? newChat(open.agent)));
|
|
182
|
+
const observed = ready(useObserve(thread === null ? null : client, 'conversation', thread ?? '', LATEST));
|
|
183
|
+
const held = observed !== null && observed.conversation === thread ? observed : null;
|
|
184
|
+
const paged = useEarlier(client, thread, held);
|
|
214
185
|
const version = useSyncExternalStore(shared.overlay.subscribe, shared.overlay.version);
|
|
215
186
|
useEffect(() => {
|
|
216
187
|
if (listedHeld !== null)
|
|
@@ -221,7 +192,7 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
221
192
|
shared.overlay.heard(held);
|
|
222
193
|
}, [shared, held, version]);
|
|
223
194
|
const conversations = useMemo(() => shared.overlay.conversations(listedHeld ?? []), [shared, listedHeld, version]);
|
|
224
|
-
const view = useMemo(() =>
|
|
195
|
+
const view = useMemo(() => (paged.view === null ? null : shared.overlay.conversation(paged.view)), [shared, paged.view, version]);
|
|
225
196
|
const agents = agentsHeld ?? [];
|
|
226
197
|
const known = useRef(agents);
|
|
227
198
|
known.current = agents;
|
|
@@ -238,6 +209,14 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
238
209
|
const current = useRef(thread);
|
|
239
210
|
current.current = thread;
|
|
240
211
|
const seeding = useRef(false);
|
|
212
|
+
const mounted = useRef(true);
|
|
213
|
+
useEffect(() => {
|
|
214
|
+
mounted.current = true;
|
|
215
|
+
return () => {
|
|
216
|
+
mounted.current = false;
|
|
217
|
+
};
|
|
218
|
+
}, []);
|
|
219
|
+
const was = useRef(null);
|
|
241
220
|
const heard = useRef('');
|
|
242
221
|
const shown = useRef('');
|
|
243
222
|
const own = useRef([]);
|
|
@@ -255,21 +234,26 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
255
234
|
heard.current = '';
|
|
256
235
|
shown.current = '';
|
|
257
236
|
own.current = own.current.filter((one) => one.startsWith(`${thread}\u0000`));
|
|
237
|
+
const created = was.current === open;
|
|
238
|
+
was.current = open;
|
|
239
|
+
if (created)
|
|
240
|
+
return;
|
|
258
241
|
sending.clear();
|
|
259
242
|
acting.clear();
|
|
260
243
|
setAgain(null);
|
|
261
244
|
}, [thread, sending.clear, acting.clear]);
|
|
262
|
-
const sendTo = (to, said, key,
|
|
263
|
-
const first = (to, said, key,
|
|
245
|
+
const sendTo = (to, said, key, idle, acts = sending) => acts.call((send) => deliver(client, send, to, said, key, idle), sentMessage(key, [to], said, null));
|
|
246
|
+
const first = (to, said, key, returning, idle) => {
|
|
264
247
|
const drafted = [newChat(to)];
|
|
265
|
-
let made = null;
|
|
266
248
|
return sending.call(async (send) => {
|
|
267
249
|
let conversation = shared.created.get(to);
|
|
268
250
|
if (conversation === undefined) {
|
|
269
251
|
const answer = await send.carried('conversation.create', { agent: to }, (operation) => client.conversation.create({ agent_id: to, operation_id: operation }));
|
|
270
252
|
if (!accepted(answer)) {
|
|
271
|
-
if (!unanswered(answer))
|
|
272
|
-
|
|
253
|
+
if (!unanswered(answer)) {
|
|
254
|
+
returning();
|
|
255
|
+
idle();
|
|
256
|
+
}
|
|
273
257
|
return answer;
|
|
274
258
|
}
|
|
275
259
|
const named = text(record(answer.result), 'conversation');
|
|
@@ -289,39 +273,29 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
289
273
|
started: null,
|
|
290
274
|
}));
|
|
291
275
|
}
|
|
292
|
-
made = conversation;
|
|
293
276
|
send.draw(sentMessage(key, [...drafted, conversation], said, null));
|
|
294
|
-
const result = await deliver(client, send, conversation, said, key,
|
|
295
|
-
if (accepted(result))
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
}, sentMessage(key, drafted, said, null), () => {
|
|
299
|
-
if (made === null)
|
|
300
|
-
return;
|
|
301
|
-
void client.chatDraft.discard(newChat(to));
|
|
277
|
+
const result = await deliver(client, send, conversation, said, key, idle);
|
|
278
|
+
if (!accepted(result))
|
|
279
|
+
return result;
|
|
280
|
+
shared.created.delete(to);
|
|
302
281
|
const now = opened.current;
|
|
303
|
-
if (now.conversation === null && now.agent === to)
|
|
304
|
-
go({ conversation
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
const now = (await client.conversation.read(to)).chatDraft;
|
|
309
|
-
await client.chatDraft.write(to, {
|
|
310
|
-
text: now === null || now.text === '' ? one.text : `${one.text}\n${now.text}`,
|
|
311
|
-
files: [...one.files, ...(now?.files ?? [])],
|
|
312
|
-
});
|
|
282
|
+
if (mounted.current && now.conversation === null && now.agent === to) {
|
|
283
|
+
go({ conversation, agent: to });
|
|
284
|
+
}
|
|
285
|
+
return result;
|
|
286
|
+
}, sentMessage(key, drafted, said, null));
|
|
313
287
|
};
|
|
314
288
|
const sent = () => {
|
|
315
289
|
shared.sends += 1;
|
|
316
290
|
return `sent ${shared.sends}`;
|
|
317
291
|
};
|
|
318
|
-
const deliverDraft = (said,
|
|
292
|
+
const deliverDraft = (said, returning, idle) => {
|
|
319
293
|
const key = sent();
|
|
320
294
|
const { conversation: to, agent: by } = opened.current;
|
|
321
295
|
const attempt = to !== null
|
|
322
|
-
? () => void sendTo(to, said, key,
|
|
296
|
+
? () => void sendTo(to, said, key, idle)
|
|
323
297
|
: by !== null
|
|
324
|
-
? () => void first(by, said, key,
|
|
298
|
+
? () => void first(by, said, key, returning, idle)
|
|
325
299
|
: null;
|
|
326
300
|
if (attempt === null)
|
|
327
301
|
return;
|
|
@@ -424,6 +398,8 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
424
398
|
const aui = useExternalStoreRuntime({
|
|
425
399
|
messages,
|
|
426
400
|
isRunning: running,
|
|
401
|
+
hasEarlier: paged.hasEarlier,
|
|
402
|
+
onLoadEarlier: paged.loadEarlier,
|
|
427
403
|
convertMessage: (message) => message,
|
|
428
404
|
queue: lined(),
|
|
429
405
|
onNew: async (message) => lined().enqueue(message),
|
|
@@ -438,7 +414,7 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
438
414
|
return;
|
|
439
415
|
const draft = { text: said, files: [] };
|
|
440
416
|
const into = thread;
|
|
441
|
-
deliverDraft(draft, () => back(draft, into));
|
|
417
|
+
deliverDraft(draft, () => back(draft, into), () => undefined);
|
|
442
418
|
},
|
|
443
419
|
adapters: {
|
|
444
420
|
attachments: ATTACHMENTS,
|
|
@@ -466,7 +442,7 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
466
442
|
});
|
|
467
443
|
function back(one, into) {
|
|
468
444
|
if (current.current !== into) {
|
|
469
|
-
void
|
|
445
|
+
void client.chatDraft.prepend(into, one);
|
|
470
446
|
return;
|
|
471
447
|
}
|
|
472
448
|
const composer = aui.thread.composer;
|
|
@@ -486,6 +462,15 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
486
462
|
const holding = (put) => (message) => {
|
|
487
463
|
if (taken(message))
|
|
488
464
|
return;
|
|
465
|
+
if (!online) {
|
|
466
|
+
const draft = draftOf(message);
|
|
467
|
+
const at = current.current;
|
|
468
|
+
deliverDraft(draft, () => {
|
|
469
|
+
if (at !== null)
|
|
470
|
+
back(draft, at);
|
|
471
|
+
}, () => undefined);
|
|
472
|
+
return;
|
|
473
|
+
}
|
|
489
474
|
const known = new Set(lanes().map((one) => one.id));
|
|
490
475
|
if (!lane.running)
|
|
491
476
|
queue.notifyIdle();
|
|
@@ -513,18 +498,14 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
513
498
|
const draft = draftOf(message);
|
|
514
499
|
const idle = () => queues.current.get(key)?.queue.notifyIdle();
|
|
515
500
|
if (key !== (current.current ?? '')) {
|
|
516
|
-
void sendTo(key, draft, sent(),
|
|
517
|
-
back(draft, key);
|
|
518
|
-
idle();
|
|
519
|
-
}, behind);
|
|
501
|
+
void sendTo(key, draft, sent(), idle, behind);
|
|
520
502
|
return;
|
|
521
503
|
}
|
|
522
504
|
const into = current.current;
|
|
523
505
|
deliverDraft(draft, () => {
|
|
524
506
|
if (into !== null)
|
|
525
507
|
back(draft, into);
|
|
526
|
-
|
|
527
|
-
});
|
|
508
|
+
}, idle);
|
|
528
509
|
};
|
|
529
510
|
const unqueue = (id) => {
|
|
530
511
|
const message = waiting.current.get(id);
|
|
@@ -584,8 +565,10 @@ export function ChatProvider({ client, conversation = null, agent = null, onOpen
|
|
|
584
565
|
.then(() => Promise.all((draft?.files ?? []).map((file) => composer.addAttachment(fileOf(file)))))
|
|
585
566
|
.finally(() => {
|
|
586
567
|
seeding.current = false;
|
|
587
|
-
if (current.current !== thread)
|
|
568
|
+
if (current.current !== thread) {
|
|
569
|
+
reconcile.current();
|
|
588
570
|
return;
|
|
571
|
+
}
|
|
589
572
|
const seeded = composer.getState();
|
|
590
573
|
shown.current = `${at}${composed(seeded)}`;
|
|
591
574
|
if (kept)
|
package/dist/chat/question.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ReactElement } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import type { MdRuntimeClient } from '../client.js';
|
|
3
3
|
import type { ChatQuestion } from './questions.js';
|
|
4
4
|
export declare function forgetAnswers(client: MdRuntimeClient, conversation: string, interaction?: string): Promise<void>;
|
|
5
5
|
export type ChatQuestionCardProps = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"question.d.ts","sourceRoot":"","sources":["../../src/chat/question.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGhE,OAAO,
|
|
1
|
+
{"version":3,"file":"question.d.ts","sourceRoot":"","sources":["../../src/chat/question.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAGhE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAMpD,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAO9D,wBAAsB,aAAa,CACjC,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,MAAM,EACpB,WAAW,SAAK,GACf,OAAO,CAAC,IAAI,CAAC,CAOf;AAeD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,qBAAqB,GAAG,YAAY,CAmHlF"}
|
package/dist/chat/question.js
CHANGED
|
@@ -2,41 +2,30 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { useContext, useState } from 'react';
|
|
3
3
|
import Check from 'lucide-react/dist/esm/icons/check.mjs';
|
|
4
4
|
import CircleHelp from 'lucide-react/dist/esm/icons/circle-help.mjs';
|
|
5
|
-
import { inTurn } from '../client.js';
|
|
6
5
|
import { useObserve } from '../react.js';
|
|
7
6
|
import { Button, Scoped } from './kit.js';
|
|
8
7
|
import { Markdown } from './markdown.js';
|
|
9
8
|
import { Linked, Undelivered } from './message.js';
|
|
10
9
|
import { useChat, useChatScope } from './provider.js';
|
|
11
10
|
import { record, text } from './read.js';
|
|
12
|
-
const TYPED = 'typed';
|
|
13
11
|
function answerKey(conversation, interaction) {
|
|
14
|
-
return `answer:${conversation}:${interaction}`;
|
|
12
|
+
return `typed:answer:${conversation}:${interaction}`;
|
|
15
13
|
}
|
|
16
|
-
function
|
|
17
|
-
return inTurn(client, async () => {
|
|
18
|
-
const held = record(await client.presentation.read());
|
|
19
|
-
const typed = update(record(held[TYPED]));
|
|
20
|
-
if (typed !== null)
|
|
21
|
-
await client.presentation.write({ ...held, [TYPED]: typed });
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
export function forgetAnswers(client, conversation, interaction = '') {
|
|
14
|
+
export async function forgetAnswers(client, conversation, interaction = '') {
|
|
25
15
|
const at = answerKey(conversation, interaction);
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
});
|
|
16
|
+
const gone = Object.keys(record(await client.presentation.read())).filter((key) => interaction === '' ? key.startsWith(at) : key === at);
|
|
17
|
+
if (gone.length > 0)
|
|
18
|
+
await client.presentation.edit(Object.fromEntries(gone.map((key) => [key, null])));
|
|
30
19
|
}
|
|
31
20
|
function useTyped(client, key) {
|
|
32
21
|
const held = useObserve(client, 'presentation');
|
|
33
|
-
const kept = record(record(
|
|
22
|
+
const kept = record(record(held.state === 'ready' ? held.value : null)[key]);
|
|
34
23
|
const [local, setLocal] = useState(null);
|
|
35
24
|
return [
|
|
36
25
|
local !== null && local.key === key ? local.value : kept,
|
|
37
26
|
(next) => {
|
|
38
27
|
setLocal({ key, value: next });
|
|
39
|
-
void
|
|
28
|
+
void client.presentation.edit({ [key]: next });
|
|
40
29
|
},
|
|
41
30
|
];
|
|
42
31
|
}
|
package/dist/chat/ready.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export type ChatProps = AgentLook & {
|
|
|
17
17
|
readonly about?: (chat: ChatState) => ReactNode;
|
|
18
18
|
readonly actions?: ReactNode;
|
|
19
19
|
readonly note?: (note: ChatNoteProps) => ReactNode;
|
|
20
|
+
readonly waiting?: string | null;
|
|
20
21
|
readonly messageLength?: number;
|
|
21
22
|
readonly autoFocus?: boolean;
|
|
22
23
|
};
|
package/dist/chat/ready.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ready.d.ts","sourceRoot":"","sources":["../../src/chat/ready.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAUf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EASL,KAAK,aAAa,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAGjF,OAAO,EAA8B,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAI5F,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEvD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,SAAS,CAAC;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,SAAS,CAAC;IACnD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;
|
|
1
|
+
{"version":3,"file":"ready.d.ts","sourceRoot":"","sources":["../../src/chat/ready.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAUf,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EASL,KAAK,aAAa,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAGjF,OAAO,EAA8B,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAI5F,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAEvD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,SAAS,CAAC;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,SAAS,CAAC;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAmQF,wBAAgB,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,SAAS,GAAG,YAAY,CAY9F;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG;QAAE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;KAAE,GAAG,IAAI,CAAC;IACtE,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAEF,wBAAgB,SAAS,CACvB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,SAAS,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GACtD,WAAW,CAOb"}
|
package/dist/chat/ready.js
CHANGED
|
@@ -62,19 +62,19 @@ function Deleted() {
|
|
|
62
62
|
const chat = useOpened();
|
|
63
63
|
return (_jsx("div", { className: "ahc-deleted", children: _jsxs("div", { role: "note", className: "ahc-column ahc-deleted__note", children: [_jsx("span", { className: "ahc-deleted__icon", children: _jsx(Info, { "aria-hidden": "true" }) }), _jsx("span", { children: `${chat.name} was deleted. Its chats stay here for you to read or delete.` })] }) }));
|
|
64
64
|
}
|
|
65
|
-
function Frame({ showChats, onLink, about, actions, note, messageLength, autoFocus, }) {
|
|
65
|
+
function Frame({ showChats, onLink, about, actions, note, waiting, messageLength, autoFocus, }) {
|
|
66
66
|
const chat = useOpened();
|
|
67
67
|
const [listed, setListed] = useState(false);
|
|
68
68
|
const thread = chat.conversation ?? `new:${chat.agent ?? ''}`;
|
|
69
|
-
return (_jsxs("div", { className: "ahc-frame", children: [showChats === true ? (_jsx("div", { className: "ahc-side", "data-open": listed ? '' : undefined, children: _jsx(ChatList, { onChoose: () => setListed(false) }) })) : null, _jsxs("div", { className: "ahc-pane", children: [_jsx(Head, { about: about, actions: actions, listing: showChats === true ? () => setListed((open) => !open) : null }, thread), chat.deleted ? _jsx(Deleted, {}) : null, _jsx(ChatMessageList, { ...(onLink === undefined ? {} : { onLink }), footer: _jsx(ChatInput, { ...(messageLength === undefined ? {} : { messageLength }), ...(note === undefined ? {} : { note }), autoFocus: autoFocus === true }) })] })] }));
|
|
69
|
+
return (_jsxs("div", { className: "ahc-frame", children: [showChats === true ? (_jsx("div", { className: "ahc-side", "data-open": listed ? '' : undefined, children: _jsx(ChatList, { onChoose: () => setListed(false) }) })) : null, _jsxs("div", { className: "ahc-pane", children: [_jsx(Head, { about: about, actions: actions, listing: showChats === true ? () => setListed((open) => !open) : null }, thread), chat.deleted ? _jsx(Deleted, {}) : null, _jsx(ChatMessageList, { ...(onLink === undefined ? {} : { onLink }), waiting: waiting ?? null, footer: _jsx(ChatInput, { ...(messageLength === undefined ? {} : { messageLength }), ...(note === undefined ? {} : { note }), autoFocus: autoFocus === true }) })] })] }));
|
|
70
70
|
}
|
|
71
|
-
function Ready({ width = 'full', className, style, agentMark, agentDetail, ...rest }) {
|
|
71
|
+
function Ready({ width = 'full', className, style, agentMark, agentDetail, AgentLink, ...rest }) {
|
|
72
72
|
const [root, setRoot] = useState(null);
|
|
73
73
|
const attach = useCallback((element) => {
|
|
74
74
|
adopted(element);
|
|
75
75
|
setRoot(element);
|
|
76
76
|
}, []);
|
|
77
|
-
return (_jsx("div", { ref: attach, className: className === undefined ? 'ahc ahc-chat' : `ahc ahc-chat ${className}`, "data-width": width, style: style, children: root === null ? null : (_jsx(Within, { root: root, children: _jsx(Described.Provider, { value: { agentMark, agentDetail }, children: _jsx(Frame, { ...rest }) }) })) }));
|
|
77
|
+
return (_jsx("div", { ref: attach, className: className === undefined ? 'ahc ahc-chat' : `ahc ahc-chat ${className}`, "data-width": width, style: style, children: root === null ? null : (_jsx(Within, { root: root, children: _jsx(Described.Provider, { value: { agentMark, agentDetail, AgentLink }, children: _jsx(Frame, { ...rest }) }) })) }));
|
|
78
78
|
}
|
|
79
79
|
export function Chat({ client, conversation, agent, onOpen, ...look }) {
|
|
80
80
|
if (client === undefined)
|
package/dist/chat/style.js
CHANGED
|
@@ -209,14 +209,14 @@ const CSS = `
|
|
|
209
209
|
.ahc-deleted__icon { flex: none; display: flex; padding-top: 2px; }
|
|
210
210
|
|
|
211
211
|
.ahc-thread { flex: 1; min-height: 0; display: flex; flex-direction: column; }
|
|
212
|
-
.ahc-viewport { flex: 1; min-height: 0; overflow-y: auto; display: flex; flex-direction: column; }
|
|
212
|
+
.ahc-viewport { flex: 1; min-height: 0; overflow-y: auto; overflow-anchor: none; display: flex; flex-direction: column; }
|
|
213
213
|
.ahc-column { max-width: var(--ahc-column); margin: 0 var(--ahc-gutter); display: flex; flex-direction: column; font-size: var(--ahc-read); line-height: var(--ahc-read-lead); }
|
|
214
214
|
.ahc-messages { flex: 1; }
|
|
215
215
|
.ahc-footer { position: sticky; z-index: 2; bottom: 0; padding-bottom: var(--ahc-block); background: var(--ahc-bg); }
|
|
216
216
|
.ahc-empty { display: flex; flex-direction: column; gap: var(--ahc-block); padding-top: var(--ahc-section); }
|
|
217
217
|
.ahc-empty__title { margin: 0; font-size: var(--ahc-title-1); line-height: var(--ahc-title-1-lead); font-weight: 600; letter-spacing: -0.012em; }
|
|
218
218
|
.ahc-agents { display: flex; flex-wrap: wrap; gap: var(--ahc-pair); font-size: var(--ahc-body); line-height: var(--ahc-body-lead); }
|
|
219
|
-
.ahc-agent { background: var(--ahc-well); padding-left: var(--ahc-inset); }
|
|
219
|
+
.ahc-agent { flex: 0 1 auto; min-width: 0; max-width: 100%; background: var(--ahc-well); padding-left: var(--ahc-inset); }
|
|
220
220
|
.ahc-agent[aria-pressed="true"] { background: var(--ahc-selected); }
|
|
221
221
|
.ahc-agent .ahc-meta { font-weight: 400; }
|
|
222
222
|
|
|
@@ -268,13 +268,13 @@ const CSS = `
|
|
|
268
268
|
|
|
269
269
|
.ahc-input-area { display: flex; flex-direction: column; }
|
|
270
270
|
.ahc-queue { display: flex; flex-direction: column; }
|
|
271
|
-
.ahc-queue__head { display: flex; align-items: center; font-size: var(--ahc-meta); line-height: var(--ahc-meta-lead); color: var(--ahc-muted); }
|
|
271
|
+
.ahc-queue__head { display: flex; align-items: center; gap: var(--ahc-pair); font-size: var(--ahc-meta); line-height: var(--ahc-meta-lead); color: var(--ahc-muted); }
|
|
272
272
|
.ahc-queue__said { flex: 1; }
|
|
273
|
-
.ahc-queue-row { display: flex; align-items: center; height: var(--ahc-control); padding: 0 4px 0 var(--ahc-inset); border-radius: var(--ahc-r-control); background: var(--ahc-well); }
|
|
273
|
+
.ahc-queue-row { display: flex; align-items: center; gap: var(--ahc-pair); height: var(--ahc-control); padding: 0 4px 0 var(--ahc-inset); border-radius: var(--ahc-r-control); background: var(--ahc-well); }
|
|
274
274
|
.ahc-queue-row__text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
275
275
|
.ahc-composer { position: relative; display: flex; flex-direction: column; padding: var(--ahc-pair); border: 1px solid var(--ahc-line); border-radius: var(--ahc-r-card); background: var(--ahc-surface); box-shadow: var(--ahc-shadow-raised); }
|
|
276
276
|
.ahc-composer__input { display: block; width: 100%; max-height: 240px; resize: none; border: 0; padding: var(--ahc-pair) var(--ahc-inset); background: transparent; color: var(--ahc-text); font: inherit; font-size: var(--ahc-read); line-height: var(--ahc-read-lead); }
|
|
277
|
-
.ahc-composer__bar { display: flex; align-items: center; }
|
|
277
|
+
.ahc-composer__bar { display: flex; align-items: center; gap: var(--ahc-pair); }
|
|
278
278
|
.ahc-picker { flex-shrink: 1; min-width: 0; color: var(--ahc-text-2); padding: 0 var(--ahc-inset); }
|
|
279
279
|
.ahc-note { margin: 1em 0; font-size: var(--ahc-meta); line-height: var(--ahc-meta-lead); color: var(--ahc-text-2); }
|
|
280
280
|
.ahc-note[data-state="refused"] { color: var(--ahc-danger); }
|
package/dist/client.d.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import type { AppRoom, ConnectionRefusal, HistoryQuery, RoomSchemas, SavedRoomDraft, SaveResult } from './connection.js';
|
|
1
|
+
import type { AppRoom, ConnectionRefusal, HistoryQuery, RoomSchemas, SavedParts, SavedRoomDraft, SaveResult } from './connection.js';
|
|
2
2
|
import type { Member, ServiceMode } from './adapter.js';
|
|
3
3
|
import type { ChatDraft, ConversationAgent, ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
|
|
4
4
|
import { type Observation } from './observation.js';
|
|
5
5
|
import type { BinaryReference } from './binary.js';
|
|
6
|
-
import type { BinaryAnswer, CallResult, HistoryAnswer, QueueEntry } from './outcome.js';
|
|
7
|
-
import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult } from './query.js';
|
|
6
|
+
import type { BinaryAnswer, BinaryLinkAnswer, CallResult, HistoryAnswer, Offline, QueueEntry } from './outcome.js';
|
|
7
|
+
import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult, PendingResult } from './query.js';
|
|
8
8
|
import type { RoomDraft, RoomDraftParts, RoomDraftWrite } from './room-draft.js';
|
|
9
9
|
import type { SearchRequest, SearchResult } from './search.js';
|
|
10
|
+
import type { Readiness } from './readiness.js';
|
|
10
11
|
import type { SyncStatus } from './status.js';
|
|
11
12
|
import { type RuntimePort } from './wire.js';
|
|
12
13
|
export type MdRuntimeClient = {
|
|
13
14
|
rooms(): Promise<readonly AppRoom[]>;
|
|
14
15
|
query: {
|
|
15
|
-
(query: DocumentQuery): Promise<DocumentResult>;
|
|
16
|
-
(query: GroupQuery): Promise<GroupResult>;
|
|
16
|
+
(query: DocumentQuery): Promise<DocumentResult | PendingResult>;
|
|
17
|
+
(query: GroupQuery): Promise<GroupResult | PendingResult>;
|
|
17
18
|
};
|
|
18
19
|
search(request: SearchRequest): Promise<SearchResult>;
|
|
19
20
|
types(locator: string): Promise<RoomSchemas>;
|
|
@@ -24,15 +25,17 @@ export type MdRuntimeClient = {
|
|
|
24
25
|
discard(room: string, path: string, revision: string): Promise<RoomDraftWrite>;
|
|
25
26
|
};
|
|
26
27
|
save(room: string, roomDrafts: readonly SavedRoomDraft[]): Promise<SaveResult>;
|
|
28
|
+
saveParts(room: string, parts: readonly SavedParts[]): Promise<SaveResult>;
|
|
27
29
|
presentation: {
|
|
28
30
|
read(): Promise<unknown>;
|
|
29
31
|
write(value: unknown): Promise<void>;
|
|
32
|
+
edit(members: Readonly<Record<string, unknown>>): Promise<void>;
|
|
30
33
|
};
|
|
31
34
|
conversation: {
|
|
32
35
|
list(): Promise<readonly ConversationEntry[]>;
|
|
33
36
|
read(conversation: string, options?: ConversationOptions): Promise<ConversationView>;
|
|
34
37
|
create(input: unknown): Promise<CallResult>;
|
|
35
|
-
send(conversation: string): Promise<CallResult>;
|
|
38
|
+
send(conversation: string, operation?: string, draft?: ChatDraft): Promise<CallResult | Offline>;
|
|
36
39
|
answer(conversation: string, answer: unknown): Promise<CallResult>;
|
|
37
40
|
interrupt(conversation: string): Promise<CallResult>;
|
|
38
41
|
kill(conversation: string): Promise<CallResult>;
|
|
@@ -41,27 +44,31 @@ export type MdRuntimeClient = {
|
|
|
41
44
|
};
|
|
42
45
|
chatDraft: {
|
|
43
46
|
write(conversation: string, draft: ChatDraft, revision?: string): Promise<void>;
|
|
47
|
+
prepend(conversation: string, draft: ChatDraft): Promise<void>;
|
|
44
48
|
discard(conversation: string): Promise<void>;
|
|
45
49
|
};
|
|
46
50
|
history(locator: string, path: string, query?: HistoryQuery): Promise<HistoryAnswer>;
|
|
47
51
|
binaryFile: {
|
|
48
52
|
read(room: string, path: string, revision?: string): Promise<BinaryAnswer>;
|
|
53
|
+
link(room: string, path: string, revision?: string): Promise<BinaryLinkAnswer>;
|
|
49
54
|
readReference(reference: BinaryReference): Promise<BinaryAnswer>;
|
|
50
55
|
};
|
|
51
56
|
call(name: string, input: unknown): Promise<CallResult>;
|
|
52
57
|
reached(locator: string, roomVersion: string, path?: string): Promise<boolean>;
|
|
53
58
|
log(): Promise<string>;
|
|
54
59
|
persistence(): Promise<boolean>;
|
|
60
|
+
retry(): Promise<void>;
|
|
55
61
|
observe: {
|
|
56
62
|
(topic: 'deployment-facts'): Promise<Observation<unknown>>;
|
|
57
63
|
(topic: 'rooms'): Promise<Observation<readonly AppRoom[]>>;
|
|
64
|
+
(topic: 'readiness'): Promise<Observation<Readiness>>;
|
|
58
65
|
(topic: 'connection-refusal'): Promise<Observation<ConnectionRefusal | null>>;
|
|
59
66
|
(topic: 'storage-loss'): Promise<Observation<string | null>>;
|
|
60
67
|
(topic: 'sync-status'): Promise<Observation<SyncStatus>>;
|
|
61
68
|
(topic: 'service-mode'): Promise<Observation<ServiceMode>>;
|
|
62
69
|
(topic: 'member'): Promise<Observation<Member | null>>;
|
|
63
|
-
(topic: 'query', query: DocumentQuery): Promise<Observation<DocumentResult>>;
|
|
64
|
-
(topic: 'query', query: GroupQuery): Promise<Observation<GroupResult>>;
|
|
70
|
+
(topic: 'query', query: DocumentQuery): Promise<Observation<DocumentResult | PendingResult>>;
|
|
71
|
+
(topic: 'query', query: GroupQuery): Promise<Observation<GroupResult | PendingResult>>;
|
|
65
72
|
(topic: 'queue', locator: string): Promise<Observation<readonly QueueEntry[]>>;
|
|
66
73
|
(topic: 'room-drafts'): Promise<Observation<readonly RoomDraft[]>>;
|
|
67
74
|
(topic: 'presentation'): Promise<Observation<unknown>>;
|
|
@@ -75,5 +82,6 @@ export type MdRuntimeClient = {
|
|
|
75
82
|
export declare function connectMdRuntime(port: RuntimePort): MdRuntimeClient;
|
|
76
83
|
export declare function inTurn(client: MdRuntimeClient, work: () => Promise<void>): Promise<void>;
|
|
77
84
|
export type { Observation } from './observation.js';
|
|
78
|
-
export type {
|
|
85
|
+
export type { Open } from './open.js';
|
|
86
|
+
export { unanswered, type RuntimePort, type WireMember } from './wire.js';
|
|
79
87
|
//# 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,MAAM,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAY,KAAK,WAAW,EAAiB,MAAM,kBAAkB,CAAC;AAE7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { observed } from './observation.js';
|
|
2
2
|
import { runtimeError } from './failure.js';
|
|
3
3
|
import { answer, AUTHORIZATION_ENDED, PORT_CLOSED, } from './wire.js';
|
|
4
|
+
// 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.
|
|
5
|
+
const SETTLED_FRAMES = 2;
|
|
4
6
|
function refused(refusal) {
|
|
5
7
|
return runtimeError(refusal.code, refusal.code, refusal.retryable);
|
|
6
8
|
}
|
|
@@ -141,14 +143,19 @@ export function connectMdRuntime(port) {
|
|
|
141
143
|
if (opening.size > 0)
|
|
142
144
|
return;
|
|
143
145
|
const at = moved;
|
|
144
|
-
|
|
146
|
+
const waited = (frames) => {
|
|
145
147
|
requestAnimationFrame(() => {
|
|
148
|
+
if (frames < SETTLED_FRAMES) {
|
|
149
|
+
waited(frames + 1);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
146
152
|
if (moved !== at || opening.size > 0)
|
|
147
153
|
return;
|
|
148
154
|
drawing = null;
|
|
149
155
|
resolve();
|
|
150
156
|
});
|
|
151
|
-
}
|
|
157
|
+
};
|
|
158
|
+
waited(1);
|
|
152
159
|
};
|
|
153
160
|
drawing = check;
|
|
154
161
|
check();
|
|
@@ -167,15 +174,17 @@ export function connectMdRuntime(port) {
|
|
|
167
174
|
discard: (room, path, revision) => ask('roomDraft.discard', [room, path, revision]),
|
|
168
175
|
},
|
|
169
176
|
save: (room, roomDrafts) => ask('save', [room, roomDrafts]),
|
|
177
|
+
saveParts: (room, parts) => ask('saveParts', [room, parts]),
|
|
170
178
|
presentation: {
|
|
171
179
|
read: () => ask('presentation.read', []),
|
|
172
180
|
write: (value) => ask('presentation.write', [value]),
|
|
181
|
+
edit: (members) => ask('presentation.edit', [members]),
|
|
173
182
|
},
|
|
174
183
|
conversation: {
|
|
175
184
|
list: () => ask('conversation.list', []),
|
|
176
185
|
read: (conversation, options) => ask('conversation.read', [conversation, options]),
|
|
177
186
|
create: (input) => ask('conversation.create', [input]),
|
|
178
|
-
send: (conversation) => ask('conversation.send', [conversation]),
|
|
187
|
+
send: (conversation, operation, draft) => ask('conversation.send', [conversation, operation, draft]),
|
|
179
188
|
answer: (conversation, answer) => ask('conversation.answer', [conversation, answer]),
|
|
180
189
|
interrupt: (conversation) => ask('conversation.interrupt', [conversation]),
|
|
181
190
|
kill: (conversation) => ask('conversation.kill', [conversation]),
|
|
@@ -184,17 +193,20 @@ export function connectMdRuntime(port) {
|
|
|
184
193
|
},
|
|
185
194
|
chatDraft: {
|
|
186
195
|
write: (conversation, draft, revision) => ask('chatDraft.write', [conversation, draft, revision]),
|
|
196
|
+
prepend: (conversation, draft) => ask('chatDraft.prepend', [conversation, draft]),
|
|
187
197
|
discard: (conversation) => ask('chatDraft.discard', [conversation]),
|
|
188
198
|
},
|
|
189
199
|
history: (locator, path, query) => ask('history', [locator, path, query]),
|
|
190
200
|
binaryFile: {
|
|
191
201
|
read: (room, path, revision) => ask('binaryFile.read', [room, path, revision]),
|
|
202
|
+
link: (room, path, revision) => ask('binaryFile.link', [room, path, revision]),
|
|
192
203
|
readReference: (reference) => ask('binaryFile.readReference', [reference]),
|
|
193
204
|
},
|
|
194
205
|
call: (name, input) => ask('call', [name, input]),
|
|
195
206
|
reached: (locator, roomVersion, path) => ask('reached', [locator, roomVersion, path]),
|
|
196
207
|
log: () => ask('log', []),
|
|
197
208
|
persistence: () => ask('persistence', []),
|
|
209
|
+
retry: () => ask('retry', []),
|
|
198
210
|
observe: ((topic, ...input) => watch(topic, input)),
|
|
199
211
|
reauthorize: () => ask('reauthorize', []),
|
|
200
212
|
settled,
|
|
@@ -202,7 +214,8 @@ export function connectMdRuntime(port) {
|
|
|
202
214
|
}
|
|
203
215
|
const turns = new WeakMap();
|
|
204
216
|
export function inTurn(client, work) {
|
|
205
|
-
const
|
|
206
|
-
turns.set(client,
|
|
207
|
-
return
|
|
217
|
+
const turn = (turns.get(client) ?? Promise.resolve()).then(work);
|
|
218
|
+
turns.set(client, turn.then(() => undefined, () => undefined));
|
|
219
|
+
return turn;
|
|
208
220
|
}
|
|
221
|
+
export { unanswered } from './wire.js';
|