@agentshouse/mdruntime 0.1.0-cc5745cd9af96 → 0.1.0-ccbb89b0ca151

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 (225) hide show
  1. package/README.md +18 -15
  2. package/dist/adapter.d.ts +56 -32
  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 +21 -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 +30 -8
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +186 -85
  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 +6 -16
  17. package/dist/change-set.d.ts.map +1 -1
  18. package/dist/change-set.js +11 -94
  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 +9 -5
  23. package/dist/client.d.ts.map +1 -1
  24. package/dist/client.js +80 -6
  25. package/dist/collection.d.ts +6 -20
  26. package/dist/collection.d.ts.map +1 -1
  27. package/dist/collection.js +31 -354
  28. package/dist/compile.d.ts +16 -0
  29. package/dist/compile.d.ts.map +1 -0
  30. package/dist/compile.js +765 -0
  31. package/dist/connection.d.ts +16 -9
  32. package/dist/connection.d.ts.map +1 -1
  33. package/dist/connection.js +2399 -952
  34. package/dist/conversation.d.ts +3 -3
  35. package/dist/conversation.d.ts.map +1 -1
  36. package/dist/conversation.js +80 -68
  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 +3 -5
  41. package/dist/durability.d.ts.map +1 -1
  42. package/dist/durability.js +5 -0
  43. package/dist/entry.d.ts +3 -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 +368 -0
  52. package/dist/host.d.ts +4 -4
  53. package/dist/host.d.ts.map +1 -1
  54. package/dist/host.js +45 -15
  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 +11 -9
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +4 -1
  61. package/dist/live.d.ts +22 -0
  62. package/dist/live.d.ts.map +1 -0
  63. package/dist/live.js +124 -0
  64. package/dist/media.d.ts +8 -0
  65. package/dist/media.d.ts.map +1 -0
  66. package/dist/media.js +195 -0
  67. package/dist/memory.d.ts +2 -1
  68. package/dist/memory.d.ts.map +1 -1
  69. package/dist/memory.js +63 -22
  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.map +1 -1
  74. package/dist/model.js +1 -1
  75. package/dist/name.d.ts +4 -0
  76. package/dist/name.d.ts.map +1 -0
  77. package/dist/name.js +122 -0
  78. package/dist/observation.d.ts +12 -0
  79. package/dist/observation.d.ts.map +1 -1
  80. package/dist/observation.js +84 -0
  81. package/dist/opened.d.ts +22 -0
  82. package/dist/opened.d.ts.map +1 -0
  83. package/dist/opened.js +107 -0
  84. package/dist/outcome.d.ts +40 -5
  85. package/dist/outcome.d.ts.map +1 -1
  86. package/dist/outcome.js +36 -2
  87. package/dist/overlay.d.ts +1 -4
  88. package/dist/overlay.d.ts.map +1 -1
  89. package/dist/overlay.js +22 -148
  90. package/dist/query.d.ts +11 -1
  91. package/dist/query.d.ts.map +1 -1
  92. package/dist/query.js +13 -1
  93. package/dist/reach.d.ts +11 -3
  94. package/dist/reach.d.ts.map +1 -1
  95. package/dist/reach.js +198 -69
  96. package/dist/readiness.d.ts +20 -9
  97. package/dist/readiness.d.ts.map +1 -1
  98. package/dist/readiness.js +6 -6
  99. package/dist/reads.d.ts.map +1 -1
  100. package/dist/reads.js +4 -2
  101. package/dist/recovery.d.ts +2 -2
  102. package/dist/recovery.d.ts.map +1 -1
  103. package/dist/recovery.js +8 -7
  104. package/dist/refresh.d.ts +15 -14
  105. package/dist/refresh.d.ts.map +1 -1
  106. package/dist/refresh.js +113 -75
  107. package/dist/replica.d.ts +56 -39
  108. package/dist/replica.d.ts.map +1 -1
  109. package/dist/replica.js +277 -197
  110. package/dist/room-draft.d.ts +4 -1
  111. package/dist/room-draft.d.ts.map +1 -1
  112. package/dist/room-draft.js +54 -13
  113. package/dist/rows.d.ts +38 -31
  114. package/dist/rows.d.ts.map +1 -1
  115. package/dist/rows.js +173 -101
  116. package/dist/save.d.ts +49 -14
  117. package/dist/save.d.ts.map +1 -1
  118. package/dist/save.js +352 -98
  119. package/dist/search.d.ts +11 -43
  120. package/dist/search.d.ts.map +1 -1
  121. package/dist/search.js +0 -213
  122. package/dist/shared.d.ts +4 -3
  123. package/dist/shared.d.ts.map +1 -1
  124. package/dist/shared.js +67 -34
  125. package/dist/store.d.ts +83 -95
  126. package/dist/store.d.ts.map +1 -1
  127. package/dist/store.js +317 -720
  128. package/dist/stored.d.ts +152 -0
  129. package/dist/stored.d.ts.map +1 -0
  130. package/dist/stored.js +607 -0
  131. package/dist/tables.d.ts +352 -0
  132. package/dist/tables.d.ts.map +1 -0
  133. package/dist/tables.js +624 -0
  134. package/dist/turn.d.ts +1 -1
  135. package/dist/turn.d.ts.map +1 -1
  136. package/dist/turn.js +31 -20
  137. package/dist/validation.d.ts +30 -0
  138. package/dist/validation.d.ts.map +1 -0
  139. package/dist/validation.js +162 -0
  140. package/dist/windows.d.ts +2 -6
  141. package/dist/windows.d.ts.map +1 -1
  142. package/dist/windows.js +30 -34
  143. package/dist/wire.d.ts +17 -1
  144. package/dist/wire.d.ts.map +1 -1
  145. package/dist/wire.js +5 -1
  146. package/dist/words.d.ts +19 -0
  147. package/dist/words.d.ts.map +1 -0
  148. package/dist/words.js +150 -0
  149. package/package.json +18 -19
  150. package/AGENTS.md +0 -299
  151. package/dist/chat/acts.d.ts +0 -33
  152. package/dist/chat/acts.d.ts.map +0 -1
  153. package/dist/chat/acts.js +0 -36
  154. package/dist/chat/context.d.ts +0 -3
  155. package/dist/chat/context.d.ts.map +0 -1
  156. package/dist/chat/context.js +0 -10
  157. package/dist/chat/earlier.d.ts +0 -10
  158. package/dist/chat/earlier.d.ts.map +0 -1
  159. package/dist/chat/earlier.js +0 -54
  160. package/dist/chat/input.d.ts +0 -9
  161. package/dist/chat/input.d.ts.map +0 -1
  162. package/dist/chat/input.js +0 -99
  163. package/dist/chat/kit.d.ts +0 -61
  164. package/dist/chat/kit.d.ts.map +0 -1
  165. package/dist/chat/kit.js +0 -123
  166. package/dist/chat/lasting.d.ts +0 -6
  167. package/dist/chat/lasting.d.ts.map +0 -1
  168. package/dist/chat/lasting.js +0 -19
  169. package/dist/chat/list.d.ts +0 -28
  170. package/dist/chat/list.d.ts.map +0 -1
  171. package/dist/chat/list.js +0 -103
  172. package/dist/chat/markdown.d.ts +0 -21
  173. package/dist/chat/markdown.d.ts.map +0 -1
  174. package/dist/chat/markdown.js +0 -246
  175. package/dist/chat/message.d.ts +0 -7
  176. package/dist/chat/message.d.ts.map +0 -1
  177. package/dist/chat/message.js +0 -202
  178. package/dist/chat/messages.d.ts +0 -24
  179. package/dist/chat/messages.d.ts.map +0 -1
  180. package/dist/chat/messages.js +0 -187
  181. package/dist/chat/name.d.ts +0 -6
  182. package/dist/chat/name.d.ts.map +0 -1
  183. package/dist/chat/name.js +0 -37
  184. package/dist/chat/opened.d.ts +0 -11
  185. package/dist/chat/opened.d.ts.map +0 -1
  186. package/dist/chat/opened.js +0 -17
  187. package/dist/chat/overlay.d.ts +0 -32
  188. package/dist/chat/overlay.d.ts.map +0 -1
  189. package/dist/chat/overlay.js +0 -107
  190. package/dist/chat/parts.d.ts +0 -57
  191. package/dist/chat/parts.d.ts.map +0 -1
  192. package/dist/chat/parts.js +0 -119
  193. package/dist/chat/pieces.d.ts +0 -62
  194. package/dist/chat/pieces.d.ts.map +0 -1
  195. package/dist/chat/pieces.js +0 -1110
  196. package/dist/chat/process.d.ts +0 -20
  197. package/dist/chat/process.d.ts.map +0 -1
  198. package/dist/chat/process.js +0 -32
  199. package/dist/chat/provider.d.ts +0 -64
  200. package/dist/chat/provider.d.ts.map +0 -1
  201. package/dist/chat/provider.js +0 -638
  202. package/dist/chat/question.d.ts +0 -9
  203. package/dist/chat/question.d.ts.map +0 -1
  204. package/dist/chat/question.js +0 -69
  205. package/dist/chat/questions.d.ts +0 -31
  206. package/dist/chat/questions.d.ts.map +0 -1
  207. package/dist/chat/questions.js +0 -111
  208. package/dist/chat/read.d.ts +0 -5
  209. package/dist/chat/read.d.ts.map +0 -1
  210. package/dist/chat/read.js +0 -13
  211. package/dist/chat/ready.d.ts +0 -34
  212. package/dist/chat/ready.d.ts.map +0 -1
  213. package/dist/chat/ready.js +0 -91
  214. package/dist/chat/steady.d.ts +0 -3
  215. package/dist/chat/steady.d.ts.map +0 -1
  216. package/dist/chat/steady.js +0 -26
  217. package/dist/chat/style.d.ts +0 -4
  218. package/dist/chat/style.d.ts.map +0 -1
  219. package/dist/chat/style.js +0 -302
  220. package/dist/chat.d.ts +0 -14
  221. package/dist/chat.d.ts.map +0 -1
  222. package/dist/chat.js +0 -8
  223. package/dist/read-side.d.ts +0 -27
  224. package/dist/read-side.d.ts.map +0 -1
  225. package/dist/read-side.js +0 -826
