@agentshouse/mdruntime-adapter 0.1.0-cc63dd043d0e2 → 0.1.0-cca5d676bc88e

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/dist/links.js CHANGED
@@ -8,7 +8,7 @@ function linkedBy(text) {
8
8
  return references.size === 0 ? NONE : references;
9
9
  }
10
10
  function handedOf(attachments) {
11
- return new Set((attachments ?? []).map((attachment) => attachment.reference));
11
+ return new Map((attachments ?? []).map((attachment) => [attachment.reference, attachment]));
12
12
  }
13
13
  export function scopeLinks(scope) {
14
14
  return {
@@ -24,6 +24,44 @@ function revised(revisions, path, revision) {
24
24
  else
25
25
  revisions.set(path, revision);
26
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
+ }
27
65
  export function enumeratedLinks(view, earlier) {
28
66
  const paths = new Map(earlier?.paths);
29
67
  const revisions = new Map(earlier?.revisions);
@@ -50,7 +88,7 @@ export function streamedLinks(held, advanced) {
50
88
  for (const reference of linked)
51
89
  if (!held.handed.has(reference))
52
90
  return null;
53
- for (const reference of paths.get(entry.path) ?? held.handed) {
91
+ for (const reference of paths.get(entry.path) ?? held.handed.keys()) {
54
92
  if (held.handed.has(reference) && !linked.has(reference))
55
93
  dropped.add(reference);
56
94
  }
package/dist/model.d.ts CHANGED
@@ -1,19 +1,8 @@
1
- import type { AdapterFailure, ModelIdentity, ModelRequest, ModelResult } from '@agentshouse/mdruntime';
2
- import type { HouseSchema } from './read.js';
3
- export type HeldModel = {
4
- snapshot: ModelResult;
5
- identity: ModelIdentity | null;
6
- };
7
- export declare const MODEL_ABSENT: ModelResult;
8
- export declare function failedModel(failure: AdapterFailure | {
9
- kind: 'beyond-horizon';
10
- }): ModelResult;
11
- export declare function modelKey(locator: string, attached: ModelRequest['attached']): string;
12
- export declare function heldModel(read: HouseSchema | null, identity: string, failure: ModelResult): Promise<HeldModel>;
13
- export type ModelShelf = {
14
- retain(key: string, acquired: HeldModel | undefined): HeldModel | undefined;
15
- answer(request: ModelRequest): ModelResult;
16
- keep(locators: readonly string[]): void;
17
- };
18
- export declare function modelShelf(): ModelShelf;
1
+ import type { RoomModels } from '@agentshouse/mdruntime';
2
+ import type { TrackedAuthority } from './discovery.js';
3
+ import { type HouseScope, type HouseView } from './read.js';
4
+ import type { HouseMode, HouseStreamEntry } from './transport.js';
5
+ export declare function scopeModels(scope: HouseScope, tracked: TrackedAuthority): Promise<RoomModels | undefined>;
6
+ export declare function viewModels(view: HouseView, tracked: TrackedAuthority): Promise<RoomModels | undefined>;
7
+ export declare function streamedModels(schemas: ReadonlyMap<string, HouseStreamEntry>, tracked: TrackedAuthority, mode: HouseMode): Promise<RoomModels | undefined>;
19
8
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAA;CAAE,CAAC;AAElF,eAAO,MAAM,YAAY,EAAE,WAAmE,CAAC;AAE/F,wBAAgB,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG,WAAW,CAI7F;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,MAAM,CAEpF;AAED,wBAAsB,SAAS,CAC7B,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,SAAS,CAAC,CAOpB;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5E,MAAM,CAAC,OAAO,EAAE,YAAY,GAAG,WAAW,CAAC;IAC3C,IAAI,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CACzC,CAAC;AAEF,wBAAgB,UAAU,IAAI,UAAU,CAqBvC"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAA0C,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACpG,OAAO,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAiClE,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAEjC;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,SAAS,EACf,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAQjC;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,EAC9C,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CASjC"}
package/dist/model.js CHANGED
@@ -1,46 +1,53 @@
1
1
  import { sha256Hex } from './digest.js';
2
- export const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
3
- export function failedModel(failure) {
4
- if (failure.kind === 'revoked-authorization')
5
- return { kind: 'revoked-authorization' };
6
- if (failure.kind === 'transport-uncertainty')
7
- return { kind: 'transport-uncertainty' };
8
- return MODEL_ABSENT;
9
- }
10
- export function modelKey(locator, attached) {
11
- return `${locator} ${attached}`;
12
- }
13
- export async function heldModel(read, identity, failure) {
2
+ import { schemaOf, schemaPath } from './read.js';
3
+ const MODEL_ABSENT = { kind: 'model-unavailable', reason: 'not-readable' };
4
+ const ABSENT_SCHEMA = { schema: null, version: null };
5
+ async function heldModel(read, identity) {
14
6
  if (read === null)
15
- return { snapshot: failure, identity: null };
7
+ return MODEL_ABSENT;
16
8
  const version = await sha256Hex(JSON.stringify(read.version));
17
- return {
18
- snapshot: { kind: 'model', snapshot: { identity, version, schema: read.schema } },
19
- identity: { identity, version },
20
- };
9
+ return { kind: 'model', snapshot: { identity, version, schema: read.schema } };
10
+ }
11
+ async function modelsOf(tracked, read) {
12
+ const models = {};
13
+ const collection = read(tracked.schema);
14
+ if (collection !== undefined) {
15
+ models.collection = await heldModel(collection, schemaPath(tracked.handle, tracked.schema));
16
+ }
17
+ if (tracked.houseModel !== null) {
18
+ const root = tracked.houseModel.root;
19
+ const selection = read(root);
20
+ if (selection !== undefined) {
21
+ models.selection = await heldModel(selection, schemaPath(tracked.handle, root));
22
+ }
23
+ }
24
+ return models.collection === undefined && models.selection === undefined ? undefined : models;
25
+ }
26
+ export function scopeModels(scope, tracked) {
27
+ return modelsOf(tracked, (schema) => schemaOf(scope, schema));
28
+ }
29
+ export function viewModels(view, tracked) {
30
+ return modelsOf(tracked, (schema) => {
31
+ const change = view.changes.find((candidate) => candidate.path === schema);
32
+ if (change === undefined)
33
+ return undefined;
34
+ if ('removed' in change)
35
+ return ABSENT_SCHEMA;
36
+ if ('content' in change)
37
+ return { schema: change.content, version: change.version };
38
+ return null;
39
+ });
21
40
  }
22
- export function modelShelf() {
23
- const models = new Map();
24
- return {
25
- retain(key, acquired) {
26
- if (acquired === undefined)
27
- return models.get(key);
28
- if (acquired.snapshot.kind === 'transport-uncertainty') {
29
- const previous = models.get(key);
30
- if (previous !== undefined && previous.identity !== null)
31
- return previous;
32
- }
33
- models.set(key, acquired);
34
- return acquired;
35
- },
36
- answer(request) {
37
- return models.get(modelKey(request.locator, request.attached))?.snapshot ?? MODEL_ABSENT;
38
- },
39
- keep(locators) {
40
- for (const key of [...models.keys()]) {
41
- if (!locators.some((locator) => key.startsWith(`${locator} `)))
42
- models.delete(key);
43
- }
44
- },
45
- };
41
+ export function streamedModels(schemas, tracked, mode) {
42
+ return modelsOf(tracked, (schema) => {
43
+ const entry = schemas.get(schema);
44
+ if (entry === undefined)
45
+ return undefined;
46
+ if (entry.kind === 'removed')
47
+ return ABSENT_SCHEMA;
48
+ if (entry.text === undefined)
49
+ return null;
50
+ const version = mode === 'site' ? entry.sha256 : entry.revision;
51
+ return version === undefined ? null : { schema: entry.text, version };
52
+ });
46
53
  }
package/dist/read.d.ts CHANGED
@@ -61,6 +61,7 @@ export declare function headChange(held: {
61
61
  readonly author?: unknown;
62
62
  readonly created_at?: unknown;
63
63
  }): HeadChange | undefined | null;
64
+ export declare function parseOriginals(value: unknown): readonly RoomAttachment[] | null;
64
65
  export declare function parseEnvelope(body: unknown): HouseEnvelope | null;
65
66
  export declare function parseSiteBootstrap(body: unknown): HouseScope | null;
66
67
  export declare function parseEnumeration(body: unknown, mode: HouseMode): HouseEnumeration | null;
@@ -71,7 +72,6 @@ export type HouseSchema = {
71
72
  schema: string | null;
72
73
  version: string | null;
73
74
  };
74
- export declare function schemaFrom(envelope: HouseEnvelope, tracked: TrackedAuthority, schema: string): HouseSchema | null;
75
75
  export declare function schemaOf(scope: HouseScope, schema: string): HouseSchema | null;
76
76
  export declare function viewOf(enumeration: HouseEnumeration, tracked: TrackedAuthority): HouseView | undefined;
77
77
  export declare function refreshFrom(view: HouseView, fromRoomVersion: string): RefreshResult;
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAEb,aAAa,EACb,cAAc,EACf,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAA6B,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3E,MAAM,MAAM,UAAU,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACpC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,GAC/B;IACE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC;AAEtD,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,SAAS,SAAS,EAAE,CAAC;CACnC,CAAC;AAEF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS,MAAM,EAAE,CAE5E;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAU3D;AAWD,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B,GAAG,UAAU,GAAG,SAAS,GAAG,IAAI,CAMhC;AA2ED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CAUjE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAEnE;AAoCD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,GAAG,gBAAgB,GAAG,IAAI,CAyBxF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,UAAU,CA2B5E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAElF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,CAsB5D;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,CAAC;AAEF,wBAAgB,UAAU,CACxB,QAAQ,EAAE,aAAa,EACvB,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,GACb,WAAW,GAAG,IAAI,CAIpB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAK9E;AAED,wBAAgB,MAAM,CACpB,WAAW,EAAE,gBAAgB,EAC7B,OAAO,EAAE,gBAAgB,GACxB,SAAS,GAAG,SAAS,CAEvB;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,GAAG,aAAa,CA+BnF"}
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
package/dist/read.js CHANGED
@@ -3,7 +3,10 @@ export function authorityRoot(handle) {
3
3
  return `/rooms/${handle}`;
4
4
  }
5
5
  export function contentPrefixes(tracked) {
6
- return [authorityRoot(tracked.handle)];
6
+ return [
7
+ authorityRoot(tracked.handle),
8
+ ...tracked.schemas.map((schema) => schemaPath(tracked.handle, schema)),
9
+ ];
7
10
  }
8
11
  export function schemaPath(handle, schema) {
9
12
  return `${authorityRoot(handle)}/${schema}`;
@@ -60,7 +63,7 @@ function parseOriginal(value) {
60
63
  return null;
61
64
  return { reference: attachment, name, byteLength: bytes, mediaType, entry: value };
62
65
  }
63
- function parseOriginals(value) {
66
+ export function parseOriginals(value) {
64
67
  if (!Array.isArray(value))
65
68
  return null;
66
69
  const attachments = [];
@@ -282,12 +285,6 @@ export function bootstrapOf(scope) {
282
285
  ...declared(scope.attachments),
283
286
  };
284
287
  }
285
- export function schemaFrom(envelope, tracked, schema) {
286
- const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));
287
- if (scope === undefined)
288
- return null;
289
- return schemaOf(scope, schema);
290
- }
291
288
  export function schemaOf(scope, schema) {
292
289
  const file = scope.files.find((entry) => entry.path === schema);
293
290
  if (file === undefined)
@@ -1 +1 @@
1
- {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAQR,MAAM,wBAAwB,CAAC;AA+BhC,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AAsCxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAuKxE"}
1
+ {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAMR,MAAM,wBAAwB,CAAC;AAsBhC,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,gBAAgB,CAAC;AA+BxB,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAiIxE"}
package/dist/site.js CHANGED
@@ -1,42 +1,32 @@
1
1
  import { actionOutcome } from './actions.js';
2
2
  import { mapDiscovery, parseSiteDiscovery, siteCapabilities, siteTracked, } from './discovery.js';
3
- import { MODEL_ABSENT, failedModel, heldModel, modelKey, modelShelf, } from './model.js';
4
- import { advancedScope, bootstrapOf, parseEnumeration, parseSiteBootstrap, refreshFrom, schemaOf, schemaPath, viewOf, } from './read.js';
5
- import { classifyDoor, discoveryFailure, doorRefusal } from './refusal.js';
3
+ import { scopeModels, streamedModels, viewModels } from './model.js';
4
+ import { advancedScope, bootstrapOf, parseEnumeration, parseSiteBootstrap, refreshFrom, viewOf, } from './read.js';
5
+ import { classifyDoor, discoveryFailure } from './refusal.js';
6
6
  import { houseNotifications } from './stream.js';
7
7
  import { PRIVATE_LOCATOR, SITE_DOOR_BOOTSTRAP, SITE_DOOR_DISCOVER, SITE_DOOR_ENUMERATE, SITE_DOOR_SUBMIT, } from './transport.js';
8
- import { logPosition, presented, reachedVersion, roomVersion, } from './version.js';
8
+ import { followsVersion, logPosition, presented, reachedVersion, roomVersion, } from './version.js';
9
9
  const UNCERTAIN = { kind: 'transport-uncertainty' };
10
- function siteRoom(tracked, attachedModel) {
10
+ function siteRoom(tracked) {
11
11
  return {
12
12
  name: tracked.handle,
13
13
  locator: tracked.locator,
14
14
  roomVersion: roomVersion(tracked),
15
15
  operations: { read: [''], sync: [''], write: [], delete: [] },
16
16
  replica: { selection: tracked.locator, admission: 'admitted' },
17
- attachedModel,
18
17
  providerOwnedPaths: [],
19
18
  };
20
19
  }
21
20
  function settled(refused) {
22
- return refused.kind === 'beyond-horizon' || refused.kind === 'retryable-refusal'
23
- ? UNCERTAIN
24
- : refused;
21
+ return refused.kind === 'beyond-horizon' ? UNCERTAIN : refused;
25
22
  }
26
23
  export function createSiteAdapter(transport) {
27
24
  const notifications = houseNotifications(transport, 'site');
28
25
  const tracked = new Map();
29
- const models = modelShelf();
30
- const acquired = new Map();
31
- let caught = new Map();
32
26
  async function enumeration(entry, from) {
33
27
  const answer = await transport.door(SITE_DOOR_ENUMERATE, {
34
28
  positions: [presented(entry.authority, from)],
35
29
  });
36
- const behind = doorRefusal(answer.body);
37
- if (behind?.code === 'replica_behind' && behind.retryable) {
38
- return { kind: 'retryable-refusal', code: behind.code, fields: behind.fields };
39
- }
40
30
  const classified = classifyDoor(answer.status, answer.body, entry.locator);
41
31
  if (classified !== null)
42
32
  return classified;
@@ -65,31 +55,27 @@ export function createSiteAdapter(transport) {
65
55
  if (from === null)
66
56
  return { kind: 'beyond-horizon' };
67
57
  const streamed = notifications.advance(entry, from);
68
- if (streamed !== null)
69
- return streamed.page;
58
+ if (streamed !== null) {
59
+ const models = await streamedModels(streamed.schemas, entry, 'site');
60
+ return models === undefined ? streamed.page : { ...streamed.page, models };
61
+ }
70
62
  const found = await enumeration(entry, from);
71
63
  if ('kind' in found)
72
64
  return found;
73
65
  const view = viewOf(found, entry);
74
66
  if (view === undefined)
75
67
  return { kind: 'room-not-readable', locator: entry.locator };
76
- notifications.hold(entry.authority, view);
77
- return refreshFrom(view, fromRoomVersion);
78
- }
79
- async function acquire(entry, held) {
80
- if ('failure' in held)
81
- return { snapshot: failedModel(held.failure), identity: null };
82
- const model = await heldModel(schemaOf(held.scope, entry.schema), schemaPath(entry.handle, entry.schema), MODEL_ABSENT);
83
- acquired.set(entry.authority, { roomVersion: roomVersion(held.scope), model });
84
- return model;
68
+ notifications.reach(entry.authority, view);
69
+ const answer = refreshFrom(view, fromRoomVersion);
70
+ if (answer.kind !== 'net-advancement')
71
+ return answer;
72
+ const models = await viewModels(view, entry);
73
+ return models === undefined ? answer : { ...answer, models };
85
74
  }
86
75
  return {
87
76
  async authorize() {
88
77
  return {};
89
78
  },
90
- async model(_authorization, request) {
91
- return models.answer(request);
92
- },
93
79
  async discover() {
94
80
  const answer = await transport.read(SITE_DOOR_DISCOVER);
95
81
  const classified = classifyDoor(answer.status, answer.body, PRIVATE_LOCATOR);
@@ -103,30 +89,7 @@ export function createSiteAdapter(transport) {
103
89
  for (const entry of entries)
104
90
  tracked.set(entry.locator, entry);
105
91
  notifications.track(entries);
106
- const published = new Set(entries.map((entry) => entry.authority));
107
- for (const authority of [...acquired.keys()]) {
108
- if (!published.has(authority))
109
- acquired.delete(authority);
110
- }
111
- const fresh = new Map();
112
- const current = new Map();
113
- for (const entry of entries) {
114
- const kept = acquired.get(entry.authority);
115
- if (kept !== undefined && kept.roomVersion === roomVersion(entry)) {
116
- current.set(entry.authority, kept.model);
117
- continue;
118
- }
119
- const held = await caughtUp(entry);
120
- fresh.set(entry.authority, held);
121
- current.set(entry.authority, await acquire(entry, held));
122
- }
123
- caught = fresh;
124
- const rooms = entries.map((entry) => {
125
- const shelved = models.retain(modelKey(entry.locator, 'collection'), current.get(entry.authority));
126
- return siteRoom(entry, shelved?.identity ?? null);
127
- });
128
- models.keep(entries.map((entry) => entry.locator));
129
- return mapDiscovery(document, rooms, siteCapabilities());
92
+ return mapDiscovery(document, entries.map(siteRoom), siteCapabilities());
130
93
  },
131
94
  async bootstrap(_authorization, request) {
132
95
  const entry = tracked.get(request.locator);
@@ -134,11 +97,12 @@ export function createSiteAdapter(transport) {
134
97
  return { kind: 'room-not-readable', locator: request.locator };
135
98
  if (request.pageToken !== undefined)
136
99
  return UNCERTAIN;
137
- const held = caught.get(entry.authority) ?? (await caughtUp(entry));
100
+ const held = await caughtUp(entry);
138
101
  if ('failure' in held)
139
102
  return held.failure;
140
- notifications.hold(entry.authority, held.scope);
141
- return bootstrapOf(held.scope);
103
+ notifications.reach(entry.authority, held.scope);
104
+ const models = await scopeModels(held.scope, entry);
105
+ return { ...bootstrapOf(held.scope), ...(models === undefined ? {} : { models }) };
142
106
  },
143
107
  async refresh(_authorization, request) {
144
108
  const entry = tracked.get(request.locator);
@@ -146,20 +110,7 @@ export function createSiteAdapter(transport) {
146
110
  return { kind: 'room-not-readable', locator: request.locator };
147
111
  if (request.pageToken !== undefined)
148
112
  return UNCERTAIN;
149
- const result = await refreshed(entry, request.fromRoomVersion);
150
- if (result.kind === 'beyond-horizon')
151
- caught.delete(entry.authority);
152
- const answered = result.kind === 'net-advancement'
153
- ? result.roomVersion
154
- : result.kind === 'still-current'
155
- ? request.fromRoomVersion
156
- : null;
157
- if (request.minPosition !== undefined &&
158
- answered !== null &&
159
- !reachedVersion(answered, request.minPosition, entry.logEpoch)) {
160
- return { kind: 'retryable-refusal', code: 'replica_behind', fields: {} };
161
- }
162
- return result;
113
+ return refreshed(entry, request.fromRoomVersion);
163
114
  },
164
115
  async mutate() {
165
116
  return { kind: 'rejected', affected: {}, code: 'write-grant', fields: {} };
@@ -170,6 +121,9 @@ export function createSiteAdapter(transport) {
170
121
  reached(locator, version, target) {
171
122
  return reachedVersion(version, target, tracked.get(locator)?.logEpoch);
172
123
  },
124
+ follows(_locator, version, next) {
125
+ return followsVersion(version, next);
126
+ },
173
127
  async action(_authorization, request) {
174
128
  if (request.name !== 'submit') {
175
129
  return { kind: 'rejected', code: 'action-unimplemented', fields: { name: request.name } };
@@ -178,7 +132,19 @@ export function createSiteAdapter(transport) {
178
132
  return UNCERTAIN;
179
133
  return actionOutcome(await transport.door(SITE_DOOR_SUBMIT, request.input), 'submit');
180
134
  },
181
- roomVersions: notifications,
135
+ roomStream: {
136
+ hold(rooms) {
137
+ notifications.send(rooms.flatMap((room) => {
138
+ const entry = tracked.get(room.locator);
139
+ const at = logPosition(room.roomVersion);
140
+ if (entry === undefined || at === null)
141
+ return [];
142
+ notifications.reach(entry.authority, at);
143
+ return [presented(entry.authority, at)];
144
+ }));
145
+ },
146
+ observe: notifications.observe,
147
+ },
182
148
  serviceMode: notifications.serviceMode,
183
149
  };
184
150
  }
package/dist/stream.d.ts CHANGED
@@ -1,15 +1,19 @@
1
- import type { ConversationStream, RefreshPage, SelectedRooms, ServiceModeSignal } from '@agentshouse/mdruntime';
1
+ import type { ConversationStream, RefreshPage, RoomStreamEvent, ServiceModeSignal } from '@agentshouse/mdruntime';
2
2
  import type { TrackedAuthority } from './discovery.js';
3
- import type { HouseDoor, HouseMode, HouseStreamEntry } from './transport.js';
3
+ import type { 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 = {
7
7
  page: RefreshPage;
8
8
  entries: readonly HouseStreamEntry[];
9
+ schemas: ReadonlyMap<string, HouseStreamEntry>;
9
10
  };
10
- export type HouseNotifications = SelectedRooms & {
11
+ export type HouseNotifications = {
12
+ runtime: string;
13
+ observe(notify: (event: RoomStreamEvent) => void): () => void;
14
+ send(rooms: readonly HouseHeldRoom[]): void;
11
15
  track(authorities: readonly TrackedAuthority[]): void;
12
- hold(authority: string, at: LogPosition): void;
16
+ reach(authority: string, at: LogPosition): void;
13
17
  advance(tracked: TrackedAuthority, from: LogPosition, holds?: HeldRevision): StreamedAdvancement | null;
14
18
  conversations: ConversationStream;
15
19
  serviceMode: ServiceModeSignal;
@@ -1 +1 @@
1
- {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAClB,WAAW,EAEX,aAAa,EAEb,iBAAiB,EAElB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAoB,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAgB7D,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;CACtC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,GAAG,IAAI,CAAC;IAC/C,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;AAYF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB,CA2P5F"}
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,kBAAkB,EAElB,WAAW,EACX,eAAe,EAEf,iBAAiB,EAElB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EACV,SAAS,EACT,aAAa,EAEb,SAAS,EAET,gBAAgB,EAEjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAgB7D,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,GAAG,MAAM,IAAI,CAAC;IAC9D,IAAI,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,IAAI,CAAC;IAC5C,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;AAuBF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,kBAAkB,CAoS5F"}