@agentshouse/mdruntime 0.1.0-c5d3fa6fb67bc → 0.1.0-c5f333dfa0583

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 (198) hide show
  1. package/AGENTS.md +225 -212
  2. package/README.md +9 -8
  3. package/dist/adapter.d.ts +64 -24
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/attached-model.d.ts +4 -1
  6. package/dist/attached-model.d.ts.map +1 -1
  7. package/dist/attached-model.js +13 -3
  8. package/dist/bootstrap.d.ts +15 -7
  9. package/dist/bootstrap.d.ts.map +1 -1
  10. package/dist/bootstrap.js +90 -61
  11. package/dist/chain.d.ts +11 -0
  12. package/dist/chain.d.ts.map +1 -0
  13. package/dist/chain.js +64 -0
  14. package/dist/change-set.d.ts +8 -9
  15. package/dist/change-set.d.ts.map +1 -1
  16. package/dist/change-set.js +10 -85
  17. package/dist/change.d.ts +31 -1
  18. package/dist/change.d.ts.map +1 -1
  19. package/dist/change.js +10 -1
  20. package/dist/chat/earlier.d.ts +10 -0
  21. package/dist/chat/earlier.d.ts.map +1 -0
  22. package/dist/chat/earlier.js +54 -0
  23. package/dist/chat/house.d.ts +25 -0
  24. package/dist/chat/house.d.ts.map +1 -0
  25. package/dist/chat/house.js +38 -0
  26. package/dist/chat/input.d.ts +3 -1
  27. package/dist/chat/input.d.ts.map +1 -1
  28. package/dist/chat/input.js +11 -18
  29. package/dist/chat/kit.js +1 -1
  30. package/dist/chat/list.d.ts +2 -1
  31. package/dist/chat/list.d.ts.map +1 -1
  32. package/dist/chat/list.js +45 -5
  33. package/dist/chat/markdown.d.ts +1 -0
  34. package/dist/chat/markdown.d.ts.map +1 -1
  35. package/dist/chat/markdown.js +78 -20
  36. package/dist/chat/message.d.ts +1 -0
  37. package/dist/chat/message.d.ts.map +1 -1
  38. package/dist/chat/message.js +73 -11
  39. package/dist/chat/messages.d.ts +14 -1
  40. package/dist/chat/messages.d.ts.map +1 -1
  41. package/dist/chat/messages.js +79 -24
  42. package/dist/chat/name.d.ts +1 -0
  43. package/dist/chat/name.d.ts.map +1 -1
  44. package/dist/chat/name.js +1 -1
  45. package/dist/chat/opened.d.ts +1 -0
  46. package/dist/chat/opened.d.ts.map +1 -1
  47. package/dist/chat/opened.js +2 -0
  48. package/dist/chat/overlay.d.ts +1 -0
  49. package/dist/chat/overlay.d.ts.map +1 -1
  50. package/dist/chat/overlay.js +11 -5
  51. package/dist/chat/parts.d.ts +1 -0
  52. package/dist/chat/parts.d.ts.map +1 -1
  53. package/dist/chat/parts.js +3 -2
  54. package/dist/chat/pieces.d.ts +62 -0
  55. package/dist/chat/pieces.d.ts.map +1 -0
  56. package/dist/chat/pieces.js +1110 -0
  57. package/dist/chat/provider.d.ts +8 -1
  58. package/dist/chat/provider.d.ts.map +1 -1
  59. package/dist/chat/provider.js +98 -92
  60. package/dist/chat/question.d.ts +1 -1
  61. package/dist/chat/question.d.ts.map +1 -1
  62. package/dist/chat/question.js +7 -18
  63. package/dist/chat/ready.d.ts +5 -2
  64. package/dist/chat/ready.d.ts.map +1 -1
  65. package/dist/chat/ready.js +7 -5
  66. package/dist/chat/room-file.d.ts +8 -0
  67. package/dist/chat/room-file.d.ts.map +1 -0
  68. package/dist/chat/room-file.js +72 -0
  69. package/dist/chat/steady.d.ts +3 -0
  70. package/dist/chat/steady.d.ts.map +1 -0
  71. package/dist/chat/steady.js +26 -0
  72. package/dist/chat/style.d.ts.map +1 -1
  73. package/dist/chat/style.js +6 -1
  74. package/dist/chat.d.ts +3 -2
  75. package/dist/chat.d.ts.map +1 -1
  76. package/dist/chat.js +2 -2
  77. package/dist/client.d.ts +11 -2
  78. package/dist/client.d.ts.map +1 -1
  79. package/dist/client.js +45 -7
  80. package/dist/collection.d.ts +6 -19
  81. package/dist/collection.d.ts.map +1 -1
  82. package/dist/collection.js +30 -287
  83. package/dist/compile.d.ts +11 -0
  84. package/dist/compile.d.ts.map +1 -0
  85. package/dist/compile.js +712 -0
  86. package/dist/connection.d.ts +21 -8
  87. package/dist/connection.d.ts.map +1 -1
  88. package/dist/connection.js +2319 -688
  89. package/dist/conversation.d.ts +15 -3
  90. package/dist/conversation.d.ts.map +1 -1
  91. package/dist/conversation.js +233 -80
  92. package/dist/digest.d.ts +7 -0
  93. package/dist/digest.d.ts.map +1 -0
  94. package/dist/digest.js +113 -0
  95. package/dist/durability.d.ts +2 -1
  96. package/dist/durability.d.ts.map +1 -1
  97. package/dist/entry.d.ts +3 -1
  98. package/dist/entry.d.ts.map +1 -1
  99. package/dist/entry.js +18 -23
  100. package/dist/file.d.ts +2 -10
  101. package/dist/file.d.ts.map +1 -1
  102. package/dist/file.js +3 -120
  103. package/dist/host.d.ts +5 -4
  104. package/dist/host.d.ts.map +1 -1
  105. package/dist/host.js +55 -7
  106. package/dist/index.d.ts +10 -6
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +4 -0
  109. package/dist/live.d.ts +22 -0
  110. package/dist/live.d.ts.map +1 -0
  111. package/dist/live.js +123 -0
  112. package/dist/memory.d.ts +7 -3
  113. package/dist/memory.d.ts.map +1 -1
  114. package/dist/memory.js +39 -17
  115. package/dist/name.d.ts +4 -0
  116. package/dist/name.d.ts.map +1 -0
  117. package/dist/name.js +122 -0
  118. package/dist/observation.d.ts +14 -0
  119. package/dist/observation.d.ts.map +1 -1
  120. package/dist/observation.js +93 -3
  121. package/dist/opened.d.ts +22 -0
  122. package/dist/opened.d.ts.map +1 -0
  123. package/dist/opened.js +107 -0
  124. package/dist/outcome.d.ts +35 -4
  125. package/dist/outcome.d.ts.map +1 -1
  126. package/dist/outcome.js +28 -0
  127. package/dist/overlay.d.ts +2 -5
  128. package/dist/overlay.d.ts.map +1 -1
  129. package/dist/overlay.js +86 -171
  130. package/dist/query.d.ts +26 -2
  131. package/dist/query.d.ts.map +1 -1
  132. package/dist/query.js +34 -6
  133. package/dist/reach.d.ts +5 -1
  134. package/dist/reach.d.ts.map +1 -1
  135. package/dist/reach.js +167 -48
  136. package/dist/react.d.ts +3 -3
  137. package/dist/react.d.ts.map +1 -1
  138. package/dist/react.js +7 -17
  139. package/dist/readiness.d.ts +1 -1
  140. package/dist/readiness.d.ts.map +1 -1
  141. package/dist/reads.d.ts +11 -0
  142. package/dist/reads.d.ts.map +1 -0
  143. package/dist/reads.js +98 -0
  144. package/dist/recovery.d.ts +2 -2
  145. package/dist/recovery.d.ts.map +1 -1
  146. package/dist/recovery.js +8 -7
  147. package/dist/refresh.d.ts +12 -15
  148. package/dist/refresh.d.ts.map +1 -1
  149. package/dist/refresh.js +74 -51
  150. package/dist/replica.d.ts +55 -33
  151. package/dist/replica.d.ts.map +1 -1
  152. package/dist/replica.js +295 -186
  153. package/dist/room-draft.d.ts +15 -1
  154. package/dist/room-draft.d.ts.map +1 -1
  155. package/dist/room-draft.js +32 -25
  156. package/dist/rows.d.ts +29 -30
  157. package/dist/rows.d.ts.map +1 -1
  158. package/dist/rows.js +113 -64
  159. package/dist/save.d.ts +51 -14
  160. package/dist/save.d.ts.map +1 -1
  161. package/dist/save.js +518 -180
  162. package/dist/search.d.ts +19 -4
  163. package/dist/search.d.ts.map +1 -1
  164. package/dist/search.js +192 -35
  165. package/dist/seed.d.ts +16 -0
  166. package/dist/seed.d.ts.map +1 -0
  167. package/dist/seed.js +75 -0
  168. package/dist/shared.d.ts +8 -3
  169. package/dist/shared.d.ts.map +1 -1
  170. package/dist/shared.js +129 -66
  171. package/dist/store.d.ts +99 -71
  172. package/dist/store.d.ts.map +1 -1
  173. package/dist/store.js +461 -586
  174. package/dist/stored.d.ts +143 -0
  175. package/dist/stored.d.ts.map +1 -0
  176. package/dist/stored.js +561 -0
  177. package/dist/tables.d.ts +320 -0
  178. package/dist/tables.d.ts.map +1 -0
  179. package/dist/tables.js +537 -0
  180. package/dist/turn.d.ts +5 -3
  181. package/dist/turn.d.ts.map +1 -1
  182. package/dist/turn.js +51 -21
  183. package/dist/validation.d.ts +30 -0
  184. package/dist/validation.d.ts.map +1 -0
  185. package/dist/validation.js +162 -0
  186. package/dist/windows.d.ts +22 -0
  187. package/dist/windows.d.ts.map +1 -0
  188. package/dist/windows.js +89 -0
  189. package/dist/wire.d.ts +32 -0
  190. package/dist/wire.d.ts.map +1 -1
  191. package/dist/wire.js +8 -0
  192. package/package.json +10 -3
  193. package/dist/acquisition.d.ts +0 -14
  194. package/dist/acquisition.d.ts.map +0 -1
  195. package/dist/acquisition.js +0 -24
  196. package/dist/read-side.d.ts +0 -25
  197. package/dist/read-side.d.ts.map +0 -1
  198. package/dist/read-side.js +0 -642
package/dist/index.js CHANGED
@@ -1,5 +1,9 @@
1
1
  export { departure } from './change.js';
2
+ export { partsAfter } from './room-draft.js';
3
+ export { cutName, nameFrom, transliterated } from './name.js';
2
4
  export { SESSION_STARTED } from './conversation.js';
3
5
  export { changeBatchIdentity } from './identity.js';
6
+ export { ROW_WEIGHT, stepped } from './turn.js';
7
+ export { entriesIn, patching, sortedKeys } from './shared.js';
4
8
  export { attempts, identities, intentOf, } from './attempt.js';
5
9
  export { expectedList, expecting } from './expectation.js';
package/dist/live.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import type { ChangeSet } from './change-set.js';
2
+ import { type KeyedResult, type QueryMessage } from './observation.js';
3
+ import type { PendingResult, Plan, QueryCoverage } from './query.js';
4
+ import type { QueryRoom } from './tables.js';
5
+ export type Cover = {
6
+ coverage: QueryCoverage;
7
+ rooms: readonly QueryRoom[];
8
+ } | PendingResult;
9
+ export type Ran = KeyedResult & {
10
+ readonly current: () => boolean;
11
+ };
12
+ export type Run = (plan: Plan, cover: () => Cover) => Promise<Ran>;
13
+ type Listener = (message: QueryMessage) => void;
14
+ export type LiveQueries = {
15
+ touched(set: ChangeSet): void;
16
+ recover(): void;
17
+ watch(plan: Plan, identity: string, cover: () => Cover, deliver: Listener): () => void;
18
+ close(): void;
19
+ };
20
+ export declare function createLiveQueries(run: Run): LiveQueries;
21
+ export {};
22
+ //# sourceMappingURL=live.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live.d.ts","sourceRoot":"","sources":["../src/live.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CAAE,GAAG,aAAa,CAAC;AAE7F,MAAM,MAAM,GAAG,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;CAAE,CAAC;AAEpE,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAEnE,KAAK,QAAQ,GAAG,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;AAchD,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;IAC9B,OAAO,IAAI,IAAI,CAAC;IAChB,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,EAAE,QAAQ,GAAG,MAAM,IAAI,CAAC;IACvF,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAmCF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW,CAuFvD"}
package/dist/live.js ADDED
@@ -0,0 +1,123 @@
1
+ import { changeOf, digestOf, } from './observation.js';
2
+ import { roomOfKey } from './rows.js';
3
+ function narrowed(plan) {
4
+ return (plan.paths !== null &&
5
+ plan.hop === null &&
6
+ plan.backlinks === null &&
7
+ !(plan.shape.kind === 'documents' && plan.shape.backlinks));
8
+ }
9
+ function reads(plan, locator) {
10
+ if (plan.locked.includes(locator))
11
+ return false;
12
+ if (plan.rooms !== null && !plan.rooms.includes(locator))
13
+ return false;
14
+ if (plan.reach === null)
15
+ return true;
16
+ return (plan.reach.rooms.includes(locator) ||
17
+ plan.reach.documents.some((document) => roomOfKey(document) === locator));
18
+ }
19
+ function affected(plan, set) {
20
+ if (set.rooms.some((locator) => reads(plan, locator)))
21
+ return true;
22
+ const paths = narrowed(plan) ? new Set(plan.paths) : null;
23
+ return set.documents.some(({ locator, path }) => reads(plan, locator) && (paths === null || path === null || paths.has(path)));
24
+ }
25
+ function shown(entry) {
26
+ const cover = entry.cover();
27
+ return JSON.stringify('pending' in cover ? cover : cover.coverage);
28
+ }
29
+ export function createLiveQueries(run) {
30
+ const entries = new Map();
31
+ let closed = false;
32
+ function deliver(entry, next) {
33
+ const previous = entry.digest;
34
+ entry.digest = digestOf(next);
35
+ entry.covered = JSON.stringify('pending' in next.result ? next.result : next.result.coverage);
36
+ const change = previous === undefined ? null : changeOf(previous, next);
37
+ if (change !== null) {
38
+ for (const listener of entry.ready)
39
+ listener(change);
40
+ }
41
+ for (const listener of entry.fresh) {
42
+ entry.ready.add(listener);
43
+ listener(next);
44
+ }
45
+ entry.fresh.clear();
46
+ }
47
+ function schedule(entry) {
48
+ if (closed || entry.listeners.size === 0)
49
+ return;
50
+ if (entry.running) {
51
+ entry.dirty = true;
52
+ return;
53
+ }
54
+ entry.running = true;
55
+ void (async () => {
56
+ try {
57
+ for (;;) {
58
+ entry.dirty = false;
59
+ const { current, ...next } = await run(entry.plan, entry.cover);
60
+ if (closed || entry.listeners.size === 0)
61
+ return;
62
+ deliver(entry, next);
63
+ if (!(entry.dirty && !current()) && shown(entry) === entry.covered)
64
+ break;
65
+ }
66
+ }
67
+ catch {
68
+ entry.dirty = false;
69
+ }
70
+ finally {
71
+ entry.running = false;
72
+ }
73
+ })();
74
+ }
75
+ return {
76
+ touched(set) {
77
+ for (const entry of entries.values()) {
78
+ if (affected(entry.plan, set))
79
+ schedule(entry);
80
+ }
81
+ },
82
+ recover() {
83
+ for (const entry of entries.values()) {
84
+ if (entry.running)
85
+ continue;
86
+ if (entry.digest === undefined || shown(entry) !== entry.covered)
87
+ schedule(entry);
88
+ }
89
+ },
90
+ watch(plan, identity, cover, listener) {
91
+ let entry = entries.get(identity);
92
+ if (entry === undefined) {
93
+ entry = {
94
+ plan,
95
+ cover,
96
+ listeners: new Set(),
97
+ fresh: new Set(),
98
+ ready: new Set(),
99
+ digest: undefined,
100
+ covered: '',
101
+ dirty: false,
102
+ running: false,
103
+ };
104
+ entries.set(identity, entry);
105
+ }
106
+ const held = entry;
107
+ held.listeners.add(listener);
108
+ held.fresh.add(listener);
109
+ schedule(held);
110
+ return () => {
111
+ held.listeners.delete(listener);
112
+ held.fresh.delete(listener);
113
+ held.ready.delete(listener);
114
+ if (held.listeners.size === 0 && entries.get(identity) === held)
115
+ entries.delete(identity);
116
+ };
117
+ },
118
+ close() {
119
+ closed = true;
120
+ entries.clear();
121
+ },
122
+ };
123
+ }
package/dist/memory.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { ModelResult } from './model.js';
2
- import { type AcceptedMessage, type ActionResult, type Adapter, type BinaryFile, type Capability, type ConversationAction, type ConversationEvent, type DiscoveredRoom, type HeadChange, type ListedConversation, type Member, type ProviderLimit, type Retention, type AcquiredDemand, type ServiceMode } from './adapter.js';
2
+ import { type AcceptedMessage, type ActionResult, type Adapter, type BinaryFile, type Capability, type ConversationAction, type ConversationEvent, type DiscoveryScope, type DiscoveredRoom, type HeadChange, type ListedConversation, type Member, type ProviderLimit, type Retention, type ServiceMode } from './adapter.js';
3
3
  export type MemoryRoom = DiscoveredRoom & {
4
4
  model?: ModelResult;
5
5
  selectionModel?: ModelResult;
@@ -8,6 +8,7 @@ export type MemoryRoom = DiscoveredRoom & {
8
8
  fileIds?: Readonly<Record<string, string>>;
9
9
  changes?: Readonly<Record<string, HeadChange>>;
10
10
  binaryFiles?: Readonly<Record<string, BinaryFile>>;
11
+ folders?: readonly string[];
11
12
  blobs?: Readonly<Record<string, Blob>>;
12
13
  };
13
14
  export type MemoryConversation = {
@@ -33,16 +34,19 @@ export type MemoryAdapter = Adapter & {
33
34
  setConversations(conversations: readonly MemoryConversation[]): void;
34
35
  script(operation: keyof Adapter, answer: unknown): void;
35
36
  open(): void;
36
- close(revoked?: boolean): void;
37
+ close(closing?: {
38
+ revoked?: boolean;
39
+ lost?: boolean;
40
+ }): void;
37
41
  expire(locators: readonly string[]): void;
38
42
  notifyRoomVersion(notification: {
39
43
  locator: string;
40
44
  roomVersion: string;
41
45
  }): void;
46
+ notifyAuthorityChanged(scope?: DiscoveryScope): void;
42
47
  notifyConversation(event: ConversationEvent): void;
43
48
  notifyServiceMode(mode: ServiceMode): void;
44
49
  heldRooms(): readonly string[];
45
- heldDemand(): AcquiredDemand | null;
46
50
  replicatedConversations(): readonly string[];
47
51
  };
48
52
  export declare function createMemoryAdapter(options?: MemoryAdapterOptions): MemoryAdapter;
@@ -1 +1 @@
1
- {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
package/dist/memory.js CHANGED
@@ -58,7 +58,6 @@ export function createMemoryAdapter(options = {}) {
58
58
  const sentTurns = new Map();
59
59
  const historyPageSize = options.historyPageSize;
60
60
  let held = [];
61
- let heldDemand = null;
62
61
  let expiring = [];
63
62
  let replicated = [];
64
63
  let issued = 0;
@@ -128,9 +127,20 @@ export function createMemoryAdapter(options = {}) {
128
127
  : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
129
128
  changes: named(room.changes ?? {}, [...taken, ...targets]),
130
129
  binaryFiles: named(room.binaryFiles ?? {}, targets),
130
+ ...(opening && room.folders !== undefined ? { folders: room.folders } : {}),
131
131
  ...(next < paths.length ? { pageToken: taken.at(-1) } : {}),
132
132
  };
133
133
  }
134
+ function foldersMoved(room, from) {
135
+ const now = new Set(room.folders ?? []);
136
+ const before = new Set(from.folders ?? []);
137
+ const folders = [...now].filter((folder) => !before.has(folder)).sort();
138
+ const folderRemovals = [...before].filter((folder) => !now.has(folder)).sort();
139
+ return {
140
+ ...(folders.length === 0 ? {} : { folders }),
141
+ ...(folderRemovals.length === 0 ? {} : { folderRemovals }),
142
+ };
143
+ }
134
144
  function advancement(room, from, at) {
135
145
  const current = room.documents ?? {};
136
146
  const previous = from.documents ?? {};
@@ -164,6 +174,7 @@ export function createMemoryAdapter(options = {}) {
164
174
  : { fileIds: named(room.fileIds, [...taken, ...targets]) }),
165
175
  changes: named(room.changes ?? {}, [...taken, ...targets]),
166
176
  binaryFiles: named(room.binaryFiles ?? {}, targets),
177
+ ...(opening ? foldersMoved(room, from) : {}),
167
178
  removals: opening
168
179
  ? [
169
180
  ...Object.keys(previous).filter((path) => !(path in current) && !currentTargets.has(path)),
@@ -281,9 +292,9 @@ export function createMemoryAdapter(options = {}) {
281
292
  for (const observer of observers)
282
293
  observer({ kind: 'opened' });
283
294
  },
284
- close(revoked = false) {
295
+ close({ revoked = false, lost = !revoked } = {}) {
285
296
  for (const observer of observers)
286
- observer({ kind: 'closed', revoked });
297
+ observer({ kind: 'closed', revoked, lost });
287
298
  },
288
299
  expire(locators) {
289
300
  expiring = [...locators];
@@ -292,6 +303,13 @@ export function createMemoryAdapter(options = {}) {
292
303
  for (const observer of observers)
293
304
  observer({ kind: 'room-version', locator, roomVersion });
294
305
  },
306
+ notifyAuthorityChanged(scope) {
307
+ for (const observer of observers) {
308
+ observer(scope === undefined
309
+ ? { kind: 'authority-changed' }
310
+ : { kind: 'authority-changed', scope });
311
+ }
312
+ },
295
313
  notifyConversation(event) {
296
314
  if (event.kind === 'accepted-message') {
297
315
  sealed.add(event.message.turn);
@@ -307,9 +325,6 @@ export function createMemoryAdapter(options = {}) {
307
325
  heldRooms() {
308
326
  return held;
309
327
  },
310
- heldDemand() {
311
- return heldDemand;
312
- },
313
328
  replicatedConversations() {
314
329
  return replicated;
315
330
  },
@@ -333,9 +348,8 @@ export function createMemoryAdapter(options = {}) {
333
348
  },
334
349
  },
335
350
  roomStream: {
336
- hold(asked, demand) {
351
+ hold(asked) {
337
352
  held = asked.map((room) => room.locator);
338
- heldDemand = demand;
339
353
  const expired = expiring.filter((locator) => held.includes(locator));
340
354
  expiring = [];
341
355
  const moved = asked.flatMap((room) => {
@@ -356,8 +370,9 @@ export function createMemoryAdapter(options = {}) {
356
370
  },
357
371
  reopen() {
358
372
  queueMicrotask(() => {
359
- for (const observer of observers)
360
- observer({ kind: 'closed', revoked: false });
373
+ for (const observer of observers) {
374
+ observer({ kind: 'closed', revoked: false, lost: false });
375
+ }
361
376
  });
362
377
  },
363
378
  published() { },
@@ -367,7 +382,7 @@ export function createMemoryAdapter(options = {}) {
367
382
  if (!observers.has(notify))
368
383
  return;
369
384
  if (options.unopened === true) {
370
- notify({ kind: 'closed', revoked: false });
385
+ notify({ kind: 'closed', revoked: false, lost: true });
371
386
  return;
372
387
  }
373
388
  announceList();
@@ -450,7 +465,13 @@ export function createMemoryAdapter(options = {}) {
450
465
  retryable: false,
451
466
  affected: {},
452
467
  };
453
- }, request).then((answer) => note(request.locator, answer));
468
+ }, request).then((answer) => {
469
+ const destination = request.changeBatch.between?.destination.room;
470
+ if (answer.kind === 'accepted' && answer.destination !== undefined && destination) {
471
+ note(destination, answer.destination);
472
+ }
473
+ return note(request.locator, answer);
474
+ });
454
475
  },
455
476
  async history(_authorization, request) {
456
477
  return resolveScript(scripts.history, () => {
@@ -475,18 +496,19 @@ export function createMemoryAdapter(options = {}) {
475
496
  const blob = room.blobs?.[request.path];
476
497
  return blob === undefined
477
498
  ? { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false }
478
- : { kind: 'binary', blob };
499
+ : { kind: 'binary', body: blob.stream(), mediaType: blob.type };
479
500
  }, request);
480
501
  },
502
+ async link(_authorization, request) {
503
+ return resolveScript(scripts.link, () => ({ kind: 'rejected', code: 'unscripted-link', fields: {}, retryable: false }), request);
504
+ },
481
505
  referrerScope(referrer) {
482
506
  if (typeof referrer !== 'object' || referrer === null)
483
507
  return null;
484
- const { room, path, message } = referrer;
485
- if (typeof message === 'string')
486
- return { kind: 'conversations' };
508
+ const { room, path } = referrer;
487
509
  if (typeof room !== 'string')
488
510
  return null;
489
- return { kind: 'room', locator: room, ...(typeof path === 'string' ? { path } : {}) };
511
+ return { locator: room, ...(typeof path === 'string' ? { path } : {}) };
490
512
  },
491
513
  async action(_authorization, request) {
492
514
  return resolveScript(scripts.action, () => {
package/dist/name.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export declare function transliterated(text: string): string;
2
+ export declare function nameFrom(title: string): string;
3
+ export declare function cutName(name: string, most: number): string;
4
+ //# sourceMappingURL=name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name.d.ts","sourceRoot":"","sources":["../src/name.ts"],"names":[],"mappings":"AAgHA,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D"}
package/dist/name.js ADDED
@@ -0,0 +1,122 @@
1
+ const LETTERS = {
2
+ а: 'a',
3
+ б: 'b',
4
+ в: 'v',
5
+ г: 'g',
6
+ ґ: 'g',
7
+ д: 'd',
8
+ ђ: 'dj',
9
+ ѓ: 'gj',
10
+ е: 'e',
11
+ ё: 'yo',
12
+ є: 'ye',
13
+ ж: 'zh',
14
+ з: 'z',
15
+ ѕ: 'dz',
16
+ и: 'i',
17
+ і: 'i',
18
+ ї: 'yi',
19
+ й: 'y',
20
+ ј: 'j',
21
+ к: 'k',
22
+ ќ: 'kj',
23
+ л: 'l',
24
+ љ: 'lj',
25
+ м: 'm',
26
+ н: 'n',
27
+ њ: 'nj',
28
+ о: 'o',
29
+ п: 'p',
30
+ р: 'r',
31
+ с: 's',
32
+ т: 't',
33
+ ћ: 'c',
34
+ у: 'u',
35
+ ў: 'u',
36
+ ф: 'f',
37
+ х: 'kh',
38
+ ц: 'ts',
39
+ ч: 'ch',
40
+ џ: 'dz',
41
+ ш: 'sh',
42
+ щ: 'shch',
43
+ ъ: '',
44
+ ы: 'y',
45
+ ь: '',
46
+ э: 'e',
47
+ ю: 'yu',
48
+ я: 'ya',
49
+ α: 'a',
50
+ β: 'v',
51
+ γ: 'g',
52
+ δ: 'd',
53
+ ε: 'e',
54
+ ζ: 'z',
55
+ η: 'i',
56
+ θ: 'th',
57
+ ι: 'i',
58
+ κ: 'k',
59
+ λ: 'l',
60
+ μ: 'm',
61
+ ν: 'n',
62
+ ξ: 'x',
63
+ ο: 'o',
64
+ π: 'p',
65
+ ρ: 'r',
66
+ σ: 's',
67
+ ς: 's',
68
+ τ: 't',
69
+ υ: 'y',
70
+ φ: 'f',
71
+ χ: 'ch',
72
+ ψ: 'ps',
73
+ ω: 'o',
74
+ ß: 'ss',
75
+ æ: 'ae',
76
+ œ: 'oe',
77
+ ø: 'o',
78
+ đ: 'd',
79
+ ð: 'd',
80
+ þ: 'th',
81
+ ł: 'l',
82
+ ı: 'i',
83
+ };
84
+ const MARKS = /\p{M}/gu;
85
+ const ADMITTED = /^[a-z0-9]$/;
86
+ const WORDLIKE = /^[\p{L}\p{N}]$/u;
87
+ function lowerLetterOf(character) {
88
+ const known = LETTERS[character];
89
+ if (known !== undefined)
90
+ return known;
91
+ const bare = character.normalize('NFKD').replace(MARKS, '');
92
+ const mapped = LETTERS[bare];
93
+ if (mapped !== undefined)
94
+ return mapped;
95
+ return [...bare].every((one) => ADMITTED.test(one)) ? bare : null;
96
+ }
97
+ function codePoint(character) {
98
+ return WORDLIKE.test(character) ? `-u${character.codePointAt(0)?.toString(16) ?? ''}-` : '-';
99
+ }
100
+ function latin(text, unknown) {
101
+ return [...text]
102
+ .map((character) => {
103
+ if ((character.codePointAt(0) ?? 0) < 0x80)
104
+ return character;
105
+ const lower = character.toLowerCase();
106
+ const letter = lowerLetterOf(lower) ?? unknown(lower);
107
+ return lower === character ? letter : `${letter.charAt(0).toUpperCase()}${letter.slice(1)}`;
108
+ })
109
+ .join('');
110
+ }
111
+ export function transliterated(text) {
112
+ return latin(text, () => '-');
113
+ }
114
+ export function nameFrom(title) {
115
+ return latin(title, codePoint)
116
+ .toLowerCase()
117
+ .replace(/[^a-z0-9]+/g, '-')
118
+ .replace(/^-+|-+$/g, '');
119
+ }
120
+ export function cutName(name, most) {
121
+ return name.slice(0, most).replace(/-+$/, '');
122
+ }
@@ -14,6 +14,8 @@ export type QueryChange = {
14
14
  removed: readonly RowKey[];
15
15
  order: readonly RowKey[] | null;
16
16
  coverage?: QueryCoverage;
17
+ next?: string | null;
18
+ total?: number;
17
19
  };
18
20
  export type QueryMessage = KeyedResult | QueryChange;
19
21
  export type Observed = {
@@ -27,4 +29,16 @@ export declare function applied(keyed: KeyedResult, message: QueryMessage): Keye
27
29
  export declare function observed(first: unknown, stop: () => void, keyed: boolean): Observed;
28
30
  export declare function opened(watch: (deliver: (message: unknown) => void) => () => void, keyed: boolean): Promise<Observation<unknown>>;
29
31
  export declare function observing<Topic extends string>(watch: (topic: Topic, input: readonly unknown[], deliver: (message: unknown) => void) => () => void): (topic: Topic, ...input: unknown[]) => Promise<Observation<unknown>>;
32
+ export type Digest = {
33
+ readonly pending: string;
34
+ } | {
35
+ readonly keys: readonly RowKey[];
36
+ readonly rows: ReadonlyMap<RowKey, number>;
37
+ readonly coverage: string;
38
+ readonly next: string | undefined;
39
+ readonly total: number | undefined;
40
+ };
41
+ export declare function digestOf({ result, keys }: KeyedResult): Digest;
42
+ export declare function digestApplied(digest: Digest, message: QueryMessage): Digest;
43
+ export declare function changeOf(previous: Digest, next: KeyedResult): QueryMessage | null;
30
44
  //# sourceMappingURL=observation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,IAAI,CAAC,CAAC;IACb,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,GAAG,IAAI,IAAI,CAAC;CACb,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,EAAE,CAGnF;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,IAAI,WAAW,CAEnE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAkB9E;AAiBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAkCnF;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,EAC1D,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAiB/B;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,MAAM,EAC5C,KAAK,EAAE,CACL,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAChC,MAAM,IAAI,WAEA,KAAK,YAAY,OAAO,EAAE,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAQ1E"}
1
+ {"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../src/observation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAExF,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAC3B,OAAO,IAAI,CAAC,CAAC;IACb,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACpD,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAErC,MAAM,MAAM,WAAW,GAAG;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,UAAU,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,WAAW,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAChC,GAAG,IAAI,IAAI,CAAC;CACb,CAAC;AAEF,wBAAgB,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC,aAAa,GAAG,UAAU,CAAC,EAAE,CAGnF;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,IAAI,WAAW,CAEnE;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW,CAwB9E;AAiBD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,CAkCnF;AAED,wBAAgB,MAAM,CACpB,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAAK,MAAM,IAAI,EAC1D,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAiB/B;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,MAAM,EAC5C,KAAK,EAAE,CACL,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,KAChC,MAAM,IAAI,WAEA,KAAK,YAAY,OAAO,EAAE,KAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAQ1E;AAED,MAAM,MAAM,MAAM,GACd;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5B;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC,CAAC;AAqBN,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,WAAW,GAAG,MAAM,CAU9D;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAY3E;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,YAAY,GAAG,IAAI,CA+BjF"}
@@ -19,12 +19,18 @@ export function applied(keyed, message) {
19
19
  for (const [key, row] of message.changed)
20
20
  byKey.set(key, row);
21
21
  const keys = message.order ?? keyed.keys.filter((key) => byKey.has(key));
22
- const next = keys.map((key) => byKey.get(key));
22
+ const kept = keys.map((key) => byKey.get(key));
23
23
  const coverage = message.coverage ?? result.coverage;
24
+ const next = message.next === undefined ? result.next : (message.next ?? undefined);
25
+ const total = message.total ?? result.total;
26
+ const window = {
27
+ ...(next === undefined ? {} : { next }),
28
+ ...(total === undefined ? {} : { total }),
29
+ };
24
30
  return {
25
31
  result: 'groups' in result
26
- ? { groups: next, coverage }
27
- : { documents: next, coverage },
32
+ ? { groups: kept, coverage, ...window }
33
+ : { documents: kept, coverage, ...window },
28
34
  keys,
29
35
  };
30
36
  }
@@ -104,3 +110,87 @@ export function observing(watch) {
104
110
  deliver(structuredClone(message));
105
111
  }), topic === 'query');
106
112
  }
113
+ function hashed(text) {
114
+ let first = 0xdeadbeef;
115
+ let second = 0x41c6ce57;
116
+ for (let index = 0; index < text.length; index += 1) {
117
+ const code = text.charCodeAt(index);
118
+ first = Math.imul(first ^ code, 2654435761);
119
+ second = Math.imul(second ^ code, 1597334677);
120
+ }
121
+ first =
122
+ Math.imul(first ^ (first >>> 16), 2246822507) ^ Math.imul(second ^ (second >>> 13), 3266489909);
123
+ second =
124
+ Math.imul(second ^ (second >>> 16), 2246822507) ^ Math.imul(first ^ (first >>> 13), 3266489909);
125
+ return 4294967296 * (2097151 & second) + (first >>> 0);
126
+ }
127
+ function rowDigest(row) {
128
+ return hashed(JSON.stringify(row));
129
+ }
130
+ export function digestOf({ result, keys }) {
131
+ if ('pending' in result)
132
+ return { pending: JSON.stringify(result) };
133
+ const rows = rowsOf(result);
134
+ return {
135
+ keys,
136
+ rows: new Map(keys.map((key, index) => [key, rowDigest(rows[index])])),
137
+ coverage: JSON.stringify(result.coverage),
138
+ next: result.next,
139
+ total: result.total,
140
+ };
141
+ }
142
+ export function digestApplied(digest, message) {
143
+ if (whole(message) || 'pending' in digest)
144
+ return whole(message) ? digestOf(message) : digest;
145
+ const rows = new Map(digest.rows);
146
+ for (const key of message.removed)
147
+ rows.delete(key);
148
+ for (const [key, row] of message.changed)
149
+ rows.set(key, rowDigest(row));
150
+ return {
151
+ keys: message.order ?? digest.keys.filter((key) => rows.has(key)),
152
+ rows,
153
+ coverage: message.coverage === undefined ? digest.coverage : JSON.stringify(message.coverage),
154
+ next: message.next === undefined ? digest.next : (message.next ?? undefined),
155
+ total: message.total ?? digest.total,
156
+ };
157
+ }
158
+ export function changeOf(previous, next) {
159
+ const after = next.result;
160
+ if ('pending' in previous || 'pending' in after) {
161
+ return 'pending' in previous && 'pending' in after && previous.pending === JSON.stringify(after)
162
+ ? null
163
+ : next;
164
+ }
165
+ const later = rowsOf(after);
166
+ const present = new Set(next.keys);
167
+ const changed = [];
168
+ next.keys.forEach((key, index) => {
169
+ const row = later[index];
170
+ if (previous.rows.get(key) !== rowDigest(row))
171
+ changed.push([key, row]);
172
+ });
173
+ const removed = previous.keys.filter((key) => !present.has(key));
174
+ const kept = previous.keys.filter((key) => present.has(key));
175
+ const moved = kept.length !== next.keys.length || kept.some((key, index) => next.keys[index] !== key);
176
+ const coverage = JSON.stringify(after.coverage);
177
+ const covered = previous.coverage !== coverage;
178
+ const framing = reframed(previous, after);
179
+ if (changed.length === 0 && removed.length === 0 && !moved && !covered && framing === null) {
180
+ return null;
181
+ }
182
+ return {
183
+ changed,
184
+ removed,
185
+ order: moved ? next.keys : null,
186
+ ...(covered ? { coverage: after.coverage } : {}),
187
+ ...framing,
188
+ };
189
+ }
190
+ function reframed(before, after) {
191
+ const next = before.next === after.next ? {} : { next: after.next ?? null };
192
+ const total = before.total === after.total || after.total === undefined ? {} : { total: after.total };
193
+ return Object.keys(next).length === 0 && Object.keys(total).length === 0
194
+ ? null
195
+ : { ...next, ...total };
196
+ }
@@ -0,0 +1,22 @@
1
+ import type { BinaryResult } from './adapter.js';
2
+ import { type RuntimeDatabase } from './tables.js';
3
+ export type OpenedName = {
4
+ readonly locator: string;
5
+ readonly path: string;
6
+ readonly revision: string;
7
+ };
8
+ export type KeptBinary = {
9
+ readonly kind: 'binary';
10
+ readonly file: string;
11
+ readonly byteLength: number;
12
+ readonly mediaType: string;
13
+ };
14
+ export type KeptResult = KeptBinary | Exclude<BinaryResult, {
15
+ kind: 'binary';
16
+ }>;
17
+ export type OpenedFiles = {
18
+ find(name: OpenedName): Promise<KeptBinary | null>;
19
+ fetch(name: OpenedName, read: () => Promise<BinaryResult>): Promise<KeptResult>;
20
+ };
21
+ export declare function openedFiles(database: RuntimeDatabase, fenced: (locator: string) => boolean): OpenedFiles;
22
+ //# sourceMappingURL=opened.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opened.d.ts","sourceRoot":"","sources":["../src/opened.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC,CAAC;AAEhF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACjF,CAAC;AAsBF,wBAAgB,WAAW,CACzB,QAAQ,EAAE,eAAe,EACzB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,GACnC,WAAW,CAsFb"}