@agentshouse/mdruntime 0.1.0-cf08ada271a7f → 0.1.0-cf0c43fc48aad

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 (168) hide show
  1. package/README.md +12 -12
  2. package/dist/acceptance.d.ts.map +1 -1
  3. package/dist/acceptance.js +25 -35
  4. package/dist/act-lanes.d.ts +30 -0
  5. package/dist/act-lanes.d.ts.map +1 -0
  6. package/dist/act-lanes.js +225 -0
  7. package/dist/actions.d.ts +8 -2
  8. package/dist/actions.d.ts.map +1 -1
  9. package/dist/actions.js +116 -65
  10. package/dist/adapter.d.ts +11 -4
  11. package/dist/adapter.d.ts.map +1 -1
  12. package/dist/client.d.ts +6 -17
  13. package/dist/client.d.ts.map +1 -1
  14. package/dist/client.js +26 -11
  15. package/dist/compile.d.ts +2 -0
  16. package/dist/compile.d.ts.map +1 -1
  17. package/dist/compile.js +17 -4
  18. package/dist/connection.d.ts.map +1 -1
  19. package/dist/connection.js +15 -10
  20. package/dist/conversation-live.d.ts +7 -2
  21. package/dist/conversation-live.d.ts.map +1 -1
  22. package/dist/conversation-live.js +6 -3
  23. package/dist/conversation.d.ts +25 -5
  24. package/dist/conversation.d.ts.map +1 -1
  25. package/dist/conversation.js +157 -76
  26. package/dist/discovery.d.ts.map +1 -1
  27. package/dist/discovery.js +18 -45
  28. package/dist/durability.d.ts +3 -0
  29. package/dist/durability.d.ts.map +1 -1
  30. package/dist/entry.js +1 -1
  31. package/dist/expectation.d.ts +25 -14
  32. package/dist/expectation.d.ts.map +1 -1
  33. package/dist/expectation.js +51 -20
  34. package/dist/failure.d.ts +2 -0
  35. package/dist/failure.d.ts.map +1 -1
  36. package/dist/failure.js +3 -0
  37. package/dist/host.d.ts.map +1 -1
  38. package/dist/host.js +29 -7
  39. package/dist/index.d.ts +9 -7
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +7 -5
  42. package/dist/install.d.ts +2 -3
  43. package/dist/install.d.ts.map +1 -1
  44. package/dist/install.js +9 -22
  45. package/dist/lifecycle.d.ts +1 -1
  46. package/dist/lifecycle.d.ts.map +1 -1
  47. package/dist/lifecycle.js +32 -26
  48. package/dist/listing.d.ts +4 -9
  49. package/dist/listing.d.ts.map +1 -1
  50. package/dist/listing.js +21 -51
  51. package/dist/locks.d.ts +2 -4
  52. package/dist/locks.d.ts.map +1 -1
  53. package/dist/locks.js +8 -38
  54. package/dist/lost.d.ts.map +1 -1
  55. package/dist/lost.js +7 -19
  56. package/dist/media.js +1 -1
  57. package/dist/memory.d.ts.map +1 -1
  58. package/dist/memory.js +36 -17
  59. package/dist/messages.d.ts +9 -2
  60. package/dist/messages.d.ts.map +1 -1
  61. package/dist/messages.js +20 -10
  62. package/dist/models.d.ts.map +1 -1
  63. package/dist/models.js +15 -32
  64. package/dist/opened.d.ts +1 -1
  65. package/dist/opened.d.ts.map +1 -1
  66. package/dist/opened.js +2 -2
  67. package/dist/opening.d.ts.map +1 -1
  68. package/dist/opening.js +3 -9
  69. package/dist/outcome.d.ts +3 -0
  70. package/dist/outcome.d.ts.map +1 -1
  71. package/dist/outcome.js +15 -0
  72. package/dist/overlay.d.ts +3 -0
  73. package/dist/overlay.d.ts.map +1 -1
  74. package/dist/overlay.js +8 -4
  75. package/dist/page-metadata.d.ts +8 -0
  76. package/dist/page-metadata.d.ts.map +1 -0
  77. package/dist/page-metadata.js +19 -0
  78. package/dist/parts.d.ts +2 -9
  79. package/dist/parts.d.ts.map +1 -1
  80. package/dist/parts.js +6 -14
  81. package/dist/preparation.d.ts.map +1 -1
  82. package/dist/preparation.js +15 -21
  83. package/dist/presence.d.ts +52 -0
  84. package/dist/presence.d.ts.map +1 -0
  85. package/dist/presence.js +220 -0
  86. package/dist/queries.d.ts +1 -1
  87. package/dist/queries.d.ts.map +1 -1
  88. package/dist/queries.js +23 -13
  89. package/dist/questions.d.ts +0 -5
  90. package/dist/questions.d.ts.map +1 -1
  91. package/dist/questions.js +0 -7
  92. package/dist/queue.d.ts +2 -1
  93. package/dist/queue.d.ts.map +1 -1
  94. package/dist/queue.js +26 -31
  95. package/dist/reach.d.ts.map +1 -1
  96. package/dist/reach.js +62 -18
  97. package/dist/react.d.ts +5 -4
  98. package/dist/react.d.ts.map +1 -1
  99. package/dist/react.js +28 -5
  100. package/dist/reads.d.ts +3 -1
  101. package/dist/reads.d.ts.map +1 -1
  102. package/dist/reads.js +5 -1
  103. package/dist/recovery.d.ts +3 -1
  104. package/dist/recovery.d.ts.map +1 -1
  105. package/dist/recovery.js +29 -7
  106. package/dist/refusal.d.ts.map +1 -1
  107. package/dist/refusal.js +2 -4
  108. package/dist/retried.d.ts +30 -0
  109. package/dist/retried.d.ts.map +1 -0
  110. package/dist/retried.js +72 -0
  111. package/dist/room-draft.d.ts +2 -2
  112. package/dist/room-draft.d.ts.map +1 -1
  113. package/dist/room-draft.js +24 -19
  114. package/dist/runtime.d.ts +4 -2
  115. package/dist/runtime.d.ts.map +1 -1
  116. package/dist/save.d.ts +1 -0
  117. package/dist/save.d.ts.map +1 -1
  118. package/dist/save.js +105 -55
  119. package/dist/saves.d.ts.map +1 -1
  120. package/dist/saves.js +8 -11
  121. package/dist/seed.js +2 -2
  122. package/dist/shown.d.ts +2 -2
  123. package/dist/shown.d.ts.map +1 -1
  124. package/dist/shown.js +14 -23
  125. package/dist/socket/lanes.d.ts +12 -4
  126. package/dist/socket/lanes.d.ts.map +1 -1
  127. package/dist/socket/lanes.js +34 -8
  128. package/dist/socket.d.ts +3 -5
  129. package/dist/socket.d.ts.map +1 -1
  130. package/dist/socket.js +3 -14
  131. package/dist/source.d.ts +0 -7
  132. package/dist/source.d.ts.map +1 -1
  133. package/dist/store/records.d.ts +7 -3
  134. package/dist/store/records.d.ts.map +1 -1
  135. package/dist/store/records.js +12 -2
  136. package/dist/store.d.ts +10 -5
  137. package/dist/store.d.ts.map +1 -1
  138. package/dist/store.js +37 -12
  139. package/dist/stored.d.ts +1 -0
  140. package/dist/stored.d.ts.map +1 -1
  141. package/dist/stored.js +5 -5
  142. package/dist/surface.d.ts +1 -1
  143. package/dist/surface.d.ts.map +1 -1
  144. package/dist/surface.js +9 -13
  145. package/dist/sync.d.ts.map +1 -1
  146. package/dist/sync.js +63 -58
  147. package/dist/tables.d.ts +6 -3
  148. package/dist/tables.d.ts.map +1 -1
  149. package/dist/tables.js +34 -10
  150. package/dist/wire.d.ts +47 -3
  151. package/dist/wire.d.ts.map +1 -1
  152. package/dist/wire.js +12 -1
  153. package/package.json +3 -3
  154. package/dist/attempt.d.ts +0 -16
  155. package/dist/attempt.d.ts.map +0 -1
  156. package/dist/attempt.js +0 -70
  157. package/dist/job.d.ts +0 -5
  158. package/dist/job.d.ts.map +0 -1
  159. package/dist/job.js +0 -7
  160. package/dist/log.d.ts +0 -6
  161. package/dist/log.d.ts.map +0 -1
  162. package/dist/log.js +0 -14
  163. package/dist/socket/rooms.d.ts +0 -41
  164. package/dist/socket/rooms.d.ts.map +0 -1
  165. package/dist/socket/rooms.js +0 -90
  166. package/dist/store/fences.d.ts +0 -16
  167. package/dist/store/fences.d.ts.map +0 -1
  168. package/dist/store/fences.js +0 -26
@@ -0,0 +1,52 @@
1
+ import type { DiscoveredRoom, ProviderRefusal, ScopedRefusal } from './adapter.js';
2
+ import type { ModelState } from './model.js';
3
+ type Repairable = {
4
+ readonly reset: string | undefined;
5
+ };
6
+ type Standing = {
7
+ readonly stale: boolean;
8
+ readonly repairable: Repairable | null;
9
+ readonly repairing: boolean;
10
+ readonly reloadDue: boolean;
11
+ };
12
+ type Listing = {
13
+ readonly whole: boolean;
14
+ readonly live: boolean;
15
+ };
16
+ export type Presence = {
17
+ list(found: readonly DiscoveredRoom[], how: Listing): readonly DiscoveredRoom[];
18
+ room(locator: string): DiscoveredRoom | undefined;
19
+ rooms(): readonly DiscoveredRoom[];
20
+ available(locator: string, selection?: string): boolean;
21
+ refusal(locator: string): ProviderRefusal | null;
22
+ unheldModel(locator: string): ModelState | null;
23
+ refused(locator: string, refusal: ScopedRefusal | null): void;
24
+ readable(locator: string): boolean;
25
+ modelled(locator: string, model: ModelState | null): void;
26
+ installed(locator: string, bootstrapped: boolean): void;
27
+ locked(locator: string, stored: () => Promise<string | null>): Promise<boolean>;
28
+ lockedAmong(stored: ReadonlyMap<string, string>): readonly string[];
29
+ connectionLost(lapsed: () => void): void;
30
+ connectionLive(): void;
31
+ lapse(): void;
32
+ stood(locator: string, stale: boolean, repairable?: Repairable | null): void;
33
+ repairing(locator: string, running: boolean): void;
34
+ reload(locator: string, due: boolean): void;
35
+ standing(locator: string): Standing;
36
+ settled(): boolean;
37
+ repairsOwed(): readonly string[];
38
+ askAgain(locator: string, ask: () => void): void;
39
+ stopAsking(locator?: string): void;
40
+ lose(locator: string, during: number): boolean;
41
+ writing(locator: string): boolean;
42
+ unwritten(locator: string): void;
43
+ lost(locator: string): boolean;
44
+ losses(): number;
45
+ lostSince(locator: string, losses: number): boolean;
46
+ liftable(locator: string, discovery: number): boolean;
47
+ lift(locator: string, discovery: number, unfenced: boolean): void;
48
+ close(): void;
49
+ };
50
+ export declare function createPresence(): Presence;
51
+ export {};
52
+ //# sourceMappingURL=presence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../src/presence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,220 @@
1
+ const UNANSWERED = {
2
+ stale: false,
3
+ repairable: null,
4
+ repairing: false,
5
+ reloadDue: false,
6
+ refusal: null,
7
+ unreading: false,
8
+ unreadable: false,
9
+ unheldModel: null,
10
+ confirmed: false,
11
+ };
12
+ // A Room the Provider answers not ready is asked again after these waits, the last repeating, so a chunk build that catches up within seconds installs at once and a long one is asked every 15 seconds.
13
+ const NOT_READY_MS = [1_000, 2_000, 3_000, 5_000, 8_000, 11_000, 15_000];
14
+ // A Room that locks offline stays readable this long after the connection drops, so a laptop waking or changing network keeps working while a disconnected device locks soon after.
15
+ const LOCK_GRACE_MS = 120_000;
16
+ export function createPresence() {
17
+ const listed = new Map();
18
+ const answered = new Map();
19
+ const marks = new Map();
20
+ const lastLost = new Map();
21
+ const unready = new Map();
22
+ let lossCount = 0;
23
+ let lockGrace = null;
24
+ function answer(locator) {
25
+ return answered.get(locator) ?? UNANSWERED;
26
+ }
27
+ function change(locator, next) {
28
+ answered.set(locator, { ...answer(locator), ...next });
29
+ }
30
+ function heard(locator, next) {
31
+ if (!marks.has(locator))
32
+ change(locator, next);
33
+ }
34
+ function readied(locator) {
35
+ const held = unready.get(locator);
36
+ if (held === undefined)
37
+ return;
38
+ if (held.timer !== null)
39
+ clearTimeout(held.timer);
40
+ unready.delete(locator);
41
+ }
42
+ function stopAsking(locator) {
43
+ for (const held of locator === undefined ? [...unready.keys()] : [locator])
44
+ readied(held);
45
+ }
46
+ function connectionLive() {
47
+ if (lockGrace !== null)
48
+ clearTimeout(lockGrace);
49
+ lockGrace = null;
50
+ }
51
+ function readable(locator) {
52
+ const { unreadable, unreading } = answer(locator);
53
+ if (!unreadable || marks.has(locator))
54
+ return false;
55
+ change(locator, {
56
+ unreadable: false,
57
+ ...(unreading ? { refusal: null, unreading: false } : {}),
58
+ });
59
+ return true;
60
+ }
61
+ function locks(locator, mode) {
62
+ return mode === 'locked' && !answer(locator).confirmed && !marks.has(locator);
63
+ }
64
+ function liftable(locator, discovery) {
65
+ const mark = marks.get(locator);
66
+ return mark === undefined || mark.during < discovery;
67
+ }
68
+ return {
69
+ list(found, { whole, live }) {
70
+ const kept = found.filter(({ locator }) => !marks.has(locator));
71
+ if (whole)
72
+ listed.clear();
73
+ for (const room of kept) {
74
+ listed.set(room.locator, room);
75
+ change(room.locator, {
76
+ refusal: null,
77
+ unreading: false,
78
+ ...(live && room.replica.admission === 'admitted' ? { confirmed: true } : {}),
79
+ });
80
+ }
81
+ return kept;
82
+ },
83
+ room: (locator) => listed.get(locator),
84
+ rooms: () => [...listed.values()],
85
+ available(locator, selection) {
86
+ if (marks.has(locator))
87
+ return false;
88
+ const room = listed.get(locator);
89
+ if (room === undefined)
90
+ return true;
91
+ return ((selection === undefined || selection === room.replica.selection) &&
92
+ room.replica.admission === 'admitted' &&
93
+ !answer(locator).unreadable);
94
+ },
95
+ refusal: (locator) => answer(locator).refusal,
96
+ unheldModel: (locator) => answer(locator).unheldModel,
97
+ refused(locator, refusal) {
98
+ if (refusal === null) {
99
+ heard(locator, { unreadable: true });
100
+ return;
101
+ }
102
+ const unreading = refusal.scope !== 'operation' && refusal.scope !== 'model';
103
+ heard(locator, {
104
+ refusal: { code: refusal.code, fields: refusal.fields, retryable: refusal.retryable },
105
+ unreading,
106
+ ...(unreading ? { unreadable: true } : {}),
107
+ });
108
+ },
109
+ readable,
110
+ modelled(locator, model) {
111
+ heard(locator, { unheldModel: model });
112
+ },
113
+ installed(locator, bootstrapped) {
114
+ if (marks.has(locator))
115
+ return;
116
+ if (bootstrapped) {
117
+ readied(locator);
118
+ change(locator, { unheldModel: null });
119
+ }
120
+ change(locator, { stale: false });
121
+ readable(locator);
122
+ },
123
+ async locked(locator, stored) {
124
+ if (marks.has(locator) || answer(locator).confirmed)
125
+ return false;
126
+ return locks(locator, (await stored()) ?? listed.get(locator)?.replica.offline);
127
+ },
128
+ lockedAmong(stored) {
129
+ const modes = new Map([...listed].map(([locator, room]) => [locator, room.replica.offline]));
130
+ for (const [locator, mode] of stored)
131
+ modes.set(locator, mode);
132
+ return [...modes]
133
+ .filter(([locator, mode]) => locks(locator, mode))
134
+ .map(([locator]) => locator)
135
+ .sort();
136
+ },
137
+ connectionLost(lapsed) {
138
+ if (lockGrace !== null)
139
+ return;
140
+ lockGrace = setTimeout(() => {
141
+ lockGrace = null;
142
+ lapsed();
143
+ }, LOCK_GRACE_MS);
144
+ },
145
+ connectionLive,
146
+ lapse() {
147
+ for (const [locator, held] of answered) {
148
+ if (held.confirmed)
149
+ answered.set(locator, { ...held, confirmed: false });
150
+ }
151
+ },
152
+ stood(locator, stale, repairable) {
153
+ heard(locator, { stale, ...(repairable === undefined ? {} : { repairable }) });
154
+ },
155
+ repairing(locator, running) {
156
+ change(locator, { repairing: running });
157
+ },
158
+ reload(locator, due) {
159
+ change(locator, { reloadDue: due });
160
+ },
161
+ standing(locator) {
162
+ const { stale, repairable, repairing, reloadDue } = answer(locator);
163
+ return { stale, repairable, repairing, reloadDue };
164
+ },
165
+ settled: () => ![...answered].some(([locator, { stale }]) => stale && !marks.has(locator)),
166
+ repairsOwed: () => [...answered]
167
+ .filter(([locator, { stale, repairable }]) => stale && repairable !== null && !marks.has(locator))
168
+ .map(([locator]) => locator),
169
+ askAgain(locator, ask) {
170
+ const held = unready.get(locator) ?? { tries: 0, timer: null };
171
+ unready.set(locator, held);
172
+ if (held.timer !== null)
173
+ return;
174
+ const wait = NOT_READY_MS[Math.min(held.tries, NOT_READY_MS.length - 1)];
175
+ held.tries += 1;
176
+ held.timer = setTimeout(() => {
177
+ held.timer = null;
178
+ ask();
179
+ }, wait);
180
+ },
181
+ stopAsking,
182
+ lose(locator, during) {
183
+ if (marks.has(locator))
184
+ return false;
185
+ marks.set(locator, { during, written: false });
186
+ lastLost.set(locator, ++lossCount);
187
+ listed.delete(locator);
188
+ readied(locator);
189
+ const { repairing, reloadDue } = answer(locator);
190
+ answered.set(locator, { ...UNANSWERED, repairing, reloadDue });
191
+ return true;
192
+ },
193
+ writing(locator) {
194
+ const mark = marks.get(locator);
195
+ if (mark === undefined || mark.written)
196
+ return false;
197
+ marks.set(locator, { ...mark, written: true });
198
+ return true;
199
+ },
200
+ unwritten(locator) {
201
+ const mark = marks.get(locator);
202
+ if (mark !== undefined)
203
+ marks.set(locator, { ...mark, written: false });
204
+ },
205
+ lost: (locator) => marks.has(locator),
206
+ losses: () => lossCount,
207
+ lostSince: (locator, losses) => marks.has(locator) || (lastLost.get(locator) ?? 0) > losses,
208
+ liftable,
209
+ lift(locator, discovery, unfenced) {
210
+ const mark = marks.get(locator);
211
+ if (mark !== undefined && liftable(locator, discovery) && (unfenced || !mark.written)) {
212
+ marks.delete(locator);
213
+ }
214
+ },
215
+ close() {
216
+ stopAsking();
217
+ connectionLive();
218
+ },
219
+ };
220
+ }
package/dist/queries.d.ts CHANGED
@@ -9,7 +9,7 @@ export declare function figuresCover(runtime: Runtime): Promise<FiguresCover>;
9
9
  export declare function answeredPlan(runtime: Runtime, plan: Plan, cover: () => Promise<Cover>): Promise<Ran>;
10
10
  export declare function rowsQuery(runtime: Runtime, plan: Plan): Promise<QueryResult>;
11
11
  export declare function planned(runtime: Runtime, input: unknown, reach: PortReach | null): Promise<Plan>;
12
- export declare function roomTallies(runtime: Runtime, rooms: readonly QueryRoom[], since: string): Promise<readonly import("./tallies.js").RoomTally[]>;
12
+ export declare function roomTallies(runtime: Runtime, rooms: readonly QueryRoom[], since: string): Promise<readonly import("./tallies.ts").RoomTally[]>;
13
13
  export declare function watchPlan(runtime: Runtime, plan: Plan, deliver: Deliver, fail: Fail): () => void;
14
14
  export declare function watchPlanned(runtime: Runtime, planning: Promise<Plan>, deliver: Deliver, fail: Fail): () => void;
15
15
  export declare function searched(runtime: Runtime, input: unknown, reach: PortReach | null): Promise<SearchResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAK5C,OAAO,EAIL,KAAK,IAAI,EACT,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAa,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,KAAK,EAAa,SAAS,EAAgB,MAAM,YAAY,CAAC;AAuFrE,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAa1E;AA2ED,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,GAAG,CAAC,CAQd;AAQD,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAWlF;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,wDAO7F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,CAchG;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,GACT,MAAM,IAAI,CAeZ;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,OAAO,CAAC,YAAY,CAAC,CAqDvB"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../src/queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAK5C,OAAO,EAIL,KAAK,IAAI,EACT,KAAK,WAAW,EAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAa,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAGhF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,KAAK,EAAa,SAAS,EAAgB,MAAM,YAAY,CAAC;AAqFrE,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAa1E;AAoGD,wBAAsB,YAAY,CAChC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC1B,OAAO,CAAC,GAAG,CAAC,CAQd;AAQD,wBAAsB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAWlF;AAED,wBAAsB,OAAO,CAC3B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,wDAO7F;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,IAAI,CAchG;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,EACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,GACT,MAAM,IAAI,CAeZ;AAED,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,SAAS,GAAG,IAAI,GACtB,OAAO,CAAC,YAAY,CAAC,CAkDvB"}
package/dist/queries.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { identityOf } from '@agentshouse/mdmodel';
2
2
  import { ROOM_TOTALS } from './figures.js';
3
3
  import { roomInFlight } from './install.js';
4
- import { roomFacts } from './listing.js';
4
+ import { compositionFor, roomFacts } from './listing.js';
5
5
  import { lockedRooms } from './locks.js';
6
6
  import { OFFLINE, UNCERTAIN, failure } from './outcome.js';
7
7
  import { connectionNow, prepare, roomsOfReach } from './preparation.js';
@@ -13,10 +13,10 @@ import { searchPlanOf } from './search.js';
13
13
  import { seedApplies, seededResult, watchSeeded } from './seed.js';
14
14
  import { capped, MAXIMUM_WINDOW } from './windows.js';
15
15
  const QUERY_BYTES = 1 << 20;
16
- function everyRoom({ socket }, held) {
16
+ function everyRoom({ presence }, held) {
17
17
  return [
18
18
  ...new Set([
19
- ...socket.rooms.declarations().keys(),
19
+ ...presence.rooms().map(({ locator }) => locator),
20
20
  ...held.rooms.keys(),
21
21
  ...held.queues.keys(),
22
22
  ]),
@@ -29,10 +29,8 @@ function reachedRooms(runtime, plan, held) {
29
29
  .filter((locator) => (reached === null || reached.has(locator)) && !plan.locked.includes(locator))
30
30
  .sort();
31
31
  }
32
- function awaited({ socket }, locator) {
33
- return (!socket.session.now().roomsListed ||
34
- (socket.rooms.declared(locator) !== undefined &&
35
- socket.rooms.discovered(locator)?.replica.admission === 'admitted'));
32
+ function awaited({ socket, presence }, locator) {
33
+ return (!socket.session.now().roomsListed || presence.room(locator)?.replica.admission === 'admitted');
36
34
  }
37
35
  function coveredRooms(runtime, locators, whole, held) {
38
36
  const { store, socket } = runtime;
@@ -119,7 +117,22 @@ async function windowRows(local, plan, rooms, unchanged) {
119
117
  }
120
118
  return null;
121
119
  }
122
- async function coveredRows({ store }, plan, cover) {
120
+ function freeTextAsked(plan) {
121
+ return plan.shape.kind === 'documents' && (plan.shape.sections !== null || plan.shape.preamble);
122
+ }
123
+ async function composedRooms(runtime, plan, rooms) {
124
+ if (!freeTextAsked(plan))
125
+ return rooms;
126
+ const held = await runtime.store.rooms(rooms.map(({ locator }) => locator));
127
+ return rooms.map((room) => {
128
+ const stored = held.get(room.locator);
129
+ return stored === undefined
130
+ ? room
131
+ : { ...room, composition: compositionFor(runtime, stored.record) };
132
+ });
133
+ }
134
+ async function coveredRows(runtime, plan, cover) {
135
+ const { store } = runtime;
123
136
  for (;;) {
124
137
  const before = await cover();
125
138
  if ('pending' in before)
@@ -128,7 +141,7 @@ async function coveredRows({ store }, plan, cover) {
128
141
  const keys = before.rooms.map(({ key }) => key);
129
142
  const changes = local.changes(keys);
130
143
  const current = () => local.changes(keys) === changes;
131
- const rows = await windowRows(local, plan, before.rooms, current);
144
+ const rows = await windowRows(local, plan, await composedRooms(runtime, plan, before.rooms), current);
132
145
  const after = await cover();
133
146
  if (rows !== null && sameCover(before, after))
134
147
  return { rows, cover: before, current };
@@ -213,7 +226,7 @@ export function watchPlanned(runtime, planning, deliver, fail) {
213
226
  };
214
227
  }
215
228
  export async function searched(runtime, input, reach) {
216
- const { store, socket, journal } = runtime;
229
+ const { store, socket } = runtime;
217
230
  const { session } = socket;
218
231
  const asked = searchPlanOf(input);
219
232
  await socket.ready;
@@ -249,12 +262,10 @@ export async function searched(runtime, input, reach) {
249
262
  const { closed, authorization, refusal } = session.now();
250
263
  if (closed || authorization === undefined || refusal !== null)
251
264
  return UNCERTAIN;
252
- journal.record('transfer search');
253
265
  try {
254
266
  const result = await search(authorization, { text: asked.text, rooms });
255
267
  if (result.kind === 'revoked-authorization')
256
268
  await refuse(runtime, 'revoked-authorization');
257
- journal.record(`outcome search ${result.kind}`);
258
269
  if (result.kind === 'rejected')
259
270
  return result;
260
271
  if (result.kind !== 'found')
@@ -266,7 +277,6 @@ export async function searched(runtime, input, reach) {
266
277
  };
267
278
  }
268
279
  catch {
269
- journal.record('outcome search transport-uncertainty');
270
280
  return UNCERTAIN;
271
281
  }
272
282
  }
@@ -26,9 +26,4 @@ export declare function entered(field: ChatField): boolean;
26
26
  export declare function questionsOf(view: Pick<ConversationView, 'questions'> | null): readonly ChatQuestion[];
27
27
  export declare function openQuestion(questions: readonly unknown[]): string | null;
28
28
  export declare function questionAsked(questions: readonly unknown[]): string | null;
29
- export type ChatLone = {
30
- readonly question: ChatQuestion;
31
- readonly field: ChatField;
32
- };
33
- export declare function loneOf(questions: readonly ChatQuestion[]): ChatLone | null;
34
29
  //# sourceMappingURL=questions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAuCF,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEjD;AA2DD,wBAAgB,WAAW,CACzB,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,GAAG,IAAI,GAC/C,SAAS,YAAY,EAAE,CAiBzB;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,CAKzE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,CAE1E;AAED,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAEtF,wBAAgB,MAAM,CAAC,SAAS,EAAE,SAAS,YAAY,EAAE,GAAG,QAAQ,GAAG,IAAI,CAM1E"}
1
+ {"version":3,"file":"questions.d.ts","sourceRoot":"","sources":["../src/questions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG1D,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;IAC5E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B,CAAC;AAuCF,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAEjD;AA2DD,wBAAgB,WAAW,CACzB,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,GAAG,IAAI,GAC/C,SAAS,YAAY,EAAE,CAiBzB;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,CAKzE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,GAAG,IAAI,CAE1E"}
package/dist/questions.js CHANGED
@@ -113,10 +113,3 @@ export function openQuestion(questions) {
113
113
  export function questionAsked(questions) {
114
114
  return questionsOf({ questions })[0]?.asked ?? null;
115
115
  }
116
- export function loneOf(questions) {
117
- const asked = questions.length === 1 && !questions[0].secret ? questions[0] : undefined;
118
- const only = asked?.fields.length === 1 ? asked.fields[0] : undefined;
119
- return asked !== undefined && only !== undefined && entered(only)
120
- ? { question: asked, field: only }
121
- : null;
122
- }
package/dist/queue.d.ts CHANGED
@@ -5,8 +5,9 @@ import type { Runtime } from './runtime.js';
5
5
  import type { SavePlan } from './save.js';
6
6
  import type { SaveResult } from './saves.js';
7
7
  import type { PendingState, RoomCommit, Store, StoredFile, View, Work } from './store.js';
8
- export type Queueing = Pick<Runtime, 'store' | 'journal' | 'localSaves'> & {
8
+ export type Queueing = Pick<Runtime, 'store' | 'localSaves'> & {
9
9
  readonly socket: Pick<Runtime['socket'], 'continuing'>;
10
+ readonly presence: Pick<Runtime['presence'], 'lost' | 'unheldModel' | 'room'>;
10
11
  };
11
12
  export type Restand = {
12
13
  readonly locator: string;
@@ -1 +1 @@
1
- {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"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"}
package/dist/queue.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { changeSet, mergeChangeSets } from './change-set.js';
2
2
  import { leaving as leavingIn, partnerOf } from './change.js';
3
3
  import { composedOf, definitionsAt } from './collection.js';
4
+ import { declared } from './declaration.js';
4
5
  import { runtimeError } from './failure.js';
5
6
  import { roomDraftRevision } from './identity.js';
6
7
  import { landed, movedBy, overlayOf, replaying, slicing, slicingWith, standing, storedRecord, touchedBy, } from './replica.js';
@@ -44,18 +45,23 @@ async function returnedDrafts(store, locator, work, leaving, composition) {
44
45
  continue;
45
46
  for (const saved of work.states.get(batch.id)?.drafts ?? []) {
46
47
  const existing = written.get(saved.path) ?? (await store.draft(locator, saved.path));
47
- written.set(saved.path, {
48
- locator,
49
- path: saved.path,
50
- revision: roomDraftRevision(),
51
- parts: returnedInto(existing?.parts, saved.parts, composition === undefined ? undefined : definitionsAt(composition, saved.path)),
52
- returned,
53
- });
48
+ const parts = returnedInto(existing?.parts, saved.parts, composition === undefined ? undefined : definitionsAt(composition, saved.path));
49
+ written.set(saved.path, parts === null
50
+ ? { ...existing, returned }
51
+ : { locator, path: saved.path, revision: roomDraftRevision(), parts, returned });
54
52
  }
55
53
  }
56
54
  return written;
57
55
  }
58
- async function carriedBack(store, locator, unlanded, written) {
56
+ function unheldComposition({ store, presence }, locator) {
57
+ const model = presence.unheldModel(locator);
58
+ const listed = presence.room(locator);
59
+ if (model === null || listed === undefined)
60
+ return undefined;
61
+ return store.composed({ model, declaration: declared(listed) });
62
+ }
63
+ async function carriedBack(runtime, locator, unlanded, written) {
64
+ const { store } = runtime;
59
65
  const back = new Map();
60
66
  const taken = [];
61
67
  for (const batch of unlanded) {
@@ -74,12 +80,16 @@ async function carriedBack(store, locator, unlanded, written) {
74
80
  const [into, key] = source === locator ? [written, path] : [back, documentKey(source, path)];
75
81
  const existing = into.get(key) ?? (await store.draft(source, path));
76
82
  const held = await store.record(source);
83
+ const composition = held === undefined ? unheldComposition(runtime, source) : store.composed(held);
84
+ const parts = returnedInto(existing?.parts, record.parts, composition === undefined ? undefined : definitionsAt(composition, path));
85
+ if (parts === null)
86
+ continue;
77
87
  taken.push({ locator: destination, path: to });
78
88
  into.set(key, {
79
89
  locator: source,
80
90
  path,
81
91
  revision: roomDraftRevision(),
82
- parts: returnedInto(existing?.parts, record.parts, held === undefined ? undefined : definitionsAt(store.composed(held), path)),
92
+ parts,
83
93
  returned: existing?.returned ?? null,
84
94
  });
85
95
  }
@@ -156,7 +166,7 @@ async function together(runtime, local, settlements) {
156
166
  return mergeChangeSets(all.map((one) => one.apply(answer)));
157
167
  }
158
168
  async function settlement(runtime, local, locator, work, record, queue, settling = {}) {
159
- const { store, journal, localSaves } = runtime;
169
+ const { store, localSaves } = runtime;
160
170
  const before = work.replica;
161
171
  const view = settling.view ?? 'confirmed';
162
172
  const previousQueue = work.queue;
@@ -191,7 +201,7 @@ async function settlement(runtime, local, locator, work, record, queue, settling
191
201
  ...(settling.leaving ?? []),
192
202
  ];
193
203
  const written = await returnedDrafts(store, locator, work, returning, composition);
194
- const carried = await carriedBack(store, locator, [
204
+ const carried = await carriedBack(runtime, locator, [
195
205
  ...[...unqueued].reverse().flatMap(({ batch, landed: held }) => (held ? [] : [batch])),
196
206
  ...(settling.leaving ?? []).flatMap(({ batch, returned }) => returned === null ? [] : [batch]),
197
207
  ], written);
@@ -235,10 +245,6 @@ async function settlement(runtime, local, locator, work, record, queue, settling
235
245
  store.landed.drop(locator, batch.id);
236
246
  }
237
247
  const drafts = [...written.keys(), ...carried.taken];
238
- for (const { batch, landed: held } of unqueued) {
239
- const outcome = localSaves ? 'dropped' : held ? 'landed' : 'withdrawn';
240
- journal.record(`outcome ${locator} ${batch.id} ${outcome}`);
241
- }
242
248
  const changed = answer.changed[locator];
243
249
  if (settling.commit?.published !== undefined ||
244
250
  settling.commit?.refreshed === true ||
@@ -260,29 +266,20 @@ async function settlement(runtime, local, locator, work, record, queue, settling
260
266
  };
261
267
  }
262
268
  async function unpairing(runtime, local, locator, batches) {
263
- const { store, journal, localSaves } = runtime;
269
+ const { store, localSaves } = runtime;
264
270
  const ids = new Set(batches.map(({ id }) => id));
265
271
  const leaving = batches.map((batch) => ({
266
272
  batch,
267
273
  returned: !localSaves && leavingIn(batch, locator) ? returnedBy() : null,
268
274
  }));
269
- const outcome = localSaves ? 'dropped' : 'unpaired';
270
275
  const work = await store.work(locator);
271
276
  const current = work.replica;
272
277
  if (current !== undefined) {
273
- const settled = await settlement(runtime, local, locator, work, current.record, current.queue.filter((one) => !ids.has(one.id)), { leaving });
274
- return {
275
- ...settled,
276
- apply(answer) {
277
- for (const batch of batches)
278
- journal.record(`outcome ${locator} ${batch.id} ${outcome}`);
279
- return settled.apply(answer);
280
- },
281
- };
278
+ return settlement(runtime, local, locator, work, current.record, current.queue.filter((one) => !ids.has(one.id)), { leaving });
282
279
  }
283
280
  const queue = work.queue.filter((one) => !ids.has(one.id));
284
- const written = await returnedDrafts(store, locator, work, leaving, undefined);
285
- const carried = await carriedBack(store, locator, leaving.flatMap(({ batch, returned }) => (returned === null ? [] : [batch])), written);
281
+ const written = await returnedDrafts(store, locator, work, leaving, unheldComposition(runtime, locator));
282
+ const carried = await carriedBack(runtime, locator, leaving.flatMap(({ batch, returned }) => (returned === null ? [] : [batch])), written);
286
283
  return {
287
284
  locator,
288
285
  left: batches,
@@ -300,8 +297,6 @@ async function unpairing(runtime, local, locator, batches) {
300
297
  ],
301
298
  },
302
299
  apply() {
303
- for (const batch of batches)
304
- journal.record(`outcome ${locator} ${batch.id} ${outcome}`);
305
300
  return mergeChangeSets([
306
301
  changeSet(locator, {
307
302
  queue: true,
@@ -437,7 +432,7 @@ export async function append(runtime, appending) {
437
432
  catch {
438
433
  return { outcome: 'refused', code: 'durable-write', retryable: true };
439
434
  }
440
- const lost = answer.fenced ?? plan.rooms.find(({ locator }) => store.fences.has(locator))?.locator;
435
+ const lost = answer.fenced ?? plan.rooms.find(({ locator }) => runtime.presence.lost(locator))?.locator;
441
436
  if (lost !== undefined)
442
437
  throw runtimeError('unknown-room', `Unknown Room ${lost}`);
443
438
  const [saving] = plan.rooms;
@@ -1 +1 @@
1
- {"version":3,"file":"reach.d.ts","sourceRoot":"","sources":["../src/reach.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reach.d.ts","sourceRoot":"","sources":["../src/reach.ts"],"names":[],"mappings":"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"}