@agentshouse/mdruntime 0.1.0-ce131cb435f8b → 0.1.0-ce41fec66d91b

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.
Files changed (229) hide show
  1. package/README.md +18 -15
  2. package/dist/adapter.d.ts +110 -72
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +5 -1
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +38 -4
  7. package/dist/binary.d.ts +0 -5
  8. package/dist/binary.d.ts.map +1 -1
  9. package/dist/binary.js +1 -1
  10. package/dist/bootstrap.d.ts +25 -10
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +180 -103
  13. package/dist/chain.d.ts +11 -0
  14. package/dist/chain.d.ts.map +1 -0
  15. package/dist/chain.js +64 -0
  16. package/dist/change-set.d.ts +9 -16
  17. package/dist/change-set.d.ts.map +1 -1
  18. package/dist/change-set.js +11 -89
  19. package/dist/change.d.ts +31 -1
  20. package/dist/change.d.ts.map +1 -1
  21. package/dist/change.js +10 -1
  22. package/dist/client.d.ts +11 -8
  23. package/dist/client.d.ts.map +1 -1
  24. package/dist/client.js +80 -7
  25. package/dist/collection.d.ts +10 -22
  26. package/dist/collection.d.ts.map +1 -1
  27. package/dist/collection.js +39 -356
  28. package/dist/compile.d.ts +16 -0
  29. package/dist/compile.d.ts.map +1 -0
  30. package/dist/compile.js +786 -0
  31. package/dist/connection.d.ts +17 -11
  32. package/dist/connection.d.ts.map +1 -1
  33. package/dist/connection.js +2779 -1329
  34. package/dist/conversation.d.ts +19 -11
  35. package/dist/conversation.d.ts.map +1 -1
  36. package/dist/conversation.js +298 -166
  37. package/dist/digest.d.ts +7 -0
  38. package/dist/digest.d.ts.map +1 -0
  39. package/dist/digest.js +113 -0
  40. package/dist/durability.d.ts +2 -5
  41. package/dist/durability.d.ts.map +1 -1
  42. package/dist/durability.js +5 -0
  43. package/dist/entry.d.ts +4 -1
  44. package/dist/entry.d.ts.map +1 -1
  45. package/dist/entry.js +18 -24
  46. package/dist/file.d.ts +2 -19
  47. package/dist/file.d.ts.map +1 -1
  48. package/dist/file.js +7 -122
  49. package/dist/fulltext.d.ts +27 -0
  50. package/dist/fulltext.d.ts.map +1 -0
  51. package/dist/fulltext.js +370 -0
  52. package/dist/host.d.ts +3 -5
  53. package/dist/host.d.ts.map +1 -1
  54. package/dist/host.js +48 -21
  55. package/dist/identity.d.ts +0 -1
  56. package/dist/identity.d.ts.map +1 -1
  57. package/dist/identity.js +0 -3
  58. package/dist/index.d.ts +14 -11
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +6 -2
  61. package/dist/live.d.ts +22 -0
  62. package/dist/live.d.ts.map +1 -0
  63. package/dist/live.js +123 -0
  64. package/dist/media.d.ts +8 -0
  65. package/dist/media.d.ts.map +1 -0
  66. package/dist/media.js +218 -0
  67. package/dist/memory.d.ts +10 -6
  68. package/dist/memory.d.ts.map +1 -1
  69. package/dist/memory.js +195 -102
  70. package/dist/messages.d.ts +28 -0
  71. package/dist/messages.d.ts.map +1 -0
  72. package/dist/messages.js +90 -0
  73. package/dist/model.d.ts +6 -1
  74. package/dist/model.d.ts.map +1 -1
  75. package/dist/model.js +7 -10
  76. package/dist/name.d.ts +4 -0
  77. package/dist/name.d.ts.map +1 -0
  78. package/dist/name.js +122 -0
  79. package/dist/observation.d.ts +13 -0
  80. package/dist/observation.d.ts.map +1 -1
  81. package/dist/observation.js +84 -0
  82. package/dist/opened.d.ts +22 -0
  83. package/dist/opened.d.ts.map +1 -0
  84. package/dist/opened.js +107 -0
  85. package/dist/outcome.d.ts +40 -8
  86. package/dist/outcome.d.ts.map +1 -1
  87. package/dist/outcome.js +38 -2
  88. package/dist/overlay.d.ts +2 -6
  89. package/dist/overlay.d.ts.map +1 -1
  90. package/dist/overlay.js +87 -176
  91. package/dist/paths.d.ts +1 -0
  92. package/dist/paths.d.ts.map +1 -1
  93. package/dist/paths.js +4 -0
  94. package/dist/query.d.ts +11 -1
  95. package/dist/query.d.ts.map +1 -1
  96. package/dist/query.js +13 -1
  97. package/dist/reach.d.ts +13 -4
  98. package/dist/reach.d.ts.map +1 -1
  99. package/dist/reach.js +200 -78
  100. package/dist/readiness.d.ts +14 -15
  101. package/dist/readiness.d.ts.map +1 -1
  102. package/dist/readiness.js +2 -8
  103. package/dist/recovery.d.ts +3 -2
  104. package/dist/recovery.d.ts.map +1 -1
  105. package/dist/recovery.js +34 -7
  106. package/dist/refresh.d.ts +18 -15
  107. package/dist/refresh.d.ts.map +1 -1
  108. package/dist/refresh.js +136 -58
  109. package/dist/replica.d.ts +55 -38
  110. package/dist/replica.d.ts.map +1 -1
  111. package/dist/replica.js +278 -198
  112. package/dist/room-draft.d.ts +21 -3
  113. package/dist/room-draft.d.ts.map +1 -1
  114. package/dist/room-draft.js +102 -28
  115. package/dist/rows.d.ts +38 -31
  116. package/dist/rows.d.ts.map +1 -1
  117. package/dist/rows.js +173 -101
  118. package/dist/save.d.ts +52 -15
  119. package/dist/save.d.ts.map +1 -1
  120. package/dist/save.js +504 -182
  121. package/dist/search.d.ts +11 -43
  122. package/dist/search.d.ts.map +1 -1
  123. package/dist/search.js +0 -213
  124. package/dist/shared.d.ts +4 -3
  125. package/dist/shared.d.ts.map +1 -1
  126. package/dist/shared.js +62 -35
  127. package/dist/status.d.ts +4 -3
  128. package/dist/status.d.ts.map +1 -1
  129. package/dist/status.js +3 -1
  130. package/dist/store.d.ts +81 -101
  131. package/dist/store.d.ts.map +1 -1
  132. package/dist/store.js +300 -693
  133. package/dist/stored.d.ts +130 -0
  134. package/dist/stored.d.ts.map +1 -0
  135. package/dist/stored.js +560 -0
  136. package/dist/tables.d.ts +325 -0
  137. package/dist/tables.d.ts.map +1 -0
  138. package/dist/tables.js +578 -0
  139. package/dist/transfer.d.ts +0 -5
  140. package/dist/transfer.d.ts.map +1 -1
  141. package/dist/turn.d.ts +2 -2
  142. package/dist/turn.d.ts.map +1 -1
  143. package/dist/turn.js +34 -23
  144. package/dist/validation.d.ts +29 -0
  145. package/dist/validation.d.ts.map +1 -0
  146. package/dist/validation.js +101 -0
  147. package/dist/windows.d.ts +2 -6
  148. package/dist/windows.d.ts.map +1 -1
  149. package/dist/windows.js +30 -34
  150. package/dist/wire.d.ts +17 -5
  151. package/dist/wire.d.ts.map +1 -1
  152. package/dist/wire.js +5 -2
  153. package/dist/words.d.ts +19 -0
  154. package/dist/words.d.ts.map +1 -0
  155. package/dist/words.js +156 -0
  156. package/package.json +18 -19
  157. package/AGENTS.md +0 -299
  158. package/dist/chat/acts.d.ts +0 -33
  159. package/dist/chat/acts.d.ts.map +0 -1
  160. package/dist/chat/acts.js +0 -36
  161. package/dist/chat/context.d.ts +0 -3
  162. package/dist/chat/context.d.ts.map +0 -1
  163. package/dist/chat/context.js +0 -10
  164. package/dist/chat/earlier.d.ts +0 -10
  165. package/dist/chat/earlier.d.ts.map +0 -1
  166. package/dist/chat/earlier.js +0 -54
  167. package/dist/chat/input.d.ts +0 -9
  168. package/dist/chat/input.d.ts.map +0 -1
  169. package/dist/chat/input.js +0 -99
  170. package/dist/chat/kit.d.ts +0 -61
  171. package/dist/chat/kit.d.ts.map +0 -1
  172. package/dist/chat/kit.js +0 -123
  173. package/dist/chat/lasting.d.ts +0 -6
  174. package/dist/chat/lasting.d.ts.map +0 -1
  175. package/dist/chat/lasting.js +0 -19
  176. package/dist/chat/list.d.ts +0 -27
  177. package/dist/chat/list.d.ts.map +0 -1
  178. package/dist/chat/list.js +0 -99
  179. package/dist/chat/markdown.d.ts +0 -20
  180. package/dist/chat/markdown.d.ts.map +0 -1
  181. package/dist/chat/markdown.js +0 -188
  182. package/dist/chat/message.d.ts +0 -6
  183. package/dist/chat/message.d.ts.map +0 -1
  184. package/dist/chat/message.js +0 -192
  185. package/dist/chat/messages.d.ts +0 -22
  186. package/dist/chat/messages.d.ts.map +0 -1
  187. package/dist/chat/messages.js +0 -155
  188. package/dist/chat/name.d.ts +0 -6
  189. package/dist/chat/name.d.ts.map +0 -1
  190. package/dist/chat/name.js +0 -37
  191. package/dist/chat/opened.d.ts +0 -11
  192. package/dist/chat/opened.d.ts.map +0 -1
  193. package/dist/chat/opened.js +0 -17
  194. package/dist/chat/overlay.d.ts +0 -31
  195. package/dist/chat/overlay.d.ts.map +0 -1
  196. package/dist/chat/overlay.js +0 -97
  197. package/dist/chat/parts.d.ts +0 -57
  198. package/dist/chat/parts.d.ts.map +0 -1
  199. package/dist/chat/parts.js +0 -119
  200. package/dist/chat/process.d.ts +0 -20
  201. package/dist/chat/process.d.ts.map +0 -1
  202. package/dist/chat/process.js +0 -32
  203. package/dist/chat/provider.d.ts +0 -63
  204. package/dist/chat/provider.d.ts.map +0 -1
  205. package/dist/chat/provider.js +0 -628
  206. package/dist/chat/question.d.ts +0 -9
  207. package/dist/chat/question.d.ts.map +0 -1
  208. package/dist/chat/question.js +0 -69
  209. package/dist/chat/questions.d.ts +0 -31
  210. package/dist/chat/questions.d.ts.map +0 -1
  211. package/dist/chat/questions.js +0 -111
  212. package/dist/chat/read.d.ts +0 -5
  213. package/dist/chat/read.d.ts.map +0 -1
  214. package/dist/chat/read.js +0 -13
  215. package/dist/chat/ready.d.ts +0 -34
  216. package/dist/chat/ready.d.ts.map +0 -1
  217. package/dist/chat/ready.js +0 -91
  218. package/dist/chat/style.d.ts +0 -4
  219. package/dist/chat/style.d.ts.map +0 -1
  220. package/dist/chat/style.js +0 -302
  221. package/dist/chat.d.ts +0 -14
  222. package/dist/chat.d.ts.map +0 -1
  223. package/dist/chat.js +0 -8
  224. package/dist/read-side.d.ts +0 -27
  225. package/dist/read-side.d.ts.map +0 -1
  226. package/dist/read-side.js +0 -824
  227. package/dist/reads.d.ts +0 -11
  228. package/dist/reads.d.ts.map +0 -1
  229. package/dist/reads.js +0 -98