package/dist/turn.js CHANGED
@@ -9,29 +9,51 @@ export function yielded() {
9
9
  });
10
10
  }
11
11
  const UNIT = 1 << 20;
12
+ // A unit of runtime work ends within one 60 Hz frame so a port's next message waits at most a frame.
13
+ const SLICE_MS = 16;
12
14
  export const ROW_WEIGHT = 256;
13
15
  export function after(value, next) {
14
16
  return value instanceof Promise ? value.then(next) : next(value);
15
17
  }
18
+ function spending() {
19
+ let spent = 0;
20
+ let since = performance.now();
21
+ return {
22
+ spend(weight) {
23
+ spent += weight;
24
+ return spent >= UNIT || performance.now() - since >= SLICE_MS;
25
+ },
26
+ restart() {
27
+ spent = 0;
28
+ since = performance.now();
29
+ },
30
+ };
31
+ }
32
+ export function paced() {
33
+ const spent = spending();
34
+ return (weight) => (spent.spend(weight) ? yielded().then(() => spent.restart()) : undefined);
35
+ }
16
36
  async function resumed(iterator, each, ended, paused) {
17
- let spent = UNIT;
18
- for (let next = iterator.next(); next.done !== true; next = iterator.next()) {
19
- if (spent >= UNIT) {
37
+ const spent = spending();
38
+ for (let due = true;;) {
39
+ if (due) {
20
40
  await paused();
21
- spent = 0;
41
+ spent.restart();
22
42
  }
23
- spent += each(next.value);
24
- if (spent >= UNIT)
43
+ const next = iterator.next();
44
+ if (next.done === true)
45
+ break;
46
+ due = spent.spend(each(next.value));
47
+ if (due)
25
48
  ended();
26
49
  }
27
50
  ended();
28
51
  }
29
52
  export function inUnits(items, each, ended = () => { }, paused = yielded) {
30
53
  const iterator = items[Symbol.iterator]();
31
- let spent = 0;
54
+ const spent = spending();
32
55
  for (let next = iterator.next(); next.done !== true; next = iterator.next()) {
33
- spent += each(next.value);
34
- if (spent >= UNIT) {
56
+ if (spent.spend(each(next.value))) {
35
57
  ended();
36
58
  return resumed(iterator, each, ended, paused);
37
59
  }
@@ -51,14 +73,3 @@ export function stepped(steps) {
51
73
  };
52
74
  return after(inUnits(driven(), (weight) => weight), () => result);
53
75
  }
54
- export async function inChunks(items, weigh, each) {
55
- for (let at = 0; at < items.length;) {
56
- await yielded();
57
- const chunk = [];
58
- for (let spent = 0; at < items.length && spent < UNIT; at += 1) {
59
- chunk.push(items[at]);
60
- spent += weigh(items[at]);
61
- }
62
- await each(chunk);
63
- }
64
- }
@@ -0,0 +1,30 @@
1
+ import { type Validation } from '@agentshouse/mdmodel';
2
+ import { type Composition } from './collection.js';
3
+ type Examined = {
4
+ readonly path: string;
5
+ readonly content: string | null;
6
+ };
7
+ export type Typed = {
8
+ readonly type: string | undefined;
9
+ readonly binary: boolean;
10
+ };
11
+ export type Walk = (after: string | null) => Promise<{
12
+ readonly entries: readonly Examined[];
13
+ readonly next: string | null;
14
+ }>;
15
+ export type Lookup = (paths: readonly string[]) => Promise<ReadonlyMap<string, Typed>>;
16
+ export declare function validatedCollection(walk: Walk, lookup: Lookup, composition: Composition): Promise<Validation>;
17
+ export type Changed = {
18
+ readonly path: string;
19
+ readonly was: string | null | undefined;
20
+ readonly now: string | null | undefined;
21
+ };
22
+ type CleanSource = {
23
+ readonly lookup: Lookup;
24
+ readonly texts: (paths: readonly string[]) => Promise<ReadonlyMap<string, string | null>>;
25
+ readonly referrers: ((targets: readonly string[]) => Promise<readonly string[]>) | null;
26
+ };
27
+ export declare function sameComposition(left: Composition, right: Composition): boolean;
28
+ export declare function changedCleanly(changes: readonly Changed[], previous: Composition, composition: Composition, source: CleanSource): Promise<boolean>;
29
+ export {};
30
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,UAAU,EAGhB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMxE,KAAK,QAAQ,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEpF,MAAM,MAAM,IAAI,GAAG,CACjB,KAAK,EAAE,MAAM,GAAG,IAAI,KACjB,OAAO,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC;AAEtF,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAyBvF,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,UAAU,CAAC,CAyCrB;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;CACzC,CAAC;AAEF,KAAK,WAAW,GAAG;IACjB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1F,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;CACzF,CAAC;AAaF,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAQ9E;AAqCD,wBAAsB,cAAc,CAClC,OAAO,EAAE,SAAS,OAAO,EAAE,EAC3B,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,OAAO,CAAC,CAsDlB"}
@@ -0,0 +1,162 @@
1
+ import { assess, checkDocument, parse, parseFrontmatter, resolves, verdicts, } from '@agentshouse/mdmodel';
2
+ import { governing, selected } from './collection.js';
3
+ import { sameTyping } from './model.js';
4
+ import { paced, ROW_WEIGHT, yielded } from './turn.js';
5
+ const NO_TYPES = { types: {} };
6
+ function modelOf(model) {
7
+ return model.status === 'unavailable' ? NO_TYPES : { types: model.types };
8
+ }
9
+ function typedText(content) {
10
+ const read = parse(content);
11
+ return read.ok && read.document.type !== undefined && read.document.type !== 'any';
12
+ }
13
+ function partVerdict(part) {
14
+ return part.unmodeled !== null
15
+ ? { verdict: 'refuse', rule: 'model-unavailable', file: part.unmodeled }
16
+ : part.judged.verdict();
17
+ }
18
+ export async function validatedCollection(walk, lookup, composition) {
19
+ const collection = { model: composition.model, judged: verdicts(), unmodeled: null };
20
+ const selection = composition.selection === null
21
+ ? null
22
+ : { model: composition.selection.model, judged: verdicts(), unmodeled: null };
23
+ const partOf = (path) => selection !== null && selected(composition, path) ? selection : collection;
24
+ const pace = paced();
25
+ for (let after = null;;) {
26
+ const { entries, next } = await walk(after);
27
+ const assessed = [];
28
+ for (const { path, content } of entries) {
29
+ if (content === null)
30
+ continue;
31
+ const part = partOf(path);
32
+ if (part.model.status === 'unavailable' && part.unmodeled === null && typedText(content)) {
33
+ part.unmodeled = path;
34
+ }
35
+ const assessment = assess(path, content, false, modelOf(part.model), { anyRoom: true });
36
+ assessed.push({ part, assessment });
37
+ await pace(content.length + assessment.targets.length * ROW_WEIGHT);
38
+ }
39
+ const targets = [...new Set(assessed.flatMap(({ assessment }) => assessment.targets))];
40
+ const known = await lookup(targets);
41
+ for (const { part, assessment } of assessed) {
42
+ const within = (path) => partOf(path) === part;
43
+ part.judged.add(assessment, (path) => (within(path) ? known.get(path)?.type : undefined), (path) => within(path) && known.get(path)?.binary === true);
44
+ await pace((assessment.targets.length + 1) * ROW_WEIGHT);
45
+ }
46
+ if (next === null)
47
+ break;
48
+ after = next;
49
+ await yielded();
50
+ }
51
+ const judged = [partVerdict(collection), ...(selection === null ? [] : [partVerdict(selection)])];
52
+ const refusals = judged.filter((verdict) => verdict.verdict === 'refuse');
53
+ if (refusals.length === 0)
54
+ return judged[0];
55
+ return refusals.find((refusal) => refusal.rule !== 'model-unavailable') ?? refusals[0];
56
+ }
57
+ function declared(content) {
58
+ if (content === undefined || content === null)
59
+ return undefined;
60
+ const read = parseFrontmatter(content);
61
+ return read.ok ? (read.frontmatter.type ?? 'any') : undefined;
62
+ }
63
+ function typedIn(content) {
64
+ const type = declared(content);
65
+ return type !== undefined && type !== 'any';
66
+ }
67
+ export function sameComposition(left, right) {
68
+ return (sameTyping(left.model, right.model) &&
69
+ (left.selection === null || right.selection === null
70
+ ? left.selection === right.selection
71
+ : sameTyping(left.selection.model, right.selection.model)) &&
72
+ JSON.stringify(left.selection?.roots ?? null) === JSON.stringify(right.selection?.roots ?? null));
73
+ }
74
+ function checked(path, content, composition) {
75
+ const model = governing(composition, path);
76
+ return checkDocument(path, content, modelOf(model), { anyRoom: true });
77
+ }
78
+ async function reachingAll(checks, composition, next) {
79
+ const targets = [
80
+ ...new Set(checks.flatMap(({ check }) => check.ok ? check.references.flatMap(({ target }) => (target === null ? [] : [target])) : [])),
81
+ ];
82
+ const known = await next(targets);
83
+ const pace = paced();
84
+ for (const { path, check } of checks) {
85
+ if (!check.ok)
86
+ return false;
87
+ const part = (other) => selected(composition, other) === selected(composition, path);
88
+ const resolved = check.references.every((reference) => resolves(reference, (other) => (part(other) ? known.get(other)?.type : undefined), (other) => part(other) && known.get(other)?.binary === true));
89
+ if (!resolved)
90
+ return false;
91
+ await pace((check.references.length + 1) * ROW_WEIGHT);
92
+ }
93
+ return true;
94
+ }
95
+ export async function changedCleanly(changes, previous, composition, source) {
96
+ if (!sameComposition(previous, composition))
97
+ return false;
98
+ const changedAt = new Map(changes.map((change) => [change.path, change]));
99
+ const next = async (paths) => {
100
+ const asked = paths.filter((path) => !changedAt.has(path));
101
+ const known = new Map(await source.lookup(asked));
102
+ for (const path of paths) {
103
+ const change = changedAt.get(path);
104
+ if (change === undefined)
105
+ continue;
106
+ if (change.now === undefined)
107
+ known.delete(path);
108
+ else
109
+ known.set(path, { type: declared(change.now), binary: change.now === null });
110
+ }
111
+ return known;
112
+ };
113
+ const shifted = [];
114
+ const checks = [];
115
+ const pace = paced();
116
+ for (const { path, was, now } of changes) {
117
+ await pace((now?.length ?? 0) + (was?.length ?? 0) + ROW_WEIGHT);
118
+ const modeled = governing(composition, path).status !== 'unavailable';
119
+ if ((now === undefined) !== (was === undefined) ||
120
+ declared(now) !== declared(was) ||
121
+ (now === null) !== (was === null)) {
122
+ shifted.push(path);
123
+ }
124
+ if (!modeled && typedIn(was) && !typedIn(now))
125
+ return false;
126
+ if (now === undefined)
127
+ continue;
128
+ if (now === null)
129
+ return false;
130
+ if (!modeled) {
131
+ if (declared(now) === undefined)
132
+ return false;
133
+ if (typedIn(now))
134
+ continue;
135
+ const check = checked(path, now, composition);
136
+ if (!check.ok)
137
+ return false;
138
+ checks.push({ path, check });
139
+ continue;
140
+ }
141
+ checks.push({ path, check: checked(path, now, composition) });
142
+ }
143
+ if (!(await reachingAll(checks, composition, next)))
144
+ return false;
145
+ if (shifted.length === 0)
146
+ return true;
147
+ if (source.referrers === null)
148
+ return false;
149
+ const files = (await source.referrers(shifted)).filter((file) => !changedAt.has(file));
150
+ if (files.length === 0)
151
+ return true;
152
+ const texts = await source.texts(files);
153
+ const rechecked = [];
154
+ for (const file of files) {
155
+ const content = texts.get(file);
156
+ if (content === undefined || content === null)
157
+ return false;
158
+ await pace(content.length + ROW_WEIGHT);
159
+ rechecked.push({ path: file, check: checked(file, content, composition) });
160
+ }
161
+ return reachingAll(rechecked, composition, next);
162
+ }
package/dist/windows.d.ts CHANGED
@@ -8,19 +8,15 @@ export type Ordering = {
8
8
  readonly locale: string | undefined;
9
9
  readonly localeOptions: Intl.CollatorOptions | undefined;
10
10
  };
11
- export type Windowed<T> = {
12
- readonly kept: readonly T[];
13
- readonly next: string | undefined;
14
- };
15
11
  interface Placed {
16
12
  readonly position: string;
17
13
  readonly identity: string;
18
14
  }
19
15
  export declare function messageOrder(left: Placed, right: Placed): number;
20
16
  export declare function precedes(message: Placed, before: readonly [string, string] | null): boolean;
21
- export declare function beyond(values: readonly unknown[], cursor: readonly unknown[], orderings: readonly Ordering[]): boolean;
17
+ export declare function byCodePoint(left: string, right: string): number;
18
+ export declare function compared(left: unknown, right: unknown, ordering: Ordering): number;
22
19
  export declare function cursorOf(values: readonly unknown[]): string;
23
20
  export declare function decodedCursor(text: string): readonly unknown[] | null;
24
- export declare function windowed<T>(entries: readonly T[], limit: number | null, after: string | undefined, cursor: (entry: T) => string): Windowed<T>;
25
21
  export {};
26
22
  //# sourceMappingURL=windows.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../src/windows.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,eAAO,MAAM,UAAU,OAAO,CAAC;AAE/B,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE/D;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;CAC1D,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE7F,UAAU,MAAM;IACd,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,OAAO,CAE3F;AA0CD,wBAAgB,MAAM,CACpB,MAAM,EAAE,SAAS,OAAO,EAAE,EAC1B,MAAM,EAAE,SAAS,OAAO,EAAE,EAC1B,SAAS,EAAE,SAAS,QAAQ,EAAE,GAC7B,OAAO,CAMT;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAE3D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,GAAG,IAAI,CAOrE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EACxB,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,GAC3B,QAAQ,CAAC,CAAC,CAAC,CAOb"}
1
+ {"version":3,"file":"windows.d.ts","sourceRoot":"","sources":["../src/windows.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,eAAO,MAAM,UAAU,OAAO,CAAC;AAE/B,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAE/D;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;CAC1D,CAAC;AAEF,UAAU,MAAM;IACd,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhE;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,GAAG,OAAO,CAE3F;AAaD,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAO/D;AA4BD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAMlF;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAE3D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,OAAO,EAAE,GAAG,IAAI,CAOrE"}
package/dist/windows.js CHANGED
@@ -13,6 +13,27 @@ export function messageOrder(left, right) {
13
13
  export function precedes(message, before) {
14
14
  return before === null || messageOrder(message, { position: before[0], identity: before[1] }) < 0;
15
15
  }
16
+ function rank(value) {
17
+ if (typeof value === 'boolean' || typeof value === 'number')
18
+ return 1;
19
+ if (typeof value === 'string')
20
+ return 2;
21
+ return Array.isArray(value) ? 3 : 4;
22
+ }
23
+ function unit(code) {
24
+ if (code >= 0xd800 && code < 0xe000)
25
+ return code + 0x2000;
26
+ return code >= 0xe000 ? code - 0x800 : code;
27
+ }
28
+ export function byCodePoint(left, right) {
29
+ for (let at = 0; at < Math.min(left.length, right.length); at += 1) {
30
+ const ours = left.charCodeAt(at);
31
+ const theirs = right.charCodeAt(at);
32
+ if (ours !== theirs)
33
+ return unit(ours) - unit(theirs);
34
+ }
35
+ return left.length - right.length;
36
+ }
16
37
  function ascending(left, right, ordering) {
17
38
  if (left == null && right == null)
18
39
  return 0;
@@ -20,8 +41,13 @@ function ascending(left, right, ordering) {
20
41
  return ordering.nulls === 'first' ? -1 : 1;
21
42
  if (right == null)
22
43
  return ordering.nulls === 'first' ? 1 : -1;
23
- if (typeof left === 'string' && typeof right === 'string' && ordering.stringSort === 'locale') {
24
- return left.localeCompare(right, ordering.locale, ordering.localeOptions);
44
+ const ranked = rank(left) - rank(right);
45
+ if (ranked !== 0)
46
+ return ranked;
47
+ if (typeof left === 'string' && typeof right === 'string') {
48
+ return ordering.stringSort === 'locale'
49
+ ? left.localeCompare(right, ordering.locale, ordering.localeOptions)
50
+ : byCodePoint(left, right);
25
51
  }
26
52
  if (Array.isArray(left) && Array.isArray(right)) {
27
53
  for (let at = 0; at < Math.min(left.length, right.length); at += 1) {
@@ -32,9 +58,7 @@ function ascending(left, right, ordering) {
32
58
  return left.length - right.length;
33
59
  }
34
60
  if (typeof left === 'object')
35
- return typeof right === 'object' ? 0 : 1;
36
- if (typeof right === 'object')
37
- return -1;
61
+ return 0;
38
62
  const held = left;
39
63
  const other = right;
40
64
  if (held < other)
@@ -43,7 +67,7 @@ function ascending(left, right, ordering) {
43
67
  return 1;
44
68
  return 0;
45
69
  }
46
- function compared(left, right, ordering) {
70
+ export function compared(left, right, ordering) {
47
71
  if (ordering.direction === 'asc')
48
72
  return ascending(left, right, ordering);
49
73
  return ascending(right, left, {
@@ -51,25 +75,6 @@ function compared(left, right, ordering) {
51
75
  nulls: ordering.nulls === 'first' ? 'last' : 'first',
52
76
  });
53
77
  }
54
- function keyCompared(left, right) {
55
- if (typeof left !== typeof right)
56
- return typeof left === 'string' ? -1 : 1;
57
- const held = left;
58
- const other = right;
59
- if (held < other)
60
- return -1;
61
- if (held > other)
62
- return 1;
63
- return 0;
64
- }
65
- export function beyond(values, cursor, orderings) {
66
- for (let at = 0; at < orderings.length; at += 1) {
67
- const result = compared(values[at], cursor[at], orderings[at]);
68
- if (result !== 0)
69
- return result > 0;
70
- }
71
- return keyCompared(values[orderings.length], cursor[orderings.length]) > 0;
72
- }
73
78
  export function cursorOf(values) {
74
79
  return JSON.stringify(values);
75
80
  }
@@ -82,12 +87,3 @@ export function decodedCursor(text) {
82
87
  return null;
83
88
  }
84
89
  }
85
- export function windowed(entries, limit, after, cursor) {
86
- if (limit === null || entries.length <= limit)
87
- return { kept: entries, next: undefined };
88
- const kept = entries.slice(0, limit);
89
- return {
90
- kept,
91
- next: kept.length === 0 ? (after ?? FROM_START) : cursor(kept[kept.length - 1]),
92
- };
93
- }
package/dist/wire.d.ts CHANGED
@@ -42,6 +42,10 @@ declare const MEMBERS: {
42
42
  readonly reach: 'within';
43
43
  readonly effect: 'read';
44
44
  };
45
+ readonly resolve: {
46
+ readonly reach: 'within';
47
+ readonly effect: 'read';
48
+ };
45
49
  readonly 'binaryFile.read': {
46
50
  readonly reach: 'within';
47
51
  readonly effect: 'read';
@@ -50,7 +54,15 @@ declare const MEMBERS: {
50
54
  readonly reach: 'within';
51
55
  readonly effect: 'read';
52
56
  };
53
- readonly 'binaryFile.readReference': {
57
+ readonly 'binaryFile.show': {
58
+ readonly reach: 'within';
59
+ readonly effect: 'read';
60
+ };
61
+ readonly 'binaryFile.attach': {
62
+ readonly reach: 'within';
63
+ readonly effect: 'action';
64
+ };
65
+ readonly 'binaryFile.part': {
54
66
  readonly reach: 'within';
55
67
  readonly effect: 'read';
56
68
  };
@@ -66,6 +78,10 @@ declare const MEMBERS: {
66
78
  readonly reach: 'whole';
67
79
  readonly effect: 'read';
68
80
  };
81
+ readonly cleanUp: {
82
+ readonly reach: 'whole';
83
+ readonly effect: 'write';
84
+ };
69
85
  readonly persistence: {
70
86
  readonly reach: 'runtime';
71
87
  readonly effect: 'read';
@@ -1 +1 @@
1
- {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../src/wire.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../src/wire.ts"],"names":[],"mappings":"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"}
package/dist/wire.js CHANGED
@@ -7,12 +7,16 @@ const MEMBERS = {
7
7
  save: { reach: 'within', effect: 'write' },
8
8
  saveParts: { reach: 'within', effect: 'write' },
9
9
  history: { reach: 'within', effect: 'read' },
10
+ resolve: { reach: 'within', effect: 'read' },
10
11
  'binaryFile.read': { reach: 'within', effect: 'read' },
11
12
  'binaryFile.link': { reach: 'within', effect: 'read' },
12
- 'binaryFile.readReference': { reach: 'within', effect: 'read' },
13
+ 'binaryFile.show': { reach: 'within', effect: 'read' },
14
+ 'binaryFile.attach': { reach: 'within', effect: 'action' },
15
+ 'binaryFile.part': { reach: 'within', effect: 'read' },
13
16
  call: { reach: 'actions', effect: 'action' },
14
17
  reached: { reach: 'within', effect: 'read' },
15
18
  log: { reach: 'whole', effect: 'read' },
19
+ cleanUp: { reach: 'whole', effect: 'write' },
16
20
  persistence: { reach: 'runtime', effect: 'read' },
17
21
  retry: { reach: 'runtime', effect: 'write' },
18
22
  reauthorize: { reach: 'runtime', effect: 'write' },
@@ -0,0 +1,19 @@
1
+ export type Clause = {
2
+ readonly text: string;
3
+ readonly kind: 'term' | 'stem' | 'prefix' | 'phrase';
4
+ readonly term: string;
5
+ };
6
+ export type Located = {
7
+ readonly start: number;
8
+ readonly end: number;
9
+ };
10
+ export declare function indexed(text: string): string;
11
+ export declare function matchClauses(text: string): Clause[] | null;
12
+ export declare function matchExpression(clauses: readonly Clause[]): string;
13
+ export declare function queryTerms(text: string): string[];
14
+ export declare function snippet(part: string, terms: readonly string[], reach: number): {
15
+ readonly text: string;
16
+ readonly at: readonly [number, number];
17
+ } | null;
18
+ export declare function matched(part: string, terms: readonly string[]): string[];
19
+ //# sourceMappingURL=words.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"words.d.ts","sourceRoot":"","sources":["../src/words.ts"],"names":[],"mappings":"AAwBA,MAAM,MAAM,MAAM,GAAG;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAYvE,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5C;AAgBD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAiB1D;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAElE;AAMD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjD;AAyDD,wBAAgB,OAAO,CACrB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,GACZ;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAW1E;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAQxE"}
package/dist/words.js ADDED
@@ -0,0 +1,150 @@
1
+ const SPACELESS = /(?:[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Thai}\p{Script=Lao}\p{Script=Khmer}\p{Script=Myanmar}\p{Script=Hangul}]\p{M}*)+/gu;
2
+ const SPACELESS_TERM = /[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Thai}\p{Script=Lao}\p{Script=Khmer}\p{Script=Myanmar}\p{Script=Hangul}]/u;
3
+ const TOKEN = /[\p{L}\p{N}\p{M}\p{Co}]+/gu;
4
+ const MARKED = /([\p{Script=Latin}\p{Script=Greek}\p{Script=Cyrillic}])\p{M}+/gu;
5
+ const INFLECTED = /^[\p{Script=Cyrillic}\p{Script=Greek}]+$/u;
6
+ const FOLD = /\p{M}+/gu;
7
+ const ASCII = /^[\x00-\x7f]$/;
8
+ const PREFIXED_LETTERS = 2;
9
+ const INFLECTED_LETTERS = 4;
10
+ const PHRASE_TERMS = { least: 2, most: 6 };
11
+ const GRAPHEMES = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
12
+ function bigrams(run) {
13
+ const characters = Array.from(run);
14
+ if (characters.length < 2)
15
+ return ` ${run} `;
16
+ const pairs = [];
17
+ for (let index = 0; index + 1 < characters.length; index += 1) {
18
+ pairs.push(characters[index] + characters[index + 1]);
19
+ }
20
+ return ` ${pairs.join(' ')} `;
21
+ }
22
+ export function indexed(text) {
23
+ return text.normalize('NFKD').replace(MARKED, '$1').normalize('NFKC').replace(SPACELESS, bigrams);
24
+ }
25
+ function tokens(text) {
26
+ return [...text.matchAll(TOKEN)].map(([token]) => token.toLowerCase());
27
+ }
28
+ function quoted(token) {
29
+ return `"${token.replaceAll('"', '""')}"`;
30
+ }
31
+ function truncated(term) {
32
+ const letters = Array.from(term);
33
+ if (!INFLECTED.test(term) || letters.length < INFLECTED_LETTERS)
34
+ return null;
35
+ return letters.slice(0, letters.length - (letters.length >= 6 ? 2 : 1)).join('');
36
+ }
37
+ export function matchClauses(text) {
38
+ const terms = tokens(indexed(text));
39
+ if (terms.length === 0)
40
+ return null;
41
+ const unique = [...new Set(terms)];
42
+ const clauses = unique.map((term) => ({ text: quoted(term), kind: 'term', term }));
43
+ for (const term of unique) {
44
+ const stem = truncated(term);
45
+ if (stem !== null)
46
+ clauses.push({ text: `${quoted(stem)}*`, kind: 'stem', term });
47
+ }
48
+ const last = terms[terms.length - 1];
49
+ if (!/\s$/u.test(text) && Array.from(last).length >= PREFIXED_LETTERS) {
50
+ clauses.push({ text: `${quoted(last)}*`, kind: 'prefix', term: last });
51
+ }
52
+ if (terms.length >= PHRASE_TERMS.least && terms.length <= PHRASE_TERMS.most) {
53
+ clauses.push({ text: quoted(terms.join(' ')), kind: 'phrase', term: terms.join(' ') });
54
+ }
55
+ return clauses;
56
+ }
57
+ export function matchExpression(clauses) {
58
+ return clauses.map(({ text }) => text).join(' OR ');
59
+ }
60
+ function folded(text) {
61
+ return text.normalize('NFKD').replace(FOLD, '').toLowerCase();
62
+ }
63
+ export function queryTerms(text) {
64
+ return [...new Set(tokens(text.normalize('NFKC')).map(folded))];
65
+ }
66
+ function agrees(token, term) {
67
+ if (SPACELESS_TERM.test(term))
68
+ return token.includes(term);
69
+ if (token.startsWith(term))
70
+ return true;
71
+ return token.length >= 3 && term.startsWith(token.slice(0, Math.max(3, token.length - 2)));
72
+ }
73
+ function inside(token, offset, term) {
74
+ const pieces = [...GRAPHEMES.segment(token)];
75
+ const owner = [];
76
+ let joined = '';
77
+ for (const [at, { segment }] of pieces.entries()) {
78
+ const part = folded(segment);
79
+ joined += part;
80
+ for (let index = 0; index < part.length; index += 1)
81
+ owner.push(at);
82
+ }
83
+ const found = joined.indexOf(term);
84
+ if (found < 0)
85
+ return null;
86
+ const first = pieces[owner[found]];
87
+ const last = pieces[owner[found + term.length - 1]];
88
+ return { start: offset + first.index, end: offset + last.index + last.segment.length };
89
+ }
90
+ function locate(part, terms) {
91
+ for (const match of part.matchAll(TOKEN)) {
92
+ const token = folded(match[0]);
93
+ for (const term of terms) {
94
+ if (!agrees(token, term))
95
+ continue;
96
+ if (!SPACELESS_TERM.test(term)) {
97
+ return { start: match.index, end: match.index + match[0].length };
98
+ }
99
+ const found = inside(match[0], match.index, term);
100
+ if (found !== null)
101
+ return found;
102
+ }
103
+ }
104
+ return null;
105
+ }
106
+ function settled(part, index) {
107
+ if (index <= 0 || index >= part.length)
108
+ return true;
109
+ const before = part[index - 1];
110
+ const after = part[index];
111
+ if (before === '\n')
112
+ return true;
113
+ return ASCII.test(before) && ASCII.test(after) && !(before === '\r' && after === '\n');
114
+ }
115
+ function edgesAround(part, low, high) {
116
+ let from = Math.max(0, low);
117
+ while (!settled(part, from))
118
+ from -= 1;
119
+ let to = Math.min(part.length, high);
120
+ while (!settled(part, to))
121
+ to += 1;
122
+ const edges = [...GRAPHEMES.segment(part.slice(from, to))].map(({ index }) => from + index);
123
+ edges.push(to);
124
+ return edges;
125
+ }
126
+ export function snippet(part, terms, reach) {
127
+ const located = locate(part, terms);
128
+ if (located === null)
129
+ return null;
130
+ const edges = edgesAround(part, located.start - 2 * reach, located.end + 2 * reach);
131
+ const last = (limit) => edges.filter((edge) => edge <= limit).at(-1) ?? edges[0];
132
+ const first = (limit) => edges.find((edge) => edge >= limit) ?? edges[edges.length - 1];
133
+ const from = last(located.start);
134
+ const to = Math.max(first(Math.min(located.end, from + reach)), first(from + 1));
135
+ const start = first(Math.max(0, from - reach));
136
+ const end = last(Math.min(part.length, to + reach));
137
+ return { text: part.slice(start, end), at: [from - start, to - start] };
138
+ }
139
+ export function matched(part, terms) {
140
+ const found = new Set();
141
+ for (const match of part.matchAll(TOKEN)) {
142
+ const token = folded(match[0]);
143
+ for (const term of terms)
144
+ if (agrees(token, term))
145
+ found.add(term);
146
+ if (found.size === terms.length)
147
+ break;
148
+ }
149
+ return [...found];
150
+ }