@agentshouse/mdruntime 0.1.0-alpha.2 → 0.1.0-alpha.21

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 (110) hide show
  1. package/AGENTS.md +87 -0
  2. package/dist/adapter.d.ts +145 -28
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/adapter.js +2 -1
  5. package/dist/adapter.js.map +1 -1
  6. package/dist/bootstrap.d.ts +11 -13
  7. package/dist/bootstrap.d.ts.map +1 -1
  8. package/dist/bootstrap.js +25 -24
  9. package/dist/bootstrap.js.map +1 -1
  10. package/dist/change-set.d.ts +33 -0
  11. package/dist/change-set.d.ts.map +1 -0
  12. package/dist/change-set.js +74 -0
  13. package/dist/change-set.js.map +1 -0
  14. package/dist/change.d.ts +70 -0
  15. package/dist/change.d.ts.map +1 -0
  16. package/dist/change.js +12 -0
  17. package/dist/change.js.map +1 -0
  18. package/dist/client.d.ts +66 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +229 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/collection.d.ts +25 -3
  23. package/dist/collection.d.ts.map +1 -1
  24. package/dist/collection.js +97 -25
  25. package/dist/collection.js.map +1 -1
  26. package/dist/connection.d.ts +87 -5
  27. package/dist/connection.d.ts.map +1 -1
  28. package/dist/connection.js +1653 -70
  29. package/dist/connection.js.map +1 -1
  30. package/dist/conversation.d.ts +57 -0
  31. package/dist/conversation.d.ts.map +1 -0
  32. package/dist/conversation.js +404 -0
  33. package/dist/conversation.js.map +1 -0
  34. package/dist/durability.d.ts +9 -0
  35. package/dist/durability.d.ts.map +1 -0
  36. package/dist/durability.js +11 -0
  37. package/dist/durability.js.map +1 -0
  38. package/dist/file.d.ts +20 -0
  39. package/dist/file.d.ts.map +1 -0
  40. package/dist/file.js +149 -0
  41. package/dist/file.js.map +1 -0
  42. package/dist/host.d.ts +13 -0
  43. package/dist/host.d.ts.map +1 -0
  44. package/dist/host.js +229 -0
  45. package/dist/host.js.map +1 -0
  46. package/dist/identity.d.ts +2 -0
  47. package/dist/identity.d.ts.map +1 -0
  48. package/dist/identity.js +16 -0
  49. package/dist/identity.js.map +1 -0
  50. package/dist/index.d.ts +13 -2
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +1 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/log.d.ts +5 -0
  55. package/dist/log.d.ts.map +1 -0
  56. package/dist/log.js +15 -0
  57. package/dist/log.js.map +1 -0
  58. package/dist/memory.d.ts +17 -2
  59. package/dist/memory.d.ts.map +1 -1
  60. package/dist/memory.js +264 -21
  61. package/dist/memory.js.map +1 -1
  62. package/dist/model.d.ts +70 -0
  63. package/dist/model.d.ts.map +1 -0
  64. package/dist/model.js +28 -0
  65. package/dist/model.js.map +1 -0
  66. package/dist/outcome.d.ts +37 -0
  67. package/dist/outcome.d.ts.map +1 -0
  68. package/dist/outcome.js +23 -0
  69. package/dist/outcome.js.map +1 -0
  70. package/dist/overlay.d.ts +10 -0
  71. package/dist/overlay.d.ts.map +1 -0
  72. package/dist/overlay.js +245 -0
  73. package/dist/overlay.js.map +1 -0
  74. package/dist/paths.d.ts +6 -0
  75. package/dist/paths.d.ts.map +1 -0
  76. package/dist/paths.js +47 -0
  77. package/dist/paths.js.map +1 -0
  78. package/dist/query.d.ts +13 -0
  79. package/dist/query.d.ts.map +1 -0
  80. package/dist/query.js +18 -0
  81. package/dist/query.js.map +1 -0
  82. package/dist/refresh.d.ts +14 -0
  83. package/dist/refresh.d.ts.map +1 -0
  84. package/dist/refresh.js +65 -0
  85. package/dist/refresh.js.map +1 -0
  86. package/dist/replica.d.ts +33 -0
  87. package/dist/replica.d.ts.map +1 -0
  88. package/dist/replica.js +134 -0
  89. package/dist/replica.js.map +1 -0
  90. package/dist/save.d.ts +35 -0
  91. package/dist/save.d.ts.map +1 -0
  92. package/dist/save.js +561 -0
  93. package/dist/save.js.map +1 -0
  94. package/dist/status.d.ts +25 -0
  95. package/dist/status.d.ts.map +1 -0
  96. package/dist/status.js +32 -0
  97. package/dist/status.js.map +1 -0
  98. package/dist/store.d.ts +86 -4
  99. package/dist/store.d.ts.map +1 -1
  100. package/dist/store.js +394 -9
  101. package/dist/store.js.map +1 -1
  102. package/dist/transfer.d.ts +5 -0
  103. package/dist/transfer.d.ts.map +1 -0
  104. package/dist/transfer.js +5 -0
  105. package/dist/transfer.js.map +1 -0
  106. package/dist/wire.d.ts +63 -0
  107. package/dist/wire.d.ts.map +1 -0
  108. package/dist/wire.js +142 -0
  109. package/dist/wire.js.map +1 -0
  110. package/package.json +13 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,WAAW,EAAgB,MAAM,aAAa,CAAC;AAErE,MAAM,MAAM,KAAK,GAAG;IAClB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5C,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC7C,CAAC;AAyIF,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,KAAK,CAezE;AAQD,wBAAgB,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAQhE;AAqBD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,KAAK,EACX,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,YAAY,EAAE,KAAK,EACnB,aAAa,EAAE,SAAS,WAAW,EAAE,EACrC,eAAe,EAAE,KAAK,GACrB,KAAK,CAkFP"}
@@ -0,0 +1,245 @@
1
+ import { apply, parse, serialize } from '@agentshouse/mdmodel';
2
+ const EMPTY_FRONTMATTER = '---\n---\n';
3
+ function at(path, name) {
4
+ return `${path} ${name}`;
5
+ }
6
+ function priorsOf(preconditions) {
7
+ const fields = new Map();
8
+ const sections = new Map();
9
+ const preambles = new Map();
10
+ for (const precondition of preconditions){
11
+ if (precondition.kind === 'field') {
12
+ fields.set(at(precondition.path, precondition.name), precondition.value);
13
+ }
14
+ if (precondition.kind === 'section') {
15
+ sections.set(at(precondition.path, precondition.name), precondition.value);
16
+ }
17
+ if (precondition.kind === 'preamble') {
18
+ preambles.set(precondition.path, precondition.value);
19
+ }
20
+ }
21
+ return {
22
+ field: (path, name)=>fields.get(at(path, name)),
23
+ section: (path, name)=>sections.get(at(path, name)) ?? '',
24
+ preamble: (path)=>preambles.get(path) ?? ''
25
+ };
26
+ }
27
+ function compose(fields, sections) {
28
+ const body = Object.entries(sections).map(([name, value])=>`\n## ${name}\n${value}`).join('');
29
+ const skeleton = `${EMPTY_FRONTMATTER}${body}`;
30
+ const opened = parse(skeleton);
31
+ if (!opened.ok) return skeleton;
32
+ let document = opened.document;
33
+ for (const [name, value] of Object.entries(fields)){
34
+ const next = apply(document, {
35
+ kind: 'field',
36
+ name,
37
+ value,
38
+ prior: undefined
39
+ });
40
+ if (next.outcome === 'applied') document = next.document;
41
+ }
42
+ return serialize(document);
43
+ }
44
+ function edited(document, change, priors) {
45
+ if (change.kind === 'field') {
46
+ return apply(document, {
47
+ kind: 'field',
48
+ name: change.name,
49
+ value: change.value,
50
+ prior: priors.field(change.path, change.name)
51
+ });
52
+ }
53
+ if (change.kind === 'preamble') {
54
+ return apply(document, {
55
+ kind: 'preamble',
56
+ value: change.value,
57
+ prior: priors.preamble(change.path)
58
+ });
59
+ }
60
+ if (change.kind !== 'section') return null;
61
+ return apply(document, {
62
+ kind: 'section',
63
+ name: change.name,
64
+ value: change.value,
65
+ prior: priors.section(change.path, change.name)
66
+ });
67
+ }
68
+ function edit(staged, change, priors) {
69
+ const text = staged.documents[change.path];
70
+ if (text === undefined) return;
71
+ const parsed = parse(text, change.path);
72
+ if (!parsed.ok) return;
73
+ const next = edited(parsed.document, change, priors);
74
+ if (next?.outcome === 'applied') staged.documents[change.path] = serialize(next.document);
75
+ }
76
+ function relocate(staged, from, to) {
77
+ const text = staged.documents[from];
78
+ if (text !== undefined) {
79
+ delete staged.documents[from];
80
+ staged.documents[to] = text;
81
+ } else if (staged.binaryTargets.delete(from)) {
82
+ staged.binaryTargets.add(to);
83
+ } else {
84
+ return;
85
+ }
86
+ const revision = staged.revisions[from];
87
+ if (revision === undefined) return;
88
+ delete staged.revisions[from];
89
+ staged.revisions[to] = revision;
90
+ }
91
+ function erase(staged, path) {
92
+ delete staged.documents[path];
93
+ delete staged.revisions[path];
94
+ staged.binaryTargets.delete(path);
95
+ }
96
+ function stage(staged, change, priors) {
97
+ if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {
98
+ edit(staged, change, priors);
99
+ return;
100
+ }
101
+ if (change.kind === 'create') {
102
+ staged.documents[change.path] = compose(change.fields, change.sections);
103
+ return;
104
+ }
105
+ if (change.kind === 'replace') {
106
+ if (staged.documents[change.path] === undefined) return;
107
+ staged.documents[change.path] = change.content;
108
+ return;
109
+ }
110
+ if (change.kind === 'move') {
111
+ relocate(staged, change.path, change.to);
112
+ return;
113
+ }
114
+ erase(staged, change.path);
115
+ }
116
+ export function overlay(base, queue) {
117
+ const staged = {
118
+ documents: {
119
+ ...base.documents
120
+ },
121
+ binaryTargets: new Set(base.binaryTargets),
122
+ revisions: {
123
+ ...base.revisions
124
+ }
125
+ };
126
+ for (const batch of queue){
127
+ const priors = priorsOf(batch.preconditions);
128
+ for (const change of batch.changes)stage(staged, change, priors);
129
+ }
130
+ return {
131
+ documents: staged.documents,
132
+ binaryTargets: [
133
+ ...staged.binaryTargets
134
+ ].sort(),
135
+ revisions: staged.revisions
136
+ };
137
+ }
138
+ function pathsOf(batch) {
139
+ return batch.changes.flatMap((change)=>change.kind === 'move' ? [
140
+ change.path,
141
+ change.to
142
+ ] : [
143
+ change.path
144
+ ]);
145
+ }
146
+ export function sameLayerText(left, right) {
147
+ const paths = Object.keys(left.documents);
148
+ return paths.length === Object.keys(right.documents).length && paths.every((path)=>left.documents[path] === right.documents[path]) && left.binaryTargets.length === right.binaryTargets.length && left.binaryTargets.every((path)=>right.binaryTargets.includes(path));
149
+ }
150
+ function replayRevisions(base, queue) {
151
+ const revisions = {
152
+ ...base
153
+ };
154
+ for (const batch of queue){
155
+ for (const change of batch.changes){
156
+ if (change.kind === 'remove') {
157
+ delete revisions[change.path];
158
+ } else if (change.kind === 'move') {
159
+ const revision = revisions[change.path];
160
+ delete revisions[change.path];
161
+ if (revision !== undefined) revisions[change.to] = revision;
162
+ }
163
+ }
164
+ }
165
+ return revisions;
166
+ }
167
+ export function overlayChanged(base, queue, previousBase, previousQueue, previousVisible) {
168
+ const before = previousQueue.map((batch)=>JSON.stringify(batch));
169
+ const after = queue.map((batch)=>JSON.stringify(batch));
170
+ if (before.length === after.length && before.every((id, index)=>id === after[index]) && sameLayerText(base, previousBase)) {
171
+ return {
172
+ documents: previousVisible.documents,
173
+ binaryTargets: previousVisible.binaryTargets,
174
+ revisions: replayRevisions(base.revisions, queue)
175
+ };
176
+ }
177
+ const affected = new Set();
178
+ const paths = new Set([
179
+ ...Object.keys(base.documents),
180
+ ...Object.keys(previousBase.documents),
181
+ ...Object.keys(base.revisions),
182
+ ...Object.keys(previousBase.revisions),
183
+ ...base.binaryTargets,
184
+ ...previousBase.binaryTargets
185
+ ]);
186
+ for (const path of paths){
187
+ if (base.documents[path] !== previousBase.documents[path] || base.revisions[path] !== previousBase.revisions[path] || base.binaryTargets.includes(path) !== previousBase.binaryTargets.includes(path)) affected.add(path);
188
+ }
189
+ const oldIds = new Set(before);
190
+ const newIds = new Set(after);
191
+ for (const batch of previousQueue){
192
+ if (!newIds.has(JSON.stringify(batch))) for (const path of pathsOf(batch))affected.add(path);
193
+ }
194
+ for (const batch of queue){
195
+ if (!oldIds.has(JSON.stringify(batch))) for (const path of pathsOf(batch))affected.add(path);
196
+ }
197
+ let expanded = true;
198
+ while(expanded){
199
+ expanded = false;
200
+ for (const batch of queue){
201
+ const touched = pathsOf(batch);
202
+ if (!touched.some((path)=>affected.has(path))) continue;
203
+ for (const path of touched){
204
+ if (affected.has(path)) continue;
205
+ affected.add(path);
206
+ expanded = true;
207
+ }
208
+ }
209
+ }
210
+ const documents = {};
211
+ const revisions = {};
212
+ for (const path of affected){
213
+ if (base.documents[path] !== undefined) documents[path] = base.documents[path];
214
+ if (base.revisions[path] !== undefined) revisions[path] = base.revisions[path];
215
+ }
216
+ const staged = overlay({
217
+ documents,
218
+ revisions,
219
+ binaryTargets: base.binaryTargets.filter((path)=>affected.has(path))
220
+ }, queue.filter((batch)=>pathsOf(batch).some((path)=>affected.has(path))));
221
+ const mergedDocuments = {
222
+ ...previousVisible.documents
223
+ };
224
+ const mergedRevisions = {
225
+ ...previousVisible.revisions
226
+ };
227
+ const mergedTargets = new Set(previousVisible.binaryTargets);
228
+ for (const path of affected){
229
+ delete mergedDocuments[path];
230
+ delete mergedRevisions[path];
231
+ mergedTargets.delete(path);
232
+ }
233
+ Object.assign(mergedDocuments, staged.documents);
234
+ Object.assign(mergedRevisions, staged.revisions);
235
+ for (const path of staged.binaryTargets)mergedTargets.add(path);
236
+ return {
237
+ documents: mergedDocuments,
238
+ revisions: mergedRevisions,
239
+ binaryTargets: [
240
+ ...mergedTargets
241
+ ].sort()
242
+ };
243
+ }
244
+
245
+ //# sourceMappingURL=overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/overlay.ts"],"sourcesContent":["import { apply, parse, serialize, type Document } from '@agentshouse/mdmodel';\nimport type { Change, ChangeBatch, Precondition } from './change.js';\n\nexport type Layer = {\n documents: Readonly<Record<string, string>>;\n binaryTargets: readonly string[];\n revisions: Readonly<Record<string, string>>;\n};\n\ntype Staged = {\n documents: Record<string, string>;\n binaryTargets: Set<string>;\n revisions: Record<string, string>;\n};\n\ntype Priors = {\n field(path: string, name: string): unknown;\n section(path: string, name: string): string;\n preamble(path: string): string;\n};\n\nconst EMPTY_FRONTMATTER = '---\\n---\\n';\n\nfunction at(path: string, name: string) {\n return `${path} ${name}`;\n}\n\nfunction priorsOf(preconditions: readonly Precondition[]): Priors {\n const fields = new Map<string, unknown>();\n const sections = new Map<string, string>();\n const preambles = new Map<string, string>();\n for (const precondition of preconditions) {\n if (precondition.kind === 'field') {\n fields.set(at(precondition.path, precondition.name), precondition.value);\n }\n if (precondition.kind === 'section') {\n sections.set(at(precondition.path, precondition.name), precondition.value);\n }\n if (precondition.kind === 'preamble') {\n preambles.set(precondition.path, precondition.value);\n }\n }\n return {\n field: (path, name) => fields.get(at(path, name)),\n section: (path, name) => sections.get(at(path, name)) ?? '',\n preamble: (path) => preambles.get(path) ?? '',\n };\n}\n\nfunction compose(\n fields: Readonly<Record<string, unknown>>,\n sections: Readonly<Record<string, string>>,\n): string {\n const body = Object.entries(sections)\n .map(([name, value]) => `\\n## ${name}\\n${value}`)\n .join('');\n const skeleton = `${EMPTY_FRONTMATTER}${body}`;\n const opened = parse(skeleton);\n if (!opened.ok) return skeleton;\n let document: Document = opened.document;\n for (const [name, value] of Object.entries(fields)) {\n const next = apply(document, { kind: 'field', name, value, prior: undefined });\n if (next.outcome === 'applied') document = next.document;\n }\n return serialize(document);\n}\n\nfunction edited(document: Document, change: Change, priors: Priors) {\n if (change.kind === 'field') {\n return apply(document, {\n kind: 'field',\n name: change.name,\n value: change.value,\n prior: priors.field(change.path, change.name),\n });\n }\n if (change.kind === 'preamble') {\n return apply(document, {\n kind: 'preamble',\n value: change.value,\n prior: priors.preamble(change.path),\n });\n }\n if (change.kind !== 'section') return null;\n return apply(document, {\n kind: 'section',\n name: change.name,\n value: change.value,\n prior: priors.section(change.path, change.name),\n });\n}\n\nfunction edit(staged: Staged, change: Change, priors: Priors) {\n const text = staged.documents[change.path];\n if (text === undefined) return;\n const parsed = parse(text, change.path);\n if (!parsed.ok) return;\n const next = edited(parsed.document, change, priors);\n if (next?.outcome === 'applied') staged.documents[change.path] = serialize(next.document);\n}\n\nfunction relocate(staged: Staged, from: string, to: string) {\n const text = staged.documents[from];\n if (text !== undefined) {\n delete staged.documents[from];\n staged.documents[to] = text;\n } else if (staged.binaryTargets.delete(from)) {\n staged.binaryTargets.add(to);\n } else {\n return;\n }\n const revision = staged.revisions[from];\n if (revision === undefined) return;\n delete staged.revisions[from];\n staged.revisions[to] = revision;\n}\n\nfunction erase(staged: Staged, path: string) {\n delete staged.documents[path];\n delete staged.revisions[path];\n staged.binaryTargets.delete(path);\n}\n\nfunction stage(staged: Staged, change: Change, priors: Priors) {\n if (change.kind === 'field' || change.kind === 'section' || change.kind === 'preamble') {\n edit(staged, change, priors);\n return;\n }\n if (change.kind === 'create') {\n staged.documents[change.path] = compose(change.fields, change.sections);\n return;\n }\n if (change.kind === 'replace') {\n if (staged.documents[change.path] === undefined) return;\n staged.documents[change.path] = change.content;\n return;\n }\n if (change.kind === 'move') {\n relocate(staged, change.path, change.to);\n return;\n }\n erase(staged, change.path);\n}\n\nexport function overlay(base: Layer, queue: readonly ChangeBatch[]): Layer {\n const staged: Staged = {\n documents: { ...base.documents },\n binaryTargets: new Set(base.binaryTargets),\n revisions: { ...base.revisions },\n };\n for (const batch of queue) {\n const priors = priorsOf(batch.preconditions);\n for (const change of batch.changes) stage(staged, change, priors);\n }\n return {\n documents: staged.documents,\n binaryTargets: [...staged.binaryTargets].sort(),\n revisions: staged.revisions,\n };\n}\n\nfunction pathsOf(batch: ChangeBatch): readonly string[] {\n return batch.changes.flatMap((change) =>\n change.kind === 'move' ? [change.path, change.to] : [change.path],\n );\n}\n\nexport function sameLayerText(left: Layer, right: Layer): boolean {\n const paths = Object.keys(left.documents);\n return (\n paths.length === Object.keys(right.documents).length &&\n paths.every((path) => left.documents[path] === right.documents[path]) &&\n left.binaryTargets.length === right.binaryTargets.length &&\n left.binaryTargets.every((path) => right.binaryTargets.includes(path))\n );\n}\n\nfunction replayRevisions(\n base: Readonly<Record<string, string>>,\n queue: readonly ChangeBatch[],\n): Readonly<Record<string, string>> {\n const revisions = { ...base };\n for (const batch of queue) {\n for (const change of batch.changes) {\n if (change.kind === 'remove') {\n delete revisions[change.path];\n } else if (change.kind === 'move') {\n const revision = revisions[change.path];\n delete revisions[change.path];\n if (revision !== undefined) revisions[change.to] = revision;\n }\n }\n }\n return revisions;\n}\n\nexport function overlayChanged(\n base: Layer,\n queue: readonly ChangeBatch[],\n previousBase: Layer,\n previousQueue: readonly ChangeBatch[],\n previousVisible: Layer,\n): Layer {\n const before = previousQueue.map((batch) => JSON.stringify(batch));\n const after = queue.map((batch) => JSON.stringify(batch));\n if (\n before.length === after.length &&\n before.every((id, index) => id === after[index]) &&\n sameLayerText(base, previousBase)\n ) {\n return {\n documents: previousVisible.documents,\n binaryTargets: previousVisible.binaryTargets,\n revisions: replayRevisions(base.revisions, queue),\n };\n }\n const affected = new Set<string>();\n const paths = new Set([\n ...Object.keys(base.documents),\n ...Object.keys(previousBase.documents),\n ...Object.keys(base.revisions),\n ...Object.keys(previousBase.revisions),\n ...base.binaryTargets,\n ...previousBase.binaryTargets,\n ]);\n for (const path of paths) {\n if (\n base.documents[path] !== previousBase.documents[path] ||\n base.revisions[path] !== previousBase.revisions[path] ||\n base.binaryTargets.includes(path) !== previousBase.binaryTargets.includes(path)\n )\n affected.add(path);\n }\n const oldIds = new Set(before);\n const newIds = new Set(after);\n for (const batch of previousQueue) {\n if (!newIds.has(JSON.stringify(batch))) for (const path of pathsOf(batch)) affected.add(path);\n }\n for (const batch of queue) {\n if (!oldIds.has(JSON.stringify(batch))) for (const path of pathsOf(batch)) affected.add(path);\n }\n let expanded = true;\n while (expanded) {\n expanded = false;\n for (const batch of queue) {\n const touched = pathsOf(batch);\n if (!touched.some((path) => affected.has(path))) continue;\n for (const path of touched) {\n if (affected.has(path)) continue;\n affected.add(path);\n expanded = true;\n }\n }\n }\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n for (const path of affected) {\n if (base.documents[path] !== undefined) documents[path] = base.documents[path];\n if (base.revisions[path] !== undefined) revisions[path] = base.revisions[path];\n }\n const staged = overlay(\n {\n documents,\n revisions,\n binaryTargets: base.binaryTargets.filter((path) => affected.has(path)),\n },\n queue.filter((batch) => pathsOf(batch).some((path) => affected.has(path))),\n );\n const mergedDocuments = { ...previousVisible.documents };\n const mergedRevisions = { ...previousVisible.revisions };\n const mergedTargets = new Set(previousVisible.binaryTargets);\n for (const path of affected) {\n delete mergedDocuments[path];\n delete mergedRevisions[path];\n mergedTargets.delete(path);\n }\n Object.assign(mergedDocuments, staged.documents);\n Object.assign(mergedRevisions, staged.revisions);\n for (const path of staged.binaryTargets) mergedTargets.add(path);\n return {\n documents: mergedDocuments,\n revisions: mergedRevisions,\n binaryTargets: [...mergedTargets].sort(),\n };\n}\n"],"names":["apply","parse","serialize","EMPTY_FRONTMATTER","at","path","name","priorsOf","preconditions","fields","Map","sections","preambles","precondition","kind","set","value","field","get","section","preamble","compose","body","Object","entries","map","join","skeleton","opened","ok","document","next","prior","undefined","outcome","edited","change","priors","edit","staged","text","documents","parsed","relocate","from","to","binaryTargets","delete","add","revision","revisions","erase","stage","content","overlay","base","queue","Set","batch","changes","sort","pathsOf","flatMap","sameLayerText","left","right","paths","keys","length","every","includes","replayRevisions","overlayChanged","previousBase","previousQueue","previousVisible","before","JSON","stringify","after","id","index","affected","oldIds","newIds","has","expanded","touched","some","filter","mergedDocuments","mergedRevisions","mergedTargets","assign"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function normalize(path: string): string | null;
2
+ export declare function resolve(from: string, reference: string): string | null;
3
+ export declare function relative(from: string, target: string): string;
4
+ export declare function beneath(prefix: string, path: string): boolean;
5
+ export declare function covered(prefixes: readonly string[], path: string): boolean;
6
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYrD;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGtE;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAW7D;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1E"}
package/dist/paths.js ADDED
@@ -0,0 +1,47 @@
1
+ function dirname(path) {
2
+ const index = path.lastIndexOf('/');
3
+ return index === -1 ? '' : path.slice(0, index);
4
+ }
5
+ export function normalize(path) {
6
+ const parts = [];
7
+ for (const part of path.split('/')){
8
+ if (part === '' || part === '.') continue;
9
+ if (part === '..') {
10
+ if (parts.length === 0) return null;
11
+ parts.pop();
12
+ continue;
13
+ }
14
+ parts.push(part);
15
+ }
16
+ return parts.join('/');
17
+ }
18
+ export function resolve(from, reference) {
19
+ const base = dirname(from);
20
+ return normalize(base === '' ? reference : `${base}/${reference}`);
21
+ }
22
+ export function relative(from, target) {
23
+ const base = dirname(from).split('/').filter((part)=>part !== '');
24
+ const parts = target.split('/');
25
+ let shared = 0;
26
+ while(shared < base.length && shared + 1 < parts.length && base[shared] === parts[shared]){
27
+ shared += 1;
28
+ }
29
+ const up = Array.from({
30
+ length: base.length - shared
31
+ }, ()=>'..');
32
+ return [
33
+ ...up,
34
+ ...parts.slice(shared)
35
+ ].join('/');
36
+ }
37
+ export function beneath(prefix, path) {
38
+ return path === prefix || path.startsWith(`${prefix}/`);
39
+ }
40
+ export function covered(prefixes, path) {
41
+ return prefixes.some((prefix)=>{
42
+ const normalized = normalize(prefix);
43
+ return normalized !== null && (normalized === '' || beneath(normalized, path));
44
+ });
45
+ }
46
+
47
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/paths.ts"],"sourcesContent":["function dirname(path: string): string {\n const index = path.lastIndexOf('/');\n return index === -1 ? '' : path.slice(0, index);\n}\n\nexport function normalize(path: string): string | null {\n const parts: string[] = [];\n for (const part of path.split('/')) {\n if (part === '' || part === '.') continue;\n if (part === '..') {\n if (parts.length === 0) return null;\n parts.pop();\n continue;\n }\n parts.push(part);\n }\n return parts.join('/');\n}\n\nexport function resolve(from: string, reference: string): string | null {\n const base = dirname(from);\n return normalize(base === '' ? reference : `${base}/${reference}`);\n}\n\nexport function relative(from: string, target: string): string {\n const base = dirname(from)\n .split('/')\n .filter((part) => part !== '');\n const parts = target.split('/');\n let shared = 0;\n while (shared < base.length && shared + 1 < parts.length && base[shared] === parts[shared]) {\n shared += 1;\n }\n const up = Array.from({ length: base.length - shared }, () => '..');\n return [...up, ...parts.slice(shared)].join('/');\n}\n\nexport function beneath(prefix: string, path: string): boolean {\n return path === prefix || path.startsWith(`${prefix}/`);\n}\n\nexport function covered(prefixes: readonly string[], path: string): boolean {\n return prefixes.some((prefix) => {\n const normalized = normalize(prefix);\n return normalized !== null && (normalized === '' || beneath(normalized, path));\n });\n}\n"],"names":["dirname","path","index","lastIndexOf","slice","normalize","parts","part","split","length","pop","push","join","resolve","from","reference","base","relative","target","filter","shared","up","Array","beneath","prefix","startsWith","covered","prefixes","some","normalized"],"mappings":"AAAA,SAASA,QAAQC,IAAY;IAC3B,MAAMC,QAAQD,KAAKE,WAAW,CAAC;IAC/B,OAAOD,UAAU,CAAC,IAAI,KAAKD,KAAKG,KAAK,CAAC,GAAGF;AAC3C;AAEA,OAAO,SAASG,UAAUJ,IAAY;IACpC,MAAMK,QAAkB,EAAE;IAC1B,KAAK,MAAMC,QAAQN,KAAKO,KAAK,CAAC,KAAM;QAClC,IAAID,SAAS,MAAMA,SAAS,KAAK;QACjC,IAAIA,SAAS,MAAM;YACjB,IAAID,MAAMG,MAAM,KAAK,GAAG,OAAO;YAC/BH,MAAMI,GAAG;YACT;QACF;QACAJ,MAAMK,IAAI,CAACJ;IACb;IACA,OAAOD,MAAMM,IAAI,CAAC;AACpB;AAEA,OAAO,SAASC,QAAQC,IAAY,EAAEC,SAAiB;IACrD,MAAMC,OAAOhB,QAAQc;IACrB,OAAOT,UAAUW,SAAS,KAAKD,YAAY,GAAGC,KAAK,CAAC,EAAED,WAAW;AACnE;AAEA,OAAO,SAASE,SAASH,IAAY,EAAEI,MAAc;IACnD,MAAMF,OAAOhB,QAAQc,MAClBN,KAAK,CAAC,KACNW,MAAM,CAAC,CAACZ,OAASA,SAAS;IAC7B,MAAMD,QAAQY,OAAOV,KAAK,CAAC;IAC3B,IAAIY,SAAS;IACb,MAAOA,SAASJ,KAAKP,MAAM,IAAIW,SAAS,IAAId,MAAMG,MAAM,IAAIO,IAAI,CAACI,OAAO,KAAKd,KAAK,CAACc,OAAO,CAAE;QAC1FA,UAAU;IACZ;IACA,MAAMC,KAAKC,MAAMR,IAAI,CAAC;QAAEL,QAAQO,KAAKP,MAAM,GAAGW;IAAO,GAAG,IAAM;IAC9D,OAAO;WAAIC;WAAOf,MAAMF,KAAK,CAACgB;KAAQ,CAACR,IAAI,CAAC;AAC9C;AAEA,OAAO,SAASW,QAAQC,MAAc,EAAEvB,IAAY;IAClD,OAAOA,SAASuB,UAAUvB,KAAKwB,UAAU,CAAC,GAAGD,OAAO,CAAC,CAAC;AACxD;AAEA,OAAO,SAASE,QAAQC,QAA2B,EAAE1B,IAAY;IAC/D,OAAO0B,SAASC,IAAI,CAAC,CAACJ;QACpB,MAAMK,aAAaxB,UAAUmB;QAC7B,OAAOK,eAAe,QAASA,CAAAA,eAAe,MAAMN,QAAQM,YAAY5B,KAAI;IAC9E;AACF"}
@@ -0,0 +1,13 @@
1
+ import type { QueryOptions, QueryResult } from '@agentshouse/query';
2
+ import type { Document } from '@agentshouse/mdmodel';
3
+ import type { TypesResult } from './model.js';
4
+ export type QueryInput = {
5
+ room: string;
6
+ roomVersion: string;
7
+ documents: Readonly<Record<string, Document>>;
8
+ model: TypesResult;
9
+ typedSelection: TypesResult | null;
10
+ };
11
+ export type QueryBinding = (rooms: readonly QueryInput[], options: QueryOptions) => QueryResult;
12
+ export declare function rawQuery(rooms: readonly QueryInput[]): QueryResult;
13
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9C,KAAK,EAAE,WAAW,CAAC;IACnB,cAAc,EAAE,WAAW,GAAG,IAAI,CAAC;CACpC,CAAC;AACF,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,WAAW,CAAC;AAChG,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,WAAW,CAgBlE"}
package/dist/query.js ADDED
@@ -0,0 +1,18 @@
1
+ export function rawQuery(rooms) {
2
+ return {
3
+ roomVersions: Object.fromEntries(rooms.map((room)=>[
4
+ room.room,
5
+ room.roomVersion
6
+ ])),
7
+ groups: null,
8
+ documents: rooms.flatMap((room)=>Object.entries(room.documents).filter(([path])=>path.endsWith('.md')).map(([path, document])=>({
9
+ ...structuredClone(document),
10
+ type: document.type ?? 'any',
11
+ room: room.room,
12
+ path,
13
+ backlinks: []
14
+ })))
15
+ };
16
+ }
17
+
18
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/query.ts"],"sourcesContent":["import type { QueryOptions, QueryResult } from '@agentshouse/query';\nimport type { Document } from '@agentshouse/mdmodel';\nimport type { TypesResult } from './model.js';\n\nexport type QueryInput = {\n room: string;\n roomVersion: string;\n documents: Readonly<Record<string, Document>>;\n model: TypesResult;\n typedSelection: TypesResult | null;\n};\nexport type QueryBinding = (rooms: readonly QueryInput[], options: QueryOptions) => QueryResult;\nexport function rawQuery(rooms: readonly QueryInput[]): QueryResult {\n return {\n roomVersions: Object.fromEntries(rooms.map((room) => [room.room, room.roomVersion])),\n groups: null,\n documents: rooms.flatMap((room) =>\n Object.entries(room.documents)\n .filter(([path]) => path.endsWith('.md'))\n .map(([path, document]) => ({\n ...structuredClone(document),\n type: document.type ?? 'any',\n room: room.room,\n path,\n backlinks: [],\n })),\n ),\n };\n}\n"],"names":["rawQuery","rooms","roomVersions","Object","fromEntries","map","room","roomVersion","groups","documents","flatMap","entries","filter","path","endsWith","document","structuredClone","type","backlinks"],"mappings":"AAYA,OAAO,SAASA,SAASC,KAA4B;IACnD,OAAO;QACLC,cAAcC,OAAOC,WAAW,CAACH,MAAMI,GAAG,CAAC,CAACC,OAAS;gBAACA,KAAKA,IAAI;gBAAEA,KAAKC,WAAW;aAAC;QAClFC,QAAQ;QACRC,WAAWR,MAAMS,OAAO,CAAC,CAACJ,OACxBH,OAAOQ,OAAO,CAACL,KAAKG,SAAS,EAC1BG,MAAM,CAAC,CAAC,CAACC,KAAK,GAAKA,KAAKC,QAAQ,CAAC,QACjCT,GAAG,CAAC,CAAC,CAACQ,MAAME,SAAS,GAAM,CAAA;oBAC1B,GAAGC,gBAAgBD,SAAS;oBAC5BE,MAAMF,SAASE,IAAI,IAAI;oBACvBX,MAAMA,KAAKA,IAAI;oBACfO;oBACAK,WAAW,EAAE;gBACf,CAAA;IAEN;AACF"}
@@ -0,0 +1,14 @@
1
+ import type { AttachedModelBinding } from './model.js';
2
+ import type { Adapter, AdapterFailure, Authorization } from './adapter.js';
3
+ import { type ConfirmedLayer } from './replica.js';
4
+ import { type Unconfirmed } from './transfer.js';
5
+ export type RefreshOutcome = {
6
+ kind: 'still-current';
7
+ } | {
8
+ kind: 'advanced';
9
+ confirmed: ConfirmedLayer;
10
+ } | {
11
+ kind: 'beyond-horizon';
12
+ } | Unconfirmed | AdapterFailure;
13
+ export declare function refreshRoom(adapter: Adapter, authorization: Authorization, confirmed: ConfirmedLayer, binding: AttachedModelBinding | null): Promise<RefreshOutcome>;
14
+ //# sourceMappingURL=refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,aAAa,EAAe,MAAM,cAAc,CAAC;AACxF,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAE9D,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,cAAc,CAAA;CAAE,GAC/C;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B,WAAW,GACX,cAAc,CAAC;AAEnB,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,oBAAoB,GAAG,IAAI,GACnC,OAAO,CAAC,cAAc,CAAC,CAuDzB"}
@@ -0,0 +1,65 @@
1
+ import { readStaged } from './replica.js';
2
+ import { unconfirmed } from './transfer.js';
3
+ export async function refreshRoom(adapter, authorization, confirmed, binding) {
4
+ const locator = confirmed.record.locator;
5
+ const fromRoomVersion = confirmed.record.roomVersion;
6
+ const first = await adapter.refresh(authorization, {
7
+ locator,
8
+ selection: confirmed.record.replica.selection,
9
+ fromRoomVersion
10
+ });
11
+ if (first.kind !== 'net-advancement') return first;
12
+ const roomVersion = first.roomVersion;
13
+ const documents = {
14
+ ...confirmed.record.documents
15
+ };
16
+ const revisions = {
17
+ ...confirmed.record.revisions
18
+ };
19
+ const binaryTargets = new Set(confirmed.record.binaryTargets);
20
+ const stage = (page)=>{
21
+ Object.assign(documents, page.documents);
22
+ Object.assign(revisions, page.revisions);
23
+ for (const path of Object.keys(page.documents))binaryTargets.delete(path);
24
+ for (const target of page.binaryTargets){
25
+ delete documents[target];
26
+ delete revisions[target];
27
+ binaryTargets.add(target);
28
+ }
29
+ for (const path of page.removals){
30
+ delete documents[path];
31
+ delete revisions[path];
32
+ binaryTargets.delete(path);
33
+ }
34
+ };
35
+ stage(first);
36
+ let pageToken = first.pageToken;
37
+ while(pageToken !== undefined){
38
+ const page = await adapter.refresh(authorization, {
39
+ locator,
40
+ selection: confirmed.record.replica.selection,
41
+ fromRoomVersion,
42
+ pageToken
43
+ });
44
+ if (page.kind === 'still-current' || page.kind === 'beyond-horizon') return unconfirmed;
45
+ if (page.kind !== 'net-advancement') return page;
46
+ if (page.roomVersion !== roomVersion) return unconfirmed;
47
+ stage(page);
48
+ pageToken = page.pageToken;
49
+ }
50
+ const advanced = readStaged({
51
+ ...confirmed.record,
52
+ roomVersion,
53
+ documents,
54
+ binaryTargets: [
55
+ ...binaryTargets
56
+ ].sort(),
57
+ revisions
58
+ }, binding, confirmed);
59
+ return advanced === null ? unconfirmed : {
60
+ kind: 'advanced',
61
+ confirmed: advanced
62
+ };
63
+ }
64
+
65
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/workspace/packages/mdruntime/src/refresh.ts"],"sourcesContent":["import type { AttachedModelBinding } from './model.js';\nimport type { Adapter, AdapterFailure, Authorization, RefreshPage } from './adapter.js';\nimport { readStaged, type ConfirmedLayer } from './replica.js';\nimport { unconfirmed, type Unconfirmed } from './transfer.js';\n\nexport type RefreshOutcome =\n | { kind: 'still-current' }\n | { kind: 'advanced'; confirmed: ConfirmedLayer }\n | { kind: 'beyond-horizon' }\n | Unconfirmed\n | AdapterFailure;\n\nexport async function refreshRoom(\n adapter: Adapter,\n authorization: Authorization,\n confirmed: ConfirmedLayer,\n binding: AttachedModelBinding | null,\n): Promise<RefreshOutcome> {\n const locator = confirmed.record.locator;\n const fromRoomVersion = confirmed.record.roomVersion;\n const first = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n });\n if (first.kind !== 'net-advancement') return first;\n const roomVersion = first.roomVersion;\n const documents: Record<string, string> = { ...confirmed.record.documents };\n const revisions: Record<string, string> = { ...confirmed.record.revisions };\n const binaryTargets = new Set(confirmed.record.binaryTargets);\n const stage = (page: RefreshPage) => {\n Object.assign(documents, page.documents);\n Object.assign(revisions, page.revisions);\n for (const path of Object.keys(page.documents)) binaryTargets.delete(path);\n for (const target of page.binaryTargets) {\n delete documents[target];\n delete revisions[target];\n binaryTargets.add(target);\n }\n for (const path of page.removals) {\n delete documents[path];\n delete revisions[path];\n binaryTargets.delete(path);\n }\n };\n stage(first);\n let pageToken = first.pageToken;\n while (pageToken !== undefined) {\n const page = await adapter.refresh(authorization, {\n locator,\n selection: confirmed.record.replica.selection,\n fromRoomVersion,\n pageToken,\n });\n if (page.kind === 'still-current' || page.kind === 'beyond-horizon') return unconfirmed;\n if (page.kind !== 'net-advancement') return page;\n if (page.roomVersion !== roomVersion) return unconfirmed;\n stage(page);\n pageToken = page.pageToken;\n }\n const advanced = readStaged(\n {\n ...confirmed.record,\n roomVersion,\n documents,\n binaryTargets: [...binaryTargets].sort(),\n revisions,\n },\n binding,\n confirmed,\n );\n return advanced === null ? unconfirmed : { kind: 'advanced', confirmed: advanced };\n}\n"],"names":["readStaged","unconfirmed","refreshRoom","adapter","authorization","confirmed","binding","locator","record","fromRoomVersion","roomVersion","first","refresh","selection","replica","kind","documents","revisions","binaryTargets","Set","stage","page","Object","assign","path","keys","delete","target","add","removals","pageToken","undefined","advanced","sort"],"mappings":"AAEA,SAASA,UAAU,QAA6B,eAAe;AAC/D,SAASC,WAAW,QAA0B,gBAAgB;AAS9D,OAAO,eAAeC,YACpBC,OAAgB,EAChBC,aAA4B,EAC5BC,SAAyB,EACzBC,OAAoC;IAEpC,MAAMC,UAAUF,UAAUG,MAAM,CAACD,OAAO;IACxC,MAAME,kBAAkBJ,UAAUG,MAAM,CAACE,WAAW;IACpD,MAAMC,QAAQ,MAAMR,QAAQS,OAAO,CAACR,eAAe;QACjDG;QACAM,WAAWR,UAAUG,MAAM,CAACM,OAAO,CAACD,SAAS;QAC7CJ;IACF;IACA,IAAIE,MAAMI,IAAI,KAAK,mBAAmB,OAAOJ;IAC7C,MAAMD,cAAcC,MAAMD,WAAW;IACrC,MAAMM,YAAoC;QAAE,GAAGX,UAAUG,MAAM,CAACQ,SAAS;IAAC;IAC1E,MAAMC,YAAoC;QAAE,GAAGZ,UAAUG,MAAM,CAACS,SAAS;IAAC;IAC1E,MAAMC,gBAAgB,IAAIC,IAAId,UAAUG,MAAM,CAACU,aAAa;IAC5D,MAAME,QAAQ,CAACC;QACbC,OAAOC,MAAM,CAACP,WAAWK,KAAKL,SAAS;QACvCM,OAAOC,MAAM,CAACN,WAAWI,KAAKJ,SAAS;QACvC,KAAK,MAAMO,QAAQF,OAAOG,IAAI,CAACJ,KAAKL,SAAS,EAAGE,cAAcQ,MAAM,CAACF;QACrE,KAAK,MAAMG,UAAUN,KAAKH,aAAa,CAAE;YACvC,OAAOF,SAAS,CAACW,OAAO;YACxB,OAAOV,SAAS,CAACU,OAAO;YACxBT,cAAcU,GAAG,CAACD;QACpB;QACA,KAAK,MAAMH,QAAQH,KAAKQ,QAAQ,CAAE;YAChC,OAAOb,SAAS,CAACQ,KAAK;YACtB,OAAOP,SAAS,CAACO,KAAK;YACtBN,cAAcQ,MAAM,CAACF;QACvB;IACF;IACAJ,MAAMT;IACN,IAAImB,YAAYnB,MAAMmB,SAAS;IAC/B,MAAOA,cAAcC,UAAW;QAC9B,MAAMV,OAAO,MAAMlB,QAAQS,OAAO,CAACR,eAAe;YAChDG;YACAM,WAAWR,UAAUG,MAAM,CAACM,OAAO,CAACD,SAAS;YAC7CJ;YACAqB;QACF;QACA,IAAIT,KAAKN,IAAI,KAAK,mBAAmBM,KAAKN,IAAI,KAAK,kBAAkB,OAAOd;QAC5E,IAAIoB,KAAKN,IAAI,KAAK,mBAAmB,OAAOM;QAC5C,IAAIA,KAAKX,WAAW,KAAKA,aAAa,OAAOT;QAC7CmB,MAAMC;QACNS,YAAYT,KAAKS,SAAS;IAC5B;IACA,MAAME,WAAWhC,WACf;QACE,GAAGK,UAAUG,MAAM;QACnBE;QACAM;QACAE,eAAe;eAAIA;SAAc,CAACe,IAAI;QACtChB;IACF,GACAX,SACAD;IAEF,OAAO2B,aAAa,OAAO/B,cAAc;QAAEc,MAAM;QAAYV,WAAW2B;IAAS;AACnF"}
@@ -0,0 +1,33 @@
1
+ import type { AttachedModelBinding } from './model.js';
2
+ import { type ChangeBatch } from './change.js';
3
+ import { type Collection, type Composition } from './collection.js';
4
+ import { type Layer } from './overlay.js';
5
+ import { type Rewriting } from './save.js';
6
+ import type { ReplicaRecord } from './store.js';
7
+ export type ConfirmedLayer = {
8
+ record: ReplicaRecord;
9
+ collection: Collection;
10
+ };
11
+ export type VisibleLayer = Layer & {
12
+ collection: Collection;
13
+ };
14
+ export type Replica = {
15
+ confirmed: ConfirmedLayer;
16
+ queue: readonly ChangeBatch[];
17
+ visible: VisibleLayer;
18
+ replay: readonly ReplayStep[];
19
+ };
20
+ type ReplayStep = {
21
+ id: string;
22
+ before: Layer;
23
+ after: Layer;
24
+ effective: ChangeBatch;
25
+ collection?: Collection;
26
+ };
27
+ export declare function compositionOf(record: ReplicaRecord): Composition;
28
+ export declare function readConfirmed(record: ReplicaRecord, previous?: ConfirmedLayer): ConfirmedLayer | null;
29
+ export declare function readStaged(record: ReplicaRecord, binding: AttachedModelBinding | null, previous?: ConfirmedLayer): ConfirmedLayer | null;
30
+ export declare function applyReturned(confirmed: ConfirmedLayer, documents: Readonly<Record<string, string>>, revisions: Readonly<Record<string, string>>, removals: readonly string[], roomVersion: string, binding: AttachedModelBinding | null): ConfirmedLayer | null;
31
+ export declare function replicaOf(confirmed: ConfirmedLayer, queue: readonly ChangeBatch[], rewriting: Rewriting, previous?: Replica): Replica;
32
+ export {};
33
+ //# sourceMappingURL=replica.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replica.d.ts","sourceRoot":"","sources":["../src/replica.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAA0C,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAClF,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG;IACjC,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,SAAS,EAAE,cAAc,CAAC;IAC1B,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAShE;AAED,wBAAgB,aAAa,CAC3B,MAAM,EAAE,aAAa,EACrB,QAAQ,CAAC,EAAE,cAAc,GACxB,cAAc,GAAG,IAAI,CASvB;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,oBAAoB,GAAG,IAAI,EACpC,QAAQ,CAAC,EAAE,cAAc,GACxB,cAAc,GAAG,IAAI,CAkBvB;AAED,wBAAgB,aAAa,CAC3B,SAAS,EAAE,cAAc,EACzB,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC3C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,oBAAoB,GAAG,IAAI,GACnC,cAAc,GAAG,IAAI,CAoBvB;AAuDD,wBAAgB,SAAS,CACvB,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,SAAS,EAAE,SAAS,EACpB,QAAQ,CAAC,EAAE,OAAO,GACjB,OAAO,CA2CT"}