@agentshouse/mdruntime 0.1.0-cf890bb538119 → 0.1.0-cfac557170cf3

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 (189) hide show
  1. package/README.md +10 -8
  2. package/dist/adapter.d.ts +31 -18
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/attached-model.d.ts +2 -1
  5. package/dist/attached-model.d.ts.map +1 -1
  6. package/dist/attached-model.js +28 -4
  7. package/dist/binary.d.ts +0 -5
  8. package/dist/binary.d.ts.map +1 -1
  9. package/dist/binary.js +1 -1
  10. package/dist/bootstrap.d.ts +15 -4
  11. package/dist/bootstrap.d.ts.map +1 -1
  12. package/dist/bootstrap.js +133 -90
  13. package/dist/client.d.ts +6 -7
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/client.js +54 -7
  16. package/dist/collection.d.ts +5 -0
  17. package/dist/collection.d.ts.map +1 -1
  18. package/dist/collection.js +23 -2
  19. package/dist/compile.d.ts.map +1 -1
  20. package/dist/compile.js +81 -29
  21. package/dist/connection.d.ts +9 -7
  22. package/dist/connection.d.ts.map +1 -1
  23. package/dist/connection.js +961 -476
  24. package/dist/conversation.d.ts +7 -5
  25. package/dist/conversation.d.ts.map +1 -1
  26. package/dist/conversation.js +166 -41
  27. package/dist/durability.d.ts +2 -5
  28. package/dist/durability.d.ts.map +1 -1
  29. package/dist/durability.js +5 -0
  30. package/dist/entry.d.ts +1 -0
  31. package/dist/entry.d.ts.map +1 -1
  32. package/dist/entry.js +1 -1
  33. package/dist/file.d.ts +2 -11
  34. package/dist/file.d.ts.map +1 -1
  35. package/dist/file.js +6 -4
  36. package/dist/fulltext.d.ts.map +1 -1
  37. package/dist/fulltext.js +8 -6
  38. package/dist/host.d.ts +4 -3
  39. package/dist/host.d.ts.map +1 -1
  40. package/dist/host.js +43 -15
  41. package/dist/index.d.ts +9 -9
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +4 -3
  44. package/dist/live.d.ts.map +1 -1
  45. package/dist/live.js +2 -1
  46. package/dist/media.d.ts +8 -0
  47. package/dist/media.d.ts.map +1 -0
  48. package/dist/media.js +218 -0
  49. package/dist/memory.d.ts +2 -2
  50. package/dist/memory.d.ts.map +1 -1
  51. package/dist/memory.js +46 -19
  52. package/dist/model.d.ts +6 -0
  53. package/dist/model.d.ts.map +1 -1
  54. package/dist/model.js +7 -1
  55. package/dist/observation.d.ts +1 -0
  56. package/dist/observation.d.ts.map +1 -1
  57. package/dist/observation.js +1 -1
  58. package/dist/outcome.d.ts +13 -3
  59. package/dist/outcome.d.ts.map +1 -1
  60. package/dist/outcome.js +16 -5
  61. package/dist/overlay.js +1 -1
  62. package/dist/paths.d.ts +1 -0
  63. package/dist/paths.d.ts.map +1 -1
  64. package/dist/paths.js +4 -0
  65. package/dist/query.d.ts +6 -0
  66. package/dist/query.d.ts.map +1 -1
  67. package/dist/reach.d.ts +8 -3
  68. package/dist/reach.d.ts.map +1 -1
  69. package/dist/reach.js +68 -45
  70. package/dist/readiness.d.ts +17 -7
  71. package/dist/readiness.d.ts.map +1 -1
  72. package/dist/readiness.js +6 -6
  73. package/dist/reads.d.ts.map +1 -1
  74. package/dist/reads.js +10 -17
  75. package/dist/recovery.d.ts +1 -0
  76. package/dist/recovery.d.ts.map +1 -1
  77. package/dist/recovery.js +26 -0
  78. package/dist/refresh.d.ts +6 -2
  79. package/dist/refresh.d.ts.map +1 -1
  80. package/dist/refresh.js +61 -27
  81. package/dist/replica.d.ts +5 -4
  82. package/dist/replica.d.ts.map +1 -1
  83. package/dist/replica.js +4 -3
  84. package/dist/room-draft.d.ts +18 -2
  85. package/dist/room-draft.d.ts.map +1 -1
  86. package/dist/room-draft.js +73 -6
  87. package/dist/rows.d.ts +15 -6
  88. package/dist/rows.d.ts.map +1 -1
  89. package/dist/rows.js +102 -74
  90. package/dist/save.d.ts +2 -0
  91. package/dist/save.d.ts.map +1 -1
  92. package/dist/save.js +13 -7
  93. package/dist/status.d.ts +5 -0
  94. package/dist/status.d.ts.map +1 -1
  95. package/dist/status.js +3 -1
  96. package/dist/store.d.ts +18 -12
  97. package/dist/store.d.ts.map +1 -1
  98. package/dist/store.js +25 -20
  99. package/dist/stored.d.ts +10 -13
  100. package/dist/stored.d.ts.map +1 -1
  101. package/dist/stored.js +200 -175
  102. package/dist/tables.d.ts +26 -6
  103. package/dist/tables.d.ts.map +1 -1
  104. package/dist/tables.js +57 -6
  105. package/dist/wire.d.ts +5 -5
  106. package/dist/wire.d.ts.map +1 -1
  107. package/dist/wire.js +2 -2
  108. package/dist/words.d.ts.map +1 -1
  109. package/dist/words.js +8 -2
  110. package/package.json +11 -18
  111. package/AGENTS.md +0 -319
  112. package/dist/chat/acts.d.ts +0 -33
  113. package/dist/chat/acts.d.ts.map +0 -1
  114. package/dist/chat/acts.js +0 -36
  115. package/dist/chat/context.d.ts +0 -3
  116. package/dist/chat/context.d.ts.map +0 -1
  117. package/dist/chat/context.js +0 -10
  118. package/dist/chat/earlier.d.ts +0 -10
  119. package/dist/chat/earlier.d.ts.map +0 -1
  120. package/dist/chat/earlier.js +0 -54
  121. package/dist/chat/house.d.ts +0 -25
  122. package/dist/chat/house.d.ts.map +0 -1
  123. package/dist/chat/house.js +0 -38
  124. package/dist/chat/input.d.ts +0 -11
  125. package/dist/chat/input.d.ts.map +0 -1
  126. package/dist/chat/input.js +0 -92
  127. package/dist/chat/kit.d.ts +0 -61
  128. package/dist/chat/kit.d.ts.map +0 -1
  129. package/dist/chat/kit.js +0 -123
  130. package/dist/chat/lasting.d.ts +0 -6
  131. package/dist/chat/lasting.d.ts.map +0 -1
  132. package/dist/chat/lasting.js +0 -19
  133. package/dist/chat/list.d.ts +0 -28
  134. package/dist/chat/list.d.ts.map +0 -1
  135. package/dist/chat/list.js +0 -103
  136. package/dist/chat/markdown.d.ts +0 -21
  137. package/dist/chat/markdown.d.ts.map +0 -1
  138. package/dist/chat/markdown.js +0 -246
  139. package/dist/chat/message.d.ts +0 -7
  140. package/dist/chat/message.d.ts.map +0 -1
  141. package/dist/chat/message.js +0 -254
  142. package/dist/chat/messages.d.ts +0 -35
  143. package/dist/chat/messages.d.ts.map +0 -1
  144. package/dist/chat/messages.js +0 -210
  145. package/dist/chat/name.d.ts +0 -7
  146. package/dist/chat/name.d.ts.map +0 -1
  147. package/dist/chat/name.js +0 -37
  148. package/dist/chat/opened.d.ts +0 -12
  149. package/dist/chat/opened.d.ts.map +0 -1
  150. package/dist/chat/opened.js +0 -19
  151. package/dist/chat/overlay.d.ts +0 -32
  152. package/dist/chat/overlay.d.ts.map +0 -1
  153. package/dist/chat/overlay.js +0 -103
  154. package/dist/chat/parts.d.ts +0 -58
  155. package/dist/chat/parts.d.ts.map +0 -1
  156. package/dist/chat/parts.js +0 -120
  157. package/dist/chat/pieces.d.ts +0 -62
  158. package/dist/chat/pieces.d.ts.map +0 -1
  159. package/dist/chat/pieces.js +0 -1110
  160. package/dist/chat/process.d.ts +0 -20
  161. package/dist/chat/process.d.ts.map +0 -1
  162. package/dist/chat/process.js +0 -32
  163. package/dist/chat/provider.d.ts +0 -70
  164. package/dist/chat/provider.d.ts.map +0 -1
  165. package/dist/chat/provider.js +0 -635
  166. package/dist/chat/question.d.ts +0 -9
  167. package/dist/chat/question.d.ts.map +0 -1
  168. package/dist/chat/question.js +0 -69
  169. package/dist/chat/questions.d.ts +0 -31
  170. package/dist/chat/questions.d.ts.map +0 -1
  171. package/dist/chat/questions.js +0 -111
  172. package/dist/chat/read.d.ts +0 -5
  173. package/dist/chat/read.d.ts.map +0 -1
  174. package/dist/chat/read.js +0 -13
  175. package/dist/chat/ready.d.ts +0 -37
  176. package/dist/chat/ready.d.ts.map +0 -1
  177. package/dist/chat/ready.js +0 -93
  178. package/dist/chat/room-file.d.ts +0 -8
  179. package/dist/chat/room-file.d.ts.map +0 -1
  180. package/dist/chat/room-file.js +0 -72
  181. package/dist/chat/steady.d.ts +0 -3
  182. package/dist/chat/steady.d.ts.map +0 -1
  183. package/dist/chat/steady.js +0 -26
  184. package/dist/chat/style.d.ts +0 -4
  185. package/dist/chat/style.d.ts.map +0 -1
  186. package/dist/chat/style.js +0 -307
  187. package/dist/chat.d.ts +0 -15
  188. package/dist/chat.d.ts.map +0 -1
  189. package/dist/chat.js +0 -8
package/dist/bootstrap.js CHANGED
@@ -1,36 +1,12 @@
1
1
  import { transferIdentity } from './identity.js';
2
- import { advancement } from './refresh.js';
2
+ import { advancement, pageEntries } from './refresh.js';
3
3
  import { unconfirmed } from './transfer.js';
4
- const RESUMABLE = new Set([
5
- 'transport-uncertainty',
6
- 'retryable-refusal',
7
- 'unconfirmed',
8
- ]);
9
- function pageOf(page) {
10
- const entries = [];
11
- for (const [path, content] of Object.entries(page.documents)) {
12
- entries.push({
13
- path,
14
- content,
15
- binary: null,
16
- revision: page.revisions[path] ?? null,
17
- fileId: page.fileIds?.[path] ?? null,
18
- change: page.changes[path] ?? null,
19
- written: page.roomVersion,
20
- });
21
- }
22
- for (const [path, file] of Object.entries(page.binaryFiles)) {
23
- entries.push({
24
- path,
25
- content: null,
26
- binary: { state: 'accepted', ...file },
27
- revision: page.revisions[path] ?? null,
28
- fileId: page.fileIds?.[path] ?? null,
29
- change: page.changes[path] ?? null,
30
- written: null,
31
- });
32
- }
33
- return { entries, folders: page.folders ?? [] };
4
+ const NOTHING_PRIOR = () => Promise.resolve(new Map());
5
+ async function pageOf(page) {
6
+ return {
7
+ entries: await pageEntries(page, [], page.roomVersion, NOTHING_PRIOR),
8
+ folders: page.folders ?? [],
9
+ };
34
10
  }
35
11
  function heldTogether(first, second) {
36
12
  if (first === null)
@@ -56,17 +32,16 @@ const NO_CONTENT = {
56
32
  files: () => Promise.resolve([]),
57
33
  contents: () => Promise.resolve(new Map()),
58
34
  };
59
- export async function bootstrapRoom(adapter, authorization, room, held, remodel, continuing, staging, reuse) {
60
- const kept = staging.held(room.locator);
61
- const resumed = kept !== null && kept.selection === room.replica.selection ? kept : null;
62
- if (kept !== null && resumed === null)
35
+ export async function bootstrapRoom(adapter, authorization, room, held, builtIn, remodel, continuing, staging, reuse) {
36
+ if (staging.held(room.locator) !== null)
63
37
  await staging.abandon(room.locator);
64
- const first = await bundle(adapter, authorization, room, held, remodel, continuing, staging, resumed, reuse);
38
+ const begun = (pool) => started(adapter, authorization, room, held, builtIn, remodel, continuing, staging, pool);
39
+ const first = await begun(reuse);
65
40
  if (first.kind !== 'expired')
66
41
  return first;
67
42
  await staging.setAside(room.locator);
68
43
  try {
69
- const replacement = await bundle(adapter, authorization, room, held, remodel, continuing, staging, null, heldTogether(reuse, first.held));
44
+ const replacement = await begun(heldTogether(reuse, first.held));
70
45
  if (replacement.kind !== 'expired')
71
46
  return replacement;
72
47
  await staging.abandon(room.locator);
@@ -77,86 +52,154 @@ export async function bootstrapRoom(adapter, authorization, room, held, remodel,
77
52
  await staging.release(first.key);
78
53
  }
79
54
  }
80
- function compositionFor(room, models) {
55
+ function dropped(ahead) {
56
+ void ahead?.fetched.then(({ next, written }) => {
57
+ written();
58
+ dropped(next);
59
+ }, () => { });
60
+ }
61
+ function compositionFor(room, models, builtIn) {
81
62
  return {
82
63
  model: models.collection,
83
64
  selection: room.typedSelection === undefined
84
65
  ? null
85
- : { roots: room.typedSelection.roots, model: models.selection },
66
+ : { roots: room.typedSelection.roots, model: builtIn },
86
67
  };
87
68
  }
88
- async function bundle(adapter, authorization, room, held, remodel, continuing, staging, kept, pool) {
69
+ async function started(adapter, authorization, room, held, builtIn, remodel, continuing, staging, pool) {
70
+ let outcome;
71
+ try {
72
+ outcome = await bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, pool);
73
+ }
74
+ catch (error) {
75
+ await staging.abandon(room.locator).catch(() => { });
76
+ throw error;
77
+ }
78
+ if (outcome.kind !== 'staged' && outcome.kind !== 'expired') {
79
+ await staging.abandon(room.locator);
80
+ }
81
+ return outcome;
82
+ }
83
+ async function bundle(adapter, authorization, room, held, builtIn, remodel, continuing, staging, pool) {
89
84
  const locator = room.locator;
90
85
  const selection = room.replica.selection;
91
- let transfer = kept;
92
- while (transfer === null || transfer.pageToken !== null) {
93
- if (!continuing())
94
- return unconfirmed;
95
- const page = await adapter.bootstrap(authorization, {
96
- locator,
97
- selection,
98
- ...(transfer?.pageToken == null ? {} : { pageToken: transfer.pageToken }),
99
- ...(pool === null ? {} : { held: pool }),
100
- });
101
- if (page.kind === 'beyond-horizon') {
102
- const key = transfer?.key ?? null;
103
- return { kind: 'expired', held: key === null ? NO_CONTENT : staging.content(key), key };
104
- }
105
- if (page.kind !== 'bootstrap') {
106
- if (!RESUMABLE.has(page.kind))
107
- await staging.abandon(locator);
108
- return page;
86
+ const ending = new AbortController();
87
+ const arriving = staging.arriving(locator);
88
+ const downloaded = await staging.turn(locator, 'downloading');
89
+ const asking = (token) => adapter.bootstrap(authorization, {
90
+ locator,
91
+ selection,
92
+ signal: ending.signal,
93
+ ...(token === null
94
+ ? { arriving: (bytes) => arriving.at(bytes) }
95
+ : { pageToken: token }),
96
+ ...(pool === null ? {} : { held: pool }),
97
+ });
98
+ const fetching = (token) => {
99
+ const fetched = (async () => {
100
+ await staging.unqueued();
101
+ const page = continuing() ? await asking(token) : unconfirmed;
102
+ if (page.kind !== 'bootstrap')
103
+ return { page, next: null, written: () => { } };
104
+ const written = staging.queued(page.bytes ?? 0);
105
+ arriving.part();
106
+ const later = page.pageToken;
107
+ if (later === undefined) {
108
+ downloaded();
109
+ arriving.end();
110
+ }
111
+ return { page, written, next: later === undefined || !continuing() ? null : fetching(later) };
112
+ })();
113
+ fetched.catch(() => { });
114
+ return { fetched };
115
+ };
116
+ let transfer = null;
117
+ let ahead = fetching(null);
118
+ try {
119
+ while (ahead !== null) {
120
+ if (!continuing())
121
+ return unconfirmed;
122
+ const fetched = await ahead.fetched;
123
+ ahead = fetched.next;
124
+ try {
125
+ if (!continuing())
126
+ return unconfirmed;
127
+ const page = fetched.page;
128
+ if (page.kind === 'beyond-horizon') {
129
+ const key = transfer?.key ?? null;
130
+ return { kind: 'expired', held: key === null ? NO_CONTENT : staging.content(key), key };
131
+ }
132
+ if (page.kind !== 'bootstrap')
133
+ return page;
134
+ const models = remodel(page.models, transfer?.models ?? held);
135
+ const staged = await staging.stage({
136
+ locator,
137
+ transfer: transfer?.transfer ?? transferIdentity(),
138
+ selection,
139
+ from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
140
+ ? transfer.from
141
+ : page.roomVersion,
142
+ last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
143
+ ? transfer.last
144
+ : page.roomVersion,
145
+ done: {
146
+ parts: (transfer?.done.parts ?? 0) + 1,
147
+ bytes: (transfer?.done.bytes ?? 0) + (page.bytes ?? 0),
148
+ },
149
+ models,
150
+ key: transfer?.key ?? null,
151
+ }, await pageOf(page), compositionFor(room, models, builtIn));
152
+ if (staged === null)
153
+ return unconfirmed;
154
+ transfer = staged;
155
+ }
156
+ finally {
157
+ fetched.written();
158
+ }
109
159
  }
110
- const next = {
111
- locator,
112
- transfer: transfer?.transfer ?? transferIdentity(),
113
- selection,
114
- from: transfer !== null && adapter.reached(locator, page.roomVersion, transfer.from)
115
- ? transfer.from
116
- : page.roomVersion,
117
- last: transfer !== null && !adapter.reached(locator, page.roomVersion, transfer.last)
118
- ? transfer.last
119
- : page.roomVersion,
120
- pageToken: page.pageToken ?? null,
121
- models: remodel(page.models, transfer?.models ?? held),
122
- key: transfer?.key ?? null,
123
- };
124
- const key = await staging.stage(next, pageOf(page), compositionFor(room, next.models));
125
- if (key === null)
126
- return unconfirmed;
127
- transfer = { ...next, key };
128
160
  }
161
+ finally {
162
+ ending.abort();
163
+ downloaded();
164
+ arriving.end();
165
+ dropped(ahead);
166
+ }
167
+ if (transfer === null)
168
+ return unconfirmed;
169
+ const installed = transfer;
170
+ const composition = compositionFor(room, installed.models, builtIn);
171
+ if (!(await staging.derive(locator, installed.key, composition)))
172
+ return unconfirmed;
173
+ await staging.turn(locator, 'replaying');
174
+ if (!continuing())
175
+ return unconfirmed;
129
176
  const record = {
130
177
  locator,
131
178
  name: room.name,
132
179
  handle: room.handle,
133
180
  operations: room.operations,
134
181
  replica: room.replica,
135
- model: transfer.models.collection,
182
+ model: installed.models.collection,
136
183
  typedSelection: room.typedSelection ?? null,
137
- selectionModel: transfer.models.selection,
138
184
  providerOwnedPaths: room.providerOwnedPaths,
139
- roomVersion: transfer.from,
140
- transfer: transfer.transfer,
141
- key: transfer.key,
185
+ roomVersion: installed.from,
186
+ transfer: installed.transfer,
187
+ inventory: installed.done,
188
+ key: installed.key,
142
189
  };
143
- const reconciled = transfer.last === transfer.from && adapter.reached(locator, transfer.last, room.roomVersion)
190
+ const due = [room.roomVersion, ...staging.announced(locator)];
191
+ const last = installed.last;
192
+ const reconciled = last === installed.from && due.every((version) => adapter.reached(locator, last, version))
144
193
  ? { kind: 'still-current' }
145
- : await advancement(adapter, authorization, record, remodel, continuing, await staging.refreshing(record.key));
194
+ : await advancement(adapter, authorization, record, remodel, continuing, await staging.refreshing(locator, record.key, composition));
146
195
  if (reconciled.kind === 'advanced' || reconciled.kind === 'still-current') {
147
196
  const refreshed = reconciled.kind === 'advanced';
148
197
  const result = refreshed ? reconciled.record : record;
149
198
  const refused = await staging.validate(result, refreshed ? 'refreshed' : 'confirmed');
150
- if (refused !== null) {
151
- await staging.abandon(locator);
152
- return refused;
153
- }
154
- return { kind: 'staged', record: result, refreshed };
199
+ return refused ?? { kind: 'staged', record: result, refreshed };
155
200
  }
156
201
  if (reconciled.kind === 'beyond-horizon') {
157
202
  return { kind: 'expired', held: staging.content(record.key), key: record.key };
158
203
  }
159
- if (!RESUMABLE.has(reconciled.kind))
160
- await staging.abandon(locator);
161
204
  return reconciled;
162
205
  }
package/dist/client.d.ts CHANGED
@@ -2,9 +2,7 @@ import type { AppRoom, ConnectionRefusal, HistoryQuery, RoomSchemas, SavedParts,
2
2
  import type { Member, ServiceMode } from './adapter.js';
3
3
  import type { ChatDraft, ConversationAgent, ConversationEntry, ConversationOptions, ConversationView } from './conversation.js';
4
4
  import { type Observation } from './observation.js';
5
- import type { BinaryReference } from './binary.js';
6
- import type { ChosenFile } from './file.js';
7
- import type { BinaryAnswer, BinaryLinkAnswer, CallResult, HistoryAnswer, Offline, QueueEntry, Resolution } from './outcome.js';
5
+ import type { AttachAnswer, BinaryAnswer, CallResult, DownloadAnswer, HistoryAnswer, Offline, QueueEntry, Resolution } from './outcome.js';
8
6
  import type { DocumentQuery, DocumentResult, GroupQuery, GroupResult, PendingResult } from './query.js';
9
7
  import type { RoomDraft, RoomDraftParts, RoomDraftWrite } from './room-draft.js';
10
8
  import type { SearchRequest, SearchResult } from './search.js';
@@ -22,7 +20,7 @@ export type MdRuntimeClient = {
22
20
  roomDraft: {
23
21
  list(): Promise<readonly RoomDraft[]>;
24
22
  read(room: string, path: string): Promise<RoomDraft | null>;
25
- write(room: string, path: string, revision: string | null, parts: RoomDraftParts): Promise<RoomDraftWrite>;
23
+ write(room: string, path: string, revision: string | null, parts: RoomDraftParts, next?: string): Promise<RoomDraftWrite>;
26
24
  discard(room: string, path: string, revision: string): Promise<RoomDraftWrite>;
27
25
  };
28
26
  save(room: string, roomDrafts: readonly SavedRoomDraft[]): Promise<SaveResult>;
@@ -37,7 +35,6 @@ export type MdRuntimeClient = {
37
35
  read(conversation: string, options?: ConversationOptions): Promise<ConversationView>;
38
36
  create(input: unknown): Promise<CallResult>;
39
37
  send(conversation: string, operation?: string, draft?: ChatDraft): Promise<CallResult | Offline>;
40
- attach(room: string, file: ChosenFile): Promise<CallResult | Offline>;
41
38
  answer(conversation: string, answer: unknown): Promise<CallResult>;
42
39
  interrupt(conversation: string): Promise<CallResult>;
43
40
  kill(conversation: string): Promise<CallResult>;
@@ -53,8 +50,8 @@ export type MdRuntimeClient = {
53
50
  resolve(room: string, path: string, destination: string): Promise<Resolution>;
54
51
  binaryFile: {
55
52
  read(room: string, path: string, revision?: string): Promise<BinaryAnswer>;
56
- link(room: string, path: string, revision?: string): Promise<BinaryLinkAnswer>;
57
- readReference(reference: BinaryReference): Promise<BinaryAnswer>;
53
+ attach(room: string, file: File): Promise<AttachAnswer>;
54
+ download(room: string, path: string, revision?: string): Promise<DownloadAnswer>;
58
55
  };
59
56
  call(name: string, input: unknown): Promise<CallResult>;
60
57
  reached(locator: string, roomVersion: string, path?: string): Promise<boolean>;
@@ -86,6 +83,8 @@ export type MdRuntimeClient = {
86
83
  export declare function connectMdRuntime(port: RuntimePort): MdRuntimeClient;
87
84
  export declare function inTurn(client: MdRuntimeClient, work: () => Promise<void>): Promise<void>;
88
85
  export { chainedWindows, type WindowAnswer, type WindowChain } from './chain.js';
86
+ export { roomDraftRevision } from './identity.js';
87
+ export { defineRoomMedia, ROOM_MEDIA } from './media.js';
89
88
  export type { Observation } from './observation.js';
90
89
  export type { Open } from './open.js';
91
90
  export { unanswered, type RuntimePort, type WireMember } from './wire.js';
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js CHANGED
@@ -1,8 +1,25 @@
1
+ import { shownBy } from './media.js';
1
2
  import { observed } from './observation.js';
2
3
  import { runtimeError } from './failure.js';
3
4
  import { answer, AUTHORIZATION_ENDED, PORT_CLOSED, } from './wire.js';
4
5
  // React renders an arrived value in a later task and opens what that render observes as it commits, so this many frames opening nothing mean the page drew what it observes.
5
6
  const SETTLED_FRAMES = 2;
7
+ // A browser reads a download's address only after the click that hands it returns, so a copy's address is released a minute later.
8
+ const HANDED_COPY_MS = 60_000;
9
+ const PAGE = /\.html?$/iu;
10
+ const STARTED = { kind: 'started' };
11
+ const BLOCKED = {
12
+ kind: 'blocked',
13
+ code: 'popup-blocked',
14
+ fields: {},
15
+ retryable: true,
16
+ };
17
+ function handed(url, name) {
18
+ const anchor = document.createElement('a');
19
+ anchor.href = url;
20
+ anchor.download = name;
21
+ anchor.click();
22
+ }
6
23
  function refused(refusal) {
7
24
  return runtimeError(refusal.code, refusal.code, refusal.retryable);
8
25
  }
@@ -156,6 +173,34 @@ export function connectMdRuntime(port) {
156
173
  }, { highWaterMark: 0 });
157
174
  return { kind: 'binary', stream, byteLength, mediaType };
158
175
  }
176
+ async function download(room, path, revision) {
177
+ const tab = PAGE.test(path) ? globalThis.open('', '_blank') : null;
178
+ const linked = await ask('binaryFile.link', [room, path, revision]);
179
+ if (linked.kind === 'link' && PAGE.test(linked.name)) {
180
+ const away = tab ?? globalThis.open('', '_blank');
181
+ if (away === null)
182
+ return BLOCKED;
183
+ away.location.replace(linked.url);
184
+ return STARTED;
185
+ }
186
+ tab?.close();
187
+ if (linked.kind === 'link') {
188
+ handed(linked.url, linked.name);
189
+ return STARTED;
190
+ }
191
+ if (linked.kind !== 'absent')
192
+ return linked;
193
+ const read = streamed(await ask('binaryFile.read', [room, path, revision]));
194
+ if (read.kind !== 'binary')
195
+ return read;
196
+ const copy = await new Response(read.stream, {
197
+ headers: { 'content-type': read.mediaType },
198
+ }).blob();
199
+ const url = URL.createObjectURL(copy);
200
+ handed(url, path.slice(path.lastIndexOf('/') + 1));
201
+ setTimeout(() => URL.revokeObjectURL(url), HANDED_COPY_MS);
202
+ return STARTED;
203
+ }
159
204
  function settled() {
160
205
  if (settling !== null)
161
206
  return settling;
@@ -185,7 +230,8 @@ export function connectMdRuntime(port) {
185
230
  });
186
231
  return settling;
187
232
  }
188
- return {
233
+ const show = (room, path, revision) => ask('binaryFile.show', [room, path, revision]).then((shown) => streamed(shown));
234
+ return shownBy(show, {
189
235
  rooms: () => ask('rooms', []),
190
236
  query: ((query) => ask('query', [query])),
191
237
  search: (request) => ask('search', [request]),
@@ -193,7 +239,7 @@ export function connectMdRuntime(port) {
193
239
  roomDraft: {
194
240
  list: () => ask('roomDraft.list', []),
195
241
  read: (room, path) => ask('roomDraft.read', [room, path]),
196
- write: (room, path, revision, parts) => ask('roomDraft.write', [room, path, revision, parts]),
242
+ write: (room, path, revision, parts, next) => ask('roomDraft.write', next === undefined ? [room, path, revision, parts] : [room, path, revision, parts, next]),
197
243
  discard: (room, path, revision) => ask('roomDraft.discard', [room, path, revision]),
198
244
  },
199
245
  save: (room, roomDrafts) => ask('save', [room, roomDrafts]),
@@ -208,7 +254,6 @@ export function connectMdRuntime(port) {
208
254
  read: (conversation, options) => ask('conversation.read', [conversation, options]),
209
255
  create: (input) => ask('conversation.create', [input]),
210
256
  send: (conversation, operation, draft) => ask('conversation.send', [conversation, operation, draft]),
211
- attach: (room, file) => ask('conversation.attach', [room, file]),
212
257
  answer: (conversation, answer) => ask('conversation.answer', [conversation, answer]),
213
258
  interrupt: (conversation) => ask('conversation.interrupt', [conversation]),
214
259
  kill: (conversation) => ask('conversation.kill', [conversation]),
@@ -223,9 +268,9 @@ export function connectMdRuntime(port) {
223
268
  history: (locator, path, query) => ask('history', [locator, path, query]),
224
269
  resolve: (room, path, destination) => ask('resolve', [room, path, destination]),
225
270
  binaryFile: {
226
- read: (room, path, revision) => ask('binaryFile.read', [room, path, revision]).then(streamed),
227
- link: (room, path, revision) => ask('binaryFile.link', [room, path, revision]),
228
- readReference: (reference) => ask('binaryFile.readReference', [reference]).then(streamed),
271
+ read: (room, path, revision) => ask('binaryFile.read', [room, path, revision]).then((read) => streamed(read)),
272
+ attach: (room, file) => ask('binaryFile.attach', [room, file]),
273
+ download,
229
274
  },
230
275
  call: (name, input) => ask('call', [name, input]),
231
276
  reached: (locator, roomVersion, path) => ask('reached', [locator, roomVersion, path]),
@@ -236,7 +281,7 @@ export function connectMdRuntime(port) {
236
281
  observe: ((topic, ...input) => watch(topic, input)),
237
282
  reauthorize: () => ask('reauthorize', []),
238
283
  settled,
239
- };
284
+ });
240
285
  }
241
286
  const turns = new WeakMap();
242
287
  export function inTurn(client, work) {
@@ -245,4 +290,6 @@ export function inTurn(client, work) {
245
290
  return turn;
246
291
  }
247
292
  export { chainedWindows } from './chain.js';
293
+ export { roomDraftRevision } from './identity.js';
294
+ export { defineRoomMedia, ROOM_MEDIA } from './media.js';
248
295
  export { unanswered } from './wire.js';
@@ -16,6 +16,11 @@ export type Composition = {
16
16
  model: ModelState;
17
17
  } | null;
18
18
  };
19
+ export type Composed = {
20
+ readonly composition: Composition;
21
+ readonly fingerprint: string;
22
+ };
23
+ export declare function composedOf(composition: Composition): Composed;
19
24
  export declare function selected(composition: Composition, path: string): boolean;
20
25
  export declare function governing(composition: Composition, path: string): ModelState;
21
26
  export declare function collectionOf(text: Readonly<Record<string, string>>, composition: Composition): Collection;
@@ -1 +1 @@
1
- {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAsB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,QAAQ,EAAE,eAAwE,CAAC;AAEhG,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE;QAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;CACnE,CAAC;AAEF,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKxE;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAI5E;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,WAAW,EAAE,WAAW,GACvB,UAAU,CAcZ;AAED,wBAAiB,WAAW,CAC1B,UAAU,EAAE,UAAU,GACrB,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAQhE;AAED,wBAAiB,UAAU,CACzB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EACnB,KAAK,GAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAW,GACpC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,CAazC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEvD;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAK3D"}
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAsB,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,QAAQ,EAAE,eAAwE,CAAC;AAEhG,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvC,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE;QAAE,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;CACnE,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAc3F,wBAAgB,UAAU,CAAC,WAAW,EAAE,WAAW,GAAG,QAAQ,CAS7D;AAED,wBAAgB,QAAQ,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKxE;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAI5E;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACtC,WAAW,EAAE,WAAW,GACvB,UAAU,CAcZ;AAED,wBAAiB,WAAW,CAC1B,UAAU,EAAE,UAAU,GACrB,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAQhE;AAED,wBAAiB,UAAU,CACzB,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EACnB,KAAK,GAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAW,GACpC,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,CAazC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,MAAM,CAEvD;AAED,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAE3D"}
@@ -1,8 +1,30 @@
1
1
  import { parse, VERSION } from '@agentshouse/mdmodel';
2
2
  import { beneath, normalize } from './paths.js';
3
+ import { hashed } from './observation.js';
3
4
  import { keysIn, sortedKeys } from './shared.js';
4
5
  import { ROW_WEIGHT } from './turn.js';
5
6
  export const MD_MODEL = { identity: '@agentshouse/mdmodel', version: VERSION };
7
+ const typesPrinted = new WeakMap();
8
+ function typesPrint(model) {
9
+ if (model.status === 'unavailable')
10
+ return '';
11
+ let print = typesPrinted.get(model.types);
12
+ if (print === undefined) {
13
+ print = hashed(JSON.stringify(model.types)).toString(36);
14
+ typesPrinted.set(model.types, print);
15
+ }
16
+ return print;
17
+ }
18
+ export function composedOf(composition) {
19
+ const { model, selection } = composition;
20
+ return {
21
+ composition,
22
+ fingerprint: JSON.stringify([
23
+ typesPrint(model),
24
+ selection === null ? null : [selection.roots, typesPrint(selection.model)],
25
+ ]),
26
+ };
27
+ }
6
28
  export function selected(composition, path) {
7
29
  return (composition.selection !== null &&
8
30
  composition.selection.roots.some((root) => beneath(root, path)));
@@ -58,6 +80,5 @@ export function validRoot(root) {
58
80
  return typeof root === 'string' && normalize(root) === root;
59
81
  }
60
82
  export function available(composition) {
61
- return (composition.model.status !== 'unavailable' &&
62
- (composition.selection === null || composition.selection.model.status !== 'unavailable'));
83
+ return composition.model.status !== 'unavailable';
63
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAOV,IAAI,EAGJ,SAAS,EAIV,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,UAAU,EAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAU1D,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,KAAK,EAAE,CAAA;CAAE,CAAC;AA+pBjF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AA8SjE,wBAAgB,QAAQ,CACtB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,QAAQ,CAEV;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,MAAM,GAAE,MAAM,GAAG,IAAW,GAC3B,WAAW,CAUb"}
1
+ {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAOV,IAAI,EAGJ,SAAS,EAIV,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,UAAU,EAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAU1D,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3E,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,KAAK,EAAE,CAAA;CAAE,CAAC;AAssBjF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG;IAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AA4TjE,wBAAgB,QAAQ,CACtB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,QAAQ,CAEV;AAED,wBAAgB,WAAW,CACzB,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,MAAM,GAAE,MAAM,GAAG,IAAW,GAC3B,WAAW,CAUb"}