@agentshouse/mdruntime 0.1.0-c2af3ddcc243b → 0.1.0-c2e433921a4d5
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 +14 -13
- package/dist/acceptance.js +1 -1
- package/dist/adapter.d.ts +55 -9
- 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/change.d.ts +4 -0
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +3 -0
- 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 +5 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +4 -7
- package/dist/collection.d.ts +4 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +7 -0
- 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.map +1 -1
- package/dist/compile.js +2 -3
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +6 -4
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +1 -1
- package/dist/conversation-live.d.ts +16 -6
- package/dist/conversation-live.d.ts.map +1 -1
- package/dist/conversation-live.js +15 -6
- 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 +9 -5
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +155 -123
- package/dist/figures.d.ts.map +1 -1
- package/dist/figures.js +4 -2
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +2 -1
- package/dist/host.d.ts +1 -0
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +14 -8
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/install.d.ts +8 -2
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +40 -33
- package/dist/lifecycle.d.ts.map +1 -1
- package/dist/lifecycle.js +15 -10
- package/dist/listing.d.ts +7 -3
- package/dist/listing.d.ts.map +1 -1
- package/dist/listing.js +26 -13
- package/dist/live.d.ts +5 -3
- package/dist/live.d.ts.map +1 -1
- package/dist/live.js +71 -30
- 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.map +1 -1
- package/dist/locks.js +2 -2
- package/dist/lost.js +1 -1
- package/dist/media.d.ts +5 -0
- package/dist/media.d.ts.map +1 -1
- package/dist/media.js +65 -14
- package/dist/memory.d.ts +3 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +17 -8
- package/dist/messages.d.ts +3 -1
- package/dist/messages.d.ts.map +1 -1
- package/dist/messages.js +5 -3
- package/dist/models.d.ts.map +1 -1
- package/dist/models.js +3 -3
- package/dist/observation.d.ts +27 -12
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +173 -69
- package/dist/outcome.d.ts +4 -0
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +8 -2
- package/dist/overlay.d.ts +1 -1
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +3 -5
- package/dist/preparation.d.ts +27 -6
- package/dist/preparation.d.ts.map +1 -1
- package/dist/preparation.js +131 -44
- package/dist/presence.d.ts +8 -2
- package/dist/presence.d.ts.map +1 -1
- package/dist/presence.js +24 -13
- package/dist/queries.d.ts +1 -1
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +43 -17
- package/dist/questions.d.ts +1 -0
- package/dist/questions.d.ts.map +1 -1
- package/dist/questions.js +1 -0
- package/dist/queue.d.ts.map +1 -1
- package/dist/queue.js +51 -21
- package/dist/reach.d.ts +2 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +20 -7
- package/dist/react.d.ts +3 -1
- package/dist/react.d.ts.map +1 -1
- package/dist/readiness.d.ts +8 -2
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +3 -5
- package/dist/reads.d.ts +1 -1
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +2 -2
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +2 -2
- package/dist/room-draft.d.ts +28 -3
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +230 -12
- package/dist/room-drafts.d.ts.map +1 -1
- package/dist/room-drafts.js +5 -2
- 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 +6 -6
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +17 -86
- package/dist/saves.d.ts.map +1 -1
- package/dist/saves.js +23 -7
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +2 -2
- package/dist/shown.d.ts +1 -1
- package/dist/shown.d.ts.map +1 -1
- package/dist/shown.js +51 -37
- package/dist/source.d.ts +5 -0
- package/dist/source.d.ts.map +1 -1
- package/dist/source.js +13 -2
- 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 +10 -1
- package/dist/store/records.d.ts.map +1 -1
- package/dist/store/records.js +46 -19
- 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.d.ts +12 -8
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +8 -4
- package/dist/stored.d.ts +23 -13
- package/dist/stored.d.ts.map +1 -1
- package/dist/stored.js +73 -22
- package/dist/surface.d.ts +4 -2
- package/dist/surface.d.ts.map +1 -1
- package/dist/surface.js +7 -2
- package/dist/sync.d.ts +1 -1
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js +8 -7
- package/dist/tables.d.ts +10 -49
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +60 -322
- package/dist/tallies.d.ts.map +1 -1
- package/dist/tallies.js +1 -2
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +3 -9
- package/dist/wire.d.ts +2 -8
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +2 -2
- package/package.json +2 -2
package/dist/live.js
CHANGED
|
@@ -1,27 +1,25 @@
|
|
|
1
|
-
import { changeOf, digestOf, } from './observation.js';
|
|
1
|
+
import { changeOf, digestOf, keyedAt, keyedInto, samePending, unchanged, } from './observation.js';
|
|
2
2
|
import { uncaught } from './failure.js';
|
|
3
|
-
import {
|
|
3
|
+
import { roomsOfReach } from './rows.js';
|
|
4
4
|
function narrowed(plan) {
|
|
5
5
|
return (plan.paths !== null &&
|
|
6
6
|
plan.hop === null &&
|
|
7
7
|
plan.backlinks === null &&
|
|
8
8
|
!(plan.shape.kind === 'documents' && plan.shape.backlinks));
|
|
9
9
|
}
|
|
10
|
-
function
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return (plan.reach.rooms.includes(locator) ||
|
|
18
|
-
plan.reach.documents.some((document) => roomOfKey(document) === locator));
|
|
10
|
+
export function readerOf(plan) {
|
|
11
|
+
const locked = new Set(plan.locked);
|
|
12
|
+
const named = plan.rooms === null ? null : new Set(plan.rooms);
|
|
13
|
+
const reached = plan.reach === null ? null : roomsOfReach(plan.reach);
|
|
14
|
+
return (locator) => !locked.has(locator) &&
|
|
15
|
+
(named === null || named.has(locator)) &&
|
|
16
|
+
(reached === null || reached.has(locator));
|
|
19
17
|
}
|
|
20
|
-
function affected(plan, set) {
|
|
21
|
-
if (set.rooms.some(
|
|
18
|
+
function affected({ plan, reads }, set) {
|
|
19
|
+
if (set.rooms.some(reads))
|
|
22
20
|
return true;
|
|
23
21
|
const paths = narrowed(plan) ? new Set(plan.paths) : null;
|
|
24
|
-
return set.documents.some(({ locator, path }) => reads(
|
|
22
|
+
return set.documents.some(({ locator, path }) => reads(locator) && (paths === null || path === null || paths.has(path)));
|
|
25
23
|
}
|
|
26
24
|
function shown(entry, held) {
|
|
27
25
|
const cover = entry.cover(held);
|
|
@@ -30,11 +28,13 @@ function shown(entry, held) {
|
|
|
30
28
|
export function createLiveQueries(run, holding) {
|
|
31
29
|
const entries = new Map();
|
|
32
30
|
let closed = false;
|
|
33
|
-
let
|
|
34
|
-
let
|
|
31
|
+
let recoveringNow = false;
|
|
32
|
+
let recoveringAll = false;
|
|
33
|
+
const recovering = new Set();
|
|
35
34
|
function deliver(entry, next) {
|
|
36
35
|
const previous = entry.digest;
|
|
37
36
|
entry.digest = digestOf(next);
|
|
37
|
+
entry.pending = 'pending' in entry.digest ? entry.digest.pending : null;
|
|
38
38
|
entry.covered = JSON.stringify('pending' in next.result ? next.result : next.result.coverage);
|
|
39
39
|
const change = previous === undefined ? null : changeOf(previous, next);
|
|
40
40
|
if (change !== null) {
|
|
@@ -87,58 +87,99 @@ export function createLiveQueries(run, holding) {
|
|
|
87
87
|
}
|
|
88
88
|
})();
|
|
89
89
|
}
|
|
90
|
-
function
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
return;
|
|
90
|
+
function pendingMoved(entry, held, rooms) {
|
|
91
|
+
const { pending } = entry;
|
|
92
|
+
if (pending === null || pending.size === 0 || entry.running || entry.fresh.size > 0) {
|
|
93
|
+
return false;
|
|
94
94
|
}
|
|
95
|
-
|
|
95
|
+
const at = entry.pendingAt(held, rooms);
|
|
96
|
+
const change = at === null ? null : keyedAt(pending, at, samePending);
|
|
97
|
+
if (change === null || change.removed.length === pending.size)
|
|
98
|
+
return false;
|
|
99
|
+
keyedInto(pending, change);
|
|
100
|
+
entry.covered = '';
|
|
101
|
+
if (unchanged(change))
|
|
102
|
+
return true;
|
|
103
|
+
for (const listener of entry.ready)
|
|
104
|
+
listener({ pending: change });
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
function recovered(locators) {
|
|
108
|
+
if (locators === undefined)
|
|
109
|
+
recoveringAll = true;
|
|
110
|
+
else
|
|
111
|
+
for (const locator of locators)
|
|
112
|
+
recovering.add(locator);
|
|
113
|
+
if (recoveringNow)
|
|
114
|
+
return;
|
|
115
|
+
recoveringNow = true;
|
|
96
116
|
void (async () => {
|
|
97
117
|
try {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
118
|
+
while ((recoveringAll || recovering.size > 0) && !closed) {
|
|
119
|
+
const all = recoveringAll;
|
|
120
|
+
const touched = [...recovering];
|
|
121
|
+
recoveringAll = false;
|
|
122
|
+
recovering.clear();
|
|
123
|
+
const reached = [...entries.values()].filter((entry) => all || touched.some(entry.reads));
|
|
124
|
+
for (const entry of reached) {
|
|
101
125
|
if (entry.running)
|
|
102
126
|
entry.dirty = true;
|
|
103
127
|
}
|
|
104
|
-
const waiting =
|
|
105
|
-
if (waiting.length === 0
|
|
128
|
+
const waiting = reached.filter((entry) => !entry.running);
|
|
129
|
+
if (waiting.length === 0)
|
|
106
130
|
continue;
|
|
107
131
|
const held = await holding();
|
|
108
132
|
for (const entry of waiting) {
|
|
109
133
|
if (entry.running)
|
|
110
134
|
continue;
|
|
135
|
+
const read = all ? [] : touched.filter(entry.reads);
|
|
136
|
+
if (read.length > 0 && pendingMoved(entry, held, read))
|
|
137
|
+
continue;
|
|
111
138
|
if (entry.digest === undefined || shown(entry, held) !== entry.covered)
|
|
112
139
|
schedule(entry);
|
|
113
140
|
}
|
|
114
|
-
}
|
|
141
|
+
}
|
|
115
142
|
}
|
|
116
143
|
catch (error) {
|
|
117
144
|
uncaught(error);
|
|
118
145
|
}
|
|
119
146
|
finally {
|
|
120
|
-
|
|
147
|
+
recoveringNow = false;
|
|
121
148
|
}
|
|
122
149
|
})();
|
|
123
150
|
}
|
|
124
151
|
return {
|
|
125
152
|
touched(set) {
|
|
153
|
+
const pending = new Set();
|
|
126
154
|
for (const entry of entries.values()) {
|
|
127
|
-
if (affected(entry
|
|
155
|
+
if (!affected(entry, set))
|
|
156
|
+
continue;
|
|
157
|
+
if (entry.pending === null || entry.running) {
|
|
128
158
|
schedule(entry);
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
for (const locator of set.rooms)
|
|
162
|
+
pending.add(locator);
|
|
163
|
+
for (const { locator } of set.documents)
|
|
164
|
+
pending.add(locator);
|
|
129
165
|
}
|
|
166
|
+
if (pending.size > 0)
|
|
167
|
+
recovered([...pending]);
|
|
130
168
|
},
|
|
131
169
|
recover: recovered,
|
|
132
|
-
watch(plan, identity, cover, listener, failed) {
|
|
170
|
+
watch(plan, identity, cover, pendingAt, listener, failed) {
|
|
133
171
|
let entry = entries.get(identity);
|
|
134
172
|
if (entry === undefined) {
|
|
135
173
|
entry = {
|
|
136
174
|
plan,
|
|
175
|
+
reads: readerOf(plan),
|
|
137
176
|
cover,
|
|
177
|
+
pendingAt,
|
|
138
178
|
listeners: new Set(),
|
|
139
179
|
fresh: new Map(),
|
|
140
180
|
ready: new Set(),
|
|
141
181
|
digest: undefined,
|
|
182
|
+
pending: null,
|
|
142
183
|
covered: '',
|
|
143
184
|
dirty: false,
|
|
144
185
|
running: false,
|
package/dist/loaded.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BuildFile } from './client.js';
|
|
2
|
+
export declare function parsed(file: Blob | null): Promise<unknown>;
|
|
3
|
+
export declare function perBuild<T>(buildFile: BuildFile, key: string, make: () => Promise<T>): Promise<T>;
|
|
4
|
+
export declare function loaded<T>(buildFile: BuildFile, name: string, read?: (file: Blob | null) => Promise<unknown>): Promise<T | null>;
|
|
5
|
+
//# sourceMappingURL=loaded.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loaded.d.ts","sourceRoot":"","sources":["../src/loaded.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAc7C,wBAAsB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAYjG;AAED,wBAAgB,MAAM,CAAC,CAAC,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC,OAAO,CAAY,GACvD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAEnB"}
|
package/dist/loaded.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
const holdings = new WeakMap();
|
|
10
|
+
async function imported(file) {
|
|
11
|
+
if (file === null)
|
|
12
|
+
return null;
|
|
13
|
+
const address = URL.createObjectURL(file);
|
|
14
|
+
try {
|
|
15
|
+
return await import(__rewriteRelativeImportExtension(address));
|
|
16
|
+
}
|
|
17
|
+
finally {
|
|
18
|
+
URL.revokeObjectURL(address);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export async function parsed(file) {
|
|
22
|
+
return file === null ? null : JSON.parse(await file.text());
|
|
23
|
+
}
|
|
24
|
+
export function perBuild(buildFile, key, make) {
|
|
25
|
+
let named = holdings.get(buildFile);
|
|
26
|
+
if (named === undefined) {
|
|
27
|
+
named = new Map();
|
|
28
|
+
holdings.set(buildFile, named);
|
|
29
|
+
}
|
|
30
|
+
const holding = named.get(key);
|
|
31
|
+
if (holding !== undefined)
|
|
32
|
+
return holding;
|
|
33
|
+
const making = make();
|
|
34
|
+
named.set(key, making);
|
|
35
|
+
making.catch(() => named.delete(key));
|
|
36
|
+
return making;
|
|
37
|
+
}
|
|
38
|
+
export function loaded(buildFile, name, read = imported) {
|
|
39
|
+
return perBuild(buildFile, name, () => buildFile(name).then(read));
|
|
40
|
+
}
|
package/dist/locks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../src/locks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,wBAAsB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5F;AAED,wBAAsB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../src/locks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,wBAAsB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5F;AAED,wBAAsB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAG1F;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,iBAKzE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAU9C;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAE7E"}
|
package/dist/locks.js
CHANGED
|
@@ -4,8 +4,8 @@ export async function locked({ store, presence }, locator) {
|
|
|
4
4
|
return presence.locked(locator, async () => (await store.open()).offline(locator));
|
|
5
5
|
}
|
|
6
6
|
export async function lockedRooms({ store, presence }) {
|
|
7
|
-
const
|
|
8
|
-
return presence.lockedAmong(
|
|
7
|
+
const { rooms, locking } = await store.covering();
|
|
8
|
+
return presence.lockedAmong(rooms, locking);
|
|
9
9
|
}
|
|
10
10
|
export async function relocked(runtime, before) {
|
|
11
11
|
const after = await lockedRooms(runtime);
|
package/dist/lost.js
CHANGED
|
@@ -42,7 +42,7 @@ export async function loseRooms(runtime, locators) {
|
|
|
42
42
|
queue: true,
|
|
43
43
|
drafts: held.filter((draft) => draft.locator === locator).map(({ path }) => path),
|
|
44
44
|
}))));
|
|
45
|
-
recoverReads(runtime);
|
|
45
|
+
recoverReads(runtime, fresh);
|
|
46
46
|
}
|
|
47
47
|
await unpair(runtime);
|
|
48
48
|
await eraseFenced(runtime, fresh);
|
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;
|
|
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;
|
|
6
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
|
}
|
|
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
|
+
}
|
|
40
87
|
export function defineRoomMedia(client) {
|
|
41
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) {
|
|
|
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) {
|
|
|
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) {
|
|
|
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) {
|
|
|
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)
|
package/dist/memory.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type VerifiedModel } from '@agentshouse/mdmodel';
|
|
1
2
|
import type { ModelResult } from './model.js';
|
|
2
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';
|
|
3
4
|
export type MemoryRoom = Omit<DiscoveredRoom, 'typedSelection' | 'authoredPaths'> & {
|
|
@@ -31,7 +32,7 @@ export type MemoryAdapterOptions = {
|
|
|
31
32
|
retention?: Retention;
|
|
32
33
|
member?: Member;
|
|
33
34
|
unopened?: boolean;
|
|
34
|
-
roomTypes?:
|
|
35
|
+
roomTypes?: VerifiedModel;
|
|
35
36
|
typedPaths?: readonly TypedPath[];
|
|
36
37
|
};
|
|
37
38
|
export type MemoryAdapter = Adapter & {
|
|
@@ -39,6 +40,7 @@ export type MemoryAdapter = Adapter & {
|
|
|
39
40
|
refresh: NonNullable<Adapter['refresh']>;
|
|
40
41
|
setRooms(rooms: readonly MemoryRoom[]): void;
|
|
41
42
|
setConversations(conversations: readonly MemoryConversation[]): void;
|
|
43
|
+
setAgents(agents: readonly ListedAgent[]): void;
|
|
42
44
|
script(operation: keyof Adapter, answer: unknown): void;
|
|
43
45
|
open(): void;
|
|
44
46
|
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":"AAAA,OAAO,EAAsC,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG9F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,KAAK,eAAe,EAEpB,KAAK,YAAY,EACjB,KAAK,OAAO,EAIZ,KAAK,UAAU,EAMf,KAAK,UAAU,EACf,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAKtB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,UAAU,EAGf,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,MAAM,EAGX,KAAK,aAAa,EAIlB,KAAK,SAAS,EAGd,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,cAAc,CAAC;AAwBtB,MAAM,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,gBAAgB,GAAG,eAAe,CAAC,GAAG;IAClF,cAAc,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC7C,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/C,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,cAAc,GAAG,QAAQ,CAAC,CAAC;IAC7D,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACtC,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,kBAAkB,GAAG,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;CAC1E,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC9B,aAAa,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACrC,cAAc,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG;IACpC,QAAQ,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3C,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,CAAC;IAC7C,gBAAgB,CAAC,aAAa,EAAE,SAAS,kBAAkB,EAAE,GAAG,IAAI,CAAC;IACrE,SAAS,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,IAAI,CAAC;IAChD,MAAM,CAAC,SAAS,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IACxD,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACzF,MAAM,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1C,iBAAiB,CAAC,YAAY,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChF,sBAAsB,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3D,kBAAkB,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnD,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,SAAS,IAAI,SAAS,MAAM,EAAE,CAAC;IAC/B,uBAAuB,IAAI,SAAS,MAAM,EAAE,CAAC;IAC7C,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAAC;CACzC,CAAC;AA0CF,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,oBAAyB,GAAG,aAAa,CAmrBrF"}
|
package/dist/memory.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { definitionAt, documentFacts, parse } from '@agentshouse/mdmodel';
|
|
2
|
-
import {
|
|
2
|
+
import { NO_ROOM_TYPES, schemaTypes } from './attached-model.js';
|
|
3
3
|
import { selected } from './collection.js';
|
|
4
|
+
import { declaredType } from './outcome.js';
|
|
4
5
|
import { sameChange } from './overlay.js';
|
|
5
6
|
const ATTACHMENTS = 'attachments';
|
|
6
7
|
function lastName(path) {
|
|
@@ -64,6 +65,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
64
65
|
const declaredRooms = new Set();
|
|
65
66
|
let replicated = [];
|
|
66
67
|
let heldCursor = null;
|
|
68
|
+
let agents = structuredClone(options.agents ?? []);
|
|
67
69
|
let issued = 0;
|
|
68
70
|
function scriptConversations(entries) {
|
|
69
71
|
scripted.clear();
|
|
@@ -105,7 +107,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
105
107
|
}
|
|
106
108
|
}
|
|
107
109
|
const saved = new WeakMap();
|
|
108
|
-
const roomTypes =
|
|
110
|
+
const roomTypes = options.roomTypes ?? NO_ROOM_TYPES;
|
|
109
111
|
function factsAt(room, path, content) {
|
|
110
112
|
const types = selected({ selection: room.typedSelection ?? null }, path)
|
|
111
113
|
? roomTypes.types
|
|
@@ -346,7 +348,14 @@ export function createMemoryAdapter(options = {}) {
|
|
|
346
348
|
? []
|
|
347
349
|
: [{ conversation, ...listed, newest: messages.at(-1)?.change ?? null }]);
|
|
348
350
|
for (const listener of listeners) {
|
|
349
|
-
listener({
|
|
351
|
+
listener({
|
|
352
|
+
kind: 'list',
|
|
353
|
+
agents: structuredClone(agents),
|
|
354
|
+
entries,
|
|
355
|
+
whole: true,
|
|
356
|
+
more: false,
|
|
357
|
+
cursor: null,
|
|
358
|
+
});
|
|
350
359
|
}
|
|
351
360
|
}
|
|
352
361
|
function discovery() {
|
|
@@ -402,6 +411,9 @@ export function createMemoryAdapter(options = {}) {
|
|
|
402
411
|
setConversations(next) {
|
|
403
412
|
scriptConversations(next);
|
|
404
413
|
},
|
|
414
|
+
setAgents(next) {
|
|
415
|
+
agents = structuredClone(next);
|
|
416
|
+
},
|
|
405
417
|
open() {
|
|
406
418
|
carried.clear();
|
|
407
419
|
announceList();
|
|
@@ -464,9 +476,6 @@ export function createMemoryAdapter(options = {}) {
|
|
|
464
476
|
};
|
|
465
477
|
},
|
|
466
478
|
history: (request) => Promise.resolve(historiesOf(request)),
|
|
467
|
-
...(options.agents === undefined
|
|
468
|
-
? {}
|
|
469
|
-
: { agents: () => Promise.resolve(structuredClone(options.agents)) }),
|
|
470
479
|
},
|
|
471
480
|
serviceMode: {
|
|
472
481
|
observe(notify) {
|
|
@@ -619,7 +628,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
619
628
|
const blob = heldBlob(room, request.path);
|
|
620
629
|
return blob === undefined
|
|
621
630
|
? { kind: 'rejected', code: 'not_found', fields: {}, retryable: false }
|
|
622
|
-
: { kind: 'binary', body: blob.stream(), mediaType: blob
|
|
631
|
+
: { kind: 'binary', body: blob.stream(), mediaType: declaredType(blob) };
|
|
623
632
|
}, request);
|
|
624
633
|
},
|
|
625
634
|
async link(_authorization, request) {
|
|
@@ -633,7 +642,7 @@ export function createMemoryAdapter(options = {}) {
|
|
|
633
642
|
}
|
|
634
643
|
const url = linked.get(blob) ?? URL.createObjectURL(blob);
|
|
635
644
|
linked.set(blob, url);
|
|
636
|
-
return { kind: 'link', url, name: lastName(request.path), mediaType: blob
|
|
645
|
+
return { kind: 'link', url, name: lastName(request.path), mediaType: declaredType(blob) };
|
|
637
646
|
}, request);
|
|
638
647
|
},
|
|
639
648
|
async attach(_authorization, request) {
|
package/dist/messages.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AcceptedMessage } from './adapter.js';
|
|
2
2
|
import type { Connection } from './tables.js';
|
|
3
3
|
export declare const MESSAGE_TABLES: readonly string[];
|
|
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 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";
|
|
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";
|
|
5
5
|
export type HeldConversation = {
|
|
6
6
|
readonly conversation: string;
|
|
7
7
|
readonly read: string | null | undefined;
|
|
@@ -22,6 +22,8 @@ export type HeldRow = {
|
|
|
22
22
|
readonly role: string | null;
|
|
23
23
|
readonly at: string | null;
|
|
24
24
|
} | null;
|
|
25
|
+
readonly answered: string | null;
|
|
26
|
+
readonly openedTurn: string | null;
|
|
25
27
|
readonly failure: string | null;
|
|
26
28
|
readonly opened: HeldSource | null;
|
|
27
29
|
readonly asking: (HeldSource & {
|
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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"}
|
package/dist/messages.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { sql } from '@agentshouse/mdmodel';
|
|
2
|
+
import { text } from './column.js';
|
|
2
3
|
import { EXCERPT } from './read.js';
|
|
3
4
|
import { tablesOf } from './stored.js';
|
|
4
5
|
const SAID_BY_HOUSE = `json_extract(message, '$.role') = 'house'`;
|
|
@@ -27,7 +28,9 @@ export const ROWS = `WITH chosen AS (
|
|
|
27
28
|
substr(said.text, 1, ${EXCERPT}) AS said_text,
|
|
28
29
|
json_extract(said.message, '$.role') AS said_role,
|
|
29
30
|
json_extract(said.message, '$.accepted_at') AS said_at,
|
|
31
|
+
answer.turn AS answered,
|
|
30
32
|
substr(json_extract(answer.message, '$.failure'), 1, ${EXCERPT}) AS failure,
|
|
33
|
+
(SELECT value FROM conversation_facts WHERE conversation = chosen.conversation AND name = 'openedTurn') AS opened_turn,
|
|
31
34
|
json_extract(opened.message, '$.source') AS opened_source,
|
|
32
35
|
json_extract(opened.message, '$.sender') AS opened_sender,
|
|
33
36
|
asking.identity AS asking_identity,
|
|
@@ -40,9 +43,6 @@ export const ROWS = `WITH chosen AS (
|
|
|
40
43
|
LEFT JOIN conversation_messages answer ON answer.id = chosen.answer
|
|
41
44
|
LEFT JOIN conversation_messages opened ON opened.id = chosen.opened
|
|
42
45
|
LEFT JOIN conversation_messages asking ON asking.id = chosen.asking`;
|
|
43
|
-
function text(value) {
|
|
44
|
-
return typeof value === 'string' ? value : String(value);
|
|
45
|
-
}
|
|
46
46
|
export function heldConversations(connection, conversations) {
|
|
47
47
|
const named = conversations === null ? '' : ' AND conversation IN (SELECT value FROM json_each(?))';
|
|
48
48
|
const bound = conversations === null ? [] : [JSON.stringify(conversations)];
|
|
@@ -126,6 +126,8 @@ export function conversationRows(connection, conversations) {
|
|
|
126
126
|
role: textOrNull(row.said_role),
|
|
127
127
|
at: textOrNull(row.said_at),
|
|
128
128
|
},
|
|
129
|
+
answered: textOrNull(row.answered),
|
|
130
|
+
openedTurn: textOrNull(row.opened_turn),
|
|
129
131
|
failure: textOrNull(row.failure),
|
|
130
132
|
opened: row.opened_source === null ? null : heldSource(row.opened_source, row.opened_sender),
|
|
131
133
|
asking: row.asking_identity === null
|
package/dist/models.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAOnE,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAc,YAAY,EAAS,MAAM,YAAY,CAAC;AAMlE,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAE9D;AA0DD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,IAAI,iBA2Bf;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,iBAkB7B;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,EAC1C,MAAM,EAAE,SAAS,GAAG,QAAQ,EAC5B,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAOnE,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAc,YAAY,EAAS,MAAM,YAAY,CAAC;AAMlE,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAE9D;AA0DD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,IAAI,iBA2Bf;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,iBAkB7B;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,EAC1C,MAAM,EAAE,SAAS,GAAG,QAAQ,EAC5B,KAAK,EAAE,YAAY,iBAkDpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvF"}
|
package/dist/models.js
CHANGED
|
@@ -35,7 +35,7 @@ function recordAlone(store, record) {
|
|
|
35
35
|
}
|
|
36
36
|
function unheld(runtime, locator, model) {
|
|
37
37
|
runtime.presence.modelled(locator, model);
|
|
38
|
-
emitRooms(runtime);
|
|
38
|
+
emitRooms(runtime, [locator]);
|
|
39
39
|
}
|
|
40
40
|
function recorded(runtime, locator, declaration, model) {
|
|
41
41
|
const { store, socket } = runtime;
|
|
@@ -94,7 +94,7 @@ export async function scoped(runtime, result, locator, declaration) {
|
|
|
94
94
|
await retainModel(runtime, locator, declaration, { status: 'unavailable', reason: 'not-readable' }, true);
|
|
95
95
|
if (!socket.continuing())
|
|
96
96
|
return;
|
|
97
|
-
emitRooms(runtime);
|
|
97
|
+
emitRooms(runtime, [locator]);
|
|
98
98
|
}
|
|
99
99
|
export async function settleModels(runtime, held, status, local) {
|
|
100
100
|
const { store, socket, presence } = runtime;
|
|
@@ -129,7 +129,7 @@ export async function settleModels(runtime, held, status, local) {
|
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
131
|
if (unchanged.length > 0)
|
|
132
|
-
emitRooms(runtime);
|
|
132
|
+
emitRooms(runtime, unchanged.map(([locator]) => locator));
|
|
133
133
|
const kept = new Set(unchanged.map(([locator]) => locator));
|
|
134
134
|
return [...held].filter(([locator]) => !kept.has(locator) &&
|
|
135
135
|
owed(stored.get(locator)?.record.model ?? unheldModelOf(runtime, locator)));
|