@agentshouse/mdruntime 0.1.0-c2e8a6f99866d → 0.1.0-c2ef9303a058d

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 (220) hide show
  1. package/README.md +11 -9
  2. package/dist/adapter.d.ts +95 -67
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +5 -11
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +36 -47
  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 +17 -9
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +143 -94
  13. package/dist/chain.d.ts +2 -1
  14. package/dist/chain.d.ts.map +1 -1
  15. package/dist/change-set.d.ts +1 -7
  16. package/dist/change-set.d.ts.map +1 -1
  17. package/dist/change-set.js +1 -4
  18. package/dist/client.d.ts +15 -12
  19. package/dist/client.d.ts.map +1 -1
  20. package/dist/client.js +56 -8
  21. package/dist/collection.d.ts +7 -4
  22. package/dist/collection.d.ts.map +1 -1
  23. package/dist/collection.js +24 -19
  24. package/dist/compile.d.ts.map +1 -1
  25. package/dist/compile.js +117 -243
  26. package/dist/connection.d.ts +14 -12
  27. package/dist/connection.d.ts.map +1 -1
  28. package/dist/connection.js +1466 -1431
  29. package/dist/context.d.ts +2 -0
  30. package/dist/context.d.ts.map +1 -0
  31. package/dist/{chat/context.js → context.js} +1 -4
  32. package/dist/conversation.d.ts +18 -15
  33. package/dist/conversation.d.ts.map +1 -1
  34. package/dist/conversation.js +273 -185
  35. package/dist/durability.d.ts +6 -4
  36. package/dist/durability.d.ts.map +1 -1
  37. package/dist/durability.js +5 -0
  38. package/dist/entry.d.ts +3 -2
  39. package/dist/entry.d.ts.map +1 -1
  40. package/dist/entry.js +17 -8
  41. package/dist/file.d.ts +2 -11
  42. package/dist/file.d.ts.map +1 -1
  43. package/dist/file.js +6 -4
  44. package/dist/host.d.ts +3 -7
  45. package/dist/host.d.ts.map +1 -1
  46. package/dist/host.js +55 -38
  47. package/dist/identity.d.ts +0 -2
  48. package/dist/identity.d.ts.map +1 -1
  49. package/dist/identity.js +0 -6
  50. package/dist/index.d.ts +15 -12
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +6 -3
  53. package/dist/job.d.ts +14 -0
  54. package/dist/job.d.ts.map +1 -0
  55. package/dist/job.js +28 -0
  56. package/dist/live.d.ts +2 -1
  57. package/dist/live.d.ts.map +1 -1
  58. package/dist/live.js +9 -5
  59. package/dist/media.d.ts +8 -0
  60. package/dist/media.d.ts.map +1 -0
  61. package/dist/media.js +218 -0
  62. package/dist/memory.d.ts +12 -6
  63. package/dist/memory.d.ts.map +1 -1
  64. package/dist/memory.js +209 -101
  65. package/dist/messages.d.ts +28 -0
  66. package/dist/messages.d.ts.map +1 -0
  67. package/dist/messages.js +89 -0
  68. package/dist/model.d.ts +8 -8
  69. package/dist/model.d.ts.map +1 -1
  70. package/dist/model.js +7 -13
  71. package/dist/observation.d.ts +3 -2
  72. package/dist/observation.d.ts.map +1 -1
  73. package/dist/observation.js +8 -3
  74. package/dist/outcome.d.ts +13 -6
  75. package/dist/outcome.d.ts.map +1 -1
  76. package/dist/outcome.js +16 -5
  77. package/dist/overlay.js +1 -1
  78. package/dist/paths.d.ts +1 -0
  79. package/dist/paths.d.ts.map +1 -1
  80. package/dist/paths.js +4 -0
  81. package/dist/query.d.ts +10 -206
  82. package/dist/query.d.ts.map +1 -1
  83. package/dist/query.js +3 -494
  84. package/dist/reach.d.ts +14 -9
  85. package/dist/reach.d.ts.map +1 -1
  86. package/dist/reach.js +84 -72
  87. package/dist/react.d.ts +3 -1
  88. package/dist/react.d.ts.map +1 -1
  89. package/dist/readiness.d.ts +14 -17
  90. package/dist/readiness.d.ts.map +1 -1
  91. package/dist/readiness.js +2 -8
  92. package/dist/recovery.d.ts +1 -0
  93. package/dist/recovery.d.ts.map +1 -1
  94. package/dist/recovery.js +26 -0
  95. package/dist/refresh.d.ts +10 -4
  96. package/dist/refresh.d.ts.map +1 -1
  97. package/dist/refresh.js +88 -30
  98. package/dist/replica.d.ts +11 -8
  99. package/dist/replica.d.ts.map +1 -1
  100. package/dist/replica.js +30 -15
  101. package/dist/room-draft.d.ts +22 -5
  102. package/dist/room-draft.d.ts.map +1 -1
  103. package/dist/room-draft.js +131 -51
  104. package/dist/rows.d.ts +18 -16
  105. package/dist/rows.d.ts.map +1 -1
  106. package/dist/rows.js +45 -153
  107. package/dist/save.d.ts +2 -0
  108. package/dist/save.d.ts.map +1 -1
  109. package/dist/save.js +13 -7
  110. package/dist/search.d.ts +12 -95
  111. package/dist/search.d.ts.map +1 -1
  112. package/dist/search.js +10 -349
  113. package/dist/shared.d.ts +0 -1
  114. package/dist/shared.d.ts.map +1 -1
  115. package/dist/shared.js +0 -10
  116. package/dist/status.d.ts +4 -3
  117. package/dist/status.d.ts.map +1 -1
  118. package/dist/status.js +3 -1
  119. package/dist/store.d.ts +25 -62
  120. package/dist/store.d.ts.map +1 -1
  121. package/dist/store.js +43 -282
  122. package/dist/stored.d.ts +12 -26
  123. package/dist/stored.d.ts.map +1 -1
  124. package/dist/stored.js +189 -226
  125. package/dist/tables.d.ts +55 -48
  126. package/dist/tables.d.ts.map +1 -1
  127. package/dist/tables.js +107 -57
  128. package/dist/transfer.d.ts +0 -5
  129. package/dist/transfer.d.ts.map +1 -1
  130. package/dist/validation.d.ts +3 -4
  131. package/dist/validation.d.ts.map +1 -1
  132. package/dist/validation.js +39 -97
  133. package/dist/windows.d.ts +1 -12
  134. package/dist/windows.d.ts.map +1 -1
  135. package/dist/windows.js +2 -75
  136. package/dist/wire.d.ts +14 -9
  137. package/dist/wire.d.ts.map +1 -1
  138. package/dist/wire.js +5 -3
  139. package/package.json +14 -18
  140. package/AGENTS.md +0 -312
  141. package/dist/chat/acts.d.ts +0 -33
  142. package/dist/chat/acts.d.ts.map +0 -1
  143. package/dist/chat/acts.js +0 -36
  144. package/dist/chat/context.d.ts +0 -3
  145. package/dist/chat/context.d.ts.map +0 -1
  146. package/dist/chat/earlier.d.ts +0 -10
  147. package/dist/chat/earlier.d.ts.map +0 -1
  148. package/dist/chat/earlier.js +0 -54
  149. package/dist/chat/house.d.ts +0 -25
  150. package/dist/chat/house.d.ts.map +0 -1
  151. package/dist/chat/house.js +0 -38
  152. package/dist/chat/input.d.ts +0 -11
  153. package/dist/chat/input.d.ts.map +0 -1
  154. package/dist/chat/input.js +0 -92
  155. package/dist/chat/kit.d.ts +0 -61
  156. package/dist/chat/kit.d.ts.map +0 -1
  157. package/dist/chat/kit.js +0 -123
  158. package/dist/chat/lasting.d.ts +0 -6
  159. package/dist/chat/lasting.d.ts.map +0 -1
  160. package/dist/chat/lasting.js +0 -19
  161. package/dist/chat/list.d.ts +0 -28
  162. package/dist/chat/list.d.ts.map +0 -1
  163. package/dist/chat/list.js +0 -103
  164. package/dist/chat/markdown.d.ts +0 -21
  165. package/dist/chat/markdown.d.ts.map +0 -1
  166. package/dist/chat/markdown.js +0 -246
  167. package/dist/chat/message.d.ts +0 -7
  168. package/dist/chat/message.d.ts.map +0 -1
  169. package/dist/chat/message.js +0 -244
  170. package/dist/chat/messages.d.ts +0 -30
  171. package/dist/chat/messages.d.ts.map +0 -1
  172. package/dist/chat/messages.js +0 -198
  173. package/dist/chat/name.d.ts +0 -7
  174. package/dist/chat/name.d.ts.map +0 -1
  175. package/dist/chat/name.js +0 -37
  176. package/dist/chat/opened.d.ts +0 -12
  177. package/dist/chat/opened.d.ts.map +0 -1
  178. package/dist/chat/opened.js +0 -19
  179. package/dist/chat/overlay.d.ts +0 -32
  180. package/dist/chat/overlay.d.ts.map +0 -1
  181. package/dist/chat/overlay.js +0 -103
  182. package/dist/chat/parts.d.ts +0 -58
  183. package/dist/chat/parts.d.ts.map +0 -1
  184. package/dist/chat/parts.js +0 -120
  185. package/dist/chat/pieces.d.ts +0 -62
  186. package/dist/chat/pieces.d.ts.map +0 -1
  187. package/dist/chat/pieces.js +0 -1110
  188. package/dist/chat/process.d.ts +0 -20
  189. package/dist/chat/process.d.ts.map +0 -1
  190. package/dist/chat/process.js +0 -32
  191. package/dist/chat/provider.d.ts +0 -70
  192. package/dist/chat/provider.d.ts.map +0 -1
  193. package/dist/chat/provider.js +0 -635
  194. package/dist/chat/question.d.ts +0 -9
  195. package/dist/chat/question.d.ts.map +0 -1
  196. package/dist/chat/question.js +0 -69
  197. package/dist/chat/questions.d.ts +0 -31
  198. package/dist/chat/questions.d.ts.map +0 -1
  199. package/dist/chat/questions.js +0 -111
  200. package/dist/chat/read.d.ts +0 -5
  201. package/dist/chat/read.d.ts.map +0 -1
  202. package/dist/chat/read.js +0 -13
  203. package/dist/chat/ready.d.ts +0 -37
  204. package/dist/chat/ready.d.ts.map +0 -1
  205. package/dist/chat/ready.js +0 -93
  206. package/dist/chat/room-file.d.ts +0 -8
  207. package/dist/chat/room-file.d.ts.map +0 -1
  208. package/dist/chat/room-file.js +0 -72
  209. package/dist/chat/steady.d.ts +0 -3
  210. package/dist/chat/steady.d.ts.map +0 -1
  211. package/dist/chat/steady.js +0 -26
  212. package/dist/chat/style.d.ts +0 -4
  213. package/dist/chat/style.d.ts.map +0 -1
  214. package/dist/chat/style.js +0 -306
  215. package/dist/chat.d.ts +0 -15
  216. package/dist/chat.d.ts.map +0 -1
  217. package/dist/chat.js +0 -8
  218. package/dist/reads.d.ts +0 -11
  219. package/dist/reads.d.ts.map +0 -1
  220. package/dist/reads.js +0 -98
