@agentshouse/mdruntime 0.1.0-ca68e8b4bbebc → 0.1.0-ca6edc1abd618
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 +18 -15
- package/dist/adapter.d.ts +70 -36
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attached-model.d.ts +5 -1
- package/dist/attached-model.d.ts.map +1 -1
- package/dist/attached-model.js +21 -4
- package/dist/binary.d.ts +0 -5
- package/dist/binary.d.ts.map +1 -1
- package/dist/binary.js +1 -1
- package/dist/bootstrap.d.ts +25 -8
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +150 -85
- package/dist/chain.d.ts +11 -0
- package/dist/chain.d.ts.map +1 -0
- package/dist/chain.js +64 -0
- package/dist/change-set.d.ts +9 -16
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +11 -89
- package/dist/change.d.ts +31 -1
- package/dist/change.d.ts.map +1 -1
- package/dist/change.js +10 -1
- package/dist/client.d.ts +13 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +37 -6
- package/dist/collection.d.ts +6 -19
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +31 -289
- package/dist/compile.d.ts +16 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +721 -0
- package/dist/connection.d.ts +22 -12
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +2485 -1036
- package/dist/conversation.d.ts +16 -3
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +238 -96
- package/dist/digest.d.ts +7 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +113 -0
- package/dist/durability.d.ts +3 -5
- package/dist/durability.d.ts.map +1 -1
- package/dist/durability.js +5 -0
- package/dist/entry.d.ts +3 -1
- package/dist/entry.d.ts.map +1 -1
- package/dist/entry.js +18 -23
- package/dist/file.d.ts +2 -10
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +3 -120
- package/dist/fulltext.d.ts +27 -0
- package/dist/fulltext.d.ts.map +1 -0
- package/dist/fulltext.js +368 -0
- package/dist/host.d.ts +4 -7
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +51 -18
- 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 +13 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/live.d.ts +22 -0
- package/dist/live.d.ts.map +1 -0
- package/dist/live.js +123 -0
- package/dist/memory.d.ts +4 -3
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +32 -26
- package/dist/messages.d.ts +28 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +90 -0
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +1 -1
- package/dist/name.d.ts +4 -0
- package/dist/name.d.ts.map +1 -0
- package/dist/name.js +122 -0
- package/dist/observation.d.ts +14 -0
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +93 -3
- package/dist/opened.d.ts +22 -0
- package/dist/opened.d.ts.map +1 -0
- package/dist/opened.js +107 -0
- package/dist/outcome.d.ts +34 -4
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +25 -0
- package/dist/overlay.d.ts +2 -5
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +87 -172
- package/dist/query.d.ts +26 -2
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +41 -6
- package/dist/reach.d.ts +5 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +167 -59
- package/dist/react.d.ts +1 -2
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +2 -14
- package/dist/readiness.d.ts +20 -9
- package/dist/readiness.d.ts.map +1 -1
- package/dist/readiness.js +6 -6
- package/dist/reads.d.ts.map +1 -1
- package/dist/reads.js +4 -2
- package/dist/recovery.d.ts +2 -2
- package/dist/recovery.d.ts.map +1 -1
- package/dist/recovery.js +8 -7
- package/dist/refresh.d.ts +15 -14
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +113 -56
- package/dist/replica.d.ts +56 -33
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +297 -188
- package/dist/room-draft.d.ts +4 -1
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +62 -22
- package/dist/rows.d.ts +29 -30
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +113 -64
- package/dist/save.d.ts +51 -14
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +518 -180
- package/dist/search.d.ts +23 -42
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +28 -182
- package/dist/seed.d.ts.map +1 -1
- package/dist/seed.js +18 -4
- package/dist/shared.d.ts +8 -3
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +129 -66
- package/dist/store.d.ts +89 -89
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +329 -669
- package/dist/stored.d.ts +145 -0
- package/dist/stored.d.ts.map +1 -0
- package/dist/stored.js +567 -0
- package/dist/tables.d.ts +354 -0
- package/dist/tables.d.ts.map +1 -0
- package/dist/tables.js +624 -0
- package/dist/turn.d.ts +5 -3
- package/dist/turn.d.ts.map +1 -1
- package/dist/turn.js +51 -21
- package/dist/validation.d.ts +30 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +162 -0
- package/dist/windows.d.ts +22 -0
- package/dist/windows.d.ts.map +1 -0
- package/dist/windows.js +89 -0
- package/dist/wire.d.ts +29 -1
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +8 -1
- package/dist/words.d.ts +19 -0
- package/dist/words.d.ts.map +1 -0
- package/dist/words.js +150 -0
- package/package.json +18 -19
- package/AGENTS.md +0 -299
- package/dist/acquisition.d.ts +0 -14
- package/dist/acquisition.d.ts.map +0 -1
- package/dist/acquisition.js +0 -24
- package/dist/chat/acts.d.ts +0 -33
- package/dist/chat/acts.d.ts.map +0 -1
- package/dist/chat/acts.js +0 -36
- package/dist/chat/context.d.ts +0 -3
- package/dist/chat/context.d.ts.map +0 -1
- package/dist/chat/context.js +0 -10
- package/dist/chat/input.d.ts +0 -9
- package/dist/chat/input.d.ts.map +0 -1
- package/dist/chat/input.js +0 -99
- package/dist/chat/kit.d.ts +0 -61
- package/dist/chat/kit.d.ts.map +0 -1
- package/dist/chat/kit.js +0 -123
- package/dist/chat/lasting.d.ts +0 -6
- package/dist/chat/lasting.d.ts.map +0 -1
- package/dist/chat/lasting.js +0 -19
- package/dist/chat/list.d.ts +0 -27
- package/dist/chat/list.d.ts.map +0 -1
- package/dist/chat/list.js +0 -63
- package/dist/chat/markdown.d.ts +0 -20
- package/dist/chat/markdown.d.ts.map +0 -1
- package/dist/chat/markdown.js +0 -188
- package/dist/chat/message.d.ts +0 -6
- package/dist/chat/message.d.ts.map +0 -1
- package/dist/chat/message.js +0 -192
- package/dist/chat/messages.d.ts +0 -22
- package/dist/chat/messages.d.ts.map +0 -1
- package/dist/chat/messages.js +0 -155
- package/dist/chat/name.d.ts +0 -6
- package/dist/chat/name.d.ts.map +0 -1
- package/dist/chat/name.js +0 -37
- package/dist/chat/opened.d.ts +0 -11
- package/dist/chat/opened.d.ts.map +0 -1
- package/dist/chat/opened.js +0 -17
- package/dist/chat/overlay.d.ts +0 -31
- package/dist/chat/overlay.d.ts.map +0 -1
- package/dist/chat/overlay.js +0 -97
- package/dist/chat/parts.d.ts +0 -57
- package/dist/chat/parts.d.ts.map +0 -1
- package/dist/chat/parts.js +0 -119
- package/dist/chat/process.d.ts +0 -20
- package/dist/chat/process.d.ts.map +0 -1
- package/dist/chat/process.js +0 -32
- package/dist/chat/provider.d.ts +0 -63
- package/dist/chat/provider.d.ts.map +0 -1
- package/dist/chat/provider.js +0 -629
- package/dist/chat/question.d.ts +0 -9
- package/dist/chat/question.d.ts.map +0 -1
- package/dist/chat/question.js +0 -80
- package/dist/chat/questions.d.ts +0 -31
- package/dist/chat/questions.d.ts.map +0 -1
- package/dist/chat/questions.js +0 -111
- package/dist/chat/read.d.ts +0 -5
- package/dist/chat/read.d.ts.map +0 -1
- package/dist/chat/read.js +0 -13
- package/dist/chat/ready.d.ts +0 -34
- package/dist/chat/ready.d.ts.map +0 -1
- package/dist/chat/ready.js +0 -91
- package/dist/chat/style.d.ts +0 -4
- package/dist/chat/style.d.ts.map +0 -1
- package/dist/chat/style.js +0 -302
- package/dist/chat.d.ts +0 -14
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js +0 -8
- package/dist/read-side.d.ts +0 -25
- package/dist/read-side.d.ts.map +0 -1
- package/dist/read-side.js +0 -642
package/dist/fulltext.js
ADDED
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
import { parse } from '@agentshouse/mdmodel';
|
|
2
|
+
import { selected } from './compile.js';
|
|
3
|
+
import { markdownPath } from './rows.js';
|
|
4
|
+
import { indexed, matchClauses, matched, matchExpression, queryTerms, snippet, } from './words.js';
|
|
5
|
+
const TOKENIZER = "porter unicode61 remove_diacritics 2 categories 'L* N* Co M*'";
|
|
6
|
+
const CONTENTLESS = `content='', contentless_delete=1, detail=full, tokenize="${TOKENIZER}"`;
|
|
7
|
+
const DOCUMENTS = 'replica_search';
|
|
8
|
+
const MESSAGES = 'conversation_search';
|
|
9
|
+
export const SEARCH_TABLES = [
|
|
10
|
+
`CREATE VIRTUAL TABLE ${DOCUMENTS} USING fts5(path, fields, sections, preamble, ${CONTENTLESS})`,
|
|
11
|
+
`CREATE VIRTUAL TABLE ${MESSAGES} USING fts5(text, ${CONTENTLESS})`,
|
|
12
|
+
];
|
|
13
|
+
const CHUNKS = 4096;
|
|
14
|
+
const CHUNK_CHARACTERS = 32_768;
|
|
15
|
+
const CANDIDATES = 5_000;
|
|
16
|
+
const LEAST_WINDOW = 32;
|
|
17
|
+
const SNIPPET_REACH = 80;
|
|
18
|
+
function scalars(value) {
|
|
19
|
+
if (value === null || value === undefined)
|
|
20
|
+
return [];
|
|
21
|
+
if (Array.isArray(value))
|
|
22
|
+
return value.flatMap(scalars);
|
|
23
|
+
if (typeof value === 'object')
|
|
24
|
+
return Object.values(value).flatMap(scalars);
|
|
25
|
+
return [String(value)];
|
|
26
|
+
}
|
|
27
|
+
function partsOf(path, content) {
|
|
28
|
+
if (!markdownPath(path))
|
|
29
|
+
return null;
|
|
30
|
+
const read = parse(content, path);
|
|
31
|
+
if (!read.ok)
|
|
32
|
+
return null;
|
|
33
|
+
return {
|
|
34
|
+
fields: scalars(read.document.fields).join('\n'),
|
|
35
|
+
sections: Object.entries(read.document.sections)
|
|
36
|
+
.map(([heading, text]) => `${heading}\n${text}`)
|
|
37
|
+
.join('\n'),
|
|
38
|
+
preamble: read.document.preamble,
|
|
39
|
+
path,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function chunked(text) {
|
|
43
|
+
const chunks = [];
|
|
44
|
+
let start = 0;
|
|
45
|
+
do {
|
|
46
|
+
let end = Math.min(text.length, start + CHUNK_CHARACTERS);
|
|
47
|
+
if (end < text.length) {
|
|
48
|
+
const space = text.lastIndexOf(' ', end);
|
|
49
|
+
if (space > start + CHUNK_CHARACTERS / 2)
|
|
50
|
+
end = space;
|
|
51
|
+
else if (/[\ud800-\udbff]/u.test(text[end - 1]))
|
|
52
|
+
end -= 1;
|
|
53
|
+
}
|
|
54
|
+
chunks.push(text.slice(start, end));
|
|
55
|
+
start = end;
|
|
56
|
+
} while (start < text.length && chunks.length < CHUNKS);
|
|
57
|
+
return chunks;
|
|
58
|
+
}
|
|
59
|
+
function rowOf(id, chunk) {
|
|
60
|
+
return id * CHUNKS + chunk;
|
|
61
|
+
}
|
|
62
|
+
export function indexDocument(connection, id, path, content) {
|
|
63
|
+
const parts = partsOf(path, content);
|
|
64
|
+
if (parts === null)
|
|
65
|
+
return;
|
|
66
|
+
chunked(parts.sections).forEach((sections, chunk) => {
|
|
67
|
+
const head = chunk === 0;
|
|
68
|
+
connection.run(`INSERT INTO ${DOCUMENTS} (rowid, path, fields, sections, preamble) VALUES (?, ?, ?, ?, ?)`, [
|
|
69
|
+
rowOf(id, chunk),
|
|
70
|
+
head ? indexed(parts.path) : null,
|
|
71
|
+
head ? indexed(parts.fields) : null,
|
|
72
|
+
indexed(sections),
|
|
73
|
+
head ? indexed(parts.preamble) : null,
|
|
74
|
+
]);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
export function indexMessage(connection, id, text) {
|
|
78
|
+
chunked(text).forEach((chunk, at) => {
|
|
79
|
+
connection.run(`INSERT INTO ${MESSAGES} (rowid, text) VALUES (?, ?)`, [
|
|
80
|
+
rowOf(id, at),
|
|
81
|
+
indexed(chunk),
|
|
82
|
+
]);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
function unindexed(connection, table, ids) {
|
|
86
|
+
for (const id of ids) {
|
|
87
|
+
connection.run(`DELETE FROM ${table} WHERE rowid >= ? AND rowid < ?`, [
|
|
88
|
+
rowOf(id, 0),
|
|
89
|
+
rowOf(id + 1, 0),
|
|
90
|
+
]);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function unindexDocuments(connection, ids) {
|
|
94
|
+
unindexed(connection, DOCUMENTS, ids);
|
|
95
|
+
}
|
|
96
|
+
export function unindexMessages(connection, ids) {
|
|
97
|
+
unindexed(connection, MESSAGES, ids);
|
|
98
|
+
}
|
|
99
|
+
export function unindexAll(connection) {
|
|
100
|
+
for (const table of [DOCUMENTS, MESSAGES]) {
|
|
101
|
+
connection.run(`INSERT INTO ${table} (${table}) VALUES ('delete-all')`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function pair(left, right) {
|
|
105
|
+
if (left[0] !== right[0])
|
|
106
|
+
return left[0] < right[0] ? -1 : 1;
|
|
107
|
+
if (left[1] !== right[1])
|
|
108
|
+
return left[1] < right[1] ? -1 : 1;
|
|
109
|
+
return 0;
|
|
110
|
+
}
|
|
111
|
+
function byRank(left, right) {
|
|
112
|
+
return right.score - left.score || pair(left.tie, right.tie);
|
|
113
|
+
}
|
|
114
|
+
function beyond(hit, cursor) {
|
|
115
|
+
if (cursor.length === 0)
|
|
116
|
+
return true;
|
|
117
|
+
return (hit.score < cursor[0] || (hit.score === cursor[0] && pair(hit.tie, [cursor[1], cursor[2]]) > 0));
|
|
118
|
+
}
|
|
119
|
+
function rankedWithin(connection, listed, sources, cursor, needed) {
|
|
120
|
+
const { table } = listed;
|
|
121
|
+
let window = Math.max(needed * 2, LEAST_WINDOW);
|
|
122
|
+
for (;;) {
|
|
123
|
+
const rows = [];
|
|
124
|
+
const boundaries = [];
|
|
125
|
+
for (const source of sources) {
|
|
126
|
+
const found = connection.rows(`SELECT rowid, bm25(${table}) AS score FROM ${table} WHERE ${table} MATCH ? ${source.sql} ORDER BY score, rowid LIMIT ?`, [source.expression, ...source.bind, window]);
|
|
127
|
+
for (const row of found)
|
|
128
|
+
rows.push([Number(row.rowid), Number(row.score)]);
|
|
129
|
+
if (found.length === window)
|
|
130
|
+
boundaries.push(-Number(found.at(-1).score));
|
|
131
|
+
}
|
|
132
|
+
rows.sort((left, right) => left[1] - right[1] || left[0] - right[0]);
|
|
133
|
+
const best = new Map();
|
|
134
|
+
for (const [row, score] of rows) {
|
|
135
|
+
const id = Math.floor(row / CHUNKS);
|
|
136
|
+
if (!best.has(id))
|
|
137
|
+
best.set(id, { chunk: row % CHUNKS, score: -score });
|
|
138
|
+
}
|
|
139
|
+
const ties = listed.ties([...best.keys()]);
|
|
140
|
+
const kept = [...best]
|
|
141
|
+
.flatMap(([id, held]) => {
|
|
142
|
+
const tie = ties.get(id);
|
|
143
|
+
return tie === undefined ? [] : [{ id, ...held, tie }];
|
|
144
|
+
})
|
|
145
|
+
.sort(byRank)
|
|
146
|
+
.filter((hit) => beyond(hit, cursor))
|
|
147
|
+
.slice(0, needed);
|
|
148
|
+
const last = kept.at(-1);
|
|
149
|
+
if (boundaries.length === 0)
|
|
150
|
+
return kept;
|
|
151
|
+
if (kept.length === needed &&
|
|
152
|
+
last !== undefined &&
|
|
153
|
+
boundaries.every((boundary) => boundary < last.score)) {
|
|
154
|
+
return kept;
|
|
155
|
+
}
|
|
156
|
+
window *= 4;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
function reaches(connection, listed, expression, reach) {
|
|
160
|
+
const { table, scope } = listed;
|
|
161
|
+
const [counted] = connection.rows(`SELECT count(*) AS held FROM (SELECT rowid FROM ${table} WHERE ${table} MATCH ? AND ${scope.sql} LIMIT ?)`, [expression, ...scope.bind, reach + 1]);
|
|
162
|
+
return Number(counted?.held ?? 0) > reach;
|
|
163
|
+
}
|
|
164
|
+
function candidates(connection, listed, clauses, cursor, needed) {
|
|
165
|
+
const { table, scope } = listed;
|
|
166
|
+
const expression = matchExpression(clauses);
|
|
167
|
+
const within = { sql: `AND ${scope.sql}`, bind: scope.bind };
|
|
168
|
+
let reach = CANDIDATES;
|
|
169
|
+
for (;;) {
|
|
170
|
+
const [edge] = connection.rows(`SELECT rowid FROM ${table} WHERE ${table} MATCH ? ${within.sql} ORDER BY rowid LIMIT 1 OFFSET ?`, [expression, ...within.bind, reach]);
|
|
171
|
+
const floor = edge === undefined ? null : Number(edge.rowid);
|
|
172
|
+
const sources = [
|
|
173
|
+
floor === null
|
|
174
|
+
? { expression, ...within }
|
|
175
|
+
: { expression, sql: `${within.sql} AND rowid < ?`, bind: [...within.bind, floor] },
|
|
176
|
+
];
|
|
177
|
+
if (floor !== null) {
|
|
178
|
+
const common = new Set();
|
|
179
|
+
const selective = [];
|
|
180
|
+
const frequent = [];
|
|
181
|
+
for (const clause of clauses) {
|
|
182
|
+
if (clause.kind === 'phrase')
|
|
183
|
+
continue;
|
|
184
|
+
if (clause.kind !== 'term' && common.has(clause.term)) {
|
|
185
|
+
frequent.push(clause);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (reaches(connection, listed, clause.text, reach)) {
|
|
189
|
+
if (clause.kind === 'term')
|
|
190
|
+
common.add(clause.term);
|
|
191
|
+
frequent.push(clause);
|
|
192
|
+
}
|
|
193
|
+
else
|
|
194
|
+
selective.push(clause);
|
|
195
|
+
}
|
|
196
|
+
const phrase = clauses.find((clause) => clause.kind === 'phrase');
|
|
197
|
+
if (phrase !== undefined) {
|
|
198
|
+
const rare = !clauses
|
|
199
|
+
.filter((clause) => clause.kind === 'term')
|
|
200
|
+
.every((clause) => common.has(clause.term)) ||
|
|
201
|
+
!reaches(connection, listed, phrase.text, reach);
|
|
202
|
+
(rare ? selective : frequent).push(phrase);
|
|
203
|
+
}
|
|
204
|
+
if (selective.length > 0) {
|
|
205
|
+
const chosen = `(${matchExpression(selective)})`;
|
|
206
|
+
const tail = { sql: `${within.sql} AND rowid >= ?`, bind: [...within.bind, floor] };
|
|
207
|
+
if (frequent.length === 0)
|
|
208
|
+
sources.push({ ...tail, expression: chosen });
|
|
209
|
+
else {
|
|
210
|
+
const rest = `(${matchExpression(frequent)})`;
|
|
211
|
+
sources.push({ ...tail, expression: `${chosen} AND ${rest}` }, { ...tail, expression: `${chosen} NOT ${rest}` });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const kept = rankedWithin(connection, listed, sources, cursor, needed);
|
|
216
|
+
if (floor === null || kept.length >= needed)
|
|
217
|
+
return kept;
|
|
218
|
+
reach *= 4;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
function windowOf(connection, listed, clauses, cursor, limit) {
|
|
222
|
+
if (cursor === null || listed === null || clauses === null)
|
|
223
|
+
return { kept: [], cursor: null };
|
|
224
|
+
const found = candidates(connection, listed, clauses, cursor, limit + 1);
|
|
225
|
+
if (found.length <= limit)
|
|
226
|
+
return { kept: found, cursor: null };
|
|
227
|
+
const kept = found.slice(0, limit);
|
|
228
|
+
const last = kept.at(-1);
|
|
229
|
+
return { kept, cursor: last === undefined ? cursor : [last.score, ...last.tie] };
|
|
230
|
+
}
|
|
231
|
+
function totalOf(connection, listed, clauses) {
|
|
232
|
+
if (listed === null || clauses === null)
|
|
233
|
+
return 0;
|
|
234
|
+
const { table, scope } = listed;
|
|
235
|
+
const [counted] = connection.rows(`SELECT count(DISTINCT rowid / ${CHUNKS}) AS held FROM ${table} WHERE ${table} MATCH ? AND ${scope.sql}`, [matchExpression(clauses), ...scope.bind]);
|
|
236
|
+
return Number(counted?.held ?? 0);
|
|
237
|
+
}
|
|
238
|
+
function ids(found) {
|
|
239
|
+
return JSON.stringify(found);
|
|
240
|
+
}
|
|
241
|
+
function documentsListed(connection, documents) {
|
|
242
|
+
if (documents.rooms.length === 0)
|
|
243
|
+
return null;
|
|
244
|
+
const filter = selected(connection, documents.plan, documents.rooms);
|
|
245
|
+
const outside = documents.beneath.flatMap(({ key, roots }) => roots.map((root) => ({
|
|
246
|
+
sql: 'NOT (d.key = ? AND (d.path = ? OR (d.path >= ? AND d.path < ?)))',
|
|
247
|
+
bind: [key, root, `${root}/`, `${root}0`],
|
|
248
|
+
})));
|
|
249
|
+
const conditions = [filter, ...outside];
|
|
250
|
+
const locators = new Map(documents.rooms.map(({ key, locator }) => [key, locator]));
|
|
251
|
+
return {
|
|
252
|
+
table: DOCUMENTS,
|
|
253
|
+
scope: {
|
|
254
|
+
sql: `EXISTS (SELECT 1 FROM replica_entries d WHERE d.id = ${DOCUMENTS}.rowid / ${CHUNKS} AND d.type IS NOT NULL AND ${conditions.map(({ sql }) => `(${sql})`).join(' AND ')})`,
|
|
255
|
+
bind: conditions.flatMap(({ bind }) => bind),
|
|
256
|
+
},
|
|
257
|
+
ties(found) {
|
|
258
|
+
const tied = new Map();
|
|
259
|
+
for (const row of connection.rows('SELECT id, key, path FROM replica_entries WHERE id IN (SELECT value FROM json_each(?))', [ids(found)])) {
|
|
260
|
+
const locator = locators.get(Number(row.key));
|
|
261
|
+
if (locator !== undefined)
|
|
262
|
+
tied.set(Number(row.id), [locator, String(row.path)]);
|
|
263
|
+
}
|
|
264
|
+
return tied;
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function messagesListed(connection, conversations) {
|
|
269
|
+
if (conversations.length === 0)
|
|
270
|
+
return null;
|
|
271
|
+
return {
|
|
272
|
+
table: MESSAGES,
|
|
273
|
+
scope: {
|
|
274
|
+
sql: `EXISTS (SELECT 1 FROM conversation_messages m WHERE m.id = ${MESSAGES}.rowid / ${CHUNKS} AND m.conversation IN (SELECT value FROM json_each(?)))`,
|
|
275
|
+
bind: [JSON.stringify(conversations)],
|
|
276
|
+
},
|
|
277
|
+
ties(found) {
|
|
278
|
+
return new Map(connection
|
|
279
|
+
.rows('SELECT id, conversation, identity FROM conversation_messages WHERE id IN (SELECT value FROM json_each(?))', [ids(found)])
|
|
280
|
+
.map((row) => [Number(row.id), [String(row.conversation), String(row.identity)]]));
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function cut(candidates, terms) {
|
|
285
|
+
for (const [part, text] of candidates) {
|
|
286
|
+
const found = snippet(text, terms, SNIPPET_REACH);
|
|
287
|
+
if (found !== null)
|
|
288
|
+
return { snippet: { part, text: found.text, at: [...found.at] } };
|
|
289
|
+
}
|
|
290
|
+
return {};
|
|
291
|
+
}
|
|
292
|
+
function documentHit(connection, hit, terms) {
|
|
293
|
+
const [row] = connection.rows('SELECT type, content FROM replica_entries WHERE id = ?', [hit.id]);
|
|
294
|
+
if (row === undefined)
|
|
295
|
+
return null;
|
|
296
|
+
const [room, path] = hit.tie;
|
|
297
|
+
const parts = typeof row.content === 'string' ? partsOf(path, row.content) : null;
|
|
298
|
+
const whole = parts === null
|
|
299
|
+
? []
|
|
300
|
+
: [
|
|
301
|
+
['fields', parts.fields],
|
|
302
|
+
['sections', parts.sections],
|
|
303
|
+
['preamble', parts.preamble],
|
|
304
|
+
['path', parts.path],
|
|
305
|
+
];
|
|
306
|
+
const matches = {};
|
|
307
|
+
for (const [part, text] of whole) {
|
|
308
|
+
for (const term of matched(text, terms))
|
|
309
|
+
(matches[term] ??= []).push(part);
|
|
310
|
+
}
|
|
311
|
+
const sections = parts === null ? [] : chunked(parts.sections);
|
|
312
|
+
const chunk = parts === null
|
|
313
|
+
? []
|
|
314
|
+
: hit.chunk === 0
|
|
315
|
+
? [
|
|
316
|
+
['fields', parts.fields],
|
|
317
|
+
['sections', sections[0] ?? ''],
|
|
318
|
+
['preamble', parts.preamble],
|
|
319
|
+
['path', parts.path],
|
|
320
|
+
]
|
|
321
|
+
: [['sections', sections[hit.chunk] ?? '']];
|
|
322
|
+
return {
|
|
323
|
+
room,
|
|
324
|
+
path,
|
|
325
|
+
type: String(row.type),
|
|
326
|
+
score: hit.score,
|
|
327
|
+
matches,
|
|
328
|
+
...cut(chunk, terms),
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
function messageHit(connection, hit, terms) {
|
|
332
|
+
const [row] = connection.rows('SELECT text FROM conversation_messages WHERE id = ?', [hit.id]);
|
|
333
|
+
const text = typeof row?.text === 'string' ? row.text : '';
|
|
334
|
+
const matches = {};
|
|
335
|
+
for (const term of matched(text, terms))
|
|
336
|
+
matches[term] = ['text'];
|
|
337
|
+
const [conversation, identity] = hit.tie;
|
|
338
|
+
return {
|
|
339
|
+
conversation,
|
|
340
|
+
identity,
|
|
341
|
+
score: hit.score,
|
|
342
|
+
matches,
|
|
343
|
+
...cut([['text', chunked(text)[hit.chunk] ?? '']], terms),
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
export function searched(connection, ask) {
|
|
347
|
+
const clauses = matchClauses(ask.text);
|
|
348
|
+
const terms = queryTerms(ask.text);
|
|
349
|
+
const documents = ask.documents === null ? null : documentsListed(connection, ask.documents);
|
|
350
|
+
const messages = messagesListed(connection, ask.conversations);
|
|
351
|
+
const [documentsAfter, messagesAfter] = ask.after ?? [[], []];
|
|
352
|
+
const documentWindow = windowOf(connection, documents, clauses, documentsAfter, ask.limit);
|
|
353
|
+
const messageWindow = windowOf(connection, messages, clauses, messagesAfter, ask.limit);
|
|
354
|
+
const more = documentWindow.cursor !== null || messageWindow.cursor !== null;
|
|
355
|
+
return {
|
|
356
|
+
documents: documentWindow.kept.flatMap((hit) => documentHit(connection, hit, terms) ?? []),
|
|
357
|
+
messages: messageWindow.kept.map((hit) => messageHit(connection, hit, terms)),
|
|
358
|
+
...(more ? { next: JSON.stringify([documentWindow.cursor, messageWindow.cursor]) } : {}),
|
|
359
|
+
...(ask.total
|
|
360
|
+
? {
|
|
361
|
+
total: {
|
|
362
|
+
documents: totalOf(connection, documents, clauses),
|
|
363
|
+
messages: totalOf(connection, messages, clauses),
|
|
364
|
+
},
|
|
365
|
+
}
|
|
366
|
+
: {}),
|
|
367
|
+
};
|
|
368
|
+
}
|
package/dist/host.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { type MdRuntimeOptions } from './connection.js';
|
|
2
|
-
import type { RuntimeDemand } from './acquisition.js';
|
|
3
2
|
import type { PortReach } from './reach.js';
|
|
4
|
-
import type {
|
|
3
|
+
import type { CodeAvailability, Persistence, Readiness, SearchObligation, Space } from './readiness.js';
|
|
5
4
|
import type { EntrySeed } from './seed.js';
|
|
6
5
|
import { type RuntimePort } from './wire.js';
|
|
7
6
|
export type MdRuntimeHostOptions = MdRuntimeOptions & {
|
|
@@ -12,24 +11,22 @@ export type AttachedPort = {
|
|
|
12
11
|
narrow(reach: PortReach): void;
|
|
13
12
|
readiness(deliver: (readiness: Readiness) => void): () => void;
|
|
14
13
|
answered(queries: readonly unknown[], done: () => void): void;
|
|
15
|
-
code(code: CodeAvailability,
|
|
14
|
+
code(code: CodeAvailability, space: Space | null): void;
|
|
16
15
|
search(search: SearchObligation): void;
|
|
17
16
|
};
|
|
18
17
|
export type MdRuntimeHost = {
|
|
19
18
|
attach(port: RuntimePort, app: string, release?: string, reach?: PortReach, code?: CodeAvailability, search?: SearchObligation): AttachedPort;
|
|
20
|
-
acquire(demand: RuntimeDemand): void;
|
|
21
19
|
seed(entry: EntrySeed): void;
|
|
22
20
|
persisted(answer: Persistence): void;
|
|
21
|
+
shown(onScreen: boolean): void;
|
|
23
22
|
endAuthorization(holder?: string): Promise<void>;
|
|
24
23
|
lose(locators: readonly string[]): Promise<void>;
|
|
25
24
|
stop(): Promise<void>;
|
|
26
25
|
};
|
|
27
26
|
export declare function serveMdRuntime(options: MdRuntimeHostOptions): MdRuntimeHost;
|
|
28
|
-
export type { RuntimeDemand } from './acquisition.js';
|
|
29
27
|
export { entrySeedOf, type EntrySeed } from './seed.js';
|
|
30
28
|
export type { PortReach, ReachedDocument } from './reach.js';
|
|
31
|
-
export type {
|
|
29
|
+
export type { CodeAvailability, Persistence, SearchObligation, Space } from './readiness.js';
|
|
32
30
|
export { createRecovery, retryDelay, type Attempt, type Attempted, type AttemptOptions, type Recovery, type RecoveryOptions, } from './recovery.js';
|
|
33
|
-
export { AUTHORED_SCHEMA, authoredBinding, authoredBy, authoredHolder, bindAuthored, openDatabase, STORE_SCHEMA, } from './store.js';
|
|
34
31
|
export type { RuntimePort } from './wire.js';
|
|
35
32
|
//# sourceMappingURL=host.d.ts.map
|
package/dist/host.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,gBAAgB,EAItB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EACV,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,KAAK,EACN,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,OAAO,EAGL,KAAK,WAAW,EAOjB,MAAM,WAAW,CAAC;AAInB,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,IAAI,IAAI,CAAC;IACf,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC/D,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAC9D,IAAI,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IACxD,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CACJ,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,SAAS,EACjB,IAAI,CAAC,EAAE,gBAAgB,EACvB,MAAM,CAAC,EAAE,gBAAgB,GACxB,YAAY,CAAC;IAChB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB,CAAC;AAgIF,wBAAgB,cAAc,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CAuL3E;AAED,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EACL,cAAc,EACd,UAAU,EACV,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,eAAe,GACrB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/host.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { composeRuntime, } from './connection.js';
|
|
2
2
|
import { queryKey } from './query.js';
|
|
3
3
|
import { described } from './failure.js';
|
|
4
|
-
import { removeRuntimeStore } from './store.js';
|
|
5
4
|
import { AUTHORIZATION_ENDED, request, WIRE, } from './wire.js';
|
|
6
5
|
const NARROWED = new Set(['within', 'whole']);
|
|
7
6
|
function answered(md, app, writtenBy, member, input) {
|
|
@@ -16,18 +15,26 @@ function answered(md, app, writtenBy, member, input) {
|
|
|
16
15
|
return md.types(input[0]);
|
|
17
16
|
case 'save':
|
|
18
17
|
return md.save(input[0], input[1], writtenBy);
|
|
18
|
+
case 'saveParts':
|
|
19
|
+
return md.saveParts(input[0], input[1], writtenBy);
|
|
19
20
|
case 'history':
|
|
20
21
|
return md.history(input[0], input[1], input[2]);
|
|
22
|
+
case 'resolve':
|
|
23
|
+
return md.resolve(input[0], input[1], input[2]);
|
|
21
24
|
case 'binaryFile.read':
|
|
22
25
|
return md.binaryFile.read(input[0], input[1], input[2]);
|
|
23
|
-
case 'binaryFile.
|
|
24
|
-
return md.binaryFile.
|
|
26
|
+
case 'binaryFile.link':
|
|
27
|
+
return md.binaryFile.link(input[0], input[1], input[2]);
|
|
28
|
+
case 'binaryFile.part':
|
|
29
|
+
return md.binaryFile.part(input[0], input[1]);
|
|
25
30
|
case 'call':
|
|
26
31
|
return md.call(input[0], input[1]);
|
|
27
32
|
case 'reached':
|
|
28
33
|
return md.reached(input[0], input[1], input[2]);
|
|
29
34
|
case 'log':
|
|
30
35
|
return md.log();
|
|
36
|
+
case 'cleanUp':
|
|
37
|
+
return md.cleanUp();
|
|
31
38
|
case 'persistence':
|
|
32
39
|
return md.persistence();
|
|
33
40
|
case 'retry':
|
|
@@ -39,13 +46,15 @@ function answered(md, app, writtenBy, member, input) {
|
|
|
39
46
|
case 'roomDraft.read':
|
|
40
47
|
return md.roomDraft.read(input[0], input[1]);
|
|
41
48
|
case 'roomDraft.write':
|
|
42
|
-
return md.roomDraft.write(input[0], input[1], input[2], input[3]);
|
|
49
|
+
return md.roomDraft.write(input[0], input[1], input[2], input[3], input[4]);
|
|
43
50
|
case 'roomDraft.discard':
|
|
44
51
|
return md.roomDraft.discard(input[0], input[1], input[2]);
|
|
45
52
|
case 'presentation.read':
|
|
46
53
|
return md.presentation.read(app);
|
|
47
54
|
case 'presentation.write':
|
|
48
55
|
return md.presentation.write(app, input[0]);
|
|
56
|
+
case 'presentation.edit':
|
|
57
|
+
return md.presentation.edit(app, input[0]);
|
|
49
58
|
case 'conversation.list':
|
|
50
59
|
return md.conversation.list();
|
|
51
60
|
case 'conversation.read':
|
|
@@ -54,6 +63,8 @@ function answered(md, app, writtenBy, member, input) {
|
|
|
54
63
|
return md.conversation.create(input[0]);
|
|
55
64
|
case 'conversation.send':
|
|
56
65
|
return md.conversation.send(input[0], input[1], input[2]);
|
|
66
|
+
case 'conversation.attach':
|
|
67
|
+
return md.conversation.attach(input[0], input[1]);
|
|
57
68
|
case 'conversation.answer':
|
|
58
69
|
return md.conversation.answer(input[0], input[1]);
|
|
59
70
|
case 'conversation.interrupt':
|
|
@@ -66,10 +77,20 @@ function answered(md, app, writtenBy, member, input) {
|
|
|
66
77
|
return md.conversation.delete(input[0]);
|
|
67
78
|
case 'chatDraft.write':
|
|
68
79
|
return md.chatDraft.write(input[0], input[1], input[2]);
|
|
80
|
+
case 'chatDraft.prepend':
|
|
81
|
+
return md.chatDraft.prepend(input[0], input[1]);
|
|
69
82
|
case 'chatDraft.discard':
|
|
70
83
|
return md.chatDraft.discard(input[0]);
|
|
71
84
|
}
|
|
72
85
|
}
|
|
86
|
+
function attempted(work) {
|
|
87
|
+
try {
|
|
88
|
+
return Promise.resolve(work());
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return Promise.reject(error);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
73
94
|
function answeredResult(value) {
|
|
74
95
|
return typeof value === 'object' && value !== null && !('pending' in value);
|
|
75
96
|
}
|
|
@@ -99,7 +120,7 @@ export function serveMdRuntime(options) {
|
|
|
99
120
|
if (!authorized)
|
|
100
121
|
throw new Error(AUTHORIZATION_ENDED);
|
|
101
122
|
const writtenBy = release === undefined ? undefined : { app, release };
|
|
102
|
-
let facts = { target: app, code,
|
|
123
|
+
let facts = { target: app, code, space: null, search };
|
|
103
124
|
const view = runtime.within(reach ?? null, facts);
|
|
104
125
|
const observations = new Map();
|
|
105
126
|
const followed = new Set();
|
|
@@ -142,6 +163,20 @@ export function serveMdRuntime(options) {
|
|
|
142
163
|
? watchFacts(deliver)
|
|
143
164
|
: (NARROWED.has(WIRE.topics[topic]) ? view : runtime).watch(topic, topic === 'presentation' ? [app] : input, deliver));
|
|
144
165
|
};
|
|
166
|
+
const reply = async (id, query, pending) => {
|
|
167
|
+
try {
|
|
168
|
+
const value = await pending;
|
|
169
|
+
if (!serving)
|
|
170
|
+
return;
|
|
171
|
+
send({ kind: 'result', id, value });
|
|
172
|
+
if (query !== undefined && answeredResult(value))
|
|
173
|
+
answeredQuery(query);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (serving)
|
|
177
|
+
send({ kind: 'failure', id, ...described(error) });
|
|
178
|
+
}
|
|
179
|
+
};
|
|
145
180
|
const serve = async (message) => {
|
|
146
181
|
if (message.kind === 'hello')
|
|
147
182
|
return;
|
|
@@ -158,17 +193,15 @@ export function serveMdRuntime(options) {
|
|
|
158
193
|
observe(message.id, message.topic, message.input);
|
|
159
194
|
return;
|
|
160
195
|
}
|
|
161
|
-
const value = await answered(NARROWED.has(WIRE.members[message.member].reach) ? view.md : md, app, writtenBy, message.member, message.input);
|
|
162
|
-
if (!serving)
|
|
163
|
-
return;
|
|
164
|
-
send({ kind: 'result', id: message.id, value });
|
|
165
|
-
if (message.member === 'query' && answeredResult(value))
|
|
166
|
-
answeredQuery(message.input[0]);
|
|
167
196
|
}
|
|
168
197
|
catch (error) {
|
|
169
198
|
if (serving)
|
|
170
199
|
send({ kind: 'failure', id: message.id, ...described(error) });
|
|
200
|
+
return;
|
|
171
201
|
}
|
|
202
|
+
const { id, member, input } = message;
|
|
203
|
+
const pending = attempted(() => answered(NARROWED.has(WIRE.members[member].reach) ? view.md : md, app, writtenBy, member, input));
|
|
204
|
+
return reply(id, member === 'query' ? input[0] : undefined, pending);
|
|
172
205
|
};
|
|
173
206
|
port.addEventListener('message', (event) => {
|
|
174
207
|
if (!serving)
|
|
@@ -187,10 +220,10 @@ export function serveMdRuntime(options) {
|
|
|
187
220
|
if (serving)
|
|
188
221
|
view.narrow(next);
|
|
189
222
|
},
|
|
190
|
-
code(next,
|
|
223
|
+
code(next, space) {
|
|
191
224
|
if (!serving)
|
|
192
225
|
return;
|
|
193
|
-
facts = { ...facts, code: next,
|
|
226
|
+
facts = { ...facts, code: next, space };
|
|
194
227
|
view.facts(facts);
|
|
195
228
|
},
|
|
196
229
|
search(next) {
|
|
@@ -224,15 +257,15 @@ export function serveMdRuntime(options) {
|
|
|
224
257
|
}
|
|
225
258
|
return {
|
|
226
259
|
attach,
|
|
227
|
-
acquire(demand) {
|
|
228
|
-
runtime.acquire(demand);
|
|
229
|
-
},
|
|
230
260
|
seed(entry) {
|
|
231
261
|
runtime.seed(entry);
|
|
232
262
|
},
|
|
233
263
|
persisted(answer) {
|
|
234
264
|
runtime.persisted(answer);
|
|
235
265
|
},
|
|
266
|
+
shown(onScreen) {
|
|
267
|
+
runtime.shown(onScreen);
|
|
268
|
+
},
|
|
236
269
|
async endAuthorization(holder) {
|
|
237
270
|
authorized = false;
|
|
238
271
|
for (const [detach, send] of [...attachments]) {
|
|
@@ -240,8 +273,9 @@ export function serveMdRuntime(options) {
|
|
|
240
273
|
detach();
|
|
241
274
|
}
|
|
242
275
|
close();
|
|
243
|
-
if (!(await
|
|
276
|
+
if (!(await options.database.ask({ kind: 'authored.end', holder: holder ?? null }))) {
|
|
244
277
|
await options.shell.dropGeneration();
|
|
278
|
+
}
|
|
245
279
|
},
|
|
246
280
|
lose(locators) {
|
|
247
281
|
return runtime.lose(locators);
|
|
@@ -253,4 +287,3 @@ export function serveMdRuntime(options) {
|
|
|
253
287
|
}
|
|
254
288
|
export { entrySeedOf } from './seed.js';
|
|
255
289
|
export { createRecovery, retryDelay, } from './recovery.js';
|
|
256
|
-
export { AUTHORED_SCHEMA, authoredBinding, authoredBy, authoredHolder, bindAuthored, openDatabase, STORE_SCHEMA, } from './store.js';
|
package/dist/identity.d.ts
CHANGED
|
@@ -3,6 +3,5 @@ export declare function identityTime(identity: string): number;
|
|
|
3
3
|
export declare function roomDraftRevision(): string;
|
|
4
4
|
export declare function chatDraftRevision(): string;
|
|
5
5
|
export declare function transferIdentity(): string;
|
|
6
|
-
export declare function indexGeneration(): string;
|
|
7
6
|
export declare function binaryLocalId(): string;
|
|
8
7
|
//# sourceMappingURL=identity.d.ts.map
|
package/dist/identity.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,EAAE,GAAE,MAAmB,GAAG,MAAM,CAWnE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAQD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,EAAE,GAAE,MAAmB,GAAG,MAAM,CAWnE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAQD,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
package/dist/identity.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,23 +1,26 @@
|
|
|
1
|
-
export type {
|
|
2
|
-
export type { Change, ChangeBatch, Precondition, WrittenBy } from './change.js';
|
|
1
|
+
export type { AcceptedMessage, AcceptedRoom, ActionDeclaration, ActionRequest, ActionResult, Adapter, AdapterFailure, Authorization, BinaryFile, BinaryLinkResult, BinaryRequest, BinaryResult, BootstrapInventory, BootstrapPage, BootstrapRequest, BootstrapResult, Capability, ChangeAuthor, ContractUnavailable, ConversationAction, ConversationAgents, ConversationEvent, ConversationHistories, ConversationHistoryPage, ConversationHistoryRequest, ConversationMessage, ConversationStream, DiscoverResult, DiscoveredRoom, Discovery, DiscoveryScope, HistoryAuthor, HistoryRequest, HistoryResult, HistoryRetention, HistoryRevision, HeldContent, HeldFile, HeldRevisions, HeldRoom, KeptReceipt, ListedConversation, MdModelIdentity, Member, MutationRequest, MutationResult, PageToken, ProviderLimit, ProviderRefusal, RefreshPage, RefreshRequest, RefreshResult, Retention, RetryableRefusal, RevokedAuthorization, RoomModels, RoomNotReadable, RoomStream, RoomStreamEvent, RoomVersionAt, ServiceMode, ServiceModeSignal, StreamReceipts, TransportUncertainty, TurnContext, TurnOperation, TypedSelection, } from './adapter.js';
|
|
2
|
+
export type { Change, ChangeBatch, Precondition, RoomMove, WrittenBy } from './change.js';
|
|
3
3
|
export type { ChatDraft, ChatDraftSurface, ConversationAgent, ConversationEntry, ConversationOptions, ConversationState, ConversationSurface, ConversationView, RunningTurn, } from './conversation.js';
|
|
4
|
-
export type {
|
|
5
|
-
export type { AppRoom, AppTypedSelection, BinaryFileSurface, ConnectionRefusal, ConnectionRefusalCode, HistoryQuery, MdRuntime, MdRuntimeOptions, PresentationSurface, RoomDraftSurface, RoomSchemas, SavedRoomDraft, SaveResult, } from './connection.js';
|
|
4
|
+
export type { ChosenFile, FileDeclaration } from './file.js';
|
|
5
|
+
export type { AppRoom, AppTypedSelection, BinaryFileSurface, ConnectionRefusal, ConnectionRefusalCode, HistoryQuery, MdRuntime, MdRuntimeOptions, PresentationSurface, RoomDraftSurface, RoomSchemas, SavedParts, SavedRoomDraft, SaveResult, } from './connection.js';
|
|
6
6
|
export type { Observation } from './observation.js';
|
|
7
|
-
export type { BinaryAnswer, CallResult, Failure, HistoryAnswer, Offline, QueueEntry, Submission, } from './outcome.js';
|
|
8
|
-
export type { BinaryFileRecord
|
|
7
|
+
export type { BinaryAnswer, BinaryLinkAnswer, CallResult, Failure, HistoryAnswer, Offline, QueueEntry, Resolution, Submission, } from './outcome.js';
|
|
8
|
+
export type { BinaryFileRecord } from './binary.js';
|
|
9
9
|
export type { RuntimeError } from './failure.js';
|
|
10
10
|
export type { ChangedPart, FieldValue, ReturnReason, RoomDraft, RoomDraftCreation, RoomDraftParts, RoomDraftWrite, TextParts, } from './room-draft.js';
|
|
11
11
|
export type { SaveRefusal } from './save.js';
|
|
12
|
-
export type { DocumentHit, DocumentPart, MessageHit,
|
|
12
|
+
export type { DocumentHit, DocumentPart, MessageHit, MessagePart, SearchCoverage, SearchHits, SearchPending, SearchRequest, SearchResult, SearchUndeclared, Snippet, } from './search.js';
|
|
13
13
|
export { departure } from './change.js';
|
|
14
14
|
export { partsAfter } from './room-draft.js';
|
|
15
|
-
export {
|
|
15
|
+
export { cutName, nameFrom, transliterated } from './name.js';
|
|
16
|
+
export { HISTORY_CONVERSATIONS, SESSION_STARTED } from './conversation.js';
|
|
16
17
|
export { changeBatchIdentity } from './identity.js';
|
|
18
|
+
export { paced, ROW_WEIGHT, stepped } from './turn.js';
|
|
19
|
+
export { entriesIn, patching, sortedKeys } from './shared.js';
|
|
17
20
|
export { attempts, identities, intentOf, type Answered, type Attempt, type Attempts, type Identities, } from './attempt.js';
|
|
18
21
|
export { expectedList, expecting, type ExpectedOf, type Expecting } from './expectation.js';
|
|
19
|
-
export type { RuntimeShell
|
|
20
|
-
export type {
|
|
22
|
+
export type { RuntimeShell } from './durability.js';
|
|
23
|
+
export type { CodeAvailability, ConnectionAvailability, ConversationCoverage, Durability, HouseOutcome, Installation, InstallationAmount, InstallationPause, InstallationStep, Persistence, Readiness, ReadinessStatus, RefusedRoom, RoomCoverage, RoomPreparation, SearchObligation, Space, TargetCoverage, } from './readiness.js';
|
|
21
24
|
export type { AttentionEntry, SyncStatus } from './status.js';
|
|
22
25
|
export type { Awaits, Backlink, CoveredRoom, Direction, DocumentQuery, DocumentResult, Filter, GroupQuery, GroupResult, Key, LocalQuery, OrderOptions, PendingResult, PendingRoom, Predicate, QueryCoverage, QueryDocument, QueryGroup, QueryResult, QueryRows, Related, Select, Value, Where, } from './query.js';
|
|
23
26
|
export type { MdType, ModelIdentity, ModelSnapshot, ModelState, ModelResult, TypesResult, ValidationReceipt, } from './model.js';
|