@agentshouse/mdruntime 0.1.0-cdf82f77fae68 → 0.1.0-ceb97106cc2fd
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +259 -272
- package/dist/acquisition.d.ts +14 -0
- package/dist/acquisition.d.ts.map +1 -0
- package/dist/acquisition.js +24 -0
- package/dist/adapter.d.ts +37 -9
- package/dist/adapter.d.ts.map +1 -1
- package/dist/attempt.d.ts.map +1 -1
- package/dist/attempt.js +14 -1
- package/dist/bootstrap.d.ts +2 -2
- package/dist/bootstrap.d.ts.map +1 -1
- package/dist/bootstrap.js +32 -6
- package/dist/change-set.d.ts +2 -0
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +36 -10
- package/dist/chat/acts.d.ts +3 -4
- package/dist/chat/acts.d.ts.map +1 -1
- package/dist/chat/acts.js +10 -10
- package/dist/chat/kit.d.ts +2 -1
- package/dist/chat/kit.d.ts.map +1 -1
- package/dist/chat/kit.js +3 -3
- package/dist/chat/list.d.ts +8 -1
- package/dist/chat/list.d.ts.map +1 -1
- package/dist/chat/list.js +10 -6
- package/dist/chat/markdown.d.ts +2 -1
- package/dist/chat/markdown.d.ts.map +1 -1
- package/dist/chat/markdown.js +7 -6
- package/dist/chat/message.d.ts.map +1 -1
- package/dist/chat/message.js +2 -2
- package/dist/chat/messages.d.ts +1 -0
- package/dist/chat/messages.d.ts.map +1 -1
- package/dist/chat/messages.js +4 -0
- package/dist/chat/provider.d.ts +1 -1
- package/dist/chat/provider.d.ts.map +1 -1
- package/dist/chat/provider.js +51 -67
- package/dist/chat/ready.d.ts +1 -0
- package/dist/chat/ready.d.ts.map +1 -1
- package/dist/chat/ready.js +4 -4
- package/dist/chat/style.js +3 -3
- package/dist/client.d.ts +12 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -1
- package/dist/collection.d.ts +17 -3
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +230 -19
- package/dist/connection.d.ts +24 -7
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +1340 -318
- package/dist/conversation.d.ts +14 -7
- package/dist/conversation.d.ts.map +1 -1
- package/dist/conversation.js +328 -137
- package/dist/durability.d.ts +7 -1
- package/dist/durability.d.ts.map +1 -1
- package/dist/entry.d.ts +17 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +156 -0
- package/dist/fence.d.ts +6 -0
- package/dist/fence.d.ts.map +1 -0
- package/dist/fence.js +10 -0
- package/dist/host.d.ts +18 -3
- package/dist/host.d.ts.map +1 -1
- package/dist/host.js +89 -12
- package/dist/identity.d.ts +2 -0
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +6 -0
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/memory.d.ts +4 -1
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +23 -2
- package/dist/model.d.ts +4 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +10 -1
- package/dist/observation.d.ts +5 -2
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +22 -11
- package/dist/outcome.d.ts +4 -0
- package/dist/outcome.d.ts.map +1 -1
- package/dist/outcome.js +1 -0
- package/dist/overlay.d.ts +2 -0
- package/dist/overlay.d.ts.map +1 -1
- package/dist/overlay.js +58 -55
- package/dist/query.d.ts +34 -3
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +7 -1
- package/dist/reach.d.ts +6 -3
- package/dist/reach.d.ts.map +1 -1
- package/dist/reach.js +17 -5
- package/dist/react.d.ts +7 -4
- package/dist/react.d.ts.map +1 -1
- package/dist/react.js +6 -4
- package/dist/read-side.d.ts +13 -6
- package/dist/read-side.d.ts.map +1 -1
- package/dist/read-side.js +285 -83
- package/dist/readiness.d.ts +53 -0
- package/dist/readiness.d.ts.map +1 -0
- package/dist/readiness.js +33 -0
- package/dist/recovery.d.ts +25 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +197 -0
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +17 -10
- package/dist/replica.d.ts +1 -1
- package/dist/replica.d.ts.map +1 -1
- package/dist/replica.js +57 -20
- package/dist/room-draft.d.ts +13 -1
- package/dist/room-draft.d.ts.map +1 -1
- package/dist/room-draft.js +2 -2
- package/dist/rows.d.ts +5 -13
- package/dist/rows.d.ts.map +1 -1
- package/dist/rows.js +5 -13
- package/dist/save.d.ts +6 -2
- package/dist/save.d.ts.map +1 -1
- package/dist/save.js +42 -18
- package/dist/search.d.ts +34 -6
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +116 -45
- package/dist/seed.d.ts +16 -0
- package/dist/seed.d.ts.map +1 -0
- package/dist/seed.js +61 -0
- package/dist/shared.d.ts +11 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +368 -0
- package/dist/status.d.ts +4 -0
- package/dist/status.d.ts.map +1 -1
- package/dist/store.d.ts +45 -12
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +315 -85
- package/dist/turn.d.ts +7 -0
- package/dist/turn.d.ts.map +1 -0
- package/dist/turn.js +45 -0
- package/dist/wire.d.ts +136 -32
- package/dist/wire.d.ts.map +1 -1
- package/dist/wire.js +48 -31
- package/package.json +12 -8
package/dist/save.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { definitionOf } from './model.js';
|
|
2
2
|
import { apply, ATTACHMENT, links, parse, pointerSegments, references, relative, relativize, retarget, serialize, target, } from '@agentshouse/mdmodel';
|
|
3
3
|
import { immutable, queuedFile, departure, } from './change.js';
|
|
4
|
-
import { collectionOf, documentsOf, governing, validateCollection, } from './collection.js';
|
|
4
|
+
import { available, changedCleanly, collectionOf, documentsOf, governing, referring, validateCollection, } from './collection.js';
|
|
5
5
|
import { changeBatchIdentity } from './identity.js';
|
|
6
6
|
import { overlay } from './overlay.js';
|
|
7
7
|
import { covered, normalize } from './paths.js';
|
|
@@ -177,7 +177,7 @@ export function providerRewritten(batch, visible) {
|
|
|
177
177
|
...anticipated(batch.changes, batch.preconditions, rewritten.changes, visible),
|
|
178
178
|
};
|
|
179
179
|
}
|
|
180
|
-
function incoming(collection, removed) {
|
|
180
|
+
function incoming(collection, removed, candidates) {
|
|
181
181
|
const found = new Map();
|
|
182
182
|
const note = (target, file) => {
|
|
183
183
|
if (!removed.has(target))
|
|
@@ -186,7 +186,13 @@ function incoming(collection, removed) {
|
|
|
186
186
|
referrers.add(file);
|
|
187
187
|
found.set(target, referrers);
|
|
188
188
|
};
|
|
189
|
-
|
|
189
|
+
const read = candidates === null
|
|
190
|
+
? documentsOf(collection)
|
|
191
|
+
: [...new Set(candidates)].sort().flatMap((path) => {
|
|
192
|
+
const document = collection.document(path);
|
|
193
|
+
return document === undefined ? [] : [[path, document]];
|
|
194
|
+
});
|
|
195
|
+
for (const [path, document] of read) {
|
|
190
196
|
const definition = definitionOf(governing(collection.composition, path), document.type);
|
|
191
197
|
for (const { value, to } of definition === undefined ? [] : references(document, definition)) {
|
|
192
198
|
if (to.includes(ATTACHMENT))
|
|
@@ -217,10 +223,13 @@ function affected(change) {
|
|
|
217
223
|
return change.kind === 'move' ? [change.path, change.to] : [change.path];
|
|
218
224
|
}
|
|
219
225
|
function guard(changes, input) {
|
|
220
|
-
const
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
226
|
+
const overridden = new Map();
|
|
227
|
+
const existing = {
|
|
228
|
+
has: (path) => overridden.get(path) ??
|
|
229
|
+
(Object.hasOwn(input.visible.documents, path) || Object.hasOwn(input.visible.binaries, path)),
|
|
230
|
+
add: (path) => void overridden.set(path, true),
|
|
231
|
+
delete: (path) => void overridden.set(path, false),
|
|
232
|
+
};
|
|
224
233
|
for (const [index, change] of changes.entries()) {
|
|
225
234
|
for (const path of affected(change)) {
|
|
226
235
|
const normalized = normalize(path);
|
|
@@ -364,8 +373,8 @@ function preconditionsOf(changes, visible, bases) {
|
|
|
364
373
|
function depth(path) {
|
|
365
374
|
return path.split('/').length;
|
|
366
375
|
}
|
|
367
|
-
function exceeded(limits, changes, resulting) {
|
|
368
|
-
const written =
|
|
376
|
+
function exceeded(limits, changes, effective, resulting) {
|
|
377
|
+
const written = effective.map((change) => (change.kind === 'move' ? change.to : change.path));
|
|
369
378
|
const created = changes
|
|
370
379
|
.filter((change) => change.kind === 'create' || change.kind === 'move' || change.kind === 'binary')
|
|
371
380
|
.map((change) => (change.kind === 'move' ? change.to : change.path));
|
|
@@ -381,7 +390,7 @@ function exceeded(limits, changes, resulting) {
|
|
|
381
390
|
return refuse('provider-limit', undefined, limit.name);
|
|
382
391
|
}
|
|
383
392
|
if (limit.name === 'document-size') {
|
|
384
|
-
const large = written.find((path) => (resulting.documents[path] ?? '').
|
|
393
|
+
const large = written.find((path) => new TextEncoder().encode(resulting.documents[path] ?? '').byteLength > value);
|
|
385
394
|
if (large !== undefined)
|
|
386
395
|
return refuse('provider-limit', large, limit.name);
|
|
387
396
|
}
|
|
@@ -450,6 +459,8 @@ function relativeChanges(input) {
|
|
|
450
459
|
});
|
|
451
460
|
}
|
|
452
461
|
function unmodeledType(collection, composition) {
|
|
462
|
+
if (available(composition))
|
|
463
|
+
return false;
|
|
453
464
|
for (const [path, document] of documentsOf(collection)) {
|
|
454
465
|
if (document.type !== undefined &&
|
|
455
466
|
document.type !== 'any' &&
|
|
@@ -718,7 +729,8 @@ export function joined(queue, owner, extra) {
|
|
|
718
729
|
return { kind: 'joined', batch, queue: queue.map((item) => (item === owner ? batch : item)) };
|
|
719
730
|
}
|
|
720
731
|
export function limitedIn(queue, batch, limits, state) {
|
|
721
|
-
const
|
|
732
|
+
const at = queue.indexOf(batch);
|
|
733
|
+
const limited = exceeded(limits, batch.changes, providerRewritten(batch, state(queue.slice(0, at))).changes, state(queue.slice(0, at + 1)));
|
|
722
734
|
return limited?.kind === 'refused' ? limited.refusal : null;
|
|
723
735
|
}
|
|
724
736
|
export function buildBatch(input) {
|
|
@@ -739,9 +751,16 @@ export function buildBatch(input) {
|
|
|
739
751
|
const resulting = overlay(input.visible, [
|
|
740
752
|
{ id: '', baseRoomVersion: input.baseRoomVersion, ...predicted },
|
|
741
753
|
]);
|
|
754
|
+
const clean = input.clean !== undefined &&
|
|
755
|
+
input.clean.text === input.visible.documents &&
|
|
756
|
+
input.clean.binaries === input.visible.binaries &&
|
|
757
|
+
available(input.composition)
|
|
758
|
+
? input.clean
|
|
759
|
+
: null;
|
|
742
760
|
const removed = new Set(changes.filter((change) => change.kind === 'remove').map((change) => change.path));
|
|
743
761
|
if (removed.size > 0) {
|
|
744
|
-
const
|
|
762
|
+
const referrers = clean === null ? null : referring(clean, input.composition, removed);
|
|
763
|
+
const referenced = incoming(collectionOf(resulting.documents, input.composition), removed, referrers === null ? null : [...referrers, ...predicted.changes.flatMap(affected)]);
|
|
745
764
|
if (referenced !== null)
|
|
746
765
|
return referenced;
|
|
747
766
|
}
|
|
@@ -751,15 +770,20 @@ export function buildBatch(input) {
|
|
|
751
770
|
const parsed = parse(content);
|
|
752
771
|
return parsed.ok && parsed.document.type !== undefined && parsed.document.type !== 'any';
|
|
753
772
|
};
|
|
754
|
-
const
|
|
773
|
+
const touched = [...new Set(predicted.changes.flatMap(affected))];
|
|
774
|
+
const typedPaths = touched.filter((path) => typed(input.visible.documents[path]) || typed(resulting.documents[path]));
|
|
755
775
|
const needsModel = typedPaths.length > 0;
|
|
756
776
|
const withoutModel = typedPaths.find((path) => governing(input.composition, path).status === 'unavailable');
|
|
757
777
|
if (withoutModel !== undefined)
|
|
758
778
|
return refuse('model-unavailable', withoutModel);
|
|
759
|
-
const
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
779
|
+
const verdict = clean !== null &&
|
|
780
|
+
changedCleanly({ text: resulting.documents, binaries: resulting.binaries }, clean, input.composition)
|
|
781
|
+
? { verdict: 'accept' }
|
|
782
|
+
: validateCollection(needsModel
|
|
783
|
+
? resulting.documents
|
|
784
|
+
: Object.fromEntries(touched.flatMap((path) => resulting.documents[path] === undefined
|
|
785
|
+
? []
|
|
786
|
+
: [[path, resulting.documents[path]]])), Object.keys(resulting.binaries), input.composition);
|
|
763
787
|
if (verdict.verdict === 'refuse') {
|
|
764
788
|
return {
|
|
765
789
|
kind: 'refused',
|
|
@@ -772,7 +796,7 @@ export function buildBatch(input) {
|
|
|
772
796
|
},
|
|
773
797
|
};
|
|
774
798
|
}
|
|
775
|
-
const limited = exceeded(input.providerLimits, changes, resulting);
|
|
799
|
+
const limited = exceeded(input.providerLimits, changes, predicted.changes, resulting);
|
|
776
800
|
if (limited !== null)
|
|
777
801
|
return limited;
|
|
778
802
|
const validated = typedPaths
|
package/dist/search.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { ProviderRefusal } from './adapter.js';
|
|
1
2
|
import type { ChangeSet } from './change-set.js';
|
|
2
|
-
import { type Filter } from './query.js';
|
|
3
|
+
import { type CoveredRoom, type Filter, type PendingRoom } from './query.js';
|
|
3
4
|
import type { Open } from './open.js';
|
|
4
5
|
export type DocumentPart = Open<'fields' | 'sections' | 'preamble' | 'path'>;
|
|
5
6
|
export type SearchRequest = {
|
|
@@ -21,10 +22,31 @@ export type MessageHit = {
|
|
|
21
22
|
score: number;
|
|
22
23
|
matches: Readonly<Record<string, readonly Open<'text'>[]>>;
|
|
23
24
|
};
|
|
24
|
-
export type
|
|
25
|
+
export type SearchCoverage = {
|
|
26
|
+
rooms: readonly CoveredRoom[];
|
|
27
|
+
conversations: readonly string[];
|
|
28
|
+
index: string;
|
|
29
|
+
overlay: readonly string[];
|
|
30
|
+
};
|
|
31
|
+
export type PendingConversation = {
|
|
32
|
+
conversation: string;
|
|
33
|
+
awaits: Open<'index'>;
|
|
34
|
+
};
|
|
35
|
+
export type SearchHits = {
|
|
25
36
|
documents: readonly DocumentHit[];
|
|
26
37
|
messages: readonly MessageHit[];
|
|
27
38
|
};
|
|
39
|
+
export type SearchPending = SearchHits & {
|
|
40
|
+
pending: readonly (PendingRoom | PendingConversation)[];
|
|
41
|
+
coverage: SearchCoverage;
|
|
42
|
+
};
|
|
43
|
+
export type SearchUndeclared = ProviderRefusal & {
|
|
44
|
+
kind: 'undeclared';
|
|
45
|
+
};
|
|
46
|
+
export type SearchResult = (SearchHits & {
|
|
47
|
+
coverage: SearchCoverage;
|
|
48
|
+
}) | SearchPending | SearchUndeclared;
|
|
49
|
+
export declare function undeclaredSearch(): SearchUndeclared;
|
|
28
50
|
export type SearchedDocument = {
|
|
29
51
|
room: string;
|
|
30
52
|
path: string;
|
|
@@ -39,10 +61,8 @@ export type SearchedMessage = {
|
|
|
39
61
|
text: string;
|
|
40
62
|
};
|
|
41
63
|
export type SearchSource = {
|
|
42
|
-
|
|
64
|
+
room(room: string): readonly string[];
|
|
43
65
|
document(room: string, path: string): SearchedDocument | null;
|
|
44
|
-
messages(): readonly SearchedMessage[];
|
|
45
|
-
message(conversation: string, identity: string): SearchedMessage | null;
|
|
46
66
|
};
|
|
47
67
|
export type SearchPlan = {
|
|
48
68
|
text: string;
|
|
@@ -51,11 +71,19 @@ export type SearchPlan = {
|
|
|
51
71
|
limit: number | null;
|
|
52
72
|
};
|
|
53
73
|
export type SearchIndex = {
|
|
74
|
+
generation(): string;
|
|
75
|
+
rooms(): ReadonlySet<string>;
|
|
76
|
+
conversations(): ReadonlySet<string>;
|
|
77
|
+
indexRoom(room: string): Promise<void>;
|
|
78
|
+
indexMessages(conversation: string, messages: readonly SearchedMessage[], whole: boolean): void;
|
|
79
|
+
forget(rooms: readonly string[]): void;
|
|
54
80
|
changed(set: ChangeSet): void;
|
|
81
|
+
changes(): number;
|
|
82
|
+
caughtUp(): Promise<void>;
|
|
55
83
|
search(plan: SearchPlan, documents: readonly {
|
|
56
84
|
room: string;
|
|
57
85
|
path: string;
|
|
58
|
-
}[] | null):
|
|
86
|
+
}[] | null, conversations: readonly string[], rooms: ReadonlySet<string> | null): SearchHits;
|
|
59
87
|
};
|
|
60
88
|
export declare function searchPlanOf(input: unknown): SearchPlan;
|
|
61
89
|
export declare function createSearchIndex(source: SearchSource): SearchIndex;
|
package/dist/search.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,WAAW,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC,CAAC;AAE7E,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAElF,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,SAAS,WAAW,EAAE,CAAC;IAClC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG;IACvC,OAAO,EAAE,SAAS,CAAC,WAAW,GAAG,mBAAmB,CAAC,EAAE,CAAC;IACxD,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,YAAY,GACpB,CAAC,UAAU,GAAG;IAAE,QAAQ,EAAE,cAAc,CAAA;CAAE,CAAC,GAC3C,aAAa,GACb,gBAAgB,CAAC;AAErB,wBAAgB,gBAAgB,IAAI,gBAAgB,CAOnD;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;CAC/D,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,IAAI,MAAM,CAAC;IACrB,KAAK,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,aAAa,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IACrC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,eAAe,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAChG,MAAM,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IACvC,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,MAAM,CAAC;IAClB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,CACJ,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,SAAS;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,IAAI,EAC3D,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAChC,UAAU,CAAC;CACf,CAAC;AA4BF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAiBvD;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAkKnE"}
|
package/dist/search.js
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import MiniSearch from 'minisearch';
|
|
2
|
-
import {
|
|
2
|
+
import { indexGeneration } from './identity.js';
|
|
3
|
+
import { invalid, known, limitOf, plain, } from './query.js';
|
|
4
|
+
import { inUnits, ROW_WEIGHT } from './turn.js';
|
|
5
|
+
export function undeclaredSearch() {
|
|
6
|
+
return {
|
|
7
|
+
kind: 'undeclared',
|
|
8
|
+
code: 'search-undeclared',
|
|
9
|
+
fields: { name: 'local_search' },
|
|
10
|
+
retryable: false,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
3
13
|
const FIELDS = ['fields', 'sections', 'preamble', 'path', 'text'];
|
|
4
14
|
function documentId(room, path) {
|
|
5
15
|
return JSON.stringify(['document', room, path]);
|
|
@@ -35,15 +45,20 @@ export function searchPlanOf(input) {
|
|
|
35
45
|
};
|
|
36
46
|
}
|
|
37
47
|
export function createSearchIndex(source) {
|
|
38
|
-
|
|
48
|
+
const generation = indexGeneration();
|
|
49
|
+
const index = new MiniSearch({ fields: FIELDS });
|
|
39
50
|
const documents = new Map();
|
|
40
51
|
const messages = new Map();
|
|
52
|
+
const rooms = new Set();
|
|
53
|
+
const filling = new Set();
|
|
54
|
+
const conversations = new Set();
|
|
55
|
+
const acquiring = new Set();
|
|
41
56
|
const changedDocuments = new Map();
|
|
42
|
-
|
|
43
|
-
function addDocument(
|
|
57
|
+
let changes = 0;
|
|
58
|
+
function addDocument(document) {
|
|
44
59
|
const id = documentId(document.room, document.path);
|
|
45
|
-
|
|
46
|
-
|
|
60
|
+
discard(id, documents);
|
|
61
|
+
index.add({
|
|
47
62
|
id,
|
|
48
63
|
fields: scalars(document.fields).join('\n'),
|
|
49
64
|
sections: Object.entries(document.sections)
|
|
@@ -52,43 +67,48 @@ export function createSearchIndex(source) {
|
|
|
52
67
|
preamble: document.preamble,
|
|
53
68
|
path: document.path,
|
|
54
69
|
});
|
|
70
|
+
documents.set(id, { room: document.room, path: document.path, type: document.type });
|
|
55
71
|
}
|
|
56
|
-
function addMessage(
|
|
72
|
+
function addMessage(message) {
|
|
57
73
|
const id = messageId(message.conversation, message.identity);
|
|
74
|
+
discard(id, messages);
|
|
75
|
+
index.add({ id, text: message.text });
|
|
58
76
|
messages.set(id, { conversation: message.conversation, identity: message.identity });
|
|
59
|
-
built.add({ id, text: message.text });
|
|
60
77
|
}
|
|
61
|
-
function
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
78
|
+
function discard(id, entries) {
|
|
79
|
+
if (entries.delete(id))
|
|
80
|
+
index.discard(id);
|
|
81
|
+
}
|
|
82
|
+
function* pending() {
|
|
83
|
+
for (;;) {
|
|
84
|
+
const next = changedDocuments.entries().next();
|
|
85
|
+
if (next.done === true)
|
|
86
|
+
return;
|
|
87
|
+
changedDocuments.delete(next.value[0]);
|
|
88
|
+
yield next.value;
|
|
70
89
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
90
|
+
}
|
|
91
|
+
let catching = null;
|
|
92
|
+
function caughtUp() {
|
|
93
|
+
if (catching !== null)
|
|
94
|
+
return catching;
|
|
95
|
+
const running = inUnits(pending(), ([id, { room, path }]) => {
|
|
96
|
+
discard(id, documents);
|
|
75
97
|
const document = source.document(room, path);
|
|
76
|
-
if (document
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
changedMessages.clear();
|
|
88
|
-
return built;
|
|
98
|
+
if (document === null)
|
|
99
|
+
return ROW_WEIGHT;
|
|
100
|
+
addDocument(document);
|
|
101
|
+
return Object.values(document.sections).reduce((total, text) => total + text.length, ROW_WEIGHT + document.preamble.length);
|
|
102
|
+
});
|
|
103
|
+
if (!(running instanceof Promise))
|
|
104
|
+
return Promise.resolve();
|
|
105
|
+
catching = running.finally(() => {
|
|
106
|
+
catching = null;
|
|
107
|
+
});
|
|
108
|
+
return catching;
|
|
89
109
|
}
|
|
90
|
-
function ranked(
|
|
91
|
-
const found =
|
|
110
|
+
function ranked(text, entries, keep, limit) {
|
|
111
|
+
const found = index.search(text, {
|
|
92
112
|
filter: ({ id }) => {
|
|
93
113
|
const entry = entries.get(id);
|
|
94
114
|
return entry !== undefined && keep(entry, id);
|
|
@@ -101,24 +121,75 @@ export function createSearchIndex(source) {
|
|
|
101
121
|
}));
|
|
102
122
|
}
|
|
103
123
|
return {
|
|
104
|
-
|
|
105
|
-
|
|
124
|
+
generation: () => generation,
|
|
125
|
+
rooms: () => rooms,
|
|
126
|
+
conversations: () => conversations,
|
|
127
|
+
async indexRoom(room) {
|
|
128
|
+
if (rooms.has(room) || filling.has(room))
|
|
129
|
+
return;
|
|
130
|
+
filling.add(room);
|
|
131
|
+
try {
|
|
132
|
+
await inUnits(source.room(room), (path) => {
|
|
133
|
+
const document = filling.has(room) ? source.document(room, path) : null;
|
|
134
|
+
if (document === null)
|
|
135
|
+
return ROW_WEIGHT;
|
|
136
|
+
addDocument(document);
|
|
137
|
+
return Object.values(document.sections).reduce((total, text) => total + text.length, ROW_WEIGHT + document.preamble.length);
|
|
138
|
+
});
|
|
139
|
+
if (filling.has(room))
|
|
140
|
+
rooms.add(room);
|
|
141
|
+
}
|
|
142
|
+
finally {
|
|
143
|
+
filling.delete(room);
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
indexMessages(conversation, arriving, whole) {
|
|
147
|
+
for (const message of arriving)
|
|
148
|
+
addMessage(message);
|
|
149
|
+
if (!whole) {
|
|
150
|
+
acquiring.add(conversation);
|
|
106
151
|
return;
|
|
152
|
+
}
|
|
153
|
+
acquiring.delete(conversation);
|
|
154
|
+
conversations.add(conversation);
|
|
155
|
+
},
|
|
156
|
+
forget(leaving) {
|
|
157
|
+
const gone = new Set(leaving);
|
|
158
|
+
for (const [id, entry] of documents)
|
|
159
|
+
if (gone.has(entry.room))
|
|
160
|
+
discard(id, documents);
|
|
161
|
+
for (const room of leaving) {
|
|
162
|
+
rooms.delete(room);
|
|
163
|
+
filling.delete(room);
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
changed(set) {
|
|
167
|
+
changes += 1;
|
|
107
168
|
for (const { locator, path } of set.documents) {
|
|
108
|
-
|
|
169
|
+
if (rooms.has(locator) || filling.has(locator)) {
|
|
170
|
+
changedDocuments.set(documentId(locator, path), { room: locator, path });
|
|
171
|
+
}
|
|
109
172
|
}
|
|
110
|
-
for (const { conversation, identity } of set.messages) {
|
|
111
|
-
|
|
173
|
+
for (const { conversation, identity, text } of set.messages) {
|
|
174
|
+
if (!conversations.has(conversation) && !acquiring.has(conversation))
|
|
175
|
+
continue;
|
|
176
|
+
const id = messageId(conversation, identity);
|
|
177
|
+
if (text === null)
|
|
178
|
+
discard(id, messages);
|
|
179
|
+
else
|
|
180
|
+
addMessage({ conversation, identity, text });
|
|
112
181
|
}
|
|
113
182
|
},
|
|
114
|
-
|
|
115
|
-
|
|
183
|
+
changes: () => changes,
|
|
184
|
+
caughtUp,
|
|
185
|
+
search({ text, limit }, selected, named, within) {
|
|
116
186
|
const chosen = selected === null
|
|
117
187
|
? null
|
|
118
188
|
: new Set(selected.map(({ room, path }) => documentId(room, path)));
|
|
189
|
+
const asked = new Set(named);
|
|
119
190
|
return {
|
|
120
|
-
documents: ranked(
|
|
121
|
-
messages: ranked(
|
|
191
|
+
documents: ranked(text, documents, ({ room }, id) => (chosen === null || chosen.has(id)) && (within === null || within.has(room)), limit).map(({ match, ...hit }) => ({ ...hit, matches: match })),
|
|
192
|
+
messages: ranked(text, messages, ({ conversation }) => asked.has(conversation), limit).map(({ match, ...hit }) => ({ ...hit, matches: match })),
|
|
122
193
|
};
|
|
123
194
|
},
|
|
124
195
|
};
|
package/dist/seed.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { KeyedResult } from './observation.js';
|
|
2
|
+
import type { QueryRows } from './query.js';
|
|
3
|
+
export type EntrySeed = {
|
|
4
|
+
readonly at: Readonly<Record<string, string>>;
|
|
5
|
+
readonly queries: readonly {
|
|
6
|
+
readonly query: unknown;
|
|
7
|
+
readonly rows: QueryRows;
|
|
8
|
+
}[];
|
|
9
|
+
};
|
|
10
|
+
export type Seeded = {
|
|
11
|
+
readonly rows: QueryRows;
|
|
12
|
+
readonly at: Readonly<Record<string, string>>;
|
|
13
|
+
};
|
|
14
|
+
export declare function entrySeedOf(value: unknown): EntrySeed | null;
|
|
15
|
+
export declare function seededResult(seed: Seeded): KeyedResult;
|
|
16
|
+
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../src/seed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAA4C,SAAS,EAAE,MAAM,YAAY,CAAC;AAGtF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;KAAE,EAAE,CAAC;CACpF,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AA0BjG,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI,CAe5D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAoBtD"}
|
package/dist/seed.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { documentKey } from './rows.js';
|
|
2
|
+
function plain(value) {
|
|
3
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
4
|
+
}
|
|
5
|
+
function rowsOf(value) {
|
|
6
|
+
if (!plain(value))
|
|
7
|
+
return null;
|
|
8
|
+
if (Array.isArray(value.groups)) {
|
|
9
|
+
const groups = value.groups;
|
|
10
|
+
return groups.every((group) => plain(group) && Array.isArray(group.key) && typeof group.count === 'number')
|
|
11
|
+
? { groups: groups }
|
|
12
|
+
: null;
|
|
13
|
+
}
|
|
14
|
+
if (!Array.isArray(value.documents))
|
|
15
|
+
return null;
|
|
16
|
+
const documents = value.documents;
|
|
17
|
+
return documents.every((document) => plain(document) && typeof document.room === 'string' && typeof document.path === 'string')
|
|
18
|
+
? { documents: documents }
|
|
19
|
+
: null;
|
|
20
|
+
}
|
|
21
|
+
export function entrySeedOf(value) {
|
|
22
|
+
if (!plain(value) || !plain(value.at) || !Array.isArray(value.queries))
|
|
23
|
+
return null;
|
|
24
|
+
const at = {};
|
|
25
|
+
for (const [room, version] of Object.entries(value.at)) {
|
|
26
|
+
if (typeof version !== 'string')
|
|
27
|
+
return null;
|
|
28
|
+
at[room] = version;
|
|
29
|
+
}
|
|
30
|
+
const queries = [];
|
|
31
|
+
for (const entry of value.queries) {
|
|
32
|
+
if (!plain(entry) || !plain(entry.query))
|
|
33
|
+
return null;
|
|
34
|
+
const rows = rowsOf(entry.rows);
|
|
35
|
+
if (rows === null)
|
|
36
|
+
return null;
|
|
37
|
+
queries.push({ query: entry.query, rows });
|
|
38
|
+
}
|
|
39
|
+
return { at, queries };
|
|
40
|
+
}
|
|
41
|
+
export function seededResult(seed) {
|
|
42
|
+
const coverage = {
|
|
43
|
+
rooms: Object.entries(seed.at).map(([room, generation]) => ({
|
|
44
|
+
room,
|
|
45
|
+
generation,
|
|
46
|
+
current: false,
|
|
47
|
+
})),
|
|
48
|
+
indexes: [],
|
|
49
|
+
overlay: [],
|
|
50
|
+
};
|
|
51
|
+
if ('groups' in seed.rows) {
|
|
52
|
+
return {
|
|
53
|
+
result: { groups: seed.rows.groups, coverage },
|
|
54
|
+
keys: seed.rows.groups.map((_group, index) => index),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
result: { documents: seed.rows.documents, coverage },
|
|
59
|
+
keys: seed.rows.documents.map((document) => documentKey(document.room, document.path)),
|
|
60
|
+
};
|
|
61
|
+
}
|
package/dist/shared.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type Paths<V> = Readonly<Record<string, V>>;
|
|
2
|
+
type Weigh<V> = (key: string, value: V) => number;
|
|
3
|
+
export declare function shared<V>(map: Paths<V>): Paths<V>;
|
|
4
|
+
export declare function patched<V>(base: Paths<V>, set: Iterable<readonly [string, V]>, removed?: Iterable<string>): Paths<V>;
|
|
5
|
+
export declare function tally<V>(map: Paths<V>, weigh: Weigh<V>): number;
|
|
6
|
+
export declare function sizeOf<V>(map: Paths<V>): number;
|
|
7
|
+
export declare function differing<V>(left: Paths<V>, right: Paths<V>, same?: (left: V, right: V) => boolean): ReadonlySet<string>;
|
|
8
|
+
export declare function drafted<V>(base: Paths<V>): Record<string, V>;
|
|
9
|
+
export declare function settled<V>(draft: Record<string, V>): Paths<V>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AAkBnD,KAAK,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC;AA6LlD,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAEjD;AAED,wBAAgB,OAAO,CAAC,CAAC,EACvB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EACnC,OAAO,GAAE,QAAQ,CAAC,MAAM,CAAM,GAC7B,KAAK,CAAC,CAAC,CAAC,CA8BV;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAY/D;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAE/C;AAuCD,wBAAgB,SAAS,CAAC,CAAC,EACzB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EACd,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,IAAI,GAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,OAAmB,GAC/C,WAAW,CAAC,MAAM,CAAC,CAcrB;AAMD,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAiD5D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAS7D"}
|