@agentshouse/mdruntime-adapter 0.1.0-cf22c8563f9f4 → 0.1.0-cf9ab9b7cbbca
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 +269 -214
- package/dist/actions.d.ts +62 -1
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +153 -133
- package/dist/adapter.d.ts +1 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +286 -91
- package/dist/discovery.d.ts +3 -1
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +18 -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 +21 -7
- package/dist/read.d.ts +35 -7
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +160 -79
- 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 +1 -1
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +165 -48
- package/dist/stream.d.ts +6 -4
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +308 -16
- package/dist/transport.d.ts +54 -11
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +3 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/write.d.ts +3 -9
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +92 -14
- 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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TrackedAuthority } from './discovery.js';
|
|
2
|
+
export type HouseReferrer = {
|
|
3
|
+
locator: string;
|
|
4
|
+
referrer: Readonly<Record<string, string>>;
|
|
5
|
+
};
|
|
6
|
+
export declare function houseReferrer(referrer: unknown, tracked: ReadonlyMap<string, TrackedAuthority>): HouseReferrer | null;
|
|
7
|
+
//# sourceMappingURL=referrer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"referrer.d.ts","sourceRoot":"","sources":["../src/referrer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,MAAM,aAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,CAAC;AAgB5F,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC7C,aAAa,GAAG,IAAI,CAqBtB"}
|
package/dist/referrer.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
function fields(value) {
|
|
2
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
3
|
+
? value
|
|
4
|
+
: null;
|
|
5
|
+
}
|
|
6
|
+
function named(held, ...keys) {
|
|
7
|
+
const present = Object.keys(held);
|
|
8
|
+
return (present.length === keys.length &&
|
|
9
|
+
keys.every((key) => typeof held[key] === 'string' && held[key] !== ''));
|
|
10
|
+
}
|
|
11
|
+
export function houseReferrer(referrer, tracked) {
|
|
12
|
+
const held = fields(referrer);
|
|
13
|
+
if (held === null)
|
|
14
|
+
return null;
|
|
15
|
+
if (named(held, 'room', 'path')) {
|
|
16
|
+
const entry = tracked.get(held.room);
|
|
17
|
+
if (entry === undefined)
|
|
18
|
+
return null;
|
|
19
|
+
return {
|
|
20
|
+
locator: entry.locator,
|
|
21
|
+
referrer: { room_ref: entry.authority, path: held.path },
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (named(held, 'room_ref', 'record')) {
|
|
25
|
+
const roomRef = held.room_ref;
|
|
26
|
+
const entry = [...tracked.values()].find((candidate) => candidate.authority === roomRef);
|
|
27
|
+
return {
|
|
28
|
+
locator: entry?.locator ?? roomRef,
|
|
29
|
+
referrer: { room_ref: roomRef, record: held.record },
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (named(held, 'message'))
|
|
33
|
+
return { locator: '', referrer: { message: held.message } };
|
|
34
|
+
return null;
|
|
35
|
+
}
|
package/dist/refusal.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import type { AdapterFailure, DiscoverResult, ProviderRefusal, ScopedRefusal } from '@agentshouse/mdruntime';
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
};
|
|
5
|
-
export declare function doorRefusal(body: unknown): DoorRefusal | null;
|
|
6
|
-
export declare function scopedRefusal(locator: string, scope: ScopedRefusal['scope'], refusal: DoorRefusal): ScopedRefusal;
|
|
2
|
+
export declare function doorRefusal(body: unknown): ProviderRefusal | null;
|
|
3
|
+
export declare function scopedRefusal(locator: string, scope: ScopedRefusal['scope'], refusal: ProviderRefusal): ScopedRefusal;
|
|
7
4
|
export declare function classifyDoor(status: number, body: unknown, locator: string): AdapterFailure | null;
|
|
8
5
|
export declare function classifyRead(status: number, body: unknown, locator: string): AdapterFailure | {
|
|
9
6
|
kind: 'beyond-horizon';
|
package/dist/refusal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACd,MAAM,wBAAwB,CAAC;AAEhC,
|
|
1
|
+
{"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,eAAe,EACf,aAAa,EACd,MAAM,wBAAwB,CAAC;AAEhC,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAOjE;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE,eAAe,GACvB,aAAa,CAEf;AAqBD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,cAAc,GAAG,IAAI,CAMvB;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,cAAc,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAGpD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI,CAQrF"}
|
package/dist/refusal.js
CHANGED
|
@@ -6,11 +6,11 @@ export function doorRefusal(body) {
|
|
|
6
6
|
const error = body.error;
|
|
7
7
|
if (typeof error.code !== 'string')
|
|
8
8
|
return null;
|
|
9
|
-
const { code, ...fields } = error;
|
|
10
|
-
return { code, fields, retryable:
|
|
9
|
+
const { code, retryable, ...fields } = error;
|
|
10
|
+
return { code, fields, retryable: retryable === true };
|
|
11
11
|
}
|
|
12
12
|
export function scopedRefusal(locator, scope, refusal) {
|
|
13
|
-
return { kind: 'scoped-refusal', locator, scope,
|
|
13
|
+
return { kind: 'scoped-refusal', locator, scope, ...refusal };
|
|
14
14
|
}
|
|
15
15
|
function doorFailure(status, body) {
|
|
16
16
|
if (status === 0)
|
|
@@ -18,8 +18,9 @@ function doorFailure(status, body) {
|
|
|
18
18
|
const refusal = doorRefusal(body);
|
|
19
19
|
if (status === 401)
|
|
20
20
|
return { kind: 'revoked-authorization' };
|
|
21
|
-
if (refusal?.retryable === true)
|
|
21
|
+
if (refusal?.retryable === true || refusal?.code === 'update_required') {
|
|
22
22
|
return { kind: 'transport-uncertainty' };
|
|
23
|
+
}
|
|
23
24
|
if (status === 404 || refusal?.code === 'room_not_found')
|
|
24
25
|
return { kind: 'room-not-readable' };
|
|
25
26
|
if (status < 400)
|
|
@@ -50,11 +51,7 @@ export function discoveryFailure(status, body) {
|
|
|
50
51
|
if (failure.kind === 'revoked-authorization')
|
|
51
52
|
return failure;
|
|
52
53
|
if (failure.kind === 'refused') {
|
|
53
|
-
return {
|
|
54
|
-
kind: 'contract-unavailable',
|
|
55
|
-
code: failure.refusal.code,
|
|
56
|
-
fields: failure.refusal.fields,
|
|
57
|
-
};
|
|
54
|
+
return { kind: 'contract-unavailable', ...failure.refusal };
|
|
58
55
|
}
|
|
59
56
|
return { kind: 'transport-uncertainty' };
|
|
60
57
|
}
|
package/dist/site.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Adapter } from '@agentshouse/mdruntime';
|
|
2
2
|
import { type HouseSiteTransport } from './transport.js';
|
|
3
|
-
export declare function createSiteAdapter(transport: HouseSiteTransport): Adapter;
|
|
3
|
+
export declare function createSiteAdapter(transport: HouseSiteTransport, snapshot?: boolean): Adapter;
|
|
4
4
|
//# sourceMappingURL=site.d.ts.map
|
package/dist/site.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,
|
|
1
|
+
{"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAOR,MAAM,wBAAwB,CAAC;AA2BhC,OAAO,EAOL,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAmCxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,UAAQ,GAAG,OAAO,CA+Q1F"}
|
package/dist/site.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { actionOutcome } from './actions.js';
|
|
1
|
+
import { actionOutcome, SITE_SUBMIT } from './actions.js';
|
|
2
2
|
import { mapDiscovery, parseSiteDiscovery, siteCapabilities, siteTracked, } from './discovery.js';
|
|
3
|
-
import {
|
|
4
|
-
import { advancedScope, bootstrapOf, parseEnumeration, parseSiteBootstrap, refreshFrom, viewOf, } from './read.js';
|
|
3
|
+
import { partModels, streamedModels, viewModels } from './model.js';
|
|
4
|
+
import { advancedScope, bootstrapOf, parseEnumeration, parseSiteBootstrap, refreshFrom, siteBootstrapNext, siteBootstrapOffset, viewOf, wholeView, } from './read.js';
|
|
5
|
+
import { sha256Hex } from './digest.js';
|
|
5
6
|
import { classifyDoor, classifyRead, discoveryFailure } from './refusal.js';
|
|
6
7
|
import { houseNotifications } from './stream.js';
|
|
7
|
-
import { SITE_DOOR_BOOTSTRAP, SITE_DOOR_DISCOVER, SITE_DOOR_ENUMERATE, SITE_DOOR_SUBMIT, } from './transport.js';
|
|
8
|
+
import { SITE_DOOR_BOOTSTRAP, SITE_DOOR_DISCOVER, SITE_DOOR_ENUMERATE, SITE_DOOR_SUBMIT, SITE_FILE_RECORD, SITE_FILES, } from './transport.js';
|
|
9
|
+
import { houseReferrer } from './referrer.js';
|
|
8
10
|
import { followsVersion, logPosition, presented, reachedVersion, roomVersion, } from './version.js';
|
|
9
11
|
const UNCERTAIN = { kind: 'transport-uncertainty' };
|
|
10
12
|
function siteRoom(tracked) {
|
|
@@ -21,35 +23,97 @@ function siteRoom(tracked) {
|
|
|
21
23
|
function settled(refused) {
|
|
22
24
|
return refused.kind === 'beyond-horizon' ? UNCERTAIN : refused;
|
|
23
25
|
}
|
|
24
|
-
export function createSiteAdapter(transport) {
|
|
26
|
+
export function createSiteAdapter(transport, snapshot = false) {
|
|
25
27
|
const notifications = houseNotifications(transport, 'site');
|
|
26
28
|
const tracked = new Map();
|
|
27
|
-
|
|
29
|
+
function published(referrer) {
|
|
30
|
+
const named = houseReferrer(referrer, tracked);
|
|
31
|
+
return named === null || !tracked.has(named.locator) ? null : named;
|
|
32
|
+
}
|
|
33
|
+
async function enumerated(entry, from, page) {
|
|
28
34
|
const answer = await transport.door(SITE_DOOR_ENUMERATE, {
|
|
29
|
-
positions: [
|
|
35
|
+
positions: [
|
|
36
|
+
page === undefined
|
|
37
|
+
? presented(entry.authority, from)
|
|
38
|
+
: {
|
|
39
|
+
...presented(entry.authority, { position: page.after, logEpoch: from.logEpoch }),
|
|
40
|
+
page: { through: page.through, read: page.read },
|
|
41
|
+
},
|
|
42
|
+
],
|
|
30
43
|
});
|
|
31
44
|
const classified = classifyRead(answer.status, answer.body, entry.locator);
|
|
32
45
|
if (classified !== null)
|
|
33
46
|
return classified;
|
|
34
|
-
|
|
47
|
+
const found = parseEnumeration(answer.body, 'site');
|
|
48
|
+
if (found === null)
|
|
49
|
+
return UNCERTAIN;
|
|
50
|
+
return viewOf(found, entry) ?? { kind: 'room-not-readable', locator: entry.locator };
|
|
51
|
+
}
|
|
52
|
+
async function enumeration(entry, from) {
|
|
53
|
+
const first = await enumerated(entry, from);
|
|
54
|
+
return 'kind' in first ? first : wholeView(first, (page) => enumerated(entry, from, page));
|
|
35
55
|
}
|
|
36
|
-
async function
|
|
37
|
-
const
|
|
56
|
+
async function bootstrapPart(entry, after, offset) {
|
|
57
|
+
const query = [
|
|
58
|
+
...(after === null ? [] : [`after=${encodeURIComponent(after)}`]),
|
|
59
|
+
...(offset === null ? [] : [`offset=${offset}`]),
|
|
60
|
+
];
|
|
61
|
+
const answer = await transport.read(`${SITE_DOOR_BOOTSTRAP}${entry.authority}${query.length === 0 ? '' : `?${query.join('&')}`}`);
|
|
38
62
|
const classified = classifyDoor(answer.status, answer.body, entry.locator);
|
|
39
63
|
if (classified !== null)
|
|
40
64
|
return { failure: classified };
|
|
41
65
|
const scope = parseSiteBootstrap(answer.body);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
66
|
+
return scope === null ? { failure: UNCERTAIN } : { body: answer.body, scope };
|
|
67
|
+
}
|
|
68
|
+
async function assembled(entry, scope, path, offset) {
|
|
69
|
+
const opened = scope.contents.at(-1);
|
|
70
|
+
if (opened === undefined || opened.path !== path || opened.content.length !== offset) {
|
|
71
|
+
return UNCERTAIN;
|
|
72
|
+
}
|
|
73
|
+
let text = opened.content;
|
|
74
|
+
for (;;) {
|
|
75
|
+
const part = await bootstrapPart(entry, path, text.length);
|
|
76
|
+
if ('failure' in part)
|
|
77
|
+
return part.failure;
|
|
78
|
+
const [piece] = part.scope.contents;
|
|
79
|
+
if (piece === undefined ||
|
|
80
|
+
part.scope.contents.length !== 1 ||
|
|
81
|
+
piece.path !== path ||
|
|
82
|
+
piece.content.length === 0) {
|
|
83
|
+
return UNCERTAIN;
|
|
84
|
+
}
|
|
85
|
+
text += piece.content;
|
|
86
|
+
const more = siteBootstrapOffset(part.body);
|
|
87
|
+
if (more === null)
|
|
88
|
+
break;
|
|
89
|
+
if (more !== text.length)
|
|
90
|
+
return UNCERTAIN;
|
|
91
|
+
}
|
|
92
|
+
const file = scope.files.find((held) => held.path === path);
|
|
93
|
+
if (file === undefined || (await sha256Hex(text)) !== file.version)
|
|
94
|
+
return UNCERTAIN;
|
|
95
|
+
return { ...scope, contents: [...scope.contents.slice(0, -1), { path, content: text }] };
|
|
96
|
+
}
|
|
97
|
+
async function caughtUp(entry, after) {
|
|
98
|
+
const part = await bootstrapPart(entry, after, null);
|
|
99
|
+
if ('failure' in part)
|
|
100
|
+
return part;
|
|
101
|
+
const next = siteBootstrapNext(part.body);
|
|
102
|
+
const offset = siteBootstrapOffset(part.body);
|
|
103
|
+
if (offset !== null) {
|
|
104
|
+
if (next === null)
|
|
105
|
+
return { failure: UNCERTAIN };
|
|
106
|
+
const scope = await assembled(entry, part.scope, next, offset);
|
|
107
|
+
return 'kind' in scope ? { failure: scope } : { scope, next };
|
|
108
|
+
}
|
|
109
|
+
const { scope } = part;
|
|
110
|
+
if (after !== null || next !== null || roomVersion(scope) === roomVersion(entry)) {
|
|
111
|
+
return { scope, next };
|
|
112
|
+
}
|
|
113
|
+
const view = await enumeration(entry, scope);
|
|
114
|
+
if ('kind' in view)
|
|
115
|
+
return { failure: settled(view) };
|
|
116
|
+
return { scope: advancedScope(scope, view), next: null };
|
|
53
117
|
}
|
|
54
118
|
async function refreshed(entry, fromRoomVersion) {
|
|
55
119
|
const from = logPosition(fromRoomVersion);
|
|
@@ -60,12 +124,9 @@ export function createSiteAdapter(transport) {
|
|
|
60
124
|
const models = await streamedModels(streamed.schemas, entry, 'site');
|
|
61
125
|
return models === undefined ? streamed.page : { ...streamed.page, models };
|
|
62
126
|
}
|
|
63
|
-
const
|
|
64
|
-
if ('kind' in
|
|
65
|
-
return
|
|
66
|
-
const view = viewOf(found, entry);
|
|
67
|
-
if (view === undefined)
|
|
68
|
-
return { kind: 'room-not-readable', locator: entry.locator };
|
|
127
|
+
const view = await enumeration(entry, from);
|
|
128
|
+
if ('kind' in view)
|
|
129
|
+
return view;
|
|
69
130
|
notifications.reach(entry.authority, view);
|
|
70
131
|
const answer = refreshFrom(view, fromRoomVersion);
|
|
71
132
|
if (answer.kind !== 'net-advancement')
|
|
@@ -74,6 +135,8 @@ export function createSiteAdapter(transport) {
|
|
|
74
135
|
return models === undefined ? answer : { ...answer, models };
|
|
75
136
|
}
|
|
76
137
|
return {
|
|
138
|
+
localSaves: true,
|
|
139
|
+
exhaustiveDiscovery: true,
|
|
77
140
|
async authorize() {
|
|
78
141
|
return {};
|
|
79
142
|
},
|
|
@@ -96,14 +159,24 @@ export function createSiteAdapter(transport) {
|
|
|
96
159
|
const entry = tracked.get(request.locator);
|
|
97
160
|
if (entry === undefined)
|
|
98
161
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
162
|
+
const continued = request.pageToken === undefined
|
|
163
|
+
? null
|
|
164
|
+
: JSON.parse(request.pageToken);
|
|
165
|
+
const held = await caughtUp(entry, continued?.after ?? null);
|
|
102
166
|
if ('failure' in held)
|
|
103
167
|
return held.failure;
|
|
104
168
|
notifications.reach(entry.authority, held.scope);
|
|
105
|
-
const
|
|
106
|
-
|
|
169
|
+
const seen = [
|
|
170
|
+
...(continued?.seen ?? []),
|
|
171
|
+
...entry.schemas.filter((schema) => held.scope.files.some((file) => file.path === schema)),
|
|
172
|
+
];
|
|
173
|
+
const models = await partModels(held.scope, entry, new Set(seen), held.next === null);
|
|
174
|
+
const continuation = held.next === null ? null : { after: held.next, seen };
|
|
175
|
+
return {
|
|
176
|
+
...bootstrapOf(held.scope),
|
|
177
|
+
...(models === undefined ? {} : { models }),
|
|
178
|
+
...(continuation === null ? {} : { pageToken: JSON.stringify(continuation) }),
|
|
179
|
+
};
|
|
107
180
|
},
|
|
108
181
|
async refresh(_authorization, request) {
|
|
109
182
|
const entry = tracked.get(request.locator);
|
|
@@ -111,14 +184,45 @@ export function createSiteAdapter(transport) {
|
|
|
111
184
|
return { kind: 'room-not-readable', locator: request.locator };
|
|
112
185
|
if (request.pageToken !== undefined)
|
|
113
186
|
return UNCERTAIN;
|
|
187
|
+
if (snapshot) {
|
|
188
|
+
return request.fromRoomVersion === roomVersion(entry)
|
|
189
|
+
? { kind: 'still-current' }
|
|
190
|
+
: { kind: 'beyond-horizon' };
|
|
191
|
+
}
|
|
114
192
|
return refreshed(entry, request.fromRoomVersion);
|
|
115
193
|
},
|
|
116
194
|
async mutate() {
|
|
117
|
-
return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {} };
|
|
195
|
+
return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {}, retryable: false };
|
|
118
196
|
},
|
|
119
197
|
async history() {
|
|
120
198
|
return { kind: 'no-history' };
|
|
121
199
|
},
|
|
200
|
+
async binary(_authorization, request) {
|
|
201
|
+
const named = published(request.kind === 'path' ? { room: request.locator, path: request.path } : request.referrer);
|
|
202
|
+
if (named === null) {
|
|
203
|
+
return { kind: 'rejected', code: 'referrer_unknown', fields: {}, retryable: false };
|
|
204
|
+
}
|
|
205
|
+
if (request.fileRef === undefined) {
|
|
206
|
+
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
207
|
+
}
|
|
208
|
+
const { room_ref, path, record } = named.referrer;
|
|
209
|
+
const read = await transport.download(`${SITE_FILES}${room_ref}/${encodeURIComponent(request.fileRef)}/${path === undefined
|
|
210
|
+
? `${SITE_FILE_RECORD}/${encodeURIComponent(record)}`
|
|
211
|
+
: encodeURIComponent(path)}`);
|
|
212
|
+
if (read.status === 404) {
|
|
213
|
+
return { kind: 'rejected', code: 'file_not_found', fields: {}, retryable: false };
|
|
214
|
+
}
|
|
215
|
+
return read.status === 200 && read.blob !== null
|
|
216
|
+
? { kind: 'binary', blob: read.blob }
|
|
217
|
+
: UNCERTAIN;
|
|
218
|
+
},
|
|
219
|
+
referrerScope(referrer) {
|
|
220
|
+
const named = published(referrer);
|
|
221
|
+
if (named === null)
|
|
222
|
+
return null;
|
|
223
|
+
const { path } = named.referrer;
|
|
224
|
+
return { kind: 'room', locator: named.locator, ...(path === undefined ? {} : { path }) };
|
|
225
|
+
},
|
|
122
226
|
reached(locator, version, target) {
|
|
123
227
|
return reachedVersion(version, target, tracked.get(locator)?.logEpoch);
|
|
124
228
|
},
|
|
@@ -126,26 +230,39 @@ export function createSiteAdapter(transport) {
|
|
|
126
230
|
return followsVersion(version, next);
|
|
127
231
|
},
|
|
128
232
|
async action(_authorization, request) {
|
|
129
|
-
if (request.name !==
|
|
130
|
-
return {
|
|
233
|
+
if (request.name !== SITE_SUBMIT) {
|
|
234
|
+
return {
|
|
235
|
+
kind: 'rejected',
|
|
236
|
+
code: 'action-unimplemented',
|
|
237
|
+
fields: { name: request.name },
|
|
238
|
+
retryable: false,
|
|
239
|
+
};
|
|
131
240
|
}
|
|
132
241
|
if (!transport.online())
|
|
133
242
|
return UNCERTAIN;
|
|
134
|
-
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input),
|
|
243
|
+
return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), SITE_SUBMIT);
|
|
135
244
|
},
|
|
136
|
-
roomStream:
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
245
|
+
roomStream: snapshot
|
|
246
|
+
? undefined
|
|
247
|
+
: {
|
|
248
|
+
hold(rooms) {
|
|
249
|
+
notifications.send(rooms.flatMap((room) => {
|
|
250
|
+
const entry = tracked.get(room.locator);
|
|
251
|
+
const at = logPosition(room.roomVersion);
|
|
252
|
+
if (entry === undefined || at === null)
|
|
253
|
+
return [];
|
|
254
|
+
notifications.reach(entry.authority, at);
|
|
255
|
+
return [presented(entry.authority, at)];
|
|
256
|
+
}), null);
|
|
257
|
+
},
|
|
258
|
+
reopen: notifications.reopen,
|
|
259
|
+
observe: notifications.observe,
|
|
260
|
+
published(locator, roomVersion) {
|
|
261
|
+
const at = logPosition(roomVersion);
|
|
262
|
+
if (at !== null)
|
|
263
|
+
notifications.published(locator, at);
|
|
264
|
+
},
|
|
146
265
|
},
|
|
147
|
-
observe: notifications.observe,
|
|
148
|
-
},
|
|
149
266
|
serviceMode: notifications.serviceMode,
|
|
150
267
|
};
|
|
151
268
|
}
|
package/dist/stream.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { ConversationStream, RefreshPage, RoomStreamEvent, ServiceModeSignal } from '@agentshouse/mdruntime';
|
|
1
|
+
import type { ConversationStream, RefreshPage, RoomStreamEvent, ServiceModeSignal, StreamReceipts } from '@agentshouse/mdruntime';
|
|
2
2
|
import type { TrackedAuthority } from './discovery.js';
|
|
3
|
-
import type { HouseDoor, HouseHeldRoom, HouseMode, HouseStreamEntry } from './transport.js';
|
|
3
|
+
import type { HouseDemand, HouseDoor, HouseHeldRoom, HouseMode, HouseStreamEntry } from './transport.js';
|
|
4
4
|
import { type LogPosition } from './version.js';
|
|
5
5
|
export type HeldRevision = (path: string, revision: string) => boolean;
|
|
6
6
|
export type StreamedAdvancement = {
|
|
@@ -10,8 +10,10 @@ export type StreamedAdvancement = {
|
|
|
10
10
|
};
|
|
11
11
|
export type HouseNotifications = {
|
|
12
12
|
runtime: string;
|
|
13
|
-
observe(notify: (event: RoomStreamEvent) => void): () => void;
|
|
14
|
-
send(rooms: readonly HouseHeldRoom[]): void;
|
|
13
|
+
observe(notify: (event: RoomStreamEvent) => void, receipts: StreamReceipts): () => void;
|
|
14
|
+
send(rooms: readonly HouseHeldRoom[], demand: HouseDemand | null): void;
|
|
15
|
+
published(locator: string, at: LogPosition): void;
|
|
16
|
+
reopen(): void;
|
|
15
17
|
track(authorities: readonly TrackedAuthority[]): void;
|
|
16
18
|
reach(authority: string, at: LogPosition): void;
|
|
17
19
|
advance(tracked: TrackedAuthority, from: LogPosition, holds?: HeldRevision): StreamedAdvancement | null;
|
package/dist/stream.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,kBAAkB,EAElB,WAAW,EACX,eAAe,EAEf,iBAAiB,EACjB,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,aAAa,EAEb,SAAS,EAET,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AA0C7D,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;AAEvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACrC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,MAAM,IAAI,CAAC;IACxF,IAAI,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;IACxE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;IAClD,MAAM,IAAI,IAAI,CAAC;IACf,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;IAChD,OAAO,CACL,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,WAAW,EACjB,KAAK,CAAC,EAAE,YAAY,GACnB,mBAAmB,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,kBAAkB,CAAC;IAClC,WAAW,EAAE,iBAAiB,CAAC;CAChC,CAAC;AAkFF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB,CAohB5F"}
|