package/dist/search.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  import type { ProviderRefusal } from './adapter.js';
2
- import type { ChangeSet } from './change-set.js';
3
2
  import { type CoveredRoom, type Filter, type PendingRoom } from './query.js';
4
3
  import type { Open } from './open.js';
5
4
  export type DocumentPart = Open<'fields' | 'sections' | 'preamble' | 'path'>;
@@ -12,29 +11,32 @@ export type SearchRequest = {
12
11
  after?: string;
13
12
  total?: true;
14
13
  };
14
+ export type MessagePart = Open<'text'>;
15
+ export type Snippet<Part extends string> = {
16
+ part: Part;
17
+ text: string;
18
+ at: readonly [number, number];
19
+ };
15
20
  export type DocumentHit = {
16
21
  room: string;
17
22
  path: string;
18
23
  type: string;
19
24
  score: number;
20
25
  matches: Readonly<Record<string, readonly DocumentPart[]>>;
26
+ snippet?: Snippet<DocumentPart>;
21
27
  };
22
28
  export type MessageHit = {
23
29
  conversation: string;
24
30
  identity: string;
25
31
  score: number;
26
- matches: Readonly<Record<string, readonly Open<'text'>[]>>;
32
+ matches: Readonly<Record<string, readonly MessagePart[]>>;
33
+ snippet?: Snippet<MessagePart>;
27
34
  };
28
35
  export type SearchCoverage = {
29
36
  rooms: readonly CoveredRoom[];
30
37
  conversations: readonly string[];
31
- index: string;
32
38
  overlay: readonly string[];
33
39
  };
34
- export type PendingConversation = {
35
- conversation: string;
36
- awaits: Open<'index'>;
37
- };
38
40
  export type SearchHits = {
39
41
  documents: readonly DocumentHit[];
40
42
  messages: readonly MessageHit[];
@@ -47,7 +49,7 @@ export type SearchWindow = SearchHits & {
47
49
  };
48
50
  };
49
51
  export type SearchPending = SearchHits & {
50
- pending: readonly (PendingRoom | PendingConversation)[];
52
+ pending: readonly PendingRoom[];
51
53
  coverage: SearchCoverage;
52
54
  };
53
55
  export type SearchUndeclared = ProviderRefusal & {
@@ -57,24 +59,7 @@ export type SearchResult = (SearchWindow & {
57
59
  coverage: SearchCoverage;
58
60
  }) | SearchPending | SearchUndeclared;
59
61
  export declare function undeclaredSearch(): SearchUndeclared;
60
- export type SearchedDocument = {
61
- room: string;
62
- path: string;
63
- type: string;
64
- fields: Readonly<Record<string, unknown>>;
65
- preamble: string;
66
- sections: Readonly<Record<string, string>>;
67
- };
68
- export type SearchedMessage = {
69
- conversation: string;
70
- identity: string;
71
- text: string;
72
- };
73
- export type SearchSource = {
74
- room(room: string): readonly string[];
75
- document(room: string, path: string): SearchedDocument | null;
76
- };
77
- type HitCursor = readonly [number, string, string] | readonly [] | null;
62
+ export type HitCursor = readonly [number, string, string] | readonly [] | null;
78
63
  export type SearchPlan = {
79
64
  text: string;
80
65
  documents: unknown;
@@ -84,22 +69,5 @@ export type SearchPlan = {
84
69
  after: readonly [HitCursor, HitCursor] | null;
85
70
  total: boolean;
86
71
  };
87
- export type SearchIndex = {
88
- generation(): string;
89
- rooms(): ReadonlySet<string>;
90
- conversations(): ReadonlySet<string>;
91
- indexRoom(room: string): Promise<void>;
92
- indexMessages(conversation: string, messages: readonly SearchedMessage[], whole: boolean): void;
93
- forget(rooms: readonly string[]): void;
94
- changed(set: ChangeSet): void;
95
- changes(): number;
96
- caughtUp(): Promise<void>;
97
- search(plan: SearchPlan, documents: readonly {
98
- room: string;
99
- path: string;
100
- }[] | null, conversations: readonly string[], rooms: ReadonlySet<string> | null, selections: ReadonlyMap<string, readonly string[]> | null): SearchWindow;
101
- };
102
72
  export declare function searchPlanOf(input: unknown): SearchPlan;
103
- export declare function createSearchIndex(source: SearchSource): SearchIndex;
104
- export {};
105
73
  //# sourceMappingURL=search.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
package/dist/search.js CHANGED
@@ -1,8 +1,4 @@
1
- import MiniSearch from 'minisearch';
2
- import { indexGeneration } from './identity.js';
3
1
  import { flag, invalid, known, limitOf, plain, } from './query.js';
4
- import { beneath } from './paths.js';
5
- import { inUnits, ROW_WEIGHT } from './turn.js';
6
2
  import { decodedCursor } from './windows.js';
7
3
  export function undeclaredSearch() {
8
4
  return {
@@ -12,22 +8,6 @@ export function undeclaredSearch() {
12
8
  retryable: false,
13
9
  };
14
10
  }
15
- const FIELDS = ['fields', 'sections', 'preamble', 'path', 'text'];
16
- function documentId(room, path) {
17
- return JSON.stringify(['document', room, path]);
18
- }
19
- function messageId(conversation, identity) {
20
- return JSON.stringify(['message', conversation, identity]);
21
- }
22
- function scalars(value) {
23
- if (value === null || value === undefined)
24
- return [];
25
- if (Array.isArray(value))
26
- return value.flatMap(scalars);
27
- if (typeof value === 'object')
28
- return Object.values(value).flatMap(scalars);
29
- return [String(value)];
30
- }
31
11
  function hitCursor(input) {
32
12
  if (input === null)
33
13
  return null;
@@ -75,196 +55,3 @@ export function searchPlanOf(input) {
75
55
  total: flag(input.total, 'total'),
76
56
  };
77
57
  }
78
- function pair(left, right) {
79
- if (left[0] !== right[0])
80
- return left[0] < right[0] ? -1 : 1;
81
- if (left[1] !== right[1])
82
- return left[1] < right[1] ? -1 : 1;
83
- return 0;
84
- }
85
- function hitWindow(found, cursor, limit, tie) {
86
- if (cursor === null)
87
- return { kept: [], cursor: null };
88
- const start = cursor.length === 0
89
- ? 0
90
- : found.findIndex((hit) => hit.score < cursor[0] ||
91
- (hit.score === cursor[0] && pair(tie(hit), [cursor[1], cursor[2]]) > 0));
92
- const following = start === -1 ? [] : found.slice(start);
93
- if (limit === null || following.length <= limit)
94
- return { kept: following, cursor: null };
95
- const kept = following.slice(0, limit);
96
- const last = kept[kept.length - 1];
97
- return { kept, cursor: last === undefined ? cursor : [last.score, ...tie(last)] };
98
- }
99
- export function createSearchIndex(source) {
100
- const generation = indexGeneration();
101
- const index = new MiniSearch({ fields: FIELDS });
102
- const documents = new Map();
103
- const messages = new Map();
104
- const rooms = new Set();
105
- const filling = new Set();
106
- const conversations = new Set();
107
- const acquiring = new Set();
108
- const changedDocuments = new Map();
109
- let changes = 0;
110
- function addDocument(document) {
111
- const id = documentId(document.room, document.path);
112
- discard(id, documents);
113
- index.add({
114
- id,
115
- fields: scalars(document.fields).join('\n'),
116
- sections: Object.entries(document.sections)
117
- .map(([heading, text]) => `${heading}\n${text}`)
118
- .join('\n'),
119
- preamble: document.preamble,
120
- path: document.path,
121
- });
122
- documents.set(id, { room: document.room, path: document.path, type: document.type });
123
- }
124
- function addMessage(message) {
125
- const id = messageId(message.conversation, message.identity);
126
- discard(id, messages);
127
- index.add({ id, text: message.text });
128
- messages.set(id, { conversation: message.conversation, identity: message.identity });
129
- }
130
- function discard(id, entries) {
131
- if (entries.delete(id))
132
- index.discard(id);
133
- }
134
- function* pending() {
135
- for (;;) {
136
- const next = changedDocuments.entries().next();
137
- if (next.done === true)
138
- return;
139
- changedDocuments.delete(next.value[0]);
140
- yield next.value;
141
- }
142
- }
143
- let catching = null;
144
- function caughtUp() {
145
- if (catching !== null)
146
- return catching;
147
- const running = inUnits(pending(), ([id, { room, path }]) => {
148
- discard(id, documents);
149
- const document = source.document(room, path);
150
- if (document === null)
151
- return ROW_WEIGHT;
152
- addDocument(document);
153
- return Object.values(document.sections).reduce((total, text) => total + text.length, ROW_WEIGHT + document.preamble.length);
154
- });
155
- if (!(running instanceof Promise))
156
- return Promise.resolve();
157
- catching = running.finally(() => {
158
- catching = null;
159
- });
160
- return catching;
161
- }
162
- function ranked(text, entries, keep, tie) {
163
- const found = index.search(text, {
164
- filter: ({ id }) => {
165
- const entry = entries.get(id);
166
- return entry !== undefined && keep(entry, id);
167
- },
168
- });
169
- found.sort((left, right) => right.score - left.score ||
170
- pair(tie(entries.get(left.id)), tie(entries.get(right.id))));
171
- return found.map(({ id, score, match }) => ({
172
- ...entries.get(id),
173
- score,
174
- match,
175
- }));
176
- }
177
- return {
178
- generation: () => generation,
179
- rooms: () => rooms,
180
- conversations: () => conversations,
181
- async indexRoom(room) {
182
- if (rooms.has(room) || filling.has(room))
183
- return;
184
- filling.add(room);
185
- try {
186
- await inUnits(source.room(room), (path) => {
187
- const document = filling.has(room) ? source.document(room, path) : null;
188
- if (document === null)
189
- return ROW_WEIGHT;
190
- addDocument(document);
191
- return Object.values(document.sections).reduce((total, text) => total + text.length, ROW_WEIGHT + document.preamble.length);
192
- });
193
- if (filling.has(room))
194
- rooms.add(room);
195
- }
196
- finally {
197
- filling.delete(room);
198
- }
199
- },
200
- indexMessages(conversation, arriving, whole) {
201
- for (const message of arriving)
202
- addMessage(message);
203
- if (!whole) {
204
- acquiring.add(conversation);
205
- return;
206
- }
207
- acquiring.delete(conversation);
208
- conversations.add(conversation);
209
- },
210
- forget(leaving) {
211
- const gone = new Set(leaving);
212
- for (const [id, entry] of documents)
213
- if (gone.has(entry.room))
214
- discard(id, documents);
215
- for (const room of leaving) {
216
- rooms.delete(room);
217
- filling.delete(room);
218
- }
219
- },
220
- changed(set) {
221
- changes += 1;
222
- for (const { locator, path } of set.documents) {
223
- if (rooms.has(locator) || filling.has(locator)) {
224
- changedDocuments.set(documentId(locator, path), { room: locator, path });
225
- }
226
- }
227
- for (const { conversation, identity, text } of set.messages) {
228
- if (!conversations.has(conversation) && !acquiring.has(conversation))
229
- continue;
230
- const id = messageId(conversation, identity);
231
- if (text === null)
232
- discard(id, messages);
233
- else
234
- addMessage({ conversation, identity, text });
235
- }
236
- },
237
- changes: () => changes,
238
- caughtUp,
239
- search({ text, limit, after, total }, selected, named, within, selections) {
240
- const chosen = selected === null
241
- ? null
242
- : new Set(selected.map(({ room, path }) => documentId(room, path)));
243
- const asked = new Set(named);
244
- const documentTie = ({ room, path }) => [room, path];
245
- const messageTie = ({ conversation, identity }) => [conversation, identity];
246
- const foundDocuments = ranked(text, documents, ({ room, path }, id) => (chosen === null || chosen.has(id)) &&
247
- (within === null || within.has(room)) &&
248
- !(selections?.get(room) ?? []).some((root) => beneath(root, path)), documentTie);
249
- const foundMessages = ranked(text, messages, ({ conversation }) => asked.has(conversation), messageTie);
250
- const [documentsAfter, messagesAfter] = after ?? [[], []];
251
- const documentWindow = hitWindow(foundDocuments, documentsAfter, limit, documentTie);
252
- const messageWindow = hitWindow(foundMessages, messagesAfter, limit, messageTie);
253
- const more = documentWindow.cursor !== null || messageWindow.cursor !== null;
254
- return {
255
- documents: documentWindow.kept.map(({ match, ...hit }) => ({
256
- ...hit,
257
- matches: match,
258
- })),
259
- messages: messageWindow.kept.map(({ match, ...hit }) => ({
260
- ...hit,
261
- matches: match,
262
- })),
263
- ...(more ? { next: JSON.stringify([documentWindow.cursor, messageWindow.cursor]) } : {}),
264
- ...(total
265
- ? { total: { documents: foundDocuments.length, messages: foundMessages.length } }
266
- : {}),
267
- };
268
- },
269
- };
270
- }
package/dist/shared.d.ts CHANGED
@@ -1,14 +1,15 @@
1
1
  export type Paths<V> = Readonly<Record<string, V>>;
2
- type Weigh<V> = (key: string, value: V) => number;
2
+ export declare function entriesIn<V>(map: Paths<V>): Generator<readonly [string, V]>;
3
+ export declare function sortedKeys(map: Paths<unknown>): Generator<number, readonly string[], void>;
4
+ export declare function sorting(keys: Iterable<string>): Generator<number, readonly string[], void>;
3
5
  export declare function sharing<V>(map: Paths<V>): Generator<number, Paths<V>, void>;
4
6
  export declare function shared<V>(map: Paths<V>): Paths<V>;
5
7
  export declare function patched<V>(base: Paths<V>, set: Iterable<readonly [string, V]>, removed?: Iterable<string>): Paths<V>;
6
8
  export declare function patching<V>(base: Paths<V>, set: Iterable<readonly [string, V]>, removed?: Iterable<string>): Generator<number, Paths<V>, void>;
7
- export declare function tally<V>(map: Paths<V>, weigh: Weigh<V>): number;
8
9
  export declare function sizeOf<V>(map: Paths<V>): number;
9
10
  export declare function differences<V>(left: Paths<V>, right: Paths<V>, same?: (left: V, right: V) => boolean): Generator<number, ReadonlySet<string>, void>;
10
11
  export declare function differing<V>(left: Paths<V>, right: Paths<V>, same?: (left: V, right: V) => boolean): ReadonlySet<string>;
11
12
  export declare function drafted<V>(base: Paths<V>): Record<string, V>;
12
13
  export declare function settled<V>(draft: Record<string, V>): Paths<V>;
13
- export {};
14
+ export declare function settling<V>(draft: Record<string, V>): Generator<number, Paths<V>, void>;
14
15
  //# sourceMappingURL=shared.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAEA,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;AA8LlD,wBAAiB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAE5E;AAED,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,CAEV;AAED,wBAAiB,QAAQ,CAAC,CAAC,EACzB,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,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAgCnC;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;AA8CD,wBAAiB,WAAW,CAAC,CAAC,EAC5B,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,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAkB9C;AAED,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,CAErB;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"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;AA+LnD,wBAAiB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAO5E;AAuCD,wBAAiB,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,CAE3F;AAED,wBAAiB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,CAoB3F;AAED,wBAAiB,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAE5E;AAED,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,CAEV;AAED,wBAAiB,QAAQ,CAAC,CAAC,EACzB,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,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAoBnC;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAE/C;AA8CD,wBAAiB,WAAW,CAAC,CAAC,EAC5B,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,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAkB9C;AAED,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,CAErB;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,CAE7D;AAED,wBAAiB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAUxF"}
package/dist/shared.js CHANGED
@@ -2,7 +2,6 @@ import { finished, ROW_WEIGHT } from './turn.js';
2
2
  const BITS = 5;
3
3
  const MASK = (1 << BITS) - 1;
4
4
  const roots = new WeakMap();
5
- const tallies = new WeakMap();
6
5
  function hashOf(key) {
7
6
  let hash = 0x811c9dc5;
8
7
  for (let index = 0; index < key.length; index += 1) {
@@ -180,19 +179,71 @@ function facade(root) {
180
179
  roots.set(map, root);
181
180
  return map;
182
181
  }
182
+ export function* entriesIn(map) {
183
+ const root = roots.get(map);
184
+ if (root === undefined) {
185
+ for (const key of Object.keys(map))
186
+ yield [key, map[key]];
187
+ return;
188
+ }
189
+ for (const leaf of leavesOf(root.node))
190
+ yield [leaf.key, leaf.value];
191
+ }
183
192
  function* rooted(map) {
184
193
  const held = roots.get(map);
185
194
  if (held !== undefined)
186
195
  return held;
187
196
  let node;
188
197
  let size = 0;
189
- for (const [key, value] of Object.entries(map)) {
198
+ for (const [key, value] of entriesIn(map)) {
190
199
  node = put(node, { key, hash: hashOf(key), value }, 0);
191
200
  size += 1;
192
201
  yield ROW_WEIGHT;
193
202
  }
194
203
  return { node, size };
195
204
  }
205
+ const RUN = 1 << 10;
206
+ function* merged(left, right) {
207
+ const into = [];
208
+ let at = 0;
209
+ let from = 0;
210
+ while (at < left.length || from < right.length) {
211
+ into.push(from === right.length || (at < left.length && left[at] < right[from])
212
+ ? left[at++]
213
+ : right[from++]);
214
+ yield ROW_WEIGHT;
215
+ }
216
+ return into;
217
+ }
218
+ function* pathsOf(map) {
219
+ for (const [key] of entriesIn(map))
220
+ yield key;
221
+ }
222
+ export function* sortedKeys(map) {
223
+ return yield* sorting(pathsOf(map));
224
+ }
225
+ export function* sorting(keys) {
226
+ let runs = [];
227
+ let run = [];
228
+ for (const key of keys) {
229
+ run.push(key);
230
+ yield ROW_WEIGHT;
231
+ if (run.length === RUN) {
232
+ runs.push(run.sort());
233
+ run = [];
234
+ }
235
+ }
236
+ if (run.length > 0)
237
+ runs.push(run.sort());
238
+ while (runs.length > 1) {
239
+ const next = [];
240
+ for (let at = 0; at < runs.length; at += 2) {
241
+ next.push(at + 1 === runs.length ? runs[at] : yield* merged(runs[at], runs[at + 1]));
242
+ }
243
+ runs = next;
244
+ }
245
+ return runs[0] ?? [];
246
+ }
196
247
  export function* sharing(map) {
197
248
  return roots.has(map) ? map : facade(yield* rooted(map));
198
249
  }
@@ -204,16 +255,8 @@ export function patched(base, set, removed = []) {
204
255
  }
205
256
  export function* patching(base, set, removed = []) {
206
257
  const root = yield* rooted(base);
207
- const weighed = [...(tallies.get(base) ?? [])];
208
258
  let node = root.node;
209
259
  let size = root.size;
210
- const shift = (key, before, after) => {
211
- for (const entry of weighed) {
212
- entry[1] +=
213
- (after === undefined ? 0 : entry[0](key, after)) -
214
- (before === undefined ? 0 : entry[0](key, before.value));
215
- }
216
- };
217
260
  for (const key of removed) {
218
261
  if (node === undefined)
219
262
  break;
@@ -222,7 +265,6 @@ export function* patching(base, set, removed = []) {
222
265
  continue;
223
266
  node = taken(node, before.hash, key, 0);
224
267
  size -= 1;
225
- shift(key, before, undefined);
226
268
  yield ROW_WEIGHT;
227
269
  }
228
270
  for (const [key, value] of set) {
@@ -230,30 +272,11 @@ export function* patching(base, set, removed = []) {
230
272
  node = put(node, { key, hash: hashOf(key), value }, 0);
231
273
  if (before === undefined)
232
274
  size += 1;
233
- shift(key, before, value);
234
275
  yield ROW_WEIGHT;
235
276
  }
236
277
  if (node === root.node && roots.has(base))
237
278
  return base;
238
- const map = facade({ node, size });
239
- if (weighed.length > 0)
240
- tallies.set(map, new Map(weighed));
241
- return map;
242
- }
243
- export function tally(map, weigh) {
244
- const held = tallies.get(map);
245
- const known = held?.get(weigh);
246
- if (known !== undefined)
247
- return known;
248
- let total = 0;
249
- for (const [key, value] of Object.entries(map))
250
- total += weigh(key, value);
251
- if (roots.has(map)) {
252
- const kept = held ?? new Map();
253
- kept.set(weigh, total);
254
- tallies.set(map, kept);
255
- }
256
- return total;
279
+ return facade({ node, size });
257
280
  }
258
281
  export function sizeOf(map) {
259
282
  return roots.get(map)?.size ?? Object.keys(map).length;
@@ -307,12 +330,12 @@ export function* differences(left, right, same = Object.is) {
307
330
  yield* compared(leftRoot.node, rightRoot.node, same, into);
308
331
  return into;
309
332
  }
310
- for (const key of Object.keys(left)) {
311
- if (!Object.hasOwn(right, key) || !same(left[key], right[key]))
333
+ for (const [key, value] of entriesIn(left)) {
334
+ if (!Object.hasOwn(right, key) || !same(value, right[key]))
312
335
  into.add(key);
313
336
  yield ROW_WEIGHT;
314
337
  }
315
- for (const key of Object.keys(right)) {
338
+ for (const [key] of entriesIn(right)) {
316
339
  if (!Object.hasOwn(left, key))
317
340
  into.add(key);
318
341
  yield ROW_WEIGHT;
@@ -381,6 +404,9 @@ export function drafted(base) {
381
404
  return draft;
382
405
  }
383
406
  export function settled(draft) {
407
+ return finished(settling(draft));
408
+ }
409
+ export function* settling(draft) {
384
410
  const held = drafts.get(draft);
385
411
  const set = [];
386
412
  const removed = [];
@@ -389,6 +415,7 @@ export function settled(draft) {
389
415
  removed.push(key);
390
416
  else
391
417
  set.push([key, value]);
418
+ yield ROW_WEIGHT;
392
419
  }
393
- return patched(held.base, set, removed);
420
+ return yield* patching(held.base, set, removed);
394
421
  }
package/dist/status.d.ts CHANGED
@@ -1,19 +1,20 @@
1
1
  import type { Open } from './open.js';
2
- import type { ProviderRefusal } from './adapter.js';
3
2
  import type { ReturnReason } from './room-draft.js';
4
3
  export type AttentionEntry = {
5
4
  room: string;
6
5
  path: string;
7
6
  returned: ReturnReason;
8
- } | {
7
+ };
8
+ export type UnsentChange = {
9
9
  room: string;
10
- refusal: ProviderRefusal;
10
+ path: string;
11
11
  };
12
12
  export type SyncStatus = {
13
13
  state: Open<'pending' | 'syncing' | 'synced'>;
14
14
  lastCompleted: string | null;
15
15
  providerUnreachable: boolean;
16
16
  attentionRequired: readonly AttentionEntry[];
17
+ unsent: readonly UnsentChange[];
17
18
  reset: string | null;
18
19
  };
19
20
  export type CycleProgress = {
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAAC;AAE/C,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,IAAI,CAAC,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;IAC9C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,UAMtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAErD;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAQhE"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,YAAY,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,IAAI,CAAC,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC,CAAC;IAC9C,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,SAAS,cAAc,EAAE,CAAC;IAC7C,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,UAOtB,CAAC;AAEF,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAErD;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAShE"}
package/dist/status.js CHANGED
@@ -3,6 +3,7 @@ export const STARTING = {
3
3
  lastCompleted: null,
4
4
  providerUnreachable: false,
5
5
  attentionRequired: [],
6
+ unsent: [],
6
7
  reset: null,
7
8
  };
8
9
  export function transferring(status) {
@@ -16,5 +17,6 @@ export function same(one, other) {
16
17
  one.lastCompleted === other.lastCompleted &&
17
18
  one.providerUnreachable === other.providerUnreachable &&
18
19
  one.reset === other.reset &&
19
- JSON.stringify(one.attentionRequired) === JSON.stringify(other.attentionRequired));
20
+ JSON.stringify(one.attentionRequired) === JSON.stringify(other.attentionRequired) &&
21
+ JSON.stringify(one.unsent) === JSON.stringify(other.unsent));
20
22
  }