package/dist/save.js CHANGED
@@ -4,7 +4,7 @@ import { immutable, leaving, queuedFile, departure, } from './change.js';
4
4
  import { collectionOf, documentsOf, governing, } from './collection.js';
5
5
  import { changeBatchIdentity } from './identity.js';
6
6
  import { overlaying } from './overlay.js';
7
- import { covered, normalize } from './paths.js';
7
+ import { ancestors, covered, normalize } from './paths.js';
8
8
  import { sorting } from './shared.js';
9
9
  import { paced, ROW_WEIGHT, stepped } from './turn.js';
10
10
  import { validatedCollection } from './validation.js';
@@ -329,6 +329,7 @@ function guard(changes, input, removing) {
329
329
  add: (path) => void overridden.set(path, true),
330
330
  delete: (path) => void overridden.set(path, false),
331
331
  };
332
+ const occupied = (path) => input.folders.has(path) ? path : (ancestors(path).find((one) => existing.has(one)) ?? null);
332
333
  for (const [index, change] of changes.entries()) {
333
334
  for (const path of affected(change)) {
334
335
  const normalized = normalize(path);
@@ -342,8 +343,9 @@ function guard(changes, input, removing) {
342
343
  return refuse(`${operation}-grant`, normalized);
343
344
  }
344
345
  if (change.kind === 'create' || change.kind === 'arrival') {
345
- if (existing.has(change.path))
346
- return refuse('path-collision', change.path);
346
+ const taken = existing.has(change.path) ? change.path : occupied(change.path);
347
+ if (taken !== null)
348
+ return refuse('path-collision', taken);
347
349
  existing.add(change.path);
348
350
  continue;
349
351
  }
@@ -353,6 +355,9 @@ function guard(changes, input, removing) {
353
355
  input.bases.some((base) => base.kind === 'absent' && base.path === change.path))) {
354
356
  return refuse('path-collision', change.path);
355
357
  }
358
+ const taken = occupied(change.path);
359
+ if (taken !== null)
360
+ return refuse('path-collision', taken);
356
361
  if (!input.local &&
357
362
  existing.has(change.path) &&
358
363
  input.visible.revisions[departure(changes, index)] === undefined) {
@@ -364,8 +369,9 @@ function guard(changes, input, removing) {
364
369
  if (change.kind === 'move') {
365
370
  if (!existing.has(change.path))
366
371
  return refuse('path-absent', change.path);
367
- if (existing.has(change.to))
368
- return refuse('path-collision', change.to);
372
+ const taken = existing.has(change.to) ? change.to : occupied(change.to);
373
+ if (taken !== null)
374
+ return refuse('path-collision', taken);
369
375
  if (unrevised(input, change.path)) {
370
376
  return refuse('unknown-revision', change.path);
371
377
  }
@@ -1074,11 +1080,11 @@ function arrivalOf({ path, to }, source, moved) {
1074
1080
  };
1075
1081
  const binary = binaries[path];
1076
1082
  if (binary?.state === 'accepted') {
1077
- const { fileRef, byteLength, mediaType, sha256 } = binary;
1083
+ const { byteLength, mediaType, sha256 } = binary;
1078
1084
  return {
1079
1085
  kind: 'arrival',
1080
1086
  path: to,
1081
- binary: { fileRef, byteLength, mediaType, sha256 },
1087
+ binary: { byteLength, mediaType, sha256 },
1082
1088
  ...heads,
1083
1089
  };
1084
1090
  }
package/dist/search.d.ts CHANGED
@@ -1,105 +1,22 @@
1
- import type { ProviderRefusal } from './adapter.js';
2
- import type { ChangeSet } from './change-set.js';
3
- import { type CoveredRoom, type Filter, type PendingRoom } from './query.js';
4
- import type { Open } from './open.js';
5
- export type DocumentPart = Open<'fields' | 'sections' | 'preamble' | 'path'>;
1
+ import type { ProviderRefusal, SearchHit } from './adapter.js';
2
+ import type { Failure, Offline } from './outcome.js';
6
3
  export type SearchRequest = {
7
4
  text: string;
8
- documents?: Filter;
9
- collection?: true;
10
- conversations?: readonly string[];
11
- limit?: number;
12
- after?: string;
13
- total?: true;
5
+ rooms?: readonly string[];
14
6
  };
15
- export type DocumentHit = {
16
- room: string;
17
- path: string;
18
- type: string;
19
- score: number;
20
- matches: Readonly<Record<string, readonly DocumentPart[]>>;
7
+ export type { SearchHit } from './adapter.js';
8
+ export type SearchFound = {
9
+ kind: 'found';
10
+ documents: readonly SearchHit[];
21
11
  };
22
- export type MessageHit = {
23
- conversation: string;
24
- identity: string;
25
- score: number;
26
- matches: Readonly<Record<string, readonly Open<'text'>[]>>;
27
- };
28
- export type SearchCoverage = {
29
- rooms: readonly CoveredRoom[];
30
- conversations: readonly string[];
31
- index: string;
32
- overlay: readonly string[];
33
- };
34
- export type PendingConversation = {
35
- conversation: string;
36
- awaits: Open<'index'>;
37
- };
38
- export type SearchHits = {
39
- documents: readonly DocumentHit[];
40
- messages: readonly MessageHit[];
41
- };
42
- export type SearchWindow = SearchHits & {
43
- next?: string;
44
- total?: {
45
- documents: number;
46
- messages: number;
47
- };
48
- };
49
- export type SearchPending = SearchHits & {
50
- pending: readonly (PendingRoom | PendingConversation)[];
51
- coverage: SearchCoverage;
52
- };
53
- export type SearchUndeclared = ProviderRefusal & {
12
+ export type SearchResult = SearchFound | Offline | (ProviderRefusal & {
13
+ kind: 'rejected';
14
+ }) | (ProviderRefusal & {
54
15
  kind: 'undeclared';
55
- };
56
- export type SearchResult = (SearchWindow & {
57
- coverage: SearchCoverage;
58
- }) | SearchPending | SearchUndeclared;
59
- 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): AsyncIterable<readonly SearchedDocument[]>;
75
- documents(room: string, paths: readonly string[]): Promise<readonly SearchedDocument[]>;
76
- };
77
- type HitCursor = readonly [number, string, string] | readonly [] | null;
16
+ }) | Failure;
78
17
  export type SearchPlan = {
79
18
  text: string;
80
- documents: unknown;
81
- collection: boolean;
82
- conversations: readonly string[] | null;
83
- limit: number | null;
84
- after: readonly [HitCursor, HitCursor] | null;
85
- total: boolean;
86
- };
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;
19
+ rooms: readonly string[] | null;
101
20
  };
102
21
  export declare function searchPlanOf(input: unknown): SearchPlan;
103
- export declare function createSearchIndex(source: SearchSource): SearchIndex;
104
- export {};
105
22
  //# 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":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAErD,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAExE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,CAAC;AAE7E,MAAM,MAAM,YAAY,GACpB,WAAW,GACX,OAAO,GACP,CAAC,eAAe,GAAG;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,GACxC,CAAC,eAAe,GAAG;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,GAC1C,OAAO,CAAC;AAEZ,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAA;CAAE,CAAC;AAE3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAYvD"}
package/dist/search.js CHANGED
@@ -1,353 +1,14 @@
1
- import MiniSearch from 'minisearch';
2
- import { indexGeneration } from './identity.js';
3
- import { flag, invalid, known, limitOf, plain, } from './query.js';
4
- import { beneath } from './paths.js';
5
- import { inUnits, ROW_WEIGHT, yielded } from './turn.js';
6
- import { decodedCursor } from './windows.js';
7
- export function undeclaredSearch() {
8
- return {
9
- kind: 'undeclared',
10
- code: 'search-undeclared',
11
- fields: { name: 'local_search' },
12
- retryable: false,
13
- };
14
- }
15
- const FIELDS = ['fields', 'sections', 'preamble', 'path', 'text'];
16
- const VACUUM_CONDITIONS = { minDirtCount: 20, minDirtFactor: 0.1 };
17
- const CHANGED_BATCH = 256;
18
- function documentId(room, path) {
19
- return JSON.stringify(['document', room, path]);
20
- }
21
- function messageId(conversation, identity) {
22
- return JSON.stringify(['message', conversation, identity]);
23
- }
24
- function scalars(value) {
25
- if (value === null || value === undefined)
26
- return [];
27
- if (Array.isArray(value))
28
- return value.flatMap(scalars);
29
- if (typeof value === 'object')
30
- return Object.values(value).flatMap(scalars);
31
- return [String(value)];
32
- }
33
- function hitCursor(input) {
34
- if (input === null)
35
- return null;
36
- if (!Array.isArray(input))
37
- return undefined;
38
- if (input.length === 0)
39
- return [];
40
- const [score, first, second] = input;
41
- return input.length === 3 &&
42
- typeof score === 'number' &&
43
- typeof first === 'string' &&
44
- typeof second === 'string'
45
- ? [score, first, second]
46
- : undefined;
47
- }
48
- function searchAfter(input) {
49
- if (input === undefined)
50
- return null;
51
- const decoded = typeof input === 'string' ? decodedCursor(input) : null;
52
- const documents = decoded?.length === 2 ? hitCursor(decoded[0]) : undefined;
53
- const messages = decoded?.length === 2 ? hitCursor(decoded[1]) : undefined;
54
- if (documents === undefined || messages === undefined) {
55
- invalid('after', 'expects the next an earlier search returned');
56
- }
57
- return [documents, messages];
58
- }
1
+ import { invalid, known, plain } from '@agentshouse/mdmodel';
59
2
  export function searchPlanOf(input) {
60
3
  if (!plain(input))
61
4
  invalid('search', 'expects a search object');
62
- known(input, ['text', 'documents', 'collection', 'conversations', 'limit', 'after', 'total'], '');
63
- if (typeof input.text !== 'string')
64
- invalid('text', 'expects text');
65
- const conversations = input.conversations;
66
- if (conversations !== undefined &&
67
- (!Array.isArray(conversations) || conversations.some((named) => typeof named !== 'string'))) {
68
- invalid('conversations', 'expects a list of conversations');
69
- }
70
- return {
71
- text: input.text,
72
- documents: input.documents,
73
- collection: flag(input.collection, 'collection'),
74
- conversations: conversations ?? null,
75
- limit: limitOf(input.limit),
76
- after: searchAfter(input.after),
77
- total: flag(input.total, 'total'),
78
- };
79
- }
80
- function pair(left, right) {
81
- if (left[0] !== right[0])
82
- return left[0] < right[0] ? -1 : 1;
83
- if (left[1] !== right[1])
84
- return left[1] < right[1] ? -1 : 1;
85
- return 0;
86
- }
87
- function hitWindow(found, cursor, limit, tie) {
88
- if (cursor === null)
89
- return { kept: [], cursor: null };
90
- const start = cursor.length === 0
91
- ? 0
92
- : found.findIndex((hit) => hit.score < cursor[0] ||
93
- (hit.score === cursor[0] && pair(tie(hit), [cursor[1], cursor[2]]) > 0));
94
- const following = start === -1 ? [] : found.slice(start);
95
- if (limit === null || following.length <= limit)
96
- return { kept: following, cursor: null };
97
- const kept = following.slice(0, limit);
98
- const last = kept[kept.length - 1];
99
- return { kept, cursor: last === undefined ? cursor : [last.score, ...tie(last)] };
100
- }
101
- export function createSearchIndex(source) {
102
- const generation = indexGeneration();
103
- const index = new MiniSearch({ fields: FIELDS, autoVacuum: false });
104
- const documents = new Map();
105
- const messages = new Map();
106
- const rooms = new Set();
107
- const filling = new Set();
108
- const conversations = new Set();
109
- const acquiring = new Set();
110
- const changedDocuments = new Map();
111
- const refilling = new Set();
112
- const arrived = new Map();
113
- let vacuuming = null;
114
- let changes = 0;
115
- function added(entry) {
116
- if (vacuuming === null)
117
- index.add(entry);
118
- else
119
- arrived.set(entry.id, entry);
120
- }
121
- function addDocument(document) {
122
- const id = documentId(document.room, document.path);
123
- discard(id, documents);
124
- added({
125
- id,
126
- fields: scalars(document.fields).join('\n'),
127
- sections: Object.entries(document.sections)
128
- .map(([heading, text]) => `${heading}\n${text}`)
129
- .join('\n'),
130
- preamble: document.preamble,
131
- path: document.path,
132
- });
133
- documents.set(id, { room: document.room, path: document.path, type: document.type });
134
- }
135
- function addMessage(message) {
136
- const id = messageId(message.conversation, message.identity);
137
- discard(id, messages);
138
- added({ id, text: message.text });
139
- messages.set(id, { conversation: message.conversation, identity: message.identity });
140
- }
141
- function discard(id, entries) {
142
- if (!entries.delete(id) || arrived.delete(id))
143
- return;
144
- index.discard(id);
145
- vacuum();
146
- }
147
- function vacuum() {
148
- if (vacuuming !== null ||
149
- index.dirtCount < VACUUM_CONDITIONS.minDirtCount ||
150
- index.dirtFactor < VACUUM_CONDITIONS.minDirtFactor) {
151
- return;
152
- }
153
- changes += 1;
154
- vacuuming = index
155
- .vacuum()
156
- .then(() => inUnits(arrivals(), (id) => {
157
- const entry = arrived.get(id);
158
- if (entry === undefined)
159
- return ROW_WEIGHT;
160
- arrived.delete(id);
161
- index.add(entry);
162
- return Object.values(entry).reduce((total, value) => total + value.length, ROW_WEIGHT);
163
- }))
164
- .finally(() => {
165
- vacuuming = null;
166
- vacuum();
167
- });
168
- }
169
- function* arrivals() {
170
- for (;;) {
171
- const next = arrived.keys().next();
172
- if (next.done === true)
173
- return;
174
- yield next.value;
175
- }
176
- }
177
- async function vacuumed() {
178
- while (vacuuming !== null)
179
- await vacuuming;
180
- }
181
- async function paused() {
182
- await yielded();
183
- await vacuumed();
184
- }
185
- let catching = null;
186
- async function refill(room) {
187
- for (const [id, entry] of documents)
188
- if (entry.room === room)
189
- discard(id, documents);
190
- for await (const batch of source.room(room)) {
191
- if (!rooms.has(room) && !filling.has(room))
192
- return;
193
- for (const document of batch)
194
- addDocument(document);
195
- await paused();
196
- }
197
- }
198
- async function catchUp() {
199
- for (const room of refilling) {
200
- refilling.delete(room);
201
- await refill(room);
202
- }
203
- while (changedDocuments.size > 0) {
204
- await paused();
205
- const batch = new Map();
206
- for (const [id, { room, path }] of changedDocuments) {
207
- changedDocuments.delete(id);
208
- const held = batch.get(room) ?? new Map();
209
- held.set(path, id);
210
- batch.set(room, held);
211
- if (held.size >= CHANGED_BATCH)
212
- break;
213
- }
214
- for (const [room, held] of batch) {
215
- for (const id of held.values())
216
- discard(id, documents);
217
- for (const document of await source.documents(room, [...held.keys()])) {
218
- if (rooms.has(room) || filling.has(room))
219
- addDocument(document);
220
- }
221
- }
222
- }
223
- await vacuumed();
224
- }
225
- function caughtUp() {
226
- if (catching !== null)
227
- return catching;
228
- if (changedDocuments.size === 0 && refilling.size === 0 && vacuuming === null) {
229
- return Promise.resolve();
230
- }
231
- catching = catchUp().finally(() => {
232
- catching = null;
233
- });
234
- return catching;
235
- }
236
- function ranked(text, entries, keep, tie) {
237
- const found = index.search(text, {
238
- filter: ({ id }) => {
239
- const entry = entries.get(id);
240
- return entry !== undefined && keep(entry, id);
241
- },
242
- });
243
- found.sort((left, right) => right.score - left.score ||
244
- pair(tie(entries.get(left.id)), tie(entries.get(right.id))));
245
- return found.map(({ id, score, match }) => ({
246
- ...entries.get(id),
247
- score,
248
- match,
249
- }));
250
- }
251
- return {
252
- generation: () => generation,
253
- rooms: () => rooms,
254
- conversations: () => conversations,
255
- async indexRoom(room) {
256
- if (rooms.has(room) || filling.has(room))
257
- return;
258
- filling.add(room);
259
- try {
260
- for await (const batch of source.room(room)) {
261
- if (!filling.has(room))
262
- return;
263
- for (const document of batch)
264
- addDocument(document);
265
- await paused();
266
- }
267
- if (filling.has(room))
268
- rooms.add(room);
269
- }
270
- finally {
271
- filling.delete(room);
272
- }
273
- },
274
- indexMessages(conversation, arriving, whole) {
275
- for (const message of arriving)
276
- addMessage(message);
277
- if (!whole) {
278
- acquiring.add(conversation);
279
- return;
280
- }
281
- acquiring.delete(conversation);
282
- conversations.add(conversation);
283
- },
284
- forget(leaving) {
285
- const gone = new Set(leaving);
286
- for (const [id, entry] of documents)
287
- if (gone.has(entry.room))
288
- discard(id, documents);
289
- for (const room of leaving) {
290
- rooms.delete(room);
291
- filling.delete(room);
292
- refilling.delete(room);
293
- }
294
- },
295
- changed(set) {
296
- changes += 1;
297
- for (const { locator, path } of set.documents) {
298
- if (!rooms.has(locator) && !filling.has(locator))
299
- continue;
300
- if (path === null) {
301
- for (const [id, entry] of changedDocuments) {
302
- if (entry.room === locator)
303
- changedDocuments.delete(id);
304
- }
305
- refilling.add(locator);
306
- continue;
307
- }
308
- changedDocuments.set(documentId(locator, path), { room: locator, path });
309
- }
310
- for (const { conversation, identity, text } of set.messages) {
311
- if (!conversations.has(conversation) && !acquiring.has(conversation))
312
- continue;
313
- const id = messageId(conversation, identity);
314
- if (text === null)
315
- discard(id, messages);
316
- else
317
- addMessage({ conversation, identity, text });
318
- }
319
- },
320
- changes: () => changes,
321
- caughtUp,
322
- search({ text, limit, after, total }, selected, named, within, selections) {
323
- const chosen = selected === null
324
- ? null
325
- : new Set(selected.map(({ room, path }) => documentId(room, path)));
326
- const asked = new Set(named);
327
- const documentTie = ({ room, path }) => [room, path];
328
- const messageTie = ({ conversation, identity }) => [conversation, identity];
329
- const foundDocuments = ranked(text, documents, ({ room, path }, id) => (chosen === null || chosen.has(id)) &&
330
- (within === null || within.has(room)) &&
331
- !(selections?.get(room) ?? []).some((root) => beneath(root, path)), documentTie);
332
- const foundMessages = ranked(text, messages, ({ conversation }) => asked.has(conversation), messageTie);
333
- const [documentsAfter, messagesAfter] = after ?? [[], []];
334
- const documentWindow = hitWindow(foundDocuments, documentsAfter, limit, documentTie);
335
- const messageWindow = hitWindow(foundMessages, messagesAfter, limit, messageTie);
336
- const more = documentWindow.cursor !== null || messageWindow.cursor !== null;
337
- return {
338
- documents: documentWindow.kept.map(({ match, ...hit }) => ({
339
- ...hit,
340
- matches: match,
341
- })),
342
- messages: messageWindow.kept.map(({ match, ...hit }) => ({
343
- ...hit,
344
- matches: match,
345
- })),
346
- ...(more ? { next: JSON.stringify([documentWindow.cursor, messageWindow.cursor]) } : {}),
347
- ...(total
348
- ? { total: { documents: foundDocuments.length, messages: foundMessages.length } }
349
- : {}),
350
- };
351
- },
352
- };
5
+ known(input, ['text', 'rooms'], '');
6
+ if (typeof input.text !== 'string' || input.text.trim() === '')
7
+ invalid('text', 'expects words');
8
+ const rooms = input.rooms;
9
+ if (rooms !== undefined &&
10
+ (!Array.isArray(rooms) || rooms.some((named) => typeof named !== 'string'))) {
11
+ invalid('rooms', 'expects a list of Rooms');
12
+ }
13
+ return { text: input.text, rooms: rooms ?? null };
353
14
  }
package/dist/shared.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  export type Paths<V> = Readonly<Record<string, V>>;
2
2
  export declare function entriesIn<V>(map: Paths<V>): Generator<readonly [string, V]>;
3
- export declare function keysIn(...maps: readonly Paths<unknown>[]): Generator<number, Set<string>, void>;
4
3
  export declare function sortedKeys(map: Paths<unknown>): Generator<number, readonly string[], void>;
5
4
  export declare function sorting(keys: Iterable<string>): Generator<number, readonly string[], void>;
6
5
  export declare function sharing<V>(map: Paths<V>): Generator<number, Paths<V>, void>;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"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"}
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
@@ -202,16 +202,6 @@ function* rooted(map) {
202
202
  }
203
203
  return { node, size };
204
204
  }
205
- export function* keysIn(...maps) {
206
- const keys = new Set();
207
- for (const map of maps) {
208
- for (const [key] of entriesIn(map)) {
209
- keys.add(key);
210
- yield ROW_WEIGHT;
211
- }
212
- }
213
- return keys;
214
- }
215
205
  const RUN = 1 << 10;
216
206
  function* merged(left, right) {
217
207
  const into = [];
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
  }