@agentshouse/mdruntime 0.1.0-c5fe3b2cddda7 → 0.1.0-c6197367d5fad
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 -19
- package/dist/acceptance.d.ts +3 -0
- package/dist/acceptance.d.ts.map +1 -0
- package/dist/acceptance.js +299 -0
- package/dist/act-lanes.d.ts +30 -0
- package/dist/act-lanes.d.ts.map +1 -0
- package/dist/act-lanes.js +225 -0
- package/dist/actions.d.ts +26 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +302 -0
- package/dist/adapter.d.ts +156 -89
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +3 -11
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +20 -60
- package/dist/authored.d.ts +88 -0
- package/dist/authored.d.ts.map +1 -0
- package/dist/authored.js +345 -0
- package/dist/bootstrap.d.ts +9 -5
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +204 -85
- package/dist/cell.d.ts +6 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +9 -0
- package/dist/chain.d.ts +2 -1
- package/dist/chain.d.ts.map +1 -1
- package/dist/change-set.d.ts +4 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +6 -0
- package/dist/change.d.ts +5 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +7 -2
- package/dist/chat-types.d.ts +3 -0
- package/dist/chat-types.d.ts.map +1 -0
- package/dist/chat-types.js +11 -0
- package/dist/client.d.ts +33 -23
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +43 -56
- package/dist/collection.d.ts +26 -4
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +19 -2
- package/dist/column.d.ts +5 -0
- package/dist/column.d.ts.map +1 -0
- package/dist/column.js +9 -0
- package/dist/compile.d.ts +8 -6
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +286 -336
- package/dist/connection.d.ts +5 -142
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +111 -4993
- package/dist/context.d.ts +2 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +7 -0
- package/dist/conversation-live.d.ts +150 -0
- package/dist/conversation-live.d.ts.map +1 -0
- package/dist/conversation-live.js +259 -0
- package/dist/conversation-row.d.ts +40 -0
- package/dist/conversation-row.d.ts.map +1 -0
- package/dist/conversation-row.js +66 -0
- package/dist/conversation.d.ts +72 -51
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +1001 -926
- package/dist/declaration.d.ts +10 -0
- package/dist/declaration.d.ts.map +1 -0
- package/dist/declaration.js +24 -0
- package/dist/discovery.d.ts +11 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +157 -0
- package/dist/download.d.ts +6 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +42 -0
- package/dist/durability.d.ts +20 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +7 -0
- package/dist/entry.d.ts +2 -2
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +18 -8
- package/dist/expectation.d.ts +26 -13
- package/dist/expectation.d.ts.map +1 -1
- package/dist/expectation.js +72 -19
- package/dist/failure.d.ts +3 -0
- package/dist/failure.d.ts.map +1 -1
- package/dist/failure.js +6 -0
- package/dist/figures.d.ts +49 -0
- package/dist/figures.d.ts.map +1 -0
- package/dist/figures.js +199 -0
- package/dist/file.d.ts +1 -1
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +3 -2
- package/dist/holdings.d.ts +29 -0
- package/dist/holdings.d.ts.map +1 -0
- package/dist/holdings.js +95 -0
- package/dist/host.d.ts +21 -7
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +83 -41
- package/dist/identity.d.ts +0 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +0 -3
- package/dist/index.d.ts +37 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -5
- package/dist/install.d.ts +60 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +537 -0
- package/dist/lifecycle.d.ts +7 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +282 -0
- package/dist/listing.d.ts +52 -0
- package/dist/listing.d.ts.map +1 -0
- package/dist/listing.js +152 -0
- package/dist/live.d.ts +9 -6
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +118 -36
- package/dist/loaded.d.ts +5 -0
- package/dist/loaded.d.ts.map +1 -0
- package/dist/loaded.js +40 -0
- package/dist/locks.d.ts +7 -0
- package/dist/locks.d.ts.map +1 -0
- package/dist/locks.js +32 -0
- package/dist/lost.d.ts +5 -0
- package/dist/lost.d.ts.map +1 -0
- package/dist/lost.js +49 -0
- package/dist/media.d.ts +19 -2
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +105 -27
- package/dist/memory.d.ts +18 -6
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +214 -91
- package/dist/messages.d.ts +35 -5
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +109 -39
- package/dist/model.d.ts +2 -10
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -14
- package/dist/models.d.ts +10 -0
- package/dist/models.d.ts.map +1 -0
- package/dist/models.js +153 -0
- package/dist/observation.d.ts +28 -13
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +185 -81
- package/dist/opened.d.ts +1 -1
- package/dist/opened.d.ts.map +1 -1
- package/dist/opened.js +5 -5
- package/dist/opening.d.ts +4 -0
- package/dist/opening.d.ts.map +1 -0
- package/dist/opening.js +53 -0
- package/dist/outcome.d.ts +17 -2
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +35 -2
- package/dist/overlay.d.ts +7 -2
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +48 -24
- package/dist/page-metadata.d.ts +8 -0
- package/dist/page-metadata.d.ts.map +1 -0
- package/dist/page-metadata.js +19 -0
- package/dist/parts.d.ts +4 -0
- package/dist/parts.d.ts.map +1 -0
- package/dist/parts.js +13 -0
- package/dist/paths.d.ts +1 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +22 -0
- package/dist/preparation.d.ts +41 -0
- package/dist/preparation.d.ts.map +1 -0
- package/dist/preparation.js +314 -0
- package/dist/presence.d.ts +58 -0
- package/dist/presence.d.ts.map +1 -0
- package/dist/presence.js +231 -0
- package/dist/queries.d.ts +16 -0
- package/dist/queries.d.ts.map +1 -0
- package/dist/queries.js +308 -0
- package/dist/query.d.ts +14 -210
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +3 -505
- package/dist/questions.d.ts +30 -0
- package/dist/questions.d.ts.map +1 -0
- package/dist/questions.js +116 -0
- package/dist/queue.d.ts +40 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +480 -0
- package/dist/reach.d.ts +16 -15
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +257 -148
- package/dist/react.d.ts +19 -3
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +33 -1
- package/dist/read.d.ts +7 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +17 -0
- package/dist/readiness.d.ts +9 -6
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +3 -5
- package/dist/reads.d.ts +39 -0
- package/dist/reads.d.ts.map +1 -0
- package/dist/reads.js +178 -0
- package/dist/recovery.d.ts +3 -1
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +38 -8
- package/dist/refresh.d.ts +2 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +31 -3
- package/dist/refusal.d.ts +5 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +55 -0
- package/dist/replica.d.ts +11 -16
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +66 -32
- package/dist/retried.d.ts +30 -0
- package/dist/retried.d.ts.map +1 -0
- package/dist/retried.js +72 -0
- package/dist/room-draft.d.ts +34 -10
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +331 -111
- package/dist/room-drafts.d.ts +24 -0
- package/dist/room-drafts.d.ts.map +1 -0
- package/dist/room-drafts.js +220 -0
- package/dist/room-list.d.ts +10 -0
- package/dist/room-list.d.ts.map +1 -0
- package/dist/room-list.js +45 -0
- package/dist/rows.d.ts +16 -22
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +49 -186
- package/dist/runtime.d.ts +34 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +1 -0
- package/dist/save.d.ts +42 -86
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +332 -228
- package/dist/saves.d.ts +34 -0
- package/dist/saves.d.ts.map +1 -0
- package/dist/saves.js +437 -0
- package/dist/search.d.ts +12 -63
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +9 -52
- package/dist/seed.d.ts +11 -2
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +71 -1
- package/dist/shared.d.ts +1 -6
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +13 -95
- package/dist/shown.d.ts +35 -0
- package/dist/shown.d.ts.map +1 -0
- package/dist/shown.js +313 -0
- package/dist/socket/admission.d.ts +7 -0
- package/dist/socket/admission.d.ts.map +1 -0
- package/dist/socket/admission.js +39 -0
- package/dist/socket/answers.d.ts +6 -0
- package/dist/socket/answers.d.ts.map +1 -0
- package/dist/socket/answers.js +20 -0
- package/dist/socket/lanes.d.ts +28 -0
- package/dist/socket/lanes.d.ts.map +1 -0
- package/dist/socket/lanes.js +103 -0
- package/dist/socket/reads.d.ts +10 -0
- package/dist/socket/reads.d.ts.map +1 -0
- package/dist/socket/reads.js +31 -0
- package/dist/socket/session.d.ts +38 -0
- package/dist/socket/session.d.ts.map +1 -0
- package/dist/socket/session.js +23 -0
- package/dist/socket.d.ts +67 -0
- package/dist/socket.d.ts.map +1 -0
- package/dist/socket.js +164 -0
- package/dist/source.d.ts +59 -0
- package/dist/source.d.ts.map +1 -0
- package/dist/source.js +93 -0
- package/dist/status.d.ts +0 -2
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +0 -6
- package/dist/store/installs.d.ts +30 -0
- package/dist/store/installs.d.ts.map +1 -0
- package/dist/store/installs.js +40 -0
- package/dist/store/readiness.d.ts +11 -0
- package/dist/store/readiness.d.ts.map +1 -0
- package/dist/store/readiness.js +68 -0
- package/dist/store/records.d.ts +224 -0
- package/dist/store/records.d.ts.map +1 -0
- package/dist/store/records.js +466 -0
- package/dist/store/room-held.d.ts +8 -0
- package/dist/store/room-held.d.ts.map +1 -0
- package/dist/store/room-held.js +17 -0
- package/dist/store/rooms-shown.d.ts +8 -0
- package/dist/store/rooms-shown.d.ts.map +1 -0
- package/dist/store/rooms-shown.js +13 -0
- package/dist/store/space.d.ts +11 -0
- package/dist/store/space.d.ts.map +1 -0
- package/dist/store/space.js +41 -0
- package/dist/store/watchers.d.ts +17 -0
- package/dist/store/watchers.d.ts.map +1 -0
- package/dist/store/watchers.js +56 -0
- package/dist/store/writes.d.ts +24 -0
- package/dist/store/writes.d.ts.map +1 -0
- package/dist/store/writes.js +125 -0
- package/dist/store.d.ts +115 -143
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +171 -364
- package/dist/stored.d.ts +72 -35
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +337 -197
- package/dist/surface.d.ts +92 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +251 -0
- package/dist/sync.d.ts +19 -0
- package/dist/sync.d.ts.map +1 -0
- package/dist/sync.js +538 -0
- package/dist/tables.d.ts +118 -67
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +199 -278
- package/dist/tallies.d.ts +18 -0
- package/dist/tallies.d.ts.map +1 -0
- package/dist/tallies.js +128 -0
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +9 -12
- package/dist/windows.d.ts +1 -12
- package/dist/windows.d.ts.map +1 -1
- package/dist/windows.js +2 -75
- package/dist/wire.d.ts +72 -9
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +26 -5
- package/package.json +3 -2
- package/dist/attempt.d.ts +0 -16
- package/dist/attempt.d.ts.map +0 -1
- package/dist/attempt.js +0 -70
- package/dist/fence.d.ts +0 -6
- package/dist/fence.d.ts.map +0 -1
- package/dist/fence.js +0 -10
- package/dist/fulltext.d.ts +0 -27
- package/dist/fulltext.d.ts.map +0 -1
- package/dist/fulltext.js +0 -370
- package/dist/log.d.ts +0 -5
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
- package/dist/words.d.ts +0 -19
- package/dist/words.d.ts.map +0 -1
- package/dist/words.js +0 -156
package/dist/reach.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import { QueryError } from '@agentshouse/mdmodel';
|
|
2
|
+
import { selected } from './collection.js';
|
|
1
3
|
import { unheldView } from './conversation.js';
|
|
2
4
|
import { modelTypes, NO_MODEL } from './model.js';
|
|
3
|
-
import { changeOf, digestApplied, digestOf, observing, } from './observation.js';
|
|
4
|
-
import { runtimeError } from './failure.js';
|
|
5
|
-
import { failure, lockedRoom, ROOM_LOCKED, undeclared, UNREADABLE, } from './outcome.js';
|
|
5
|
+
import { changeOf, digestApplied, digestOf, observing, unchanged, } from './observation.js';
|
|
6
|
+
import { runtimeError, uncaught } from './failure.js';
|
|
7
|
+
import { absentBinary, failure, lockedRoom, ROOM_LOCKED, undeclared, UNREADABLE, } from './outcome.js';
|
|
6
8
|
import { beneath } from './paths.js';
|
|
7
9
|
import { moveTarget, readParts, staleWrite, } from './room-draft.js';
|
|
8
10
|
import { documentKey } from './rows.js';
|
|
9
|
-
import { undeclaredSearch } from './search.js';
|
|
10
11
|
const UNHELD_TYPES = { collection: modelTypes(NO_MODEL), typedSelection: null };
|
|
11
12
|
function unconversed(name) {
|
|
12
13
|
return () => Promise.resolve(undeclared(name));
|
|
@@ -14,33 +15,41 @@ function unconversed(name) {
|
|
|
14
15
|
const NO_CONVERSATION = {
|
|
15
16
|
list: () => Promise.resolve([]),
|
|
16
17
|
read: (conversation) => Promise.resolve(unheldView(conversation)),
|
|
17
|
-
create: unconversed('
|
|
18
|
-
send: unconversed('
|
|
19
|
-
answer: unconversed('
|
|
20
|
-
interrupt: unconversed('
|
|
21
|
-
kill: unconversed('
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
create: unconversed('conversations/create'),
|
|
19
|
+
send: unconversed('conversations/send'),
|
|
20
|
+
answer: unconversed('conversations/interaction/answer'),
|
|
21
|
+
interrupt: unconversed('conversations/interrupt'),
|
|
22
|
+
kill: unconversed('conversations/kill'),
|
|
23
|
+
delete: unconversed('conversations/delete'),
|
|
24
|
+
takeOut: unconversed('conversations/take-out'),
|
|
25
|
+
decide: unconversed('agent-functions/decide'),
|
|
26
|
+
rename: unconversed('conversations/rename'),
|
|
27
|
+
option: unconversed('conversations/option/set'),
|
|
28
|
+
retry: unconversed('conversations/retry'),
|
|
29
|
+
pin: () => Promise.resolve(),
|
|
30
|
+
openTurn: () => Promise.resolve(),
|
|
31
|
+
dismissSuggestion: () => Promise.resolve(),
|
|
32
|
+
attach: () => Promise.resolve(undeclared('conversation.attach')),
|
|
33
|
+
attachment: (link) => Promise.resolve(absentBinary(link)),
|
|
24
34
|
};
|
|
25
35
|
const NO_CHAT_DRAFT = {
|
|
26
36
|
write: () => Promise.resolve(),
|
|
27
37
|
prepend: () => Promise.resolve(),
|
|
38
|
+
append: () => Promise.resolve(),
|
|
28
39
|
discard: () => Promise.resolve(),
|
|
29
40
|
};
|
|
30
41
|
function areasOf(reach) {
|
|
31
42
|
return reach.areas ?? [];
|
|
32
43
|
}
|
|
33
|
-
function typedAreas(reach, room) {
|
|
34
|
-
return areasOf(reach).filter((area) => area.room === room && area.types.length > 0);
|
|
35
|
-
}
|
|
36
44
|
function fenced(reach, room, path) {
|
|
37
|
-
return areasOf(reach).some((area) => area.room === room &&
|
|
45
|
+
return areasOf(reach).some((area) => area.room === room &&
|
|
46
|
+
beneath(area.path, path) &&
|
|
47
|
+
!area.open.some((open) => beneath(open, path)));
|
|
38
48
|
}
|
|
39
49
|
export function holds(reach, room) {
|
|
40
50
|
return (reach === null ||
|
|
41
51
|
reach.rooms.includes(room) ||
|
|
42
|
-
reach.documents.some((document) => document.room === room)
|
|
43
|
-
typedAreas(reach, room).length > 0);
|
|
52
|
+
reach.documents.some((document) => document.room === room));
|
|
44
53
|
}
|
|
45
54
|
function wholly(reach, room) {
|
|
46
55
|
return reach === null || reach.rooms.includes(room);
|
|
@@ -49,14 +58,11 @@ export function governs(reach, room) {
|
|
|
49
58
|
if (wholly(reach, room.locator)) {
|
|
50
59
|
return { collection: true, selection: room.typedSelection !== null };
|
|
51
60
|
}
|
|
52
|
-
const
|
|
53
|
-
const paths =
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
...typedAreas(reach, room.locator).map(({ path }) => path),
|
|
58
|
-
];
|
|
59
|
-
return { collection: paths.some((path) => !selected(path)), selection: paths.some(selected) };
|
|
61
|
+
const within = (path) => selected({ selection: room.typedSelection }, path);
|
|
62
|
+
const paths = reach.documents
|
|
63
|
+
.filter((document) => document.room === room.locator)
|
|
64
|
+
.map(({ path }) => path);
|
|
65
|
+
return { collection: paths.some((path) => !within(path)), selection: paths.some(within) };
|
|
60
66
|
}
|
|
61
67
|
function covers(reach, room, path) {
|
|
62
68
|
return (reach === null ||
|
|
@@ -67,6 +73,19 @@ function covers(reach, room, path) {
|
|
|
67
73
|
function conversing(reach) {
|
|
68
74
|
return reach === null || reach.conversations;
|
|
69
75
|
}
|
|
76
|
+
function roomsAwaited(error, reach) {
|
|
77
|
+
return error.code === 'unknown-type' && reach !== null && reach.rooms.length === 0;
|
|
78
|
+
}
|
|
79
|
+
async function planInReach(runtime, input, reach, answered) {
|
|
80
|
+
try {
|
|
81
|
+
return await runtime.plan(input, reach);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (error instanceof QueryError && (answered || roomsAwaited(error, reach)))
|
|
85
|
+
return null;
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
70
89
|
export function planReach(reach) {
|
|
71
90
|
return reach === null
|
|
72
91
|
? null
|
|
@@ -76,13 +95,21 @@ export function planReach(reach) {
|
|
|
76
95
|
...new Set(reach.documents.map(({ room, path }) => documentKey(room, path))),
|
|
77
96
|
].sort(),
|
|
78
97
|
areas: areasOf(reach)
|
|
79
|
-
.map(({ room, path,
|
|
98
|
+
.map(({ room, path, open }) => ({ room, path, open: [...new Set(open)].sort() }))
|
|
80
99
|
.sort((left, right) => documentKey(left.room, left.path) < documentKey(right.room, right.path) ? -1 : 1),
|
|
81
100
|
};
|
|
82
101
|
}
|
|
83
102
|
function roomsWithin(reach, rooms) {
|
|
84
103
|
return rooms.filter((room) => wholly(reach, room.locator));
|
|
85
104
|
}
|
|
105
|
+
function roomsChangeWithin(reach, { changed, removed, order }) {
|
|
106
|
+
const within = {
|
|
107
|
+
changed: changed.filter(([locator]) => wholly(reach, locator)),
|
|
108
|
+
removed,
|
|
109
|
+
order: order === null ? null : order.filter((locator) => wholly(reach, locator)),
|
|
110
|
+
};
|
|
111
|
+
return unchanged(within) ? null : within;
|
|
112
|
+
}
|
|
86
113
|
function typesWithin(reach, room, types) {
|
|
87
114
|
if (room === undefined)
|
|
88
115
|
return structuredClone(UNHELD_TYPES);
|
|
@@ -112,12 +139,13 @@ function writeWithin(reach, write) {
|
|
|
112
139
|
function savedWithin(reach, room, result) {
|
|
113
140
|
if (reach === null || result.outcome === 'saved')
|
|
114
141
|
return result;
|
|
115
|
-
const { file, location, referrers, ...refusal } = result;
|
|
142
|
+
const { file, location, line, referrers, ...refusal } = result;
|
|
116
143
|
const hidden = file !== undefined && !covers(reach, room, file);
|
|
117
144
|
return {
|
|
118
145
|
...refusal,
|
|
119
146
|
...(file === undefined || hidden ? {} : { file }),
|
|
120
147
|
...(location === undefined || hidden ? {} : { location }),
|
|
148
|
+
...(line === undefined || hidden ? {} : { line }),
|
|
121
149
|
...(referrers === undefined
|
|
122
150
|
? {}
|
|
123
151
|
: { referrers: referrers.filter((path) => covers(reach, room, path)) }),
|
|
@@ -144,13 +172,13 @@ function queueWithin(reach, room, entries) {
|
|
|
144
172
|
});
|
|
145
173
|
}
|
|
146
174
|
function unreached(room) {
|
|
147
|
-
return runtimeError('room
|
|
175
|
+
return runtimeError('unknown-room', `Unknown Room ${room}`);
|
|
148
176
|
}
|
|
149
177
|
function lockedError(room) {
|
|
150
178
|
return runtimeError(ROOM_LOCKED, `${room} is locked until House confirms its access`, true);
|
|
151
179
|
}
|
|
152
180
|
function deviceUnreached() {
|
|
153
|
-
return runtimeError('device-unreached', 'Only the panel
|
|
181
|
+
return runtimeError('device-unreached', 'Only the panel reaches this device');
|
|
154
182
|
}
|
|
155
183
|
const ATTACH_REQUIRED = 'attach-required';
|
|
156
184
|
function attachRequired() {
|
|
@@ -159,10 +187,9 @@ function attachRequired() {
|
|
|
159
187
|
function carriesFile(parts) {
|
|
160
188
|
return parts !== null && typeof parts === 'object' && Object.hasOwn(parts, 'file');
|
|
161
189
|
}
|
|
162
|
-
export function narrowed(runtime, given,
|
|
190
|
+
export function narrowed(runtime, given, port) {
|
|
163
191
|
const { md, watch } = runtime;
|
|
164
192
|
let reach = given;
|
|
165
|
-
let port = told;
|
|
166
193
|
const open = new Set();
|
|
167
194
|
function following(begin, locking = false) {
|
|
168
195
|
let stop = begin();
|
|
@@ -178,70 +205,139 @@ export function narrowed(runtime, given, told) {
|
|
|
178
205
|
stop();
|
|
179
206
|
};
|
|
180
207
|
}
|
|
181
|
-
const unlocking = (rooms) => {
|
|
182
|
-
const
|
|
183
|
-
return
|
|
184
|
-
? null
|
|
185
|
-
: { pending: locked.map((room) => ({ room, awaits: 'unlock' })) };
|
|
208
|
+
const unlocking = (rooms, locked) => {
|
|
209
|
+
const held = (rooms ?? []).filter((room) => locked.includes(room));
|
|
210
|
+
return held.length === 0 ? null : { pending: held.map((room) => ({ room, awaits: 'unlock' })) };
|
|
186
211
|
};
|
|
187
|
-
const unlocked = (entries) => entries.filter((entry) => !
|
|
188
|
-
const intoLocked = (held) =>
|
|
189
|
-
|
|
212
|
+
const unlocked = (entries, locked) => entries.filter((entry) => !locked.includes(entry.room));
|
|
213
|
+
const intoLocked = async (held) => {
|
|
214
|
+
for (const move of held) {
|
|
215
|
+
if (move?.room !== undefined && (await runtime.locked(move.room)))
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
return false;
|
|
219
|
+
};
|
|
220
|
+
function ordered(deliver) {
|
|
221
|
+
let open = true;
|
|
222
|
+
let shown = Promise.resolve();
|
|
223
|
+
return {
|
|
224
|
+
push(making) {
|
|
225
|
+
shown = shown.then(() => making.then((value) => {
|
|
226
|
+
if (open)
|
|
227
|
+
deliver(value);
|
|
228
|
+
}, uncaught), uncaught);
|
|
229
|
+
},
|
|
230
|
+
stop() {
|
|
231
|
+
open = false;
|
|
232
|
+
},
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
function unlockedWatch(topic, input, deliver, fail, within) {
|
|
236
|
+
const shown = ordered(deliver);
|
|
237
|
+
const stop = watch(topic, input, (message) => {
|
|
238
|
+
shown.push(runtime.lockedRooms().then((locked) => within(message, locked)));
|
|
239
|
+
}, fail);
|
|
240
|
+
return () => {
|
|
241
|
+
shown.stop();
|
|
242
|
+
stop();
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
function lockedFirst(room, start, shut) {
|
|
246
|
+
let open = true;
|
|
247
|
+
let stop = () => { };
|
|
248
|
+
void (async () => {
|
|
249
|
+
const closed = !holds(reach, room) || (await runtime.locked(room));
|
|
250
|
+
if (!open)
|
|
251
|
+
return;
|
|
252
|
+
if (closed)
|
|
253
|
+
shut();
|
|
254
|
+
else
|
|
255
|
+
stop = start();
|
|
256
|
+
})();
|
|
257
|
+
return () => {
|
|
258
|
+
open = false;
|
|
259
|
+
stop();
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
const within = (topic, input, deliver, fail) => {
|
|
263
|
+
if (topic === 'read' && reach !== null) {
|
|
264
|
+
fail(deviceUnreached());
|
|
265
|
+
return () => { };
|
|
266
|
+
}
|
|
190
267
|
if (topic === 'rooms') {
|
|
191
|
-
return following(() => watch(topic, input, (rooms) =>
|
|
268
|
+
return following(() => watch(topic, input, (rooms) => {
|
|
269
|
+
const shown = Array.isArray(rooms)
|
|
270
|
+
? roomsWithin(reach, rooms)
|
|
271
|
+
: roomsChangeWithin(reach, rooms);
|
|
272
|
+
if (shown !== null)
|
|
273
|
+
deliver(shown);
|
|
274
|
+
}, fail));
|
|
192
275
|
}
|
|
193
276
|
if (topic === 'readiness') {
|
|
194
277
|
return following(() => runtime.watchReadiness(port, reach, deliver));
|
|
195
278
|
}
|
|
196
279
|
if (topic === 'sync-status') {
|
|
197
|
-
return following(() =>
|
|
198
|
-
const
|
|
199
|
-
|
|
280
|
+
return following(() => unlockedWatch(topic, input, deliver, fail, (status, locked) => {
|
|
281
|
+
const shown = statusWithin(reach, status);
|
|
282
|
+
return { ...shown, attentionRequired: unlocked(shown.attentionRequired, locked) };
|
|
200
283
|
}), true);
|
|
201
284
|
}
|
|
202
285
|
if (topic === 'room-drafts') {
|
|
203
|
-
return following(() =>
|
|
286
|
+
return following(() => unlockedWatch(topic, input, deliver, fail, (drafts, locked) => unlocked(draftsWithin(reach, drafts), locked)), true);
|
|
204
287
|
}
|
|
205
288
|
if (topic === 'queue') {
|
|
206
289
|
const room = input[0];
|
|
207
|
-
return following(() =>
|
|
208
|
-
if (!holds(reach, room) || runtime.locked(room)) {
|
|
209
|
-
deliver([]);
|
|
210
|
-
return () => { };
|
|
211
|
-
}
|
|
212
|
-
return watch(topic, input, (entries) => deliver(queueWithin(reach, room, entries)));
|
|
213
|
-
}, true);
|
|
290
|
+
return following(() => lockedFirst(room, () => watch(topic, input, (entries) => deliver(queueWithin(reach, room, entries)), fail), () => deliver([])), true);
|
|
214
291
|
}
|
|
215
292
|
if (topic === 'query') {
|
|
216
|
-
const plan = runtime.plan(input[0], reach);
|
|
217
293
|
let held = null;
|
|
294
|
+
let planning = null;
|
|
295
|
+
const waiting = (result) => {
|
|
296
|
+
const answer = { result, keys: [] };
|
|
297
|
+
if (held === null || changeOf(held, answer) !== null)
|
|
298
|
+
deliver(answer);
|
|
299
|
+
held = digestOf(answer);
|
|
300
|
+
};
|
|
218
301
|
return following(() => {
|
|
219
|
-
const locked = unlocking(plan.rooms);
|
|
220
|
-
if (locked !== null) {
|
|
221
|
-
const answer = { result: locked, keys: [] };
|
|
222
|
-
if (held === null || changeOf(held, answer) !== null)
|
|
223
|
-
deliver(answer);
|
|
224
|
-
held = digestOf(answer);
|
|
225
|
-
return () => { };
|
|
226
|
-
}
|
|
227
|
-
let first = true;
|
|
228
302
|
let open = true;
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
303
|
+
let stop = () => { };
|
|
304
|
+
if (planning?.reach !== reach) {
|
|
305
|
+
planning = { reach, plan: planInReach(runtime, input[0], reach, held !== null) };
|
|
306
|
+
}
|
|
307
|
+
const planned = planning.plan;
|
|
308
|
+
void (async () => {
|
|
309
|
+
const plan = await planned;
|
|
310
|
+
const locked = await runtime.lockedRooms();
|
|
311
|
+
if (!open)
|
|
233
312
|
return;
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
313
|
+
if (plan === null)
|
|
314
|
+
return waiting({ pending: [] });
|
|
315
|
+
const pending = unlocking(plan.rooms, locked);
|
|
316
|
+
if (pending !== null)
|
|
317
|
+
return waiting(pending);
|
|
318
|
+
let first = true;
|
|
319
|
+
const heard = (message) => {
|
|
320
|
+
if (!first) {
|
|
321
|
+
held = digestApplied(held, message);
|
|
322
|
+
deliver(message);
|
|
323
|
+
return;
|
|
324
|
+
}
|
|
325
|
+
first = false;
|
|
326
|
+
const change = held === null ? message : changeOf(held, message);
|
|
327
|
+
held = digestOf(message);
|
|
328
|
+
if (change !== null)
|
|
329
|
+
deliver(change);
|
|
330
|
+
};
|
|
331
|
+
stop = runtime.watchPlan({ ...plan, locked }, (message) => {
|
|
332
|
+
if (open)
|
|
333
|
+
heard(message);
|
|
334
|
+
}, (error) => {
|
|
335
|
+
if (open)
|
|
336
|
+
fail(error);
|
|
337
|
+
});
|
|
338
|
+
})().catch((error) => {
|
|
243
339
|
if (open)
|
|
244
|
-
|
|
340
|
+
fail(error);
|
|
245
341
|
});
|
|
246
342
|
return () => {
|
|
247
343
|
open = false;
|
|
@@ -252,7 +348,7 @@ export function narrowed(runtime, given, told) {
|
|
|
252
348
|
if (topic === 'conversation') {
|
|
253
349
|
return following(() => {
|
|
254
350
|
if (conversing(reach))
|
|
255
|
-
return watch(topic, input, deliver);
|
|
351
|
+
return watch(topic, input, deliver, fail);
|
|
256
352
|
deliver(unheldView(input[0]));
|
|
257
353
|
return () => { };
|
|
258
354
|
});
|
|
@@ -260,12 +356,21 @@ export function narrowed(runtime, given, told) {
|
|
|
260
356
|
if (topic === 'conversations' || topic === 'agents') {
|
|
261
357
|
return following(() => {
|
|
262
358
|
if (conversing(reach))
|
|
263
|
-
return watch(topic, input, deliver);
|
|
359
|
+
return watch(topic, input, deliver, fail);
|
|
264
360
|
deliver([]);
|
|
265
361
|
return () => { };
|
|
266
362
|
});
|
|
267
363
|
}
|
|
268
|
-
|
|
364
|
+
if (topic === 'figures' ||
|
|
365
|
+
topic === 'holdings' ||
|
|
366
|
+
topic === 'listed-agents' ||
|
|
367
|
+
topic === 'room-list') {
|
|
368
|
+
if (reach === null)
|
|
369
|
+
return watch(topic, input, deliver, fail);
|
|
370
|
+
fail(deviceUnreached());
|
|
371
|
+
return () => { };
|
|
372
|
+
}
|
|
373
|
+
return watch(topic, input, deliver, fail);
|
|
269
374
|
};
|
|
270
375
|
const files = new Map();
|
|
271
376
|
let handed = 0;
|
|
@@ -283,33 +388,35 @@ export function narrowed(runtime, given, told) {
|
|
|
283
388
|
const view = {
|
|
284
389
|
...md,
|
|
285
390
|
rooms: () => md.rooms().then((rooms) => roomsWithin(reach, rooms)),
|
|
286
|
-
query: ((input) => {
|
|
287
|
-
const plan = runtime
|
|
288
|
-
|
|
391
|
+
query: (async (input) => {
|
|
392
|
+
const plan = await planInReach(runtime, input, reach, false);
|
|
393
|
+
if (plan === null)
|
|
394
|
+
return { pending: [] };
|
|
395
|
+
const locked = await runtime.lockedRooms();
|
|
396
|
+
return unlocking(plan.rooms, locked) ?? runtime.query({ ...plan, locked });
|
|
289
397
|
}),
|
|
290
|
-
search: (input) =>
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
types(room) {
|
|
294
|
-
if (holds(reach, room) && runtime.locked(room))
|
|
398
|
+
search: (input) => runtime.search(input, reach),
|
|
399
|
+
async types(room) {
|
|
400
|
+
if (holds(reach, room) && (await runtime.locked(room)))
|
|
295
401
|
throw lockedError(room);
|
|
296
402
|
if (wholly(reach, room))
|
|
297
403
|
return md.types(room);
|
|
298
404
|
if (!holds(reach, room))
|
|
299
405
|
return structuredClone(UNHELD_TYPES);
|
|
300
|
-
return typesWithin(reach, runtime.room(room), md.types(room));
|
|
406
|
+
return typesWithin(reach, await runtime.room(room), await md.types(room));
|
|
301
407
|
},
|
|
302
408
|
async save(room, roomDrafts, writtenBy) {
|
|
303
409
|
if (!holds(reach, room))
|
|
304
410
|
throw unreached(room);
|
|
305
|
-
if (runtime.locked(room))
|
|
411
|
+
if (await runtime.locked(room)) {
|
|
306
412
|
return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
|
|
413
|
+
}
|
|
307
414
|
const held = (await Promise.all(roomDrafts.map(({ path }) => md.roomDraft.read(room, path)))).map((draft) => draft?.parts.move);
|
|
308
415
|
const outside = roomDrafts.find(({ path }, at) => !covers(reach, room, path) || !moves(reach, room, held[at]));
|
|
309
416
|
if (outside !== undefined) {
|
|
310
417
|
return { outcome: 'refused', code: 'stale', retryable: false, file: outside.path };
|
|
311
418
|
}
|
|
312
|
-
if (intoLocked(held))
|
|
419
|
+
if (await intoLocked(held))
|
|
313
420
|
return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
|
|
314
421
|
return savedWithin(reach, room, await md.save(room, roomDrafts, writtenBy));
|
|
315
422
|
},
|
|
@@ -320,47 +427,48 @@ export function narrowed(runtime, given, told) {
|
|
|
320
427
|
if (filed !== undefined) {
|
|
321
428
|
return { outcome: 'refused', code: ATTACH_REQUIRED, retryable: false, file: filed.path };
|
|
322
429
|
}
|
|
323
|
-
if (runtime.locked(room))
|
|
430
|
+
if (await runtime.locked(room)) {
|
|
324
431
|
return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
|
|
325
|
-
|
|
432
|
+
}
|
|
433
|
+
const held = parts.map(({ path, parts: one }) => readParts(one, path).move);
|
|
326
434
|
if (parts.some(({ path }, at) => !covers(reach, room, path) || !moves(reach, room, held[at]))) {
|
|
327
435
|
throw unreached(room);
|
|
328
436
|
}
|
|
329
|
-
if (intoLocked(held))
|
|
437
|
+
if (await intoLocked(held))
|
|
330
438
|
return { outcome: 'refused', code: ROOM_LOCKED, retryable: true };
|
|
331
439
|
return savedWithin(reach, room, await md.saveParts(room, parts, writtenBy));
|
|
332
440
|
},
|
|
333
|
-
resolve(room, path, destination) {
|
|
334
|
-
const at = runtime.located(room, path, destination);
|
|
441
|
+
async resolve(room, path, destination) {
|
|
442
|
+
const at = await runtime.located(room, path, destination);
|
|
335
443
|
return at !== null && !covers(reach, at.room, at.path)
|
|
336
|
-
?
|
|
444
|
+
? UNREADABLE
|
|
337
445
|
: md.resolve(room, path, destination);
|
|
338
446
|
},
|
|
339
|
-
history: (room, path, query) => !covers(reach, room, path)
|
|
340
|
-
?
|
|
341
|
-
: runtime.locked(room)
|
|
342
|
-
?
|
|
447
|
+
history: async (room, path, query) => !covers(reach, room, path)
|
|
448
|
+
? failure({ kind: 'room-not-readable', locator: room })
|
|
449
|
+
: (await runtime.locked(room))
|
|
450
|
+
? lockedRoom(room)
|
|
343
451
|
: md.history(room, path, query),
|
|
344
452
|
binaryFile: {
|
|
345
|
-
read: (room, path, revision) => !covers(reach, room, path)
|
|
346
|
-
?
|
|
347
|
-
: runtime.locked(room)
|
|
348
|
-
?
|
|
453
|
+
read: async (room, path, revision) => !covers(reach, room, path)
|
|
454
|
+
? failure({ kind: 'room-not-readable', locator: room })
|
|
455
|
+
: (await runtime.locked(room))
|
|
456
|
+
? lockedRoom(room)
|
|
349
457
|
: hand(md.binaryFile.read(room, path, revision)),
|
|
350
|
-
link: (room, path, revision) => !covers(reach, room, path)
|
|
351
|
-
?
|
|
352
|
-
: runtime.locked(room)
|
|
353
|
-
?
|
|
458
|
+
link: async (room, path, revision) => !covers(reach, room, path)
|
|
459
|
+
? failure({ kind: 'room-not-readable', locator: room })
|
|
460
|
+
: (await runtime.locked(room))
|
|
461
|
+
? lockedRoom(room)
|
|
354
462
|
: md.binaryFile.link(room, path, revision),
|
|
355
|
-
show: (room, path, revision) => !covers(reach, room, path)
|
|
356
|
-
?
|
|
357
|
-
: runtime.locked(room)
|
|
358
|
-
?
|
|
463
|
+
show: async (room, path, revision) => !covers(reach, room, path)
|
|
464
|
+
? failure({ kind: 'room-not-readable', locator: room })
|
|
465
|
+
: (await runtime.locked(room))
|
|
466
|
+
? lockedRoom(room)
|
|
359
467
|
: hand(md.binaryFile.show(room, path, revision)),
|
|
360
|
-
attach: (room, file) => !wholly(reach, room)
|
|
361
|
-
?
|
|
362
|
-
: runtime.locked(room)
|
|
363
|
-
?
|
|
468
|
+
attach: async (room, file) => !wholly(reach, room)
|
|
469
|
+
? failure({ kind: 'room-not-readable', locator: room })
|
|
470
|
+
: (await runtime.locked(room))
|
|
471
|
+
? lockedRoom(room)
|
|
364
472
|
: md.binaryFile.attach(room, file),
|
|
365
473
|
async part(file, part) {
|
|
366
474
|
const key = files.get(file);
|
|
@@ -373,42 +481,38 @@ export function narrowed(runtime, given, told) {
|
|
|
373
481
|
},
|
|
374
482
|
},
|
|
375
483
|
reached: async (room, roomVersion, path) => (path === undefined ? wholly(reach, room) : covers(reach, room, path)) &&
|
|
376
|
-
!runtime.locked(room) &&
|
|
484
|
+
!(await runtime.locked(room)) &&
|
|
377
485
|
(await md.reached(room, roomVersion, path)),
|
|
378
|
-
log: () => (reach === null ? md.log() : ''),
|
|
379
486
|
cleanUp: () => (reach === null ? md.cleanUp() : Promise.reject(deviceUnreached())),
|
|
487
|
+
unsent: () => (reach === null ? md.unsent() : Promise.reject(deviceUnreached())),
|
|
488
|
+
sent: () => (reach === null ? md.sent() : Promise.reject(deviceUnreached())),
|
|
489
|
+
reset: () => (reach === null ? md.reset() : Promise.reject(deviceUnreached())),
|
|
490
|
+
readAgain: () => (reach === null ? md.readAgain() : Promise.reject(deviceUnreached())),
|
|
380
491
|
roomDraft: {
|
|
381
|
-
list: () => md.roomDraft.list()
|
|
492
|
+
list: async () => unlocked(draftsWithin(reach, await md.roomDraft.list()), await runtime.lockedRooms()),
|
|
382
493
|
async read(room, path) {
|
|
383
494
|
if (!covers(reach, room, path))
|
|
384
495
|
return null;
|
|
385
|
-
if (runtime.locked(room))
|
|
496
|
+
if (await runtime.locked(room))
|
|
386
497
|
throw lockedError(room);
|
|
387
498
|
return shownDraft(reach, await md.roomDraft.read(room, path));
|
|
388
499
|
},
|
|
389
|
-
write(room, path, revision, parts, next) {
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
}
|
|
401
|
-
catch (error) {
|
|
402
|
-
return Promise.reject(error);
|
|
403
|
-
}
|
|
404
|
-
return md.roomDraft
|
|
405
|
-
.write(room, path, revision, parts, next)
|
|
406
|
-
.then((written) => writeWithin(reach, written));
|
|
500
|
+
async write(room, path, revision, parts, next) {
|
|
501
|
+
if (reach !== null && carriesFile(parts))
|
|
502
|
+
throw attachRequired();
|
|
503
|
+
const move = readParts(parts, path).move;
|
|
504
|
+
if (!covers(reach, room, path) || !moves(reach, room, move))
|
|
505
|
+
throw unreached(room);
|
|
506
|
+
if (await runtime.locked(room))
|
|
507
|
+
throw lockedError(room);
|
|
508
|
+
if (await intoLocked([move]))
|
|
509
|
+
throw lockedError(move.room);
|
|
510
|
+
return writeWithin(reach, await md.roomDraft.write(room, path, revision, parts, next));
|
|
407
511
|
},
|
|
408
512
|
async discard(room, path, revision) {
|
|
409
513
|
if (!covers(reach, room, path))
|
|
410
514
|
return staleWrite(null);
|
|
411
|
-
if (runtime.locked(room))
|
|
515
|
+
if (await runtime.locked(room))
|
|
412
516
|
throw lockedError(room);
|
|
413
517
|
return writeWithin(reach, await md.roomDraft.discard(room, path, revision));
|
|
414
518
|
},
|
|
@@ -418,15 +522,25 @@ export function narrowed(runtime, given, told) {
|
|
|
418
522
|
read: (id, options) => conversation().read(id, options),
|
|
419
523
|
create: (input) => conversation().create(input),
|
|
420
524
|
send: (id, operation, draft) => conversation().send(id, operation, draft),
|
|
421
|
-
answer: (id, answer) => conversation().answer(id, answer),
|
|
422
|
-
interrupt: (id) => conversation().interrupt(id),
|
|
423
|
-
kill: (id) => conversation().kill(id),
|
|
424
|
-
|
|
425
|
-
|
|
525
|
+
answer: (id, answer, operation) => conversation().answer(id, answer, operation),
|
|
526
|
+
interrupt: (id, operation) => conversation().interrupt(id, operation),
|
|
527
|
+
kill: (id, operation) => conversation().kill(id, operation),
|
|
528
|
+
delete: (id, operation) => conversation().delete(id, operation),
|
|
529
|
+
takeOut: (id, message, operation) => conversation().takeOut(id, message, operation),
|
|
530
|
+
decide: (request, decision, operation) => conversation().decide(request, decision, operation),
|
|
531
|
+
rename: (id, name, operation) => conversation().rename(id, name, operation),
|
|
532
|
+
option: (id, option, value, operation) => conversation().option(id, option, value, operation),
|
|
533
|
+
retry: (id, message, operation) => conversation().retry(id, message, operation),
|
|
534
|
+
pin: (figures) => conversation().pin(figures),
|
|
535
|
+
openTurn: (id, turn) => conversation().openTurn(id, turn),
|
|
536
|
+
dismissSuggestion: (id, suggestion) => conversation().dismissSuggestion(id, suggestion),
|
|
537
|
+
attach: (file) => conversation().attach(file),
|
|
538
|
+
attachment: (link) => conversation().attachment(link),
|
|
426
539
|
},
|
|
427
540
|
chatDraft: {
|
|
428
541
|
write: (id, draft, revision) => chatDraft().write(id, draft, revision),
|
|
429
542
|
prepend: (id, draft) => chatDraft().prepend(id, draft),
|
|
543
|
+
append: (id, draft) => chatDraft().append(id, draft),
|
|
430
544
|
discard: (id) => chatDraft().discard(id),
|
|
431
545
|
},
|
|
432
546
|
observe: observing(within),
|
|
@@ -439,10 +553,5 @@ export function narrowed(runtime, given, told) {
|
|
|
439
553
|
for (const restart of [...open])
|
|
440
554
|
restart();
|
|
441
555
|
},
|
|
442
|
-
facts(next) {
|
|
443
|
-
port = next;
|
|
444
|
-
for (const restart of [...open])
|
|
445
|
-
restart();
|
|
446
|
-
},
|
|
447
556
|
};
|
|
448
557
|
}
|