@agentshouse/mdruntime-adapter 0.1.0-cd028205a5103 → 0.1.0-ce3fe65a95f49
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.
- package/AGENTS.md +152 -94
- package/dist/actions.d.ts +61 -1
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +147 -117
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +170 -68
- package/dist/discovery.d.ts +2 -1
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +17 -3
- package/dist/gather.d.ts +1 -0
- package/dist/gather.d.ts.map +1 -1
- package/dist/gather.js +11 -6
- package/dist/handed.d.ts +15 -0
- package/dist/handed.d.ts.map +1 -0
- package/dist/handed.js +38 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/model.d.ts +1 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -2
- package/dist/read.d.ts +14 -7
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +82 -77
- package/dist/referrer.d.ts +7 -0
- package/dist/referrer.d.ts.map +1 -0
- package/dist/referrer.js +35 -0
- package/dist/refusal.d.ts +2 -5
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +6 -9
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +115 -20
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +125 -10
- package/dist/transport.d.ts +26 -9
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +3 -0
- package/dist/write.d.ts +3 -9
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +85 -11
- package/package.json +3 -4
- package/dist/links.d.ts +0 -20
- package/dist/links.d.ts.map +0 -1
- package/dist/links.js +0 -104
package/dist/write.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { departure, } from '@agentshouse/mdruntime';
|
|
2
|
+
import { binaryFileOf, headChange } from './read.js';
|
|
2
3
|
import { sha256Hex, textBytes } from './digest.js';
|
|
3
4
|
import { nativePath, roomLocalPath } from './map.js';
|
|
4
5
|
import { classifyDoor, doorRefusal, scopedRefusal } from './refusal.js';
|
|
@@ -73,6 +74,25 @@ function operationOf(batch, change, handle) {
|
|
|
73
74
|
const operation = created(change, path);
|
|
74
75
|
return operation === null ? { rule: 'type-missing' } : { operation };
|
|
75
76
|
}
|
|
77
|
+
if (change.kind === 'binary') {
|
|
78
|
+
const written = {
|
|
79
|
+
op: 'upload',
|
|
80
|
+
path,
|
|
81
|
+
local_id: change.localId,
|
|
82
|
+
bytes: change.byteLength,
|
|
83
|
+
sha256: change.sha256,
|
|
84
|
+
media_type: change.mediaType,
|
|
85
|
+
};
|
|
86
|
+
const from = departure(batch.changes, batch.changes.indexOf(change));
|
|
87
|
+
if (from === change.path && priorAbsence(batch, change.path) !== undefined)
|
|
88
|
+
return { operation: written };
|
|
89
|
+
const replaced = priorExistence(batch, from);
|
|
90
|
+
if (replaced === undefined)
|
|
91
|
+
return { rule: 'precondition-missing' };
|
|
92
|
+
if (!('base' in replaced))
|
|
93
|
+
return { rule: 'presence-base-unrepresentable' };
|
|
94
|
+
return { operation: { ...written, base: replaced.base } };
|
|
95
|
+
}
|
|
76
96
|
const existence = priorExistence(batch, change.path);
|
|
77
97
|
if (existence === undefined)
|
|
78
98
|
return { rule: 'precondition-missing' };
|
|
@@ -138,6 +158,12 @@ function material(value, handle) {
|
|
|
138
158
|
return null;
|
|
139
159
|
if (file.revision !== null && file.revision !== undefined && typeof file.revision !== 'string')
|
|
140
160
|
return null;
|
|
161
|
+
const binary = binaryFileOf(file);
|
|
162
|
+
if (binary === null)
|
|
163
|
+
return null;
|
|
164
|
+
const head = headChange(file);
|
|
165
|
+
if (head === null)
|
|
166
|
+
return null;
|
|
141
167
|
let path;
|
|
142
168
|
try {
|
|
143
169
|
path = roomLocalPath(file.path, handle);
|
|
@@ -149,6 +175,8 @@ function material(value, handle) {
|
|
|
149
175
|
path,
|
|
150
176
|
content: file.content,
|
|
151
177
|
revision: typeof file.revision === 'string' ? file.revision : null,
|
|
178
|
+
...(binary === undefined ? {} : { binary }),
|
|
179
|
+
...(head === undefined ? {} : { head }),
|
|
152
180
|
});
|
|
153
181
|
}
|
|
154
182
|
return held;
|
|
@@ -171,7 +199,13 @@ export function mutationOutcome(status, body, locator, handle) {
|
|
|
171
199
|
if (refusal !== null && refusal.code === 'edit_conflict') {
|
|
172
200
|
const { current, ...fields } = refusal.fields;
|
|
173
201
|
const held = material(current, handle) ?? [];
|
|
174
|
-
return {
|
|
202
|
+
return {
|
|
203
|
+
kind: 'conflicted',
|
|
204
|
+
affected: affectedOf(held),
|
|
205
|
+
code: refusal.code,
|
|
206
|
+
fields,
|
|
207
|
+
retryable: refusal.retryable,
|
|
208
|
+
};
|
|
175
209
|
}
|
|
176
210
|
if (refusal !== null && status === 404) {
|
|
177
211
|
return scopedRefusal(locator, 'undisclosed', refusal);
|
|
@@ -181,14 +215,26 @@ export function mutationOutcome(status, body, locator, handle) {
|
|
|
181
215
|
if (refusal?.retryable === true &&
|
|
182
216
|
typeof reset === 'string' &&
|
|
183
217
|
classified?.kind === 'transport-uncertainty') {
|
|
184
|
-
return {
|
|
218
|
+
return {
|
|
219
|
+
kind: 'retryable-refusal',
|
|
220
|
+
code: refusal.code,
|
|
221
|
+
fields: refusal.fields,
|
|
222
|
+
retryable: true,
|
|
223
|
+
reset,
|
|
224
|
+
};
|
|
185
225
|
}
|
|
186
226
|
if (classified !== null && classified.kind !== 'scoped-refusal')
|
|
187
227
|
return classified;
|
|
188
228
|
if (classified !== null && status === 403)
|
|
189
229
|
return classified;
|
|
190
230
|
if (refusal !== null && status >= 400) {
|
|
191
|
-
return {
|
|
231
|
+
return {
|
|
232
|
+
kind: 'rejected',
|
|
233
|
+
affected: {},
|
|
234
|
+
code: refusal.code,
|
|
235
|
+
fields: refusal.fields,
|
|
236
|
+
retryable: refusal.retryable,
|
|
237
|
+
};
|
|
192
238
|
}
|
|
193
239
|
if (status !== 200 || typeof body !== 'object' || body === null) {
|
|
194
240
|
return { kind: 'transport-uncertainty' };
|
|
@@ -200,27 +246,32 @@ export function mutationOutcome(status, body, locator, handle) {
|
|
|
200
246
|
const contents = material(held.contents, handle);
|
|
201
247
|
if (contents === null)
|
|
202
248
|
return { kind: 'transport-uncertainty' };
|
|
203
|
-
const originals = parseOriginals(held.originals);
|
|
204
|
-
if (originals === null)
|
|
205
|
-
return { kind: 'transport-uncertainty' };
|
|
206
249
|
const documents = {};
|
|
207
250
|
const revisions = {};
|
|
251
|
+
const changes = {};
|
|
252
|
+
const binaryFiles = {};
|
|
208
253
|
const removals = [];
|
|
209
254
|
for (const entry of contents) {
|
|
210
|
-
if (entry.
|
|
255
|
+
if (entry.revision === null) {
|
|
211
256
|
removals.push(entry.path);
|
|
212
257
|
continue;
|
|
213
258
|
}
|
|
214
|
-
|
|
259
|
+
if (entry.content !== null)
|
|
260
|
+
documents[entry.path] = entry.content;
|
|
261
|
+
if (entry.binary !== undefined)
|
|
262
|
+
binaryFiles[entry.path] = entry.binary;
|
|
215
263
|
revisions[entry.path] = entry.revision;
|
|
264
|
+
if (entry.head !== undefined)
|
|
265
|
+
changes[entry.path] = entry.head;
|
|
216
266
|
}
|
|
217
267
|
return {
|
|
218
268
|
kind: 'accepted',
|
|
219
269
|
roomVersion: roomVersion(at),
|
|
220
270
|
documents,
|
|
221
271
|
revisions,
|
|
272
|
+
changes,
|
|
222
273
|
removals: removals.sort(),
|
|
223
|
-
|
|
274
|
+
...(Object.keys(binaryFiles).length === 0 ? {} : { binaryFiles }),
|
|
224
275
|
};
|
|
225
276
|
}
|
|
226
277
|
export function rejectedMapping(mapping) {
|
|
@@ -229,6 +280,7 @@ export function rejectedMapping(mapping) {
|
|
|
229
280
|
affected: {},
|
|
230
281
|
code: mapping.rule,
|
|
231
282
|
fields: { path: mapping.path },
|
|
283
|
+
retryable: false,
|
|
232
284
|
};
|
|
233
285
|
}
|
|
234
286
|
export function revisionBody(input) {
|
|
@@ -250,6 +302,17 @@ function revisionAuthor(entry) {
|
|
|
250
302
|
}
|
|
251
303
|
return null;
|
|
252
304
|
}
|
|
305
|
+
function historyBinary(entry) {
|
|
306
|
+
if (entry.file === undefined)
|
|
307
|
+
return undefined;
|
|
308
|
+
const { file, bytes, media_type: mediaType, sha256 } = entry;
|
|
309
|
+
if (typeof file !== 'string' ||
|
|
310
|
+
typeof bytes !== 'number' ||
|
|
311
|
+
typeof mediaType !== 'string' ||
|
|
312
|
+
typeof sha256 !== 'string')
|
|
313
|
+
return null;
|
|
314
|
+
return { fileRef: file, byteLength: bytes, mediaType, sha256 };
|
|
315
|
+
}
|
|
253
316
|
export function historyOutcome(status, body, locator, request) {
|
|
254
317
|
const classified = classifyDoor(status, body, locator);
|
|
255
318
|
if (classified !== null)
|
|
@@ -277,8 +340,11 @@ export function historyOutcome(status, body, locator, request) {
|
|
|
277
340
|
scope: 'content',
|
|
278
341
|
code: 'retained_history_unavailable',
|
|
279
342
|
fields: { path: request.path, revision: request.revision },
|
|
343
|
+
retryable: false,
|
|
280
344
|
};
|
|
281
345
|
}
|
|
346
|
+
if (typeof named.file === 'string')
|
|
347
|
+
return { kind: 'no-history' };
|
|
282
348
|
if (typeof named.content !== 'string')
|
|
283
349
|
return { kind: 'transport-uncertainty' };
|
|
284
350
|
return { kind: 'revision', content: named.content };
|
|
@@ -293,7 +359,15 @@ export function historyOutcome(status, body, locator, request) {
|
|
|
293
359
|
typeof entry.created_at !== 'string') {
|
|
294
360
|
return { kind: 'transport-uncertainty' };
|
|
295
361
|
}
|
|
296
|
-
|
|
362
|
+
const binaryFile = historyBinary(entry);
|
|
363
|
+
if (binaryFile === null)
|
|
364
|
+
return { kind: 'transport-uncertainty' };
|
|
365
|
+
revisions.push({
|
|
366
|
+
revision: entry.revision,
|
|
367
|
+
author,
|
|
368
|
+
time: entry.created_at,
|
|
369
|
+
...(binaryFile === undefined ? {} : { binaryFile }),
|
|
370
|
+
});
|
|
297
371
|
}
|
|
298
372
|
const next = held.next_before;
|
|
299
373
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentshouse/mdruntime-adapter",
|
|
3
|
-
"version": "0.1.0-
|
|
3
|
+
"version": "0.1.0-ce3fe65a95f49",
|
|
4
4
|
"description": "Agents House Adapter for the MD Runtime",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"exports": {
|
|
15
15
|
".": {
|
|
16
16
|
"types": "./dist/index.d.ts",
|
|
17
|
-
"
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
18
|
},
|
|
19
19
|
"./package.json": "./package.json"
|
|
20
20
|
},
|
|
@@ -25,7 +25,6 @@
|
|
|
25
25
|
"LICENSE"
|
|
26
26
|
],
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@agentshouse/
|
|
29
|
-
"@agentshouse/mdruntime": "0.1.0-ca1eff92bbe73"
|
|
28
|
+
"@agentshouse/mdruntime": "0.1.0-c56daf494ecb4"
|
|
30
29
|
}
|
|
31
30
|
}
|
package/dist/links.d.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { HeldRoom, MutationResult, RoomAttachment } from '@agentshouse/mdruntime';
|
|
2
|
-
import type { HouseScope, HouseView } from './read.js';
|
|
3
|
-
import type { StreamedAdvancement } from './stream.js';
|
|
4
|
-
export type RoomLinks = {
|
|
5
|
-
roomVersion: string;
|
|
6
|
-
handed: ReadonlyMap<string, RoomAttachment>;
|
|
7
|
-
paths: ReadonlyMap<string, ReadonlySet<string>>;
|
|
8
|
-
revisions: ReadonlyMap<string, string>;
|
|
9
|
-
};
|
|
10
|
-
export declare function scopeLinks(scope: HouseScope): RoomLinks;
|
|
11
|
-
export declare function heldLinks(held: HeldRoom): RoomLinks;
|
|
12
|
-
export declare function acceptedLinks(held: RoomLinks, accepted: Extract<MutationResult, {
|
|
13
|
-
kind: 'accepted';
|
|
14
|
-
}>, roomVersion: string, originals: readonly RoomAttachment[]): {
|
|
15
|
-
links: RoomLinks;
|
|
16
|
-
attachments?: readonly RoomAttachment[];
|
|
17
|
-
};
|
|
18
|
-
export declare function enumeratedLinks(view: HouseView, earlier: RoomLinks | undefined): RoomLinks;
|
|
19
|
-
export declare function streamedLinks(held: RoomLinks, advanced: StreamedAdvancement): RoomLinks | null;
|
|
20
|
-
//# sourceMappingURL=links.d.ts.map
|
package/dist/links.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../src/links.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAOvD,MAAM,MAAM,SAAS,GAAG;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC5C,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;IAChD,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC,CAAC;AAcF,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,CAWvD;AAOD,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,CAOnD;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,EACvD,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,cAAc,EAAE,GACnC;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,CA2B/D;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAgB1F;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,GAAG,SAAS,GAAG,IAAI,CAoB9F"}
|
package/dist/links.js
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { roomVersion } from './version.js';
|
|
2
|
-
const ATTACHMENT_REFERENCE = /at_[1-9a-hjkmnp-tv-z][0-9a-hjkmnp-tv-z]*\.[0-9a-hjkmnp-tv-z]/g;
|
|
3
|
-
const NONE = new Set();
|
|
4
|
-
function linkedBy(text) {
|
|
5
|
-
if (text === null)
|
|
6
|
-
return NONE;
|
|
7
|
-
const references = new Set(Array.from(text.matchAll(ATTACHMENT_REFERENCE), ([found]) => found));
|
|
8
|
-
return references.size === 0 ? NONE : references;
|
|
9
|
-
}
|
|
10
|
-
function handedOf(attachments) {
|
|
11
|
-
return new Map((attachments ?? []).map((attachment) => [attachment.reference, attachment]));
|
|
12
|
-
}
|
|
13
|
-
export function scopeLinks(scope) {
|
|
14
|
-
return {
|
|
15
|
-
roomVersion: roomVersion(scope),
|
|
16
|
-
handed: handedOf(scope.attachments),
|
|
17
|
-
paths: new Map(scope.contents.map(({ path, content }) => [path, linkedBy(content)])),
|
|
18
|
-
revisions: new Map(scope.files.flatMap(({ path, revision }) => revision === undefined ? [] : [[path, revision]])),
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
function revised(revisions, path, revision) {
|
|
22
|
-
if (revision === undefined)
|
|
23
|
-
revisions.delete(path);
|
|
24
|
-
else
|
|
25
|
-
revisions.set(path, revision);
|
|
26
|
-
}
|
|
27
|
-
export function heldLinks(held) {
|
|
28
|
-
return {
|
|
29
|
-
roomVersion: held.roomVersion,
|
|
30
|
-
handed: handedOf(held.attachments),
|
|
31
|
-
paths: new Map(Object.entries(held.documents).map(([path, text]) => [path, linkedBy(text)])),
|
|
32
|
-
revisions: new Map(Object.entries(held.revisions)),
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
export function acceptedLinks(held, accepted, roomVersion, originals) {
|
|
36
|
-
const paths = new Map(held.paths);
|
|
37
|
-
const revisions = new Map(held.revisions);
|
|
38
|
-
const handed = new Map(held.handed);
|
|
39
|
-
const answered = handedOf(originals);
|
|
40
|
-
for (const [path, text] of Object.entries(accepted.documents)) {
|
|
41
|
-
const linked = linkedBy(text);
|
|
42
|
-
for (const reference of linked) {
|
|
43
|
-
const original = answered.get(reference);
|
|
44
|
-
if (!handed.has(reference) && original !== undefined)
|
|
45
|
-
handed.set(reference, original);
|
|
46
|
-
}
|
|
47
|
-
paths.set(path, linked);
|
|
48
|
-
}
|
|
49
|
-
for (const [path, revision] of Object.entries(accepted.revisions))
|
|
50
|
-
revisions.set(path, revision);
|
|
51
|
-
for (const path of accepted.removals) {
|
|
52
|
-
paths.delete(path);
|
|
53
|
-
revisions.delete(path);
|
|
54
|
-
}
|
|
55
|
-
const linked = new Set([...paths.values()].flatMap((references) => [...references]));
|
|
56
|
-
for (const reference of held.handed.keys()) {
|
|
57
|
-
const before = [...held.paths.values()].some((references) => references.has(reference));
|
|
58
|
-
if (before && !linked.has(reference))
|
|
59
|
-
handed.delete(reference);
|
|
60
|
-
}
|
|
61
|
-
const links = { roomVersion, handed, paths, revisions };
|
|
62
|
-
const changed = handed.size !== held.handed.size || [...handed.keys()].some((key) => !held.handed.has(key));
|
|
63
|
-
return changed ? { links, attachments: [...handed.values()] } : { links };
|
|
64
|
-
}
|
|
65
|
-
export function enumeratedLinks(view, earlier) {
|
|
66
|
-
const paths = new Map(earlier?.paths);
|
|
67
|
-
const revisions = new Map(earlier?.revisions);
|
|
68
|
-
for (const change of view.changes) {
|
|
69
|
-
paths.set(change.path, linkedBy('content' in change ? change.content : null));
|
|
70
|
-
revised(revisions, change.path, 'removed' in change
|
|
71
|
-
? undefined
|
|
72
|
-
: 'reference' in change
|
|
73
|
-
? change.reference.revision
|
|
74
|
-
: change.revision);
|
|
75
|
-
}
|
|
76
|
-
return { roomVersion: roomVersion(view), handed: handedOf(view.attachments), paths, revisions };
|
|
77
|
-
}
|
|
78
|
-
export function streamedLinks(held, advanced) {
|
|
79
|
-
const paths = new Map(held.paths);
|
|
80
|
-
const revisions = new Map(held.revisions);
|
|
81
|
-
const dropped = new Set();
|
|
82
|
-
for (const entry of advanced.entries) {
|
|
83
|
-
revised(revisions, entry.path, entry.kind === 'removed' ? undefined : entry.revision);
|
|
84
|
-
const text = entry.kind === 'removed' ? null : entry.text;
|
|
85
|
-
if (text === undefined)
|
|
86
|
-
return null;
|
|
87
|
-
const linked = linkedBy(text);
|
|
88
|
-
for (const reference of linked)
|
|
89
|
-
if (!held.handed.has(reference))
|
|
90
|
-
return null;
|
|
91
|
-
for (const reference of paths.get(entry.path) ?? held.handed.keys()) {
|
|
92
|
-
if (held.handed.has(reference) && !linked.has(reference))
|
|
93
|
-
dropped.add(reference);
|
|
94
|
-
}
|
|
95
|
-
paths.set(entry.path, linked);
|
|
96
|
-
}
|
|
97
|
-
for (const references of paths.values()) {
|
|
98
|
-
for (const reference of references)
|
|
99
|
-
dropped.delete(reference);
|
|
100
|
-
}
|
|
101
|
-
if (dropped.size > 0)
|
|
102
|
-
return null;
|
|
103
|
-
return { roomVersion: advanced.page.roomVersion, handed: held.handed, paths, revisions };
|
|
104
|
-
}
|