@agentshouse/mdruntime 0.1.0-c2af3ddcc243b → 0.1.0-c2e433921a4d5

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 (172) hide show
  1. package/README.md +14 -13
  2. package/dist/acceptance.js +1 -1
  3. package/dist/adapter.d.ts +55 -9
  4. package/dist/adapter.d.ts.map +1 -1
  5. package/dist/attached-model.d.ts +0 -1
  6. package/dist/attached-model.d.ts.map +1 -1
  7. package/dist/attached-model.js +0 -5
  8. package/dist/authored.d.ts +88 -0
  9. package/dist/authored.d.ts.map +1 -0
  10. package/dist/authored.js +345 -0
  11. package/dist/change.d.ts +4 -0
  12. package/dist/change.d.ts.map +1 -1
  13. package/dist/change.js +3 -0
  14. package/dist/chat-types.d.ts +0 -2
  15. package/dist/chat-types.d.ts.map +1 -1
  16. package/dist/chat-types.js +0 -2
  17. package/dist/client.d.ts +5 -3
  18. package/dist/client.d.ts.map +1 -1
  19. package/dist/client.js +4 -7
  20. package/dist/collection.d.ts +4 -1
  21. package/dist/collection.d.ts.map +1 -1
  22. package/dist/collection.js +7 -0
  23. package/dist/column.d.ts +5 -0
  24. package/dist/column.d.ts.map +1 -0
  25. package/dist/column.js +9 -0
  26. package/dist/compile.d.ts.map +1 -1
  27. package/dist/compile.js +2 -3
  28. package/dist/connection.d.ts.map +1 -1
  29. package/dist/connection.js +6 -4
  30. package/dist/context.d.ts.map +1 -1
  31. package/dist/context.js +1 -1
  32. package/dist/conversation-live.d.ts +16 -6
  33. package/dist/conversation-live.d.ts.map +1 -1
  34. package/dist/conversation-live.js +15 -6
  35. package/dist/conversation-row.d.ts +8 -1
  36. package/dist/conversation-row.d.ts.map +1 -1
  37. package/dist/conversation-row.js +20 -7
  38. package/dist/conversation.d.ts +9 -5
  39. package/dist/conversation.d.ts.map +1 -1
  40. package/dist/conversation.js +155 -123
  41. package/dist/figures.d.ts.map +1 -1
  42. package/dist/figures.js +4 -2
  43. package/dist/file.d.ts.map +1 -1
  44. package/dist/file.js +2 -1
  45. package/dist/host.d.ts +1 -0
  46. package/dist/host.d.ts.map +1 -1
  47. package/dist/host.js +14 -8
  48. package/dist/index.d.ts +4 -3
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +2 -1
  51. package/dist/install.d.ts +8 -2
  52. package/dist/install.d.ts.map +1 -1
  53. package/dist/install.js +40 -33
  54. package/dist/lifecycle.d.ts.map +1 -1
  55. package/dist/lifecycle.js +15 -10
  56. package/dist/listing.d.ts +7 -3
  57. package/dist/listing.d.ts.map +1 -1
  58. package/dist/listing.js +26 -13
  59. package/dist/live.d.ts +5 -3
  60. package/dist/live.d.ts.map +1 -1
  61. package/dist/live.js +71 -30
  62. package/dist/loaded.d.ts +5 -0
  63. package/dist/loaded.d.ts.map +1 -0
  64. package/dist/loaded.js +40 -0
  65. package/dist/locks.d.ts.map +1 -1
  66. package/dist/locks.js +2 -2
  67. package/dist/lost.js +1 -1
  68. package/dist/media.d.ts +5 -0
  69. package/dist/media.d.ts.map +1 -1
  70. package/dist/media.js +65 -14
  71. package/dist/memory.d.ts +3 -1
  72. package/dist/memory.d.ts.map +1 -1
  73. package/dist/memory.js +17 -8
  74. package/dist/messages.d.ts +3 -1
  75. package/dist/messages.d.ts.map +1 -1
  76. package/dist/messages.js +5 -3
  77. package/dist/models.d.ts.map +1 -1
  78. package/dist/models.js +3 -3
  79. package/dist/observation.d.ts +27 -12
  80. package/dist/observation.d.ts.map +1 -1
  81. package/dist/observation.js +173 -69
  82. package/dist/outcome.d.ts +4 -0
  83. package/dist/outcome.d.ts.map +1 -1
  84. package/dist/outcome.js +8 -2
  85. package/dist/overlay.d.ts +1 -1
  86. package/dist/overlay.d.ts.map +1 -1
  87. package/dist/overlay.js +3 -5
  88. package/dist/preparation.d.ts +27 -6
  89. package/dist/preparation.d.ts.map +1 -1
  90. package/dist/preparation.js +131 -44
  91. package/dist/presence.d.ts +8 -2
  92. package/dist/presence.d.ts.map +1 -1
  93. package/dist/presence.js +24 -13
  94. package/dist/queries.d.ts +1 -1
  95. package/dist/queries.d.ts.map +1 -1
  96. package/dist/queries.js +43 -17
  97. package/dist/questions.d.ts +1 -0
  98. package/dist/questions.d.ts.map +1 -1
  99. package/dist/questions.js +1 -0
  100. package/dist/queue.d.ts.map +1 -1
  101. package/dist/queue.js +51 -21
  102. package/dist/reach.d.ts +2 -3
  103. package/dist/reach.d.ts.map +1 -1
  104. package/dist/reach.js +20 -7
  105. package/dist/react.d.ts +3 -1
  106. package/dist/react.d.ts.map +1 -1
  107. package/dist/readiness.d.ts +8 -2
  108. package/dist/readiness.d.ts.map +1 -1
  109. package/dist/readiness.js +3 -5
  110. package/dist/reads.d.ts +1 -1
  111. package/dist/reads.d.ts.map +1 -1
  112. package/dist/reads.js +2 -2
  113. package/dist/replica.d.ts.map +1 -1
  114. package/dist/replica.js +2 -2
  115. package/dist/room-draft.d.ts +28 -3
  116. package/dist/room-draft.d.ts.map +1 -1
  117. package/dist/room-draft.js +230 -12
  118. package/dist/room-drafts.d.ts.map +1 -1
  119. package/dist/room-drafts.js +5 -2
  120. package/dist/room-list.d.ts +10 -0
  121. package/dist/room-list.d.ts.map +1 -0
  122. package/dist/room-list.js +45 -0
  123. package/dist/rows.d.ts +2 -1
  124. package/dist/rows.d.ts.map +1 -1
  125. package/dist/rows.js +6 -6
  126. package/dist/save.d.ts.map +1 -1
  127. package/dist/save.js +17 -86
  128. package/dist/saves.d.ts.map +1 -1
  129. package/dist/saves.js +23 -7
  130. package/dist/seed.d.ts.map +1 -1
  131. package/dist/seed.js +2 -2
  132. package/dist/shown.d.ts +1 -1
  133. package/dist/shown.d.ts.map +1 -1
  134. package/dist/shown.js +51 -37
  135. package/dist/source.d.ts +5 -0
  136. package/dist/source.d.ts.map +1 -1
  137. package/dist/source.js +13 -2
  138. package/dist/store/installs.d.ts +2 -2
  139. package/dist/store/installs.d.ts.map +1 -1
  140. package/dist/store/installs.js +10 -4
  141. package/dist/store/readiness.d.ts +5 -4
  142. package/dist/store/readiness.d.ts.map +1 -1
  143. package/dist/store/readiness.js +28 -12
  144. package/dist/store/records.d.ts +10 -1
  145. package/dist/store/records.d.ts.map +1 -1
  146. package/dist/store/records.js +46 -19
  147. package/dist/store/rooms-shown.d.ts +8 -0
  148. package/dist/store/rooms-shown.d.ts.map +1 -0
  149. package/dist/store/rooms-shown.js +13 -0
  150. package/dist/store.d.ts +12 -8
  151. package/dist/store.d.ts.map +1 -1
  152. package/dist/store.js +8 -4
  153. package/dist/stored.d.ts +23 -13
  154. package/dist/stored.d.ts.map +1 -1
  155. package/dist/stored.js +73 -22
  156. package/dist/surface.d.ts +4 -2
  157. package/dist/surface.d.ts.map +1 -1
  158. package/dist/surface.js +7 -2
  159. package/dist/sync.d.ts +1 -1
  160. package/dist/sync.d.ts.map +1 -1
  161. package/dist/sync.js +8 -7
  162. package/dist/tables.d.ts +10 -49
  163. package/dist/tables.d.ts.map +1 -1
  164. package/dist/tables.js +60 -322
  165. package/dist/tallies.d.ts.map +1 -1
  166. package/dist/tallies.js +1 -2
  167. package/dist/validation.d.ts.map +1 -1
  168. package/dist/validation.js +3 -9
  169. package/dist/wire.d.ts +2 -8
  170. package/dist/wire.d.ts.map +1 -1
  171. package/dist/wire.js +2 -2
  172. package/package.json +2 -2
package/dist/live.js CHANGED
@@ -1,27 +1,25 @@
1
- import { changeOf, digestOf, } from './observation.js';
1
+ import { changeOf, digestOf, keyedAt, keyedInto, samePending, unchanged, } from './observation.js';
2
2
  import { uncaught } from './failure.js';
3
- import { roomOfKey } from './rows.js';
3
+ import { roomsOfReach } from './rows.js';
4
4
  function narrowed(plan) {
5
5
  return (plan.paths !== null &&
6
6
  plan.hop === null &&
7
7
  plan.backlinks === null &&
8
8
  !(plan.shape.kind === 'documents' && plan.shape.backlinks));
9
9
  }
10
- function reads(plan, locator) {
11
- if (plan.locked.includes(locator))
12
- return false;
13
- if (plan.rooms !== null && !plan.rooms.includes(locator))
14
- return false;
15
- if (plan.reach === null)
16
- return true;
17
- return (plan.reach.rooms.includes(locator) ||
18
- plan.reach.documents.some((document) => roomOfKey(document) === locator));
10
+ export function readerOf(plan) {
11
+ const locked = new Set(plan.locked);
12
+ const named = plan.rooms === null ? null : new Set(plan.rooms);
13
+ const reached = plan.reach === null ? null : roomsOfReach(plan.reach);
14
+ return (locator) => !locked.has(locator) &&
15
+ (named === null || named.has(locator)) &&
16
+ (reached === null || reached.has(locator));
19
17
  }
20
- function affected(plan, set) {
21
- if (set.rooms.some((locator) => reads(plan, locator)))
18
+ function affected({ plan, reads }, set) {
19
+ if (set.rooms.some(reads))
22
20
  return true;
23
21
  const paths = narrowed(plan) ? new Set(plan.paths) : null;
24
- return set.documents.some(({ locator, path }) => reads(plan, locator) && (paths === null || path === null || paths.has(path)));
22
+ return set.documents.some(({ locator, path }) => reads(locator) && (paths === null || path === null || paths.has(path)));
25
23
  }
26
24
  function shown(entry, held) {
27
25
  const cover = entry.cover(held);
@@ -30,11 +28,13 @@ function shown(entry, held) {
30
28
  export function createLiveQueries(run, holding) {
31
29
  const entries = new Map();
32
30
  let closed = false;
33
- let recovering = false;
34
- let recoverAgain = false;
31
+ let recoveringNow = false;
32
+ let recoveringAll = false;
33
+ const recovering = new Set();
35
34
  function deliver(entry, next) {
36
35
  const previous = entry.digest;
37
36
  entry.digest = digestOf(next);
37
+ entry.pending = 'pending' in entry.digest ? entry.digest.pending : null;
38
38
  entry.covered = JSON.stringify('pending' in next.result ? next.result : next.result.coverage);
39
39
  const change = previous === undefined ? null : changeOf(previous, next);
40
40
  if (change !== null) {
@@ -87,58 +87,99 @@ export function createLiveQueries(run, holding) {
87
87
  }
88
88
  })();
89
89
  }
90
- function recovered() {
91
- if (recovering) {
92
- recoverAgain = true;
93
- return;
90
+ function pendingMoved(entry, held, rooms) {
91
+ const { pending } = entry;
92
+ if (pending === null || pending.size === 0 || entry.running || entry.fresh.size > 0) {
93
+ return false;
94
94
  }
95
- recovering = true;
95
+ const at = entry.pendingAt(held, rooms);
96
+ const change = at === null ? null : keyedAt(pending, at, samePending);
97
+ if (change === null || change.removed.length === pending.size)
98
+ return false;
99
+ keyedInto(pending, change);
100
+ entry.covered = '';
101
+ if (unchanged(change))
102
+ return true;
103
+ for (const listener of entry.ready)
104
+ listener({ pending: change });
105
+ return true;
106
+ }
107
+ function recovered(locators) {
108
+ if (locators === undefined)
109
+ recoveringAll = true;
110
+ else
111
+ for (const locator of locators)
112
+ recovering.add(locator);
113
+ if (recoveringNow)
114
+ return;
115
+ recoveringNow = true;
96
116
  void (async () => {
97
117
  try {
98
- do {
99
- recoverAgain = false;
100
- for (const entry of entries.values()) {
118
+ while ((recoveringAll || recovering.size > 0) && !closed) {
119
+ const all = recoveringAll;
120
+ const touched = [...recovering];
121
+ recoveringAll = false;
122
+ recovering.clear();
123
+ const reached = [...entries.values()].filter((entry) => all || touched.some(entry.reads));
124
+ for (const entry of reached) {
101
125
  if (entry.running)
102
126
  entry.dirty = true;
103
127
  }
104
- const waiting = [...entries.values()].filter((entry) => !entry.running);
105
- if (waiting.length === 0 || closed)
128
+ const waiting = reached.filter((entry) => !entry.running);
129
+ if (waiting.length === 0)
106
130
  continue;
107
131
  const held = await holding();
108
132
  for (const entry of waiting) {
109
133
  if (entry.running)
110
134
  continue;
135
+ const read = all ? [] : touched.filter(entry.reads);
136
+ if (read.length > 0 && pendingMoved(entry, held, read))
137
+ continue;
111
138
  if (entry.digest === undefined || shown(entry, held) !== entry.covered)
112
139
  schedule(entry);
113
140
  }
114
- } while (recoverAgain && !closed);
141
+ }
115
142
  }
116
143
  catch (error) {
117
144
  uncaught(error);
118
145
  }
119
146
  finally {
120
- recovering = false;
147
+ recoveringNow = false;
121
148
  }
122
149
  })();
123
150
  }
124
151
  return {
125
152
  touched(set) {
153
+ const pending = new Set();
126
154
  for (const entry of entries.values()) {
127
- if (affected(entry.plan, set))
155
+ if (!affected(entry, set))
156
+ continue;
157
+ if (entry.pending === null || entry.running) {
128
158
  schedule(entry);
159
+ continue;
160
+ }
161
+ for (const locator of set.rooms)
162
+ pending.add(locator);
163
+ for (const { locator } of set.documents)
164
+ pending.add(locator);
129
165
  }
166
+ if (pending.size > 0)
167
+ recovered([...pending]);
130
168
  },
131
169
  recover: recovered,
132
- watch(plan, identity, cover, listener, failed) {
170
+ watch(plan, identity, cover, pendingAt, listener, failed) {
133
171
  let entry = entries.get(identity);
134
172
  if (entry === undefined) {
135
173
  entry = {
136
174
  plan,
175
+ reads: readerOf(plan),
137
176
  cover,
177
+ pendingAt,
138
178
  listeners: new Set(),
139
179
  fresh: new Map(),
140
180
  ready: new Set(),
141
181
  digest: undefined,
182
+ pending: null,
142
183
  covered: '',
143
184
  dirty: false,
144
185
  running: false,
@@ -0,0 +1,5 @@
1
+ import type { BuildFile } from './client.js';
2
+ export declare function parsed(file: Blob | null): Promise<unknown>;
3
+ export declare function perBuild<T>(buildFile: BuildFile, key: string, make: () => Promise<T>): Promise<T>;
4
+ export declare function loaded<T>(buildFile: BuildFile, name: string, read?: (file: Blob | null) => Promise<unknown>): Promise<T | null>;
5
+ //# sourceMappingURL=loaded.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loaded.d.ts","sourceRoot":"","sources":["../src/loaded.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAc7C,wBAAsB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAEhE;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAYjG;AAED,wBAAgB,MAAM,CAAC,CAAC,EACtB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC,OAAO,CAAY,GACvD,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAEnB"}
package/dist/loaded.js ADDED
@@ -0,0 +1,40 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ const holdings = new WeakMap();
10
+ async function imported(file) {
11
+ if (file === null)
12
+ return null;
13
+ const address = URL.createObjectURL(file);
14
+ try {
15
+ return await import(__rewriteRelativeImportExtension(address));
16
+ }
17
+ finally {
18
+ URL.revokeObjectURL(address);
19
+ }
20
+ }
21
+ export async function parsed(file) {
22
+ return file === null ? null : JSON.parse(await file.text());
23
+ }
24
+ export function perBuild(buildFile, key, make) {
25
+ let named = holdings.get(buildFile);
26
+ if (named === undefined) {
27
+ named = new Map();
28
+ holdings.set(buildFile, named);
29
+ }
30
+ const holding = named.get(key);
31
+ if (holding !== undefined)
32
+ return holding;
33
+ const making = make();
34
+ named.set(key, making);
35
+ making.catch(() => named.delete(key));
36
+ return making;
37
+ }
38
+ export function loaded(buildFile, name, read = imported) {
39
+ return perBuild(buildFile, name, () => buildFile(name).then(read));
40
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../src/locks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,wBAAsB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5F;AAED,wBAAsB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAK1F;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,iBAKzE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAU9C;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAE7E"}
1
+ {"version":3,"file":"locks.d.ts","sourceRoot":"","sources":["../src/locks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5C,wBAAsB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5F;AAED,wBAAsB,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAG1F;AAED,wBAAsB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,iBAKzE;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAU9C;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAE7E"}
package/dist/locks.js CHANGED
@@ -4,8 +4,8 @@ export async function locked({ store, presence }, locator) {
4
4
  return presence.locked(locator, async () => (await store.open()).offline(locator));
5
5
  }
6
6
  export async function lockedRooms({ store, presence }) {
7
- const held = (await store.covering()).rooms;
8
- return presence.lockedAmong(new Map([...held].map(([locator, { offline }]) => [locator, offline])));
7
+ const { rooms, locking } = await store.covering();
8
+ return presence.lockedAmong(rooms, locking);
9
9
  }
10
10
  export async function relocked(runtime, before) {
11
11
  const after = await lockedRooms(runtime);
package/dist/lost.js CHANGED
@@ -42,7 +42,7 @@ export async function loseRooms(runtime, locators) {
42
42
  queue: true,
43
43
  drafts: held.filter((draft) => draft.locator === locator).map(({ path }) => path),
44
44
  }))));
45
- recoverReads(runtime);
45
+ recoverReads(runtime, fresh);
46
46
  }
47
47
  await unpair(runtime);
48
48
  await eraseFenced(runtime, fresh);
package/dist/media.d.ts CHANGED
@@ -1,8 +1,13 @@
1
1
  import type { MdRuntimeClient } from './client.js';
2
2
  import { type ShownAnswer } from './outcome.js';
3
3
  export declare const ROOM_MEDIA = "room-media";
4
+ export declare const DIAGRAM = "md-diagram";
5
+ export declare const VIEWING = "ahc-viewer";
4
6
  type Show = (room: string, path: string, revision?: string) => Promise<ShownAnswer>;
5
7
  export declare function shownBy(show: Show, client: MdRuntimeClient): MdRuntimeClient;
8
+ export declare function rendered(element: Element): boolean;
9
+ export declare function viewable(element: Element): boolean;
10
+ export declare function viewFile(client: MdRuntimeClient, media: Element): void;
6
11
  export declare function defineRoomMedia(client: Promise<MdRuntimeClient> | MdRuntimeClient): void;
7
12
  export {};
8
13
  //# sourceMappingURL=media.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3D,eAAO,MAAM,UAAU,eAAe,CAAC;AAwBvC,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAIpF,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,GAAG,eAAe,CAG5E;AAsBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,GAAG,IAAI,CA0LxF"}
1
+ {"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../src/media.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAEnE,eAAO,MAAM,UAAU,eAAe,CAAC;AAMvC,eAAO,MAAM,OAAO,eAAe,CAAC;AAEpC,eAAO,MAAM,OAAO,eAAe,CAAC;AA8BpC,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAIpF,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,GAAG,eAAe,CAG5E;AAsBD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAElD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAMlD;AA4BD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAEtE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,eAAe,GAAG,IAAI,CAkMxF"}
package/dist/media.js CHANGED
@@ -1,5 +1,12 @@
1
- import { UNCERTAIN } from './outcome.js';
1
+ import { isAudioType, isImageType, isVideoType } from '@agentshouse/mdmodel';
2
+ import { loaded } from './loaded.js';
3
+ import { blobOf, UNCERTAIN } from './outcome.js';
2
4
  export const ROOM_MEDIA = 'room-media';
5
+ const VIEWER = 'viewer';
6
+ const RENDERED = '.ahc, .ahc-markdown';
7
+ export const DIAGRAM = 'md-diagram';
8
+ export const VIEWING = 'ahc-viewer';
9
+ const PRESSED_ELSEWHERE = 'a[href], button, input, select, textarea, summary, label, [role="button"], [role="link"]';
3
10
  const ATTRIBUTES = ['room', 'path', 'revision', 'width', 'height', 'alt'];
4
11
  const LOADING = new Set(['room', 'path', 'revision']);
5
12
  const NEARING = '600px 0px';
@@ -10,7 +17,10 @@ const SHAPE = '16 / 9';
10
17
  const STYLE = `:host{display:block}
11
18
  [part=box]{position:relative;overflow:hidden}
12
19
  [part=box]>img,[part=box]>video,[part=box]>audio{display:block;width:100%;height:100%;object-fit:contain}
13
- [part=box]>slot{display:flex;align-items:center;justify-content:center;width:100%;height:100%;text-align:center}`;
20
+ [part=box]>video:not([controls]){cursor:pointer}
21
+ [part=box]>slot{display:flex;align-items:center;justify-content:center;width:100%;height:100%;text-align:center}
22
+ [part=play]{position:absolute;top:50%;left:50%;width:56px;height:56px;margin:-28px 0 0 -28px;border-radius:50%;background:rgb(0 0 0/.6);pointer-events:none}
23
+ [part=play]::before{content:"";position:absolute;top:18px;left:22px;border-style:solid;border-width:10px 0 10px 16px;border-color:transparent transparent transparent #fff}`;
14
24
  const shows = new WeakMap();
15
25
  export function shownBy(show, client) {
16
26
  shows.set(client, show);
@@ -29,23 +39,62 @@ function refusedForGood(shown) {
29
39
  return (shown.kind === 'rejected' || shown.kind === 'scoped-refusal') && !shown.retryable;
30
40
  }
31
41
  function drawnFor(mediaType) {
32
- if (mediaType.startsWith('image/'))
42
+ if (isImageType(mediaType))
33
43
  return 'img';
34
- if (mediaType.startsWith('video/'))
44
+ if (isVideoType(mediaType))
35
45
  return 'video';
36
- if (mediaType.startsWith('audio/'))
46
+ if (isAudioType(mediaType))
37
47
  return 'audio';
38
48
  return null;
39
49
  }
50
+ export function rendered(element) {
51
+ return element.closest(RENDERED) !== null;
52
+ }
53
+ export function viewable(element) {
54
+ if (element.localName === 'figure')
55
+ return element.classList.contains(DIAGRAM);
56
+ if (element.localName !== ROOM_MEDIA || element.closest(`.${VIEWING}`) !== null)
57
+ return false;
58
+ return (rendered(element) || (element.shadowRoot?.querySelector('[part=box] > video') ?? null) !== null);
59
+ }
60
+ function viewed(client, opener, alone) {
61
+ void loaded(client.buildFile, VIEWER).then((file) => file?.openViewer({
62
+ opener,
63
+ alone,
64
+ download: (room, path, revision) => void client.binaryFile.download(room, path, revision),
65
+ }));
66
+ }
67
+ function pressed(client) {
68
+ return (event) => {
69
+ if (event.defaultPrevented || event.detail > 1)
70
+ return;
71
+ for (const node of event.composedPath()) {
72
+ if (!(node instanceof Element))
73
+ continue;
74
+ if (viewable(node)) {
75
+ event.preventDefault();
76
+ void client.then((one) => viewed(one, node, !rendered(node)));
77
+ return;
78
+ }
79
+ if (node.matches(PRESSED_ELSEWHERE))
80
+ return;
81
+ }
82
+ };
83
+ }
84
+ export function viewFile(client, media) {
85
+ viewed(client, media, true);
86
+ }
40
87
  export function defineRoomMedia(client) {
41
88
  if (customElements.get(ROOM_MEDIA) !== undefined)
42
89
  return;
43
90
  const connected = Promise.resolve(client);
91
+ document.addEventListener('click', pressed(connected));
44
92
  class RoomMedia extends HTMLElement {
45
93
  static observedAttributes = ATTRIBUTES;
46
94
  #root = this.attachShadow({ mode: 'open' });
47
95
  #box = document.createElement('div');
48
96
  #fallback = document.createElement('slot');
97
+ #play = document.createElement('span');
49
98
  #watching = null;
50
99
  #near = false;
51
100
  #asked = 0;
@@ -56,6 +105,7 @@ export function defineRoomMedia(client) {
56
105
  constructor() {
57
106
  super();
58
107
  this.#box.setAttribute('part', 'box');
108
+ this.#play.setAttribute('part', 'play');
59
109
  this.#root.append(Object.assign(document.createElement('style'), { textContent: STYLE }), this.#box);
60
110
  this.#shape();
61
111
  }
@@ -129,11 +179,7 @@ export function defineRoomMedia(client) {
129
179
  this.#unshown(asked);
130
180
  return;
131
181
  }
132
- const copy = await new Response(shown.stream, {
133
- headers: { 'content-type': shown.mediaType },
134
- })
135
- .blob()
136
- .catch(() => null);
182
+ const copy = await blobOf(shown).catch(() => null);
137
183
  if (asked !== this.#asked)
138
184
  return;
139
185
  if (copy === null)
@@ -157,7 +203,9 @@ export function defineRoomMedia(client) {
157
203
  if (content === null)
158
204
  this.#box.replaceChildren();
159
205
  else if (content.parentNode !== this.#box)
160
- this.#box.replaceChildren(content);
206
+ this.#box.replaceChildren(...(content instanceof HTMLVideoElement && !content.controls
207
+ ? [content, this.#play]
208
+ : [content]));
161
209
  this.#label();
162
210
  }
163
211
  #unreadable() {
@@ -174,13 +222,16 @@ export function defineRoomMedia(client) {
174
222
  const kept = this.#drawn?.localName === tag ? this.#drawn : null;
175
223
  const drawn = kept ?? document.createElement(tag);
176
224
  if (kept === null) {
225
+ const plays = !(drawn instanceof HTMLVideoElement) || this.closest(`.${VIEWING}`) !== null;
177
226
  if (drawn instanceof HTMLImageElement)
178
227
  drawn.decoding = 'async';
179
228
  if (drawn instanceof HTMLMediaElement) {
180
- drawn.controls = true;
181
229
  drawn.preload = 'metadata';
182
- if (drawn instanceof HTMLVideoElement && 'playsInline' in drawn)
183
- drawn.playsInline = true;
230
+ drawn.controls = plays;
231
+ }
232
+ if (drawn instanceof HTMLVideoElement && plays) {
233
+ drawn.autoplay = true;
234
+ drawn.setAttribute('playsinline', '');
184
235
  }
185
236
  drawn.addEventListener(drawn instanceof HTMLImageElement ? 'load' : 'loadedmetadata', () => {
186
237
  if (drawn !== this.#drawn)
package/dist/memory.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type VerifiedModel } from '@agentshouse/mdmodel';
1
2
  import type { ModelResult } from './model.js';
2
3
  import { type AcceptedMessage, type ActionResult, type Adapter, type BinaryFile, type Capability, type ConversationAction, type ConversationEvent, type DiscoveredRoom, type SavedFacts, type HeadChange, type ListedAgent, type ListedConversation, type Member, type ProviderLimit, type Retention, type ServiceMode, type TypedPath, type TypedSelection } from './adapter.js';
3
4
  export type MemoryRoom = Omit<DiscoveredRoom, 'typedSelection' | 'authoredPaths'> & {
@@ -31,7 +32,7 @@ export type MemoryAdapterOptions = {
31
32
  retention?: Retention;
32
33
  member?: Member;
33
34
  unopened?: boolean;
34
- roomTypes?: string;
35
+ roomTypes?: VerifiedModel;
35
36
  typedPaths?: readonly TypedPath[];
36
37
  };
37
38
  export type MemoryAdapter = Adapter & {
@@ -39,6 +40,7 @@ export type MemoryAdapter = Adapter & {
39
40
  refresh: NonNullable<Adapter['refresh']>;
40
41
  setRooms(rooms: readonly MemoryRoom[]): void;
41
42
  setConversations(conversations: readonly MemoryConversation[]): void;
43
+ setAgents(agents: readonly ListedAgent[]): void;
42
44
  script(operation: keyof Adapter, answer: unknown): void;
43
45
  open(): void;
44
46
  close(closing?: {
@@ -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
@@ -1,6 +1,7 @@
1
1
  import { definitionAt, documentFacts, parse } from '@agentshouse/mdmodel';
2
- import { roomTypesOf, schemaTypes } from './attached-model.js';
2
+ import { NO_ROOM_TYPES, schemaTypes } from './attached-model.js';
3
3
  import { selected } from './collection.js';
4
+ import { declaredType } from './outcome.js';
4
5
  import { sameChange } from './overlay.js';
5
6
  const ATTACHMENTS = 'attachments';
6
7
  function lastName(path) {
@@ -64,6 +65,7 @@ export function createMemoryAdapter(options = {}) {
64
65
  const declaredRooms = new Set();
65
66
  let replicated = [];
66
67
  let heldCursor = null;
68
+ let agents = structuredClone(options.agents ?? []);
67
69
  let issued = 0;
68
70
  function scriptConversations(entries) {
69
71
  scripted.clear();
@@ -105,7 +107,7 @@ export function createMemoryAdapter(options = {}) {
105
107
  }
106
108
  }
107
109
  const saved = new WeakMap();
108
- const roomTypes = roomTypesOf(options.roomTypes);
110
+ const roomTypes = options.roomTypes ?? NO_ROOM_TYPES;
109
111
  function factsAt(room, path, content) {
110
112
  const types = selected({ selection: room.typedSelection ?? null }, path)
111
113
  ? roomTypes.types
@@ -346,7 +348,14 @@ export function createMemoryAdapter(options = {}) {
346
348
  ? []
347
349
  : [{ conversation, ...listed, newest: messages.at(-1)?.change ?? null }]);
348
350
  for (const listener of listeners) {
349
- listener({ kind: 'list', entries, whole: true, more: false, cursor: null });
351
+ listener({
352
+ kind: 'list',
353
+ agents: structuredClone(agents),
354
+ entries,
355
+ whole: true,
356
+ more: false,
357
+ cursor: null,
358
+ });
350
359
  }
351
360
  }
352
361
  function discovery() {
@@ -402,6 +411,9 @@ export function createMemoryAdapter(options = {}) {
402
411
  setConversations(next) {
403
412
  scriptConversations(next);
404
413
  },
414
+ setAgents(next) {
415
+ agents = structuredClone(next);
416
+ },
405
417
  open() {
406
418
  carried.clear();
407
419
  announceList();
@@ -464,9 +476,6 @@ export function createMemoryAdapter(options = {}) {
464
476
  };
465
477
  },
466
478
  history: (request) => Promise.resolve(historiesOf(request)),
467
- ...(options.agents === undefined
468
- ? {}
469
- : { agents: () => Promise.resolve(structuredClone(options.agents)) }),
470
479
  },
471
480
  serviceMode: {
472
481
  observe(notify) {
@@ -619,7 +628,7 @@ export function createMemoryAdapter(options = {}) {
619
628
  const blob = heldBlob(room, request.path);
620
629
  return blob === undefined
621
630
  ? { kind: 'rejected', code: 'not_found', fields: {}, retryable: false }
622
- : { kind: 'binary', body: blob.stream(), mediaType: blob.type };
631
+ : { kind: 'binary', body: blob.stream(), mediaType: declaredType(blob) };
623
632
  }, request);
624
633
  },
625
634
  async link(_authorization, request) {
@@ -633,7 +642,7 @@ export function createMemoryAdapter(options = {}) {
633
642
  }
634
643
  const url = linked.get(blob) ?? URL.createObjectURL(blob);
635
644
  linked.set(blob, url);
636
- return { kind: 'link', url, name: lastName(request.path), mediaType: blob.type };
645
+ return { kind: 'link', url, name: lastName(request.path), mediaType: declaredType(blob) };
637
646
  }, request);
638
647
  },
639
648
  async attach(_authorization, request) {
@@ -1,7 +1,7 @@
1
1
  import type { AcceptedMessage } from './adapter.js';
2
2
  import type { Connection } from './tables.js';
3
3
  export declare const MESSAGE_TABLES: readonly string[];
4
- export declare const ROWS = "WITH chosen AS (\n SELECT listed.value AS conversation,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'assistant' ORDER BY position DESC, identity DESC LIMIT 1) AS answer,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND text <> '' ORDER BY position DESC, identity DESC LIMIT 1) AS said,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' ORDER BY position, identity LIMIT 1) AS opened,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' AND json_extract(message, '$.waiting') = 1 ORDER BY position, identity LIMIT 1) AS asking\n FROM json_each(?) AS listed\n )\n SELECT chosen.conversation AS conversation,\n substr(said.text, 1, 512) AS said_text,\n json_extract(said.message, '$.role') AS said_role,\n json_extract(said.message, '$.accepted_at') AS said_at,\n substr(json_extract(answer.message, '$.failure'), 1, 512) AS failure,\n json_extract(opened.message, '$.source') AS opened_source,\n json_extract(opened.message, '$.sender') AS opened_sender,\n asking.identity AS asking_identity,\n asking.text AS asking_text,\n json_extract(asking.message, '$.accepted_at') AS asking_at,\n json_extract(asking.message, '$.source') AS asking_source,\n json_extract(asking.message, '$.sender') AS asking_sender\n FROM chosen\n LEFT JOIN conversation_messages said ON said.id = chosen.said\n LEFT JOIN conversation_messages answer ON answer.id = chosen.answer\n LEFT JOIN conversation_messages opened ON opened.id = chosen.opened\n LEFT JOIN conversation_messages asking ON asking.id = chosen.asking";
4
+ export declare const ROWS = "WITH chosen AS (\n SELECT listed.value AS conversation,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'assistant' ORDER BY position DESC, identity DESC LIMIT 1) AS answer,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND text <> '' ORDER BY position DESC, identity DESC LIMIT 1) AS said,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' ORDER BY position, identity LIMIT 1) AS opened,\n (SELECT id FROM conversation_messages WHERE conversation = listed.value AND json_extract(message, '$.role') = 'house' AND json_extract(message, '$.waiting') = 1 ORDER BY position, identity LIMIT 1) AS asking\n FROM json_each(?) AS listed\n )\n SELECT chosen.conversation AS conversation,\n substr(said.text, 1, 512) AS said_text,\n json_extract(said.message, '$.role') AS said_role,\n json_extract(said.message, '$.accepted_at') AS said_at,\n answer.turn AS answered,\n substr(json_extract(answer.message, '$.failure'), 1, 512) AS failure,\n (SELECT value FROM conversation_facts WHERE conversation = chosen.conversation AND name = 'openedTurn') AS opened_turn,\n json_extract(opened.message, '$.source') AS opened_source,\n json_extract(opened.message, '$.sender') AS opened_sender,\n asking.identity AS asking_identity,\n asking.text AS asking_text,\n json_extract(asking.message, '$.accepted_at') AS asking_at,\n json_extract(asking.message, '$.source') AS asking_source,\n json_extract(asking.message, '$.sender') AS asking_sender\n FROM chosen\n LEFT JOIN conversation_messages said ON said.id = chosen.said\n LEFT JOIN conversation_messages answer ON answer.id = chosen.answer\n LEFT JOIN conversation_messages opened ON opened.id = chosen.opened\n LEFT JOIN conversation_messages asking ON asking.id = chosen.asking";
5
5
  export type HeldConversation = {
6
6
  readonly conversation: string;
7
7
  readonly read: string | null | undefined;
@@ -22,6 +22,8 @@ export type HeldRow = {
22
22
  readonly role: string | null;
23
23
  readonly at: string | null;
24
24
  } | null;
25
+ readonly answered: string | null;
26
+ readonly openedTurn: string | null;
25
27
  readonly failure: string | null;
26
28
  readonly opened: HeldSource | null;
27
29
  readonly asking: (HeldSource & {
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
package/dist/messages.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { sql } from '@agentshouse/mdmodel';
2
+ import { text } from './column.js';
2
3
  import { EXCERPT } from './read.js';
3
4
  import { tablesOf } from './stored.js';
4
5
  const SAID_BY_HOUSE = `json_extract(message, '$.role') = 'house'`;
@@ -27,7 +28,9 @@ export const ROWS = `WITH chosen AS (
27
28
  substr(said.text, 1, ${EXCERPT}) AS said_text,
28
29
  json_extract(said.message, '$.role') AS said_role,
29
30
  json_extract(said.message, '$.accepted_at') AS said_at,
31
+ answer.turn AS answered,
30
32
  substr(json_extract(answer.message, '$.failure'), 1, ${EXCERPT}) AS failure,
33
+ (SELECT value FROM conversation_facts WHERE conversation = chosen.conversation AND name = 'openedTurn') AS opened_turn,
31
34
  json_extract(opened.message, '$.source') AS opened_source,
32
35
  json_extract(opened.message, '$.sender') AS opened_sender,
33
36
  asking.identity AS asking_identity,
@@ -40,9 +43,6 @@ export const ROWS = `WITH chosen AS (
40
43
  LEFT JOIN conversation_messages answer ON answer.id = chosen.answer
41
44
  LEFT JOIN conversation_messages opened ON opened.id = chosen.opened
42
45
  LEFT JOIN conversation_messages asking ON asking.id = chosen.asking`;
43
- function text(value) {
44
- return typeof value === 'string' ? value : String(value);
45
- }
46
46
  export function heldConversations(connection, conversations) {
47
47
  const named = conversations === null ? '' : ' AND conversation IN (SELECT value FROM json_each(?))';
48
48
  const bound = conversations === null ? [] : [JSON.stringify(conversations)];
@@ -126,6 +126,8 @@ export function conversationRows(connection, conversations) {
126
126
  role: textOrNull(row.said_role),
127
127
  at: textOrNull(row.said_at),
128
128
  },
129
+ answered: textOrNull(row.answered),
130
+ openedTurn: textOrNull(row.opened_turn),
129
131
  failure: textOrNull(row.failure),
130
132
  opened: row.opened_source === null ? null : heldSource(row.opened_source, row.opened_sender),
131
133
  asking: row.asking_identity === null
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAOnE,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAc,YAAY,EAAS,MAAM,YAAY,CAAC;AAMlE,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAE9D;AA0DD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,IAAI,iBA2Bf;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,iBAkB7B;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,EAC1C,MAAM,EAAE,SAAS,GAAG,QAAQ,EAC5B,KAAK,EAAE,YAAY,iBA8CpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvF"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../src/models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAOnE,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAc,YAAY,EAAS,MAAM,YAAY,CAAC;AAMlE,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,OAAO,CAE9D;AA0DD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,EAC5B,KAAK,EAAE,UAAU,GAAG,IAAI,EACxB,OAAO,CAAC,EAAE,IAAI,iBA2Bf;AAED,wBAAsB,MAAM,CAC1B,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,eAAe,iBAkB7B;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,EAC1C,MAAM,EAAE,SAAS,GAAG,QAAQ,EAC5B,KAAK,EAAE,YAAY,iBAkDpB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvF"}
package/dist/models.js CHANGED
@@ -35,7 +35,7 @@ function recordAlone(store, record) {
35
35
  }
36
36
  function unheld(runtime, locator, model) {
37
37
  runtime.presence.modelled(locator, model);
38
- emitRooms(runtime);
38
+ emitRooms(runtime, [locator]);
39
39
  }
40
40
  function recorded(runtime, locator, declaration, model) {
41
41
  const { store, socket } = runtime;
@@ -94,7 +94,7 @@ export async function scoped(runtime, result, locator, declaration) {
94
94
  await retainModel(runtime, locator, declaration, { status: 'unavailable', reason: 'not-readable' }, true);
95
95
  if (!socket.continuing())
96
96
  return;
97
- emitRooms(runtime);
97
+ emitRooms(runtime, [locator]);
98
98
  }
99
99
  export async function settleModels(runtime, held, status, local) {
100
100
  const { store, socket, presence } = runtime;
@@ -129,7 +129,7 @@ export async function settleModels(runtime, held, status, local) {
129
129
  }
130
130
  }
131
131
  if (unchanged.length > 0)
132
- emitRooms(runtime);
132
+ emitRooms(runtime, unchanged.map(([locator]) => locator));
133
133
  const kept = new Set(unchanged.map(([locator]) => locator));
134
134
  return [...held].filter(([locator]) => !kept.has(locator) &&
135
135
  owed(stored.get(locator)?.record.model ?? unheldModelOf(runtime, locator)));