@agentshouse/mdruntime 0.1.0-cd507e16e5fc0 → 0.1.0-cd574a610e9c8
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 +0 -3
- package/dist/acceptance.d.ts.map +1 -1
- package/dist/acceptance.js +75 -165
- 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 +8 -2
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +118 -67
- package/dist/adapter.d.ts +90 -58
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +0 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +0 -5
- 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 +1 -1
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +6 -19
- 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 +4 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +7 -2
- package/dist/chat-types.d.ts +0 -2
- package/dist/chat-types.d.ts.map +1 -1
- package/dist/chat-types.js +0 -2
- package/dist/client.d.ts +13 -20
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +36 -20
- package/dist/collection.d.ts +25 -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 +2 -0
- package/dist/compile.d.ts.map +1 -1
- package/dist/compile.js +31 -25
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +31 -24
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +1 -1
- package/dist/conversation-live.d.ts +26 -12
- package/dist/conversation-live.d.ts.map +1 -1
- package/dist/conversation-live.js +23 -12
- package/dist/conversation-row.d.ts +8 -1
- package/dist/conversation-row.d.ts.map +1 -1
- package/dist/conversation-row.js +20 -7
- package/dist/conversation.d.ts +37 -12
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +320 -234
- 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.map +1 -1
- package/dist/discovery.js +19 -44
- package/dist/durability.d.ts +4 -0
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +4 -0
- package/dist/entry.js +1 -1
- 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.map +1 -1
- package/dist/figures.js +4 -2
- package/dist/file.d.ts +1 -1
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +3 -2
- package/dist/host.d.ts +18 -2
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +59 -15
- package/dist/index.d.ts +16 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -7
- package/dist/install.d.ts +10 -6
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +92 -111
- package/dist/lifecycle.d.ts +1 -1
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +54 -40
- package/dist/listing.d.ts +11 -12
- package/dist/listing.d.ts.map +1 -1
- package/dist/listing.js +48 -72
- package/dist/live.d.ts +5 -3
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +74 -33
- 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 +2 -4
- package/dist/locks.d.ts.map +1 -1
- package/dist/locks.js +10 -39
- package/dist/lost.d.ts.map +1 -1
- package/dist/lost.js +11 -23
- package/dist/media.d.ts +6 -1
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +68 -17
- package/dist/memory.d.ts +8 -3
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +92 -33
- package/dist/messages.d.ts +12 -6
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +30 -38
- package/dist/model.d.ts +0 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +0 -5
- package/dist/models.d.ts +4 -8
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +97 -139
- package/dist/observation.d.ts +27 -12
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +184 -85
- 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.map +1 -1
- package/dist/opening.js +5 -9
- package/dist/outcome.d.ts +13 -1
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +32 -2
- package/dist/overlay.d.ts +6 -2
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +37 -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 +3 -58
- package/dist/parts.d.ts.map +1 -1
- package/dist/parts.js +10 -115
- package/dist/preparation.d.ts +27 -6
- package/dist/preparation.d.ts.map +1 -1
- package/dist/preparation.js +156 -68
- 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 +2 -2
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +67 -31
- package/dist/query.d.ts +0 -1
- package/dist/query.d.ts.map +1 -1
- package/dist/questions.d.ts +1 -5
- package/dist/questions.d.ts.map +1 -1
- package/dist/questions.js +1 -7
- 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 +2 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +88 -26
- package/dist/react.d.ts +8 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +33 -1
- package/dist/readiness.d.ts +9 -3
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +3 -5
- package/dist/reads.d.ts +4 -2
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +11 -4
- package/dist/recovery.d.ts +3 -1
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +29 -7
- package/dist/refresh.js +2 -2
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +5 -6
- package/dist/replica.d.ts +5 -11
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +15 -17
- 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 +31 -8
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +273 -66
- package/dist/room-drafts.d.ts.map +1 -1
- package/dist/room-drafts.js +22 -18
- 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 +2 -1
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +9 -10
- package/dist/runtime.d.ts +9 -18
- package/dist/runtime.d.ts.map +1 -1
- package/dist/save.d.ts +42 -90
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +327 -229
- package/dist/saves.d.ts +4 -40
- package/dist/saves.d.ts.map +1 -1
- package/dist/saves.js +143 -714
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +4 -5
- package/dist/shared.d.ts +0 -5
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +4 -90
- package/dist/shown.d.ts +7 -5
- package/dist/shown.d.ts.map +1 -1
- package/dist/shown.js +77 -63
- package/dist/socket/lanes.d.ts +12 -4
- package/dist/socket/lanes.d.ts.map +1 -1
- package/dist/socket/lanes.js +34 -8
- package/dist/socket/session.d.ts +0 -1
- package/dist/socket/session.d.ts.map +1 -1
- package/dist/socket.d.ts +3 -6
- package/dist/socket.d.ts.map +1 -1
- package/dist/socket.js +5 -16
- package/dist/source.d.ts +5 -7
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +18 -6
- package/dist/store/installs.d.ts +2 -2
- package/dist/store/installs.d.ts.map +1 -1
- package/dist/store/installs.js +10 -4
- package/dist/store/readiness.d.ts +5 -4
- package/dist/store/readiness.d.ts.map +1 -1
- package/dist/store/readiness.js +28 -12
- package/dist/store/records.d.ts +18 -7
- package/dist/store/records.d.ts.map +1 -1
- package/dist/store/records.js +58 -24
- 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 +1 -1
- package/dist/store/space.d.ts.map +1 -1
- package/dist/store/space.js +0 -2
- package/dist/store/watchers.js +1 -2
- package/dist/store.d.ts +23 -14
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +46 -17
- package/dist/stored.d.ts +25 -14
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +83 -32
- package/dist/surface.d.ts +5 -3
- package/dist/surface.d.ts.map +1 -1
- package/dist/surface.js +25 -23
- package/dist/sync.d.ts +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +96 -92
- package/dist/tables.d.ts +16 -57
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +91 -332
- package/dist/tallies.d.ts.map +1 -1
- package/dist/tallies.js +6 -7
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +4 -10
- package/dist/wire.d.ts +53 -7
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +17 -4
- 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/job.d.ts +0 -33
- package/dist/job.d.ts.map +0 -1
- package/dist/job.js +0 -54
- package/dist/log.d.ts +0 -6
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -14
- package/dist/socket/rooms.d.ts +0 -44
- package/dist/socket/rooms.d.ts.map +0 -1
- package/dist/socket/rooms.js +0 -90
- package/dist/store/fences.d.ts +0 -16
- package/dist/store/fences.d.ts.map +0 -1
- package/dist/store/fences.js +0 -26
package/dist/lost.js
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
import { changeSet, mergeChangeSets } from './change-set.js';
|
|
2
|
-
import { ERASE_BATCH
|
|
3
|
-
import {
|
|
2
|
+
import { ERASE_BATCH } from './install.js';
|
|
3
|
+
import { unpair } from './queue.js';
|
|
4
|
+
import { recoverReads } from './shown.js';
|
|
4
5
|
import { yielded } from './turn.js';
|
|
5
|
-
function forget({ store, socket }, locator) {
|
|
6
|
-
forgetInstall(store, locator);
|
|
7
|
-
socket.rooms.forget(locator);
|
|
8
|
-
store.forget(locator);
|
|
9
|
-
}
|
|
10
6
|
export async function eraseFenced({ store }, locators) {
|
|
11
7
|
for (const locator of locators) {
|
|
12
8
|
while (await store.durably((local) => local.erase(locator, ERASE_BATCH)))
|
|
@@ -14,24 +10,17 @@ export async function eraseFenced({ store }, locators) {
|
|
|
14
10
|
}
|
|
15
11
|
}
|
|
16
12
|
export function fenceLive(runtime, locators) {
|
|
17
|
-
const { store, socket,
|
|
13
|
+
const { store, socket, presence } = runtime;
|
|
18
14
|
for (const locator of new Set(locators)) {
|
|
19
|
-
if (!
|
|
15
|
+
if (!presence.lose(locator, socket.session.now().discoveries))
|
|
20
16
|
continue;
|
|
21
|
-
forget(
|
|
22
|
-
journal.record(`room lost ${locator}`);
|
|
17
|
+
store.forget(locator);
|
|
23
18
|
}
|
|
24
19
|
}
|
|
25
20
|
export async function loseRooms(runtime, locators) {
|
|
26
|
-
const { store } = runtime;
|
|
21
|
+
const { store, presence } = runtime;
|
|
27
22
|
fenceLive(runtime, locators);
|
|
28
|
-
const fresh = [...new Set(locators)].filter((locator) =>
|
|
29
|
-
const fence = store.fences.of(locator);
|
|
30
|
-
if (fence === undefined || fence.written)
|
|
31
|
-
return false;
|
|
32
|
-
store.fences.mark(locator, true);
|
|
33
|
-
return true;
|
|
34
|
-
});
|
|
23
|
+
const fresh = [...new Set(locators)].filter((locator) => presence.writing(locator));
|
|
35
24
|
if (fresh.length === 0)
|
|
36
25
|
return;
|
|
37
26
|
let held = [];
|
|
@@ -43,7 +32,7 @@ export async function loseRooms(runtime, locators) {
|
|
|
43
32
|
}
|
|
44
33
|
catch (error) {
|
|
45
34
|
for (const locator of fresh)
|
|
46
|
-
|
|
35
|
+
presence.unwritten(locator);
|
|
47
36
|
throw error;
|
|
48
37
|
}
|
|
49
38
|
finally {
|
|
@@ -53,9 +42,8 @@ export async function loseRooms(runtime, locators) {
|
|
|
53
42
|
queue: true,
|
|
54
43
|
drafts: held.filter((draft) => draft.locator === locator).map(({ path }) => path),
|
|
55
44
|
}))));
|
|
56
|
-
recoverReads(runtime);
|
|
57
|
-
statusShown(runtime);
|
|
45
|
+
recoverReads(runtime, fresh);
|
|
58
46
|
}
|
|
59
|
-
await
|
|
47
|
+
await unpair(runtime);
|
|
60
48
|
await eraseFenced(runtime, fresh);
|
|
61
49
|
}
|
package/dist/media.d.ts
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import type { MdRuntimeClient } from './client.js';
|
|
2
2
|
import { type ShownAnswer } from './outcome.js';
|
|
3
3
|
export declare const ROOM_MEDIA = "room-media";
|
|
4
|
+
export declare const DIAGRAM = "md-diagram";
|
|
5
|
+
export declare const VIEWING = "ahc-viewer";
|
|
4
6
|
type Show = (room: string, path: string, revision?: string) => Promise<ShownAnswer>;
|
|
5
7
|
export declare function shownBy(show: Show, client: MdRuntimeClient): MdRuntimeClient;
|
|
6
|
-
export declare function
|
|
8
|
+
export declare function rendered(element: Element): boolean;
|
|
9
|
+
export declare function viewable(element: Element): boolean;
|
|
10
|
+
export declare function viewFile(client: MdRuntimeClient, media: Element): void;
|
|
11
|
+
export declare function defineRoomMedia(client: Promise<MdRuntimeClient> | MdRuntimeClient): void;
|
|
7
12
|
export {};
|
|
8
13
|
//# sourceMappingURL=media.d.ts.map
|
package/dist/media.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEnE,eAAO,MAAM,UAAU,eAAe,CAAC;AAMvC,eAAO,MAAM,OAAO,eAAe,CAAC;AAEpC,eAAO,MAAM,OAAO,eAAe,CAAC;AA8BpC,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAIpF,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,GAAG,eAAe,CAG5E;AAsBD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAElD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAMlD;AA4BD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAEtE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,GAAG,IAAI,CAkMxF"}
|
package/dist/media.js
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isAudioType, isImageType, isVideoType } from '@agentshouse/mdmodel';
|
|
2
|
+
import { loaded } from './loaded.js';
|
|
3
|
+
import { blobOf, UNCERTAIN } from './outcome.js';
|
|
2
4
|
export const ROOM_MEDIA = 'room-media';
|
|
5
|
+
const VIEWER = 'viewer';
|
|
6
|
+
const RENDERED = '.ahc, .ahc-markdown';
|
|
7
|
+
export const DIAGRAM = 'md-diagram';
|
|
8
|
+
export const VIEWING = 'ahc-viewer';
|
|
9
|
+
const PRESSED_ELSEWHERE = 'a[href], button, input, select, textarea, summary, label, [role="button"], [role="link"]';
|
|
3
10
|
const ATTRIBUTES = ['room', 'path', 'revision', 'width', 'height', 'alt'];
|
|
4
11
|
const LOADING = new Set(['room', 'path', 'revision']);
|
|
5
12
|
const NEARING = '600px 0px';
|
|
@@ -10,7 +17,10 @@ const SHAPE = '16 / 9';
|
|
|
10
17
|
const STYLE = `:host{display:block}
|
|
11
18
|
[part=box]{position:relative;overflow:hidden}
|
|
12
19
|
[part=box]>img,[part=box]>video,[part=box]>audio{display:block;width:100%;height:100%;object-fit:contain}
|
|
13
|
-
[part=box]>
|
|
20
|
+
[part=box]>video:not([controls]){cursor:pointer}
|
|
21
|
+
[part=box]>slot{display:flex;align-items:center;justify-content:center;width:100%;height:100%;text-align:center}
|
|
22
|
+
[part=play]{position:absolute;top:50%;left:50%;width:56px;height:56px;margin:-28px 0 0 -28px;border-radius:50%;background:rgb(0 0 0/.6);pointer-events:none}
|
|
23
|
+
[part=play]::before{content:"";position:absolute;top:18px;left:22px;border-style:solid;border-width:10px 0 10px 16px;border-color:transparent transparent transparent #fff}`;
|
|
14
24
|
const shows = new WeakMap();
|
|
15
25
|
export function shownBy(show, client) {
|
|
16
26
|
shows.set(client, show);
|
|
@@ -29,23 +39,62 @@ function refusedForGood(shown) {
|
|
|
29
39
|
return (shown.kind === 'rejected' || shown.kind === 'scoped-refusal') && !shown.retryable;
|
|
30
40
|
}
|
|
31
41
|
function drawnFor(mediaType) {
|
|
32
|
-
if (mediaType
|
|
42
|
+
if (isImageType(mediaType))
|
|
33
43
|
return 'img';
|
|
34
|
-
if (mediaType
|
|
44
|
+
if (isVideoType(mediaType))
|
|
35
45
|
return 'video';
|
|
36
|
-
if (mediaType
|
|
46
|
+
if (isAudioType(mediaType))
|
|
37
47
|
return 'audio';
|
|
38
48
|
return null;
|
|
39
49
|
}
|
|
40
|
-
export function
|
|
41
|
-
|
|
50
|
+
export function rendered(element) {
|
|
51
|
+
return element.closest(RENDERED) !== null;
|
|
52
|
+
}
|
|
53
|
+
export function viewable(element) {
|
|
54
|
+
if (element.localName === 'figure')
|
|
55
|
+
return element.classList.contains(DIAGRAM);
|
|
56
|
+
if (element.localName !== ROOM_MEDIA || element.closest(`.${VIEWING}`) !== null)
|
|
57
|
+
return false;
|
|
58
|
+
return (rendered(element) || (element.shadowRoot?.querySelector('[part=box] > video') ?? null) !== null);
|
|
59
|
+
}
|
|
60
|
+
function viewed(client, opener, alone) {
|
|
61
|
+
void loaded(client.buildFile, VIEWER).then((file) => file?.openViewer({
|
|
62
|
+
opener,
|
|
63
|
+
alone,
|
|
64
|
+
download: (room, path, revision) => void client.binaryFile.download(room, path, revision),
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
function pressed(client) {
|
|
68
|
+
return (event) => {
|
|
69
|
+
if (event.defaultPrevented || event.detail > 1)
|
|
70
|
+
return;
|
|
71
|
+
for (const node of event.composedPath()) {
|
|
72
|
+
if (!(node instanceof Element))
|
|
73
|
+
continue;
|
|
74
|
+
if (viewable(node)) {
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
void client.then((one) => viewed(one, node, !rendered(node)));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (node.matches(PRESSED_ELSEWHERE))
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function viewFile(client, media) {
|
|
85
|
+
viewed(client, media, true);
|
|
86
|
+
}
|
|
87
|
+
export function defineRoomMedia(client) {
|
|
88
|
+
if (customElements.get(ROOM_MEDIA) !== undefined)
|
|
42
89
|
return;
|
|
43
90
|
const connected = Promise.resolve(client);
|
|
91
|
+
document.addEventListener('click', pressed(connected));
|
|
44
92
|
class RoomMedia extends HTMLElement {
|
|
45
93
|
static observedAttributes = ATTRIBUTES;
|
|
46
94
|
#root = this.attachShadow({ mode: 'open' });
|
|
47
95
|
#box = document.createElement('div');
|
|
48
96
|
#fallback = document.createElement('slot');
|
|
97
|
+
#play = document.createElement('span');
|
|
49
98
|
#watching = null;
|
|
50
99
|
#near = false;
|
|
51
100
|
#asked = 0;
|
|
@@ -56,6 +105,7 @@ export function defineRoomMedia(client, registry = customElements) {
|
|
|
56
105
|
constructor() {
|
|
57
106
|
super();
|
|
58
107
|
this.#box.setAttribute('part', 'box');
|
|
108
|
+
this.#play.setAttribute('part', 'play');
|
|
59
109
|
this.#root.append(Object.assign(document.createElement('style'), { textContent: STYLE }), this.#box);
|
|
60
110
|
this.#shape();
|
|
61
111
|
}
|
|
@@ -129,11 +179,7 @@ export function defineRoomMedia(client, registry = customElements) {
|
|
|
129
179
|
this.#unshown(asked);
|
|
130
180
|
return;
|
|
131
181
|
}
|
|
132
|
-
const copy = await
|
|
133
|
-
headers: { 'content-type': shown.mediaType },
|
|
134
|
-
})
|
|
135
|
-
.blob()
|
|
136
|
-
.catch(() => null);
|
|
182
|
+
const copy = await blobOf(shown).catch(() => null);
|
|
137
183
|
if (asked !== this.#asked)
|
|
138
184
|
return;
|
|
139
185
|
if (copy === null)
|
|
@@ -157,7 +203,9 @@ export function defineRoomMedia(client, registry = customElements) {
|
|
|
157
203
|
if (content === null)
|
|
158
204
|
this.#box.replaceChildren();
|
|
159
205
|
else if (content.parentNode !== this.#box)
|
|
160
|
-
this.#box.replaceChildren(content
|
|
206
|
+
this.#box.replaceChildren(...(content instanceof HTMLVideoElement && !content.controls
|
|
207
|
+
? [content, this.#play]
|
|
208
|
+
: [content]));
|
|
161
209
|
this.#label();
|
|
162
210
|
}
|
|
163
211
|
#unreadable() {
|
|
@@ -174,13 +222,16 @@ export function defineRoomMedia(client, registry = customElements) {
|
|
|
174
222
|
const kept = this.#drawn?.localName === tag ? this.#drawn : null;
|
|
175
223
|
const drawn = kept ?? document.createElement(tag);
|
|
176
224
|
if (kept === null) {
|
|
225
|
+
const plays = !(drawn instanceof HTMLVideoElement) || this.closest(`.${VIEWING}`) !== null;
|
|
177
226
|
if (drawn instanceof HTMLImageElement)
|
|
178
227
|
drawn.decoding = 'async';
|
|
179
228
|
if (drawn instanceof HTMLMediaElement) {
|
|
180
|
-
drawn.controls = true;
|
|
181
229
|
drawn.preload = 'metadata';
|
|
182
|
-
|
|
183
|
-
|
|
230
|
+
drawn.controls = plays;
|
|
231
|
+
}
|
|
232
|
+
if (drawn instanceof HTMLVideoElement && plays) {
|
|
233
|
+
drawn.autoplay = true;
|
|
234
|
+
drawn.setAttribute('playsinline', '');
|
|
184
235
|
}
|
|
185
236
|
drawn.addEventListener(drawn instanceof HTMLImageElement ? 'load' : 'loadedmetadata', () => {
|
|
186
237
|
if (drawn !== this.#drawn)
|
|
@@ -214,5 +265,5 @@ export function defineRoomMedia(client, registry = customElements) {
|
|
|
214
265
|
void this.#load();
|
|
215
266
|
}
|
|
216
267
|
}
|
|
217
|
-
|
|
268
|
+
customElements.define(ROOM_MEDIA, RoomMedia);
|
|
218
269
|
}
|
package/dist/memory.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { type VerifiedModel } from '@agentshouse/mdmodel';
|
|
1
2
|
import type { ModelResult } from './model.js';
|
|
2
|
-
import { type AcceptedMessage, type ActionResult, type Adapter, type BinaryFile, type Capability, type ConversationAction, type ConversationEvent, type DiscoveredRoom, type SavedFacts, type HeadChange, type ListedAgent, type ListedConversation, type Member, type ProviderLimit, type Retention, type ServiceMode, type TypedPath } from './adapter.js';
|
|
3
|
-
export type MemoryRoom = DiscoveredRoom & {
|
|
3
|
+
import { type AcceptedMessage, type ActionResult, type Adapter, type BinaryFile, type Capability, type ConversationAction, type ConversationEvent, type DiscoveredRoom, type SavedFacts, type HeadChange, type ListedAgent, type ListedConversation, type Member, type ProviderLimit, type Retention, type ServiceMode, type TypedPath, type TypedSelection } from './adapter.js';
|
|
4
|
+
export type MemoryRoom = Omit<DiscoveredRoom, 'typedSelection' | 'authoredPaths'> & {
|
|
5
|
+
typedSelection?: TypedSelection | null;
|
|
6
|
+
authoredPaths?: readonly string[];
|
|
4
7
|
model?: ModelResult;
|
|
5
8
|
documents?: Readonly<Record<string, string>>;
|
|
6
9
|
facts?: Readonly<Record<string, SavedFacts>>;
|
|
@@ -29,14 +32,16 @@ export type MemoryAdapterOptions = {
|
|
|
29
32
|
retention?: Retention;
|
|
30
33
|
member?: Member;
|
|
31
34
|
unopened?: boolean;
|
|
32
|
-
roomTypes?:
|
|
35
|
+
roomTypes?: VerifiedModel;
|
|
33
36
|
typedPaths?: readonly TypedPath[];
|
|
37
|
+
privateRoom?: string;
|
|
34
38
|
};
|
|
35
39
|
export type MemoryAdapter = Adapter & {
|
|
36
40
|
discover: NonNullable<Adapter['discover']>;
|
|
37
41
|
refresh: NonNullable<Adapter['refresh']>;
|
|
38
42
|
setRooms(rooms: readonly MemoryRoom[]): void;
|
|
39
43
|
setConversations(conversations: readonly MemoryConversation[]): void;
|
|
44
|
+
setAgents(agents: readonly ListedAgent[]): void;
|
|
40
45
|
script(operation: keyof Adapter, answer: unknown): void;
|
|
41
46
|
open(): void;
|
|
42
47
|
close(closing?: {
|
package/dist/memory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/memory.js
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
import { documentFacts, parse } from '@agentshouse/mdmodel';
|
|
1
|
+
import { definitionAt, documentFacts, keyedDestination, keyedLink, parse, } from '@agentshouse/mdmodel';
|
|
2
2
|
import { NO_ROOM_TYPES, schemaTypes } from './attached-model.js';
|
|
3
|
+
import { selected } from './collection.js';
|
|
4
|
+
import { declaredType } from './outcome.js';
|
|
3
5
|
import { sameChange } from './overlay.js';
|
|
4
6
|
const ATTACHMENTS = 'attachments';
|
|
7
|
+
const UNFOUND = {
|
|
8
|
+
kind: 'rejected',
|
|
9
|
+
code: 'not_found',
|
|
10
|
+
fields: {},
|
|
11
|
+
retryable: false,
|
|
12
|
+
};
|
|
5
13
|
function lastName(path) {
|
|
6
14
|
return path.slice(path.lastIndexOf('/') + 1);
|
|
7
15
|
}
|
|
@@ -53,9 +61,10 @@ export function createMemoryAdapter(options = {}) {
|
|
|
53
61
|
const listeners = new Set();
|
|
54
62
|
const modeObservers = new Set();
|
|
55
63
|
const scripted = new Map();
|
|
56
|
-
const
|
|
64
|
+
const repeats = new Map();
|
|
57
65
|
const historyPageSize = options.historyPageSize;
|
|
58
66
|
const attached = new Map();
|
|
67
|
+
const keyed = new Map();
|
|
59
68
|
const linked = new WeakMap();
|
|
60
69
|
const carried = new Map();
|
|
61
70
|
let expiring = [];
|
|
@@ -63,6 +72,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
63
72
|
const declaredRooms = new Set();
|
|
64
73
|
let replicated = [];
|
|
65
74
|
let heldCursor = null;
|
|
75
|
+
let agents = structuredClone(options.agents ?? []);
|
|
66
76
|
let issued = 0;
|
|
67
77
|
function scriptConversations(entries) {
|
|
68
78
|
scripted.clear();
|
|
@@ -93,6 +103,25 @@ export function createMemoryAdapter(options = {}) {
|
|
|
93
103
|
function heldBlob(room, path) {
|
|
94
104
|
return attached.get(`${room.locator}\u0000${path}`) ?? room.blobs?.[path];
|
|
95
105
|
}
|
|
106
|
+
function linkTo(room, path) {
|
|
107
|
+
const blob = room === undefined ? undefined : heldBlob(room, path);
|
|
108
|
+
if (blob === undefined)
|
|
109
|
+
return UNFOUND;
|
|
110
|
+
const url = linked.get(blob) ?? URL.createObjectURL(blob);
|
|
111
|
+
linked.set(blob, url);
|
|
112
|
+
return { kind: 'link', url, name: lastName(path), mediaType: declaredType(blob) };
|
|
113
|
+
}
|
|
114
|
+
function attachedKeyed(request) {
|
|
115
|
+
const room = rooms.find((entry) => entry.locator === options.privateRoom);
|
|
116
|
+
if (room === undefined) {
|
|
117
|
+
return { kind: 'rejected', code: 'room_not_found', fields: {}, retryable: false };
|
|
118
|
+
}
|
|
119
|
+
const path = freePath(room, request.name);
|
|
120
|
+
attached.set(`${room.locator}\u0000${path}`, request.blob);
|
|
121
|
+
const key = `memory-${keyed.size + 1}`;
|
|
122
|
+
keyed.set(key, { locator: room.locator, path });
|
|
123
|
+
return { kind: 'linked', link: keyedDestination(`/rooms/${room.handle}/${path}`, key) };
|
|
124
|
+
}
|
|
96
125
|
function freePath(room, name) {
|
|
97
126
|
const dot = name.lastIndexOf('.');
|
|
98
127
|
const stem = dot > 0 ? name.slice(0, dot) : name;
|
|
@@ -104,8 +133,11 @@ export function createMemoryAdapter(options = {}) {
|
|
|
104
133
|
}
|
|
105
134
|
}
|
|
106
135
|
const saved = new WeakMap();
|
|
136
|
+
const roomTypes = options.roomTypes ?? NO_ROOM_TYPES;
|
|
107
137
|
function factsAt(room, path, content) {
|
|
108
|
-
const types =
|
|
138
|
+
const types = selected({ selection: room.typedSelection ?? null }, path)
|
|
139
|
+
? roomTypes.types
|
|
140
|
+
: schemaTypes(room.model?.kind === 'model' ? room.model.snapshot.schema : null, roomTypes);
|
|
109
141
|
let held = saved.get(types);
|
|
110
142
|
if (held === undefined) {
|
|
111
143
|
held = new Map();
|
|
@@ -113,7 +145,9 @@ export function createMemoryAdapter(options = {}) {
|
|
|
113
145
|
}
|
|
114
146
|
const key = `${path}\u0000${content}`;
|
|
115
147
|
if (!held.has(key)) {
|
|
116
|
-
const facts = documentFacts(path, parse(content, path
|
|
148
|
+
const facts = documentFacts(path, parse(content, path, definitionAt({ types }, path, options.typedPaths)), {
|
|
149
|
+
types,
|
|
150
|
+
});
|
|
117
151
|
held.set(key, facts === null ? null : JSON.parse(JSON.stringify(facts)));
|
|
118
152
|
}
|
|
119
153
|
return held.get(key);
|
|
@@ -147,9 +181,9 @@ export function createMemoryAdapter(options = {}) {
|
|
|
147
181
|
roomVersion: room.roomVersion,
|
|
148
182
|
operations: room.operations,
|
|
149
183
|
replica: room.replica,
|
|
150
|
-
|
|
184
|
+
typedSelection: room.typedSelection ?? null,
|
|
151
185
|
providerOwnedPaths: room.providerOwnedPaths,
|
|
152
|
-
authoredPaths: room.authoredPaths,
|
|
186
|
+
authoredPaths: room.authoredPaths ?? ['**'],
|
|
153
187
|
};
|
|
154
188
|
}
|
|
155
189
|
function page(room, after) {
|
|
@@ -259,16 +293,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
259
293
|
}
|
|
260
294
|
function pageOf(conversation, after) {
|
|
261
295
|
const messages = conversation.messages ?? [];
|
|
262
|
-
const first = typeof after === 'string' ? messages.findIndex((message) => message.
|
|
296
|
+
const first = typeof after === 'string' ? messages.findIndex((message) => message.change > after) : 0;
|
|
263
297
|
const from = first === -1 ? messages.length : first;
|
|
264
298
|
const page = messages.slice(from, from + (historyPageSize ?? messages.length));
|
|
265
299
|
const last = page.at(-1);
|
|
266
300
|
return {
|
|
267
301
|
conversation: conversation.conversation,
|
|
268
302
|
messages: page,
|
|
269
|
-
...(last !== undefined && from + page.length < messages.length
|
|
270
|
-
? { next: last.position }
|
|
271
|
-
: {}),
|
|
303
|
+
...(last !== undefined && from + page.length < messages.length ? { next: last.change } : {}),
|
|
272
304
|
};
|
|
273
305
|
}
|
|
274
306
|
function historiesOf(request) {
|
|
@@ -288,11 +320,20 @@ export function createMemoryAdapter(options = {}) {
|
|
|
288
320
|
function conversationAction(request) {
|
|
289
321
|
const name = request.name;
|
|
290
322
|
const input = (request.input ?? {});
|
|
323
|
+
const operation = typeof input.operation_id === 'string' ? `${name}\u0000${input.operation_id}` : null;
|
|
324
|
+
const first = (answer) => {
|
|
325
|
+
if (operation !== null)
|
|
326
|
+
repeats.set(operation, answer);
|
|
327
|
+
return answer;
|
|
328
|
+
};
|
|
329
|
+
const repeated = operation === null ? undefined : repeats.get(operation);
|
|
291
330
|
if (name === 'conversations/create') {
|
|
331
|
+
if (repeated !== undefined)
|
|
332
|
+
return repeated;
|
|
292
333
|
issued += 1;
|
|
293
334
|
const conversation = `conversation-${issued}`;
|
|
294
335
|
scripted.set(conversation, { conversation });
|
|
295
|
-
return { kind: 'action', result: { conversation_id: conversation } };
|
|
336
|
+
return first({ kind: 'action', result: { conversation_id: conversation } });
|
|
296
337
|
}
|
|
297
338
|
const named = typeof input.conversation_id === 'string' ? input.conversation_id : '';
|
|
298
339
|
const conversation = scripted.get(named);
|
|
@@ -308,26 +349,39 @@ export function createMemoryAdapter(options = {}) {
|
|
|
308
349
|
if (outcome !== undefined)
|
|
309
350
|
return outcome;
|
|
310
351
|
if (name === 'conversations/send') {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
if (answered !== undefined)
|
|
314
|
-
return { kind: 'action', result: { message_id: answered } };
|
|
352
|
+
if (repeated !== undefined)
|
|
353
|
+
return repeated;
|
|
315
354
|
issued += 1;
|
|
316
|
-
|
|
317
|
-
if (operation !== null)
|
|
318
|
-
sentTurns.set(operation, turn);
|
|
319
|
-
return { kind: 'action', result: { message_id: turn } };
|
|
355
|
+
return first({ kind: 'action', result: { message_id: `turn-${issued}` } });
|
|
320
356
|
}
|
|
321
357
|
if (name === 'conversations/delete')
|
|
322
358
|
scripted.delete(named);
|
|
323
359
|
return { kind: 'action', result: { conversation_id: named } };
|
|
324
360
|
}
|
|
361
|
+
function decided(request) {
|
|
362
|
+
const { request: asked, message, decision, } = (request.input ?? {});
|
|
363
|
+
return {
|
|
364
|
+
kind: 'action',
|
|
365
|
+
result: {
|
|
366
|
+
request: asked,
|
|
367
|
+
...(message === undefined ? {} : { message }),
|
|
368
|
+
state: decision === 'approve' ? 'started' : 'declined',
|
|
369
|
+
},
|
|
370
|
+
};
|
|
371
|
+
}
|
|
325
372
|
function announceList() {
|
|
326
373
|
const entries = [...scripted.values()].flatMap(({ conversation, listed, messages = [] }) => listed === undefined
|
|
327
374
|
? []
|
|
328
|
-
: [{ conversation, ...listed, newest: messages.at(-1)?.
|
|
375
|
+
: [{ conversation, ...listed, newest: messages.at(-1)?.change ?? null }]);
|
|
329
376
|
for (const listener of listeners) {
|
|
330
|
-
listener({
|
|
377
|
+
listener({
|
|
378
|
+
kind: 'list',
|
|
379
|
+
agents: structuredClone(agents),
|
|
380
|
+
entries,
|
|
381
|
+
whole: true,
|
|
382
|
+
more: false,
|
|
383
|
+
cursor: null,
|
|
384
|
+
});
|
|
331
385
|
}
|
|
332
386
|
}
|
|
333
387
|
function discovery() {
|
|
@@ -383,6 +437,9 @@ export function createMemoryAdapter(options = {}) {
|
|
|
383
437
|
setConversations(next) {
|
|
384
438
|
scriptConversations(next);
|
|
385
439
|
},
|
|
440
|
+
setAgents(next) {
|
|
441
|
+
agents = structuredClone(next);
|
|
442
|
+
},
|
|
386
443
|
open() {
|
|
387
444
|
carried.clear();
|
|
388
445
|
announceList();
|
|
@@ -445,9 +502,6 @@ export function createMemoryAdapter(options = {}) {
|
|
|
445
502
|
};
|
|
446
503
|
},
|
|
447
504
|
history: (request) => Promise.resolve(historiesOf(request)),
|
|
448
|
-
...(options.agents === undefined
|
|
449
|
-
? {}
|
|
450
|
-
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
451
505
|
},
|
|
452
506
|
serviceMode: {
|
|
453
507
|
observe(notify) {
|
|
@@ -599,26 +653,29 @@ export function createMemoryAdapter(options = {}) {
|
|
|
599
653
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
600
654
|
const blob = heldBlob(room, request.path);
|
|
601
655
|
return blob === undefined
|
|
602
|
-
? { kind: 'rejected', code: '
|
|
603
|
-
: { kind: 'binary', body: blob.stream(), mediaType: blob
|
|
656
|
+
? { kind: 'rejected', code: 'not_found', fields: {}, retryable: false }
|
|
657
|
+
: { kind: 'binary', body: blob.stream(), mediaType: declaredType(blob) };
|
|
604
658
|
}, request);
|
|
605
659
|
},
|
|
606
660
|
async link(_authorization, request) {
|
|
607
661
|
return resolveScript(scripts.link, () => {
|
|
662
|
+
if (request.kind === 'key') {
|
|
663
|
+
const key = keyedLink(request.link)?.key;
|
|
664
|
+
const named = key === undefined ? undefined : keyed.get(key);
|
|
665
|
+
if (named === undefined)
|
|
666
|
+
return UNFOUND;
|
|
667
|
+
return linkTo(rooms.find((entry) => entry.locator === named.locator), named.path);
|
|
668
|
+
}
|
|
608
669
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
609
670
|
if (room === undefined)
|
|
610
671
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
611
|
-
|
|
612
|
-
if (blob === undefined) {
|
|
613
|
-
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
614
|
-
}
|
|
615
|
-
const url = linked.get(blob) ?? URL.createObjectURL(blob);
|
|
616
|
-
linked.set(blob, url);
|
|
617
|
-
return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
|
|
672
|
+
return linkTo(room, request.path);
|
|
618
673
|
}, request);
|
|
619
674
|
},
|
|
620
675
|
async attach(_authorization, request) {
|
|
621
676
|
return resolveScript(scripts.attach, () => {
|
|
677
|
+
if (request.locator === undefined)
|
|
678
|
+
return attachedKeyed(request);
|
|
622
679
|
const room = rooms.find((entry) => entry.locator === request.locator);
|
|
623
680
|
if (room === undefined)
|
|
624
681
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
@@ -631,6 +688,8 @@ export function createMemoryAdapter(options = {}) {
|
|
|
631
688
|
return resolveScript(scripts.action, () => {
|
|
632
689
|
if (request.name.startsWith('conversations/'))
|
|
633
690
|
return conversationAction(request);
|
|
691
|
+
if (request.name === 'agent-functions/decide')
|
|
692
|
+
return decided(request);
|
|
634
693
|
return { kind: 'rejected', code: 'unscripted-action', fields: {}, retryable: false };
|
|
635
694
|
}, request).then((answer) => {
|
|
636
695
|
if (answer.kind === 'action' && answer.at !== undefined)
|
package/dist/messages.d.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import type { AcceptedMessage } from './adapter.js';
|
|
2
|
-
import type { JobMarker } from './job.js';
|
|
3
2
|
import type { Connection } from './tables.js';
|
|
4
3
|
export declare const MESSAGE_TABLES: readonly string[];
|
|
5
|
-
export declare const ROWS = "WITH chosen AS (\n SELECT listed.value AS conversation,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'assistant' ORDER BY position DESC, identity DESC LIMIT 1) AS answer,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND text <> '' ORDER BY position DESC, identity DESC LIMIT 1) AS said,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' ORDER BY position, identity LIMIT 1) AS opened,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' AND json_extract(message, '$.waiting') = 1 ORDER BY position, identity LIMIT 1) AS asking\n FROM json_each(?) AS listed\n )\n SELECT chosen.conversation AS conversation,\n substr(said.text, 1, 512) AS said_text,\n json_extract(said.message, '$.role') AS said_role,\n json_extract(said.message, '$.accepted_at') AS said_at,\n substr(json_extract(answer.message, '$.failure'), 1, 512) AS failure,\n json_extract(opened.message, '$.source') AS opened_source,\n json_extract(opened.message, '$.sender') AS opened_sender,\n asking.identity AS asking_identity,\n asking.text AS asking_text,\n json_extract(asking.message, '$.accepted_at') AS asking_at,\n json_extract(asking.message, '$.source') AS asking_source,\n json_extract(asking.message, '$.sender') AS asking_sender\n FROM chosen\n LEFT JOIN conversation_messages said ON said.id = chosen.said\n LEFT JOIN conversation_messages answer ON answer.id = chosen.answer\n LEFT JOIN conversation_messages opened ON opened.id = chosen.opened\n LEFT JOIN conversation_messages asking ON asking.id = chosen.asking";
|
|
6
|
-
export declare const JOB_MARKERS = "SELECT json_extract(part.value, '$.text') AS said,\n json_extract(message, '$.accepted_at') AS at\n FROM conversation_messages, json_each(message, '$.parts') AS part\n WHERE conversation = ? AND instr(message, '\"marker\":\"job\"') > 0\n AND json_extract(part.value, '$.type') = 'marker'\n AND json_extract(part.value, '$.marker') = 'job'\n ORDER BY position, identity, part.key";
|
|
4
|
+
export declare const ROWS = "WITH chosen AS (\n SELECT listed.value AS conversation,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'assistant' ORDER BY position DESC, identity DESC LIMIT 1) AS answer,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND text <> '' ORDER BY position DESC, identity DESC LIMIT 1) AS said,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' ORDER BY position, identity LIMIT 1) AS opened,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' AND json_extract(message, '$.waiting') = 1 ORDER BY position, identity LIMIT 1) AS asking\n FROM json_each(?) AS listed\n )\n SELECT chosen.conversation AS conversation,\n substr(said.text, 1, 512) AS said_text,\n json_extract(said.message, '$.role') AS said_role,\n json_extract(said.message, '$.accepted_at') AS said_at,\n answer.turn AS answered,\n substr(json_extract(answer.message, '$.failure'), 1, 512) AS failure,\n (SELECT value FROM conversation_facts WHERE conversation = chosen.conversation AND name = 'openedTurn') AS opened_turn,\n json_extract(opened.message, '$.source') AS opened_source,\n json_extract(opened.message, '$.sender') AS opened_sender,\n asking.identity AS asking_identity,\n asking.text AS asking_text,\n json_extract(asking.message, '$.accepted_at') AS asking_at,\n json_extract(asking.message, '$.source') AS asking_source,\n json_extract(asking.message, '$.sender') AS asking_sender\n FROM chosen\n LEFT JOIN conversation_messages said ON said.id = chosen.said\n LEFT JOIN conversation_messages answer ON answer.id = chosen.answer\n LEFT JOIN conversation_messages opened ON opened.id = chosen.opened\n LEFT JOIN conversation_messages asking ON asking.id = chosen.asking";
|
|
7
5
|
export type HeldConversation = {
|
|
8
6
|
readonly conversation: string;
|
|
9
7
|
readonly read: string | null | undefined;
|
|
@@ -24,6 +22,8 @@ export type HeldRow = {
|
|
|
24
22
|
readonly role: string | null;
|
|
25
23
|
readonly at: string | null;
|
|
26
24
|
} | null;
|
|
25
|
+
readonly answered: string | null;
|
|
26
|
+
readonly openedTurn: string | null;
|
|
27
27
|
readonly failure: string | null;
|
|
28
28
|
readonly opened: HeldSource | null;
|
|
29
29
|
readonly asking: (HeldSource & {
|
|
@@ -32,6 +32,12 @@ export type HeldRow = {
|
|
|
32
32
|
readonly at: string | null;
|
|
33
33
|
}) | null;
|
|
34
34
|
};
|
|
35
|
+
export type ConversationFact = 'openedTurn' | 'dismissedSuggestion';
|
|
36
|
+
export type HeldFact = {
|
|
37
|
+
readonly conversation: string;
|
|
38
|
+
readonly name: ConversationFact;
|
|
39
|
+
readonly value: string;
|
|
40
|
+
};
|
|
35
41
|
export type ConversationWrite = {
|
|
36
42
|
readonly conversation: string;
|
|
37
43
|
readonly messages: readonly AcceptedMessage[];
|
|
@@ -45,8 +51,8 @@ export declare function keptMessages(connection: Connection, { conversation, mes
|
|
|
45
51
|
export declare function messageWindow(connection: Connection, conversation: string, limit: number, before: readonly [string, string] | null, phrase: string | null): MessageWindow;
|
|
46
52
|
export declare function messageCount(connection: Connection, conversation: string, phrase: string | null): number;
|
|
47
53
|
export declare function conversationRows(connection: Connection, conversations: readonly string[]): HeldRow[];
|
|
48
|
-
export declare function jobMarkers(connection: Connection, conversation: string): JobMarker[];
|
|
49
54
|
export declare function turnArrived(connection: Connection, conversation: string, turn: string): boolean;
|
|
50
|
-
export declare function
|
|
51
|
-
export declare function
|
|
55
|
+
export declare function conversationFacts(connection: Connection): HeldFact[];
|
|
56
|
+
export declare function keptFact(connection: Connection, { conversation, name, value }: HeldFact): null;
|
|
57
|
+
export declare function forgottenConversations(connection: Connection): void;
|
|
52
58
|
//# sourceMappingURL=messages.d.ts.map
|
package/dist/messages.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
|