@agentshouse/mdruntime-adapter 0.1.0-alpha.1 → 0.1.0-alpha.2
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 +78 -0
- package/dist/actions.d.ts +16 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +454 -0
- package/dist/actions.js.map +1 -0
- package/dist/adapter.d.ts +8 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +341 -0
- package/dist/adapter.js.map +1 -0
- package/dist/digest.d.ts +3 -0
- package/dist/digest.d.ts.map +1 -0
- package/dist/digest.js +11 -0
- package/dist/digest.js.map +1 -0
- package/dist/discovery.d.ts +60 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +242 -0
- package/dist/discovery.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/map.d.ts +3 -0
- package/dist/map.d.ts.map +1 -0
- package/dist/map.js +15 -0
- package/dist/map.js.map +1 -0
- package/dist/read.d.ts +67 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +244 -0
- package/dist/read.js.map +1 -0
- package/dist/refusal.d.ts +8 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +65 -0
- package/dist/refusal.js.map +1 -0
- package/dist/stream.d.ts +10 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +239 -0
- package/dist/stream.js.map +1 -0
- package/dist/transport.d.ts +77 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +9 -0
- package/dist/transport.js.map +1 -0
- package/dist/write.d.ts +41 -0
- package/dist/write.d.ts.map +1 -0
- package/dist/write.js +377 -0
- package/dist/write.js.map +1 -0
- package/package.json +7 -2
package/dist/read.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/read.ts"],"sourcesContent":["import type { BootstrapResult, RefreshResult } from '@agentshouse/mdruntime';\nimport { PROVIDER_SELECTION_ROOTS, type TrackedAuthority } from './discovery.js';\n\nexport type HouseManifestFile = {\n path: string;\n revision: string;\n};\n\nexport type HouseContent = {\n path: string;\n content: string;\n};\n\nexport type HouseScope = {\n scope: 'room' | 'private';\n anchor: string;\n roomHandle: string | undefined;\n position: string;\n files: readonly HouseManifestFile[];\n contents: readonly HouseContent[];\n};\n\nexport type HouseEnvelope = {\n scopes: readonly HouseScope[];\n};\n\nexport type HouseGrant = {\n method: 'GET' | 'POST';\n operation: string;\n url: string;\n};\n\nexport type HouseChange =\n | { path: string; removed: true }\n | { path: string; content: string; revision: string }\n | { path: string; reference: { revision: string } };\n\nexport type HouseEnumeration = {\n authorities: readonly {\n authority: string;\n position: string;\n changes: readonly HouseChange[];\n }[];\n};\n\nexport function authorityRoot(handle: string | undefined): string {\n return handle === undefined ? '/private' : `/rooms/${handle}`;\n}\n\nexport const ROOM_README = 'ROOM.md';\n\nexport function selectionRoots(tracked: TrackedAuthority): readonly string[] {\n if (tracked.handle === undefined) {\n return [tracked.collectionRoot, ...PROVIDER_SELECTION_ROOTS];\n }\n return [ROOM_README, tracked.collectionRoot];\n}\n\nexport function contentPrefixes(tracked: TrackedAuthority): readonly string[] {\n const root = authorityRoot(tracked.handle);\n return selectionRoots(tracked)\n .filter((entry) => entry !== ROOM_README)\n .map((entry) => `${root}/${entry}`);\n}\n\nexport function modelPrefix(tracked: TrackedAuthority, modelRoot: string): string {\n return `${authorityRoot(tracked.handle)}/${modelRoot}`;\n}\n\nexport function parseGrant(body: unknown): HouseGrant | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('transfer' in body) || typeof body.transfer !== 'object' || body.transfer === null) {\n return null;\n }\n const transfer = body.transfer as Record<string, unknown>;\n if (transfer.method !== 'GET' && transfer.method !== 'POST') return null;\n if (typeof transfer.operation !== 'string' || typeof transfer.url !== 'string') return null;\n return { method: transfer.method, operation: transfer.operation, url: transfer.url };\n}\n\nfunction parseScope(value: unknown): HouseScope | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.manifest !== 'object' || held.manifest === null) return null;\n if (!Array.isArray(held.contents)) return null;\n const manifest = held.manifest as Record<string, unknown>;\n if (manifest.scope !== 'room' && manifest.scope !== 'private') return null;\n if (typeof manifest.anchor !== 'string' || typeof manifest.position !== 'string') return null;\n if (!Array.isArray(manifest.files)) return null;\n const files: HouseManifestFile[] = [];\n for (const entry of manifest.files) {\n if (typeof entry !== 'object' || entry === null) return null;\n const file = entry as Record<string, unknown>;\n if (typeof file.path !== 'string' || typeof file.revision !== 'string') return null;\n files.push({ path: file.path, revision: file.revision });\n }\n const contents: HouseContent[] = [];\n for (const entry of held.contents) {\n if (typeof entry !== 'object' || entry === null) return null;\n const content = entry as Record<string, unknown>;\n if (typeof content.path !== 'string' || typeof content.content !== 'string') return null;\n contents.push({ path: content.path, content: content.content });\n }\n return {\n scope: manifest.scope,\n anchor: manifest.anchor,\n roomHandle: typeof manifest.room_handle === 'string' ? manifest.room_handle : undefined,\n position: manifest.position,\n files,\n contents,\n };\n}\n\nexport function parseEnvelope(body: unknown): HouseEnvelope | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('scopes' in body) || !Array.isArray(body.scopes)) return null;\n const scopes: HouseScope[] = [];\n for (const entry of body.scopes) {\n const scope = parseScope(entry);\n if (scope === null) return null;\n scopes.push(scope);\n }\n return { scopes };\n}\n\nfunction parseChange(value: unknown): HouseChange | null {\n if (typeof value !== 'object' || value === null) return null;\n const held = value as Record<string, unknown>;\n if (typeof held.path !== 'string') return null;\n if (held.removed === true) return { path: held.path, removed: true };\n if (typeof held.content === 'string' && typeof held.revision === 'string') {\n return { path: held.path, content: held.content, revision: held.revision };\n }\n if (typeof held.reference === 'object' && held.reference !== null) {\n const reference = held.reference as Record<string, unknown>;\n if (typeof reference.revision !== 'string') return null;\n return { path: held.path, reference: { revision: reference.revision } };\n }\n return null;\n}\n\nexport function parseEnumeration(body: unknown): HouseEnumeration | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('authorities' in body) || !Array.isArray(body.authorities)) return null;\n const authorities: HouseEnumeration['authorities'][number][] = [];\n for (const entry of body.authorities) {\n if (typeof entry !== 'object' || entry === null) return null;\n const held = entry as Record<string, unknown>;\n if (typeof held.authority !== 'string' || typeof held.position !== 'string') return null;\n if (!Array.isArray(held.changes)) return null;\n const changes: HouseChange[] = [];\n for (const change of held.changes) {\n const mapped = parseChange(change);\n if (mapped === null) return null;\n changes.push(mapped);\n }\n authorities.push({ authority: held.authority, position: held.position, changes });\n }\n return { authorities };\n}\n\nexport function matchesScope(scope: HouseScope, tracked: TrackedAuthority): boolean {\n if (tracked.handle === undefined) return scope.scope === 'private';\n return scope.roomHandle === tracked.handle || scope.anchor === tracked.authority;\n}\n\nexport function withinRoot(path: string, root: string): boolean {\n return path === root || path.startsWith(`${root}/`);\n}\n\nexport function selects(tracked: TrackedAuthority, path: string): boolean {\n if (tracked.modelRoots.some((root) => withinRoot(path, root))) return false;\n return selectionRoots(tracked).some((root) => withinRoot(path, root));\n}\n\nexport function bootstrapFrom(envelope: HouseEnvelope, tracked: TrackedAuthority): BootstrapResult {\n const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));\n if (scope === undefined) return { kind: 'room-not-readable', locator: tracked.locator };\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const binaryTargets: string[] = [];\n for (const file of scope.files) {\n if (!selects(tracked, file.path)) continue;\n revisions[file.path] = file.revision;\n const content = contents.get(file.path);\n if (content === undefined) binaryTargets.push(file.path);\n else documents[file.path] = content;\n }\n return {\n kind: 'bootstrap',\n roomVersion: scope.position,\n documents,\n revisions,\n binaryTargets: binaryTargets.sort(),\n };\n}\n\nexport type HouseDefinitions = {\n definitions: Readonly<Record<string, string>>;\n revisions: readonly string[];\n};\n\nexport const MODEL_DEFINITION_ADDRESS = 'types';\n\nexport function definitionAddress(path: string): string {\n return `${MODEL_DEFINITION_ADDRESS}/${path.slice(path.lastIndexOf('/') + 1)}`;\n}\n\nexport function definitionsFrom(\n envelope: HouseEnvelope,\n tracked: TrackedAuthority,\n modelRoot: string,\n): HouseDefinitions | null {\n const scope = envelope.scopes.find((entry) => matchesScope(entry, tracked));\n if (scope === undefined) return null;\n const contents = new Map(scope.contents.map((entry) => [entry.path, entry.content]));\n const definitions: Record<string, string> = {};\n const revisions: string[] = [];\n for (const file of scope.files) {\n if (!withinRoot(file.path, modelRoot)) continue;\n const content = contents.get(file.path);\n const address = definitionAddress(file.path);\n if (content === undefined || Object.hasOwn(definitions, address)) return null;\n definitions[address] = content;\n revisions.push(`${file.path} ${file.revision}`);\n }\n return { definitions, revisions: revisions.sort() };\n}\n\nexport function refreshFrom(\n enumeration: HouseEnumeration,\n tracked: TrackedAuthority,\n fromRoomVersion: string,\n): RefreshResult {\n const view = enumeration.authorities.find((entry) => entry.authority === tracked.authority);\n if (view === undefined) return { kind: 'room-not-readable', locator: tracked.locator };\n if (view.position === fromRoomVersion) return { kind: 'still-current' };\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const binaryTargets: string[] = [];\n const removals: string[] = [];\n for (const change of view.changes) {\n if (!selects(tracked, change.path)) continue;\n if ('removed' in change) {\n removals.push(change.path);\n continue;\n }\n if ('content' in change) {\n documents[change.path] = change.content;\n revisions[change.path] = change.revision;\n continue;\n }\n binaryTargets.push(change.path);\n revisions[change.path] = change.reference.revision;\n }\n return {\n kind: 'net-advancement',\n roomVersion: view.position,\n documents,\n revisions,\n binaryTargets: binaryTargets.sort(),\n removals: removals.sort(),\n };\n}\n"],"names":["PROVIDER_SELECTION_ROOTS","authorityRoot","handle","undefined","ROOM_README","selectionRoots","tracked","collectionRoot","contentPrefixes","root","filter","entry","map","modelPrefix","modelRoot","parseGrant","body","transfer","method","operation","url","parseScope","value","held","manifest","Array","isArray","contents","scope","anchor","position","files","file","path","revision","push","content","roomHandle","room_handle","parseEnvelope","scopes","parseChange","removed","reference","parseEnumeration","authorities","authority","changes","change","mapped","matchesScope","withinRoot","startsWith","selects","modelRoots","some","bootstrapFrom","envelope","find","kind","locator","Map","documents","revisions","binaryTargets","get","roomVersion","sort","MODEL_DEFINITION_ADDRESS","definitionAddress","slice","lastIndexOf","definitionsFrom","definitions","address","Object","hasOwn","refreshFrom","enumeration","fromRoomVersion","view","removals"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AdapterFailure, ProviderRefusal, ScopedRefusal } from '@agentshouse/mdruntime';
|
|
2
|
+
export type DoorRefusal = ProviderRefusal;
|
|
3
|
+
export declare function doorRefusal(body: unknown): DoorRefusal | null;
|
|
4
|
+
export declare function scopedRefusal(locator: string, scope: ScopedRefusal['scope'], refusal: DoorRefusal): ScopedRefusal;
|
|
5
|
+
export declare function classifyDoor(status: number, body: unknown, locator: string): AdapterFailure | {
|
|
6
|
+
kind: 'beyond-horizon';
|
|
7
|
+
} | null;
|
|
8
|
+
//# sourceMappingURL=refusal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refusal.d.ts","sourceRoot":"","sources":["../src/refusal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAgB7F,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC;AAE1C,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAO7D;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,EAC7B,OAAO,EAAE,WAAW,GACnB,aAAa,CAEf;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,CAepD"}
|
package/dist/refusal.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const RETRYABLE_CODES = new Set([
|
|
2
|
+
'auth_unavailable',
|
|
3
|
+
'replica_behind',
|
|
4
|
+
'read_replica_unavailable',
|
|
5
|
+
'read_replica_lagging',
|
|
6
|
+
'read_pool_acquisition_timed_out',
|
|
7
|
+
'sync_unavailable',
|
|
8
|
+
'sync_failed',
|
|
9
|
+
'rate_limited',
|
|
10
|
+
'operation_contended',
|
|
11
|
+
'service_mode_write_halted',
|
|
12
|
+
'transaction_budget_exceeded'
|
|
13
|
+
]);
|
|
14
|
+
export function doorRefusal(body) {
|
|
15
|
+
if (typeof body !== 'object' || body === null) return null;
|
|
16
|
+
if (!('error' in body) || typeof body.error !== 'object' || body.error === null) return null;
|
|
17
|
+
const error = body.error;
|
|
18
|
+
if (typeof error.code !== 'string') return null;
|
|
19
|
+
const { code, ...fields } = error;
|
|
20
|
+
return {
|
|
21
|
+
code,
|
|
22
|
+
fields
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export function scopedRefusal(locator, scope, refusal) {
|
|
26
|
+
return {
|
|
27
|
+
kind: 'scoped-refusal',
|
|
28
|
+
locator,
|
|
29
|
+
scope,
|
|
30
|
+
code: refusal.code,
|
|
31
|
+
fields: refusal.fields
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function classifyDoor(status, body, locator) {
|
|
35
|
+
if (status === 0) return {
|
|
36
|
+
kind: 'transport-uncertainty'
|
|
37
|
+
};
|
|
38
|
+
const refusal = doorRefusal(body);
|
|
39
|
+
if (status === 401) return {
|
|
40
|
+
kind: 'revoked-authorization'
|
|
41
|
+
};
|
|
42
|
+
if (refusal !== null && RETRYABLE_CODES.has(refusal.code)) return {
|
|
43
|
+
kind: 'transport-uncertainty'
|
|
44
|
+
};
|
|
45
|
+
if (refusal !== null && refusal.code === 'position_expired') return {
|
|
46
|
+
kind: 'beyond-horizon'
|
|
47
|
+
};
|
|
48
|
+
if (status === 404 || refusal?.code === 'room_not_found') {
|
|
49
|
+
return {
|
|
50
|
+
kind: 'room-not-readable',
|
|
51
|
+
locator
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (status >= 500) return {
|
|
55
|
+
kind: 'transport-uncertainty'
|
|
56
|
+
};
|
|
57
|
+
if (status < 400) return null;
|
|
58
|
+
if (refusal === null) return {
|
|
59
|
+
kind: 'transport-uncertainty'
|
|
60
|
+
};
|
|
61
|
+
if (status === 403) return scopedRefusal(locator, 'operation', refusal);
|
|
62
|
+
return scopedRefusal(locator, 'undisclosed', refusal);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=refusal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/refusal.ts"],"sourcesContent":["import type { AdapterFailure, ProviderRefusal, ScopedRefusal } from '@agentshouse/mdruntime';\n\nconst RETRYABLE_CODES = new Set([\n 'auth_unavailable',\n 'replica_behind',\n 'read_replica_unavailable',\n 'read_replica_lagging',\n 'read_pool_acquisition_timed_out',\n 'sync_unavailable',\n 'sync_failed',\n 'rate_limited',\n 'operation_contended',\n 'service_mode_write_halted',\n 'transaction_budget_exceeded',\n]);\n\nexport type DoorRefusal = ProviderRefusal;\n\nexport function doorRefusal(body: unknown): DoorRefusal | null {\n if (typeof body !== 'object' || body === null) return null;\n if (!('error' in body) || typeof body.error !== 'object' || body.error === null) return null;\n const error = body.error as Record<string, unknown>;\n if (typeof error.code !== 'string') return null;\n const { code, ...fields } = error;\n return { code, fields };\n}\n\nexport function scopedRefusal(\n locator: string,\n scope: ScopedRefusal['scope'],\n refusal: DoorRefusal,\n): ScopedRefusal {\n return { kind: 'scoped-refusal', locator, scope, code: refusal.code, fields: refusal.fields };\n}\n\nexport function classifyDoor(\n status: number,\n body: unknown,\n locator: string,\n): AdapterFailure | { kind: 'beyond-horizon' } | null {\n if (status === 0) return { kind: 'transport-uncertainty' };\n const refusal = doorRefusal(body);\n if (status === 401) return { kind: 'revoked-authorization' };\n if (refusal !== null && RETRYABLE_CODES.has(refusal.code))\n return { kind: 'transport-uncertainty' };\n if (refusal !== null && refusal.code === 'position_expired') return { kind: 'beyond-horizon' };\n if (status === 404 || refusal?.code === 'room_not_found') {\n return { kind: 'room-not-readable', locator };\n }\n if (status >= 500) return { kind: 'transport-uncertainty' };\n if (status < 400) return null;\n if (refusal === null) return { kind: 'transport-uncertainty' };\n if (status === 403) return scopedRefusal(locator, 'operation', refusal);\n return scopedRefusal(locator, 'undisclosed', refusal);\n}\n"],"names":["RETRYABLE_CODES","Set","doorRefusal","body","error","code","fields","scopedRefusal","locator","scope","refusal","kind","classifyDoor","status","has"],"mappings":"AAEA,MAAMA,kBAAkB,IAAIC,IAAI;IAC9B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAID,OAAO,SAASC,YAAYC,IAAa;IACvC,IAAI,OAAOA,SAAS,YAAYA,SAAS,MAAM,OAAO;IACtD,IAAI,CAAE,CAAA,WAAWA,IAAG,KAAM,OAAOA,KAAKC,KAAK,KAAK,YAAYD,KAAKC,KAAK,KAAK,MAAM,OAAO;IACxF,MAAMA,QAAQD,KAAKC,KAAK;IACxB,IAAI,OAAOA,MAAMC,IAAI,KAAK,UAAU,OAAO;IAC3C,MAAM,EAAEA,IAAI,EAAE,GAAGC,QAAQ,GAAGF;IAC5B,OAAO;QAAEC;QAAMC;IAAO;AACxB;AAEA,OAAO,SAASC,cACdC,OAAe,EACfC,KAA6B,EAC7BC,OAAoB;IAEpB,OAAO;QAAEC,MAAM;QAAkBH;QAASC;QAAOJ,MAAMK,QAAQL,IAAI;QAAEC,QAAQI,QAAQJ,MAAM;IAAC;AAC9F;AAEA,OAAO,SAASM,aACdC,MAAc,EACdV,IAAa,EACbK,OAAe;IAEf,IAAIK,WAAW,GAAG,OAAO;QAAEF,MAAM;IAAwB;IACzD,MAAMD,UAAUR,YAAYC;IAC5B,IAAIU,WAAW,KAAK,OAAO;QAAEF,MAAM;IAAwB;IAC3D,IAAID,YAAY,QAAQV,gBAAgBc,GAAG,CAACJ,QAAQL,IAAI,GACtD,OAAO;QAAEM,MAAM;IAAwB;IACzC,IAAID,YAAY,QAAQA,QAAQL,IAAI,KAAK,oBAAoB,OAAO;QAAEM,MAAM;IAAiB;IAC7F,IAAIE,WAAW,OAAOH,SAASL,SAAS,kBAAkB;QACxD,OAAO;YAAEM,MAAM;YAAqBH;QAAQ;IAC9C;IACA,IAAIK,UAAU,KAAK,OAAO;QAAEF,MAAM;IAAwB;IAC1D,IAAIE,SAAS,KAAK,OAAO;IACzB,IAAIH,YAAY,MAAM,OAAO;QAAEC,MAAM;IAAwB;IAC7D,IAAIE,WAAW,KAAK,OAAON,cAAcC,SAAS,aAAaE;IAC/D,OAAOH,cAAcC,SAAS,eAAeE;AAC/C"}
|
package/dist/stream.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RefreshPage, SelectedRooms, ViewedConversations } from '@agentshouse/mdruntime';
|
|
2
|
+
import type { TrackedAuthority } from './discovery.js';
|
|
3
|
+
import { type HouseTransport } from './transport.js';
|
|
4
|
+
export type HouseNotifications = SelectedRooms & {
|
|
5
|
+
track(authorities: readonly TrackedAuthority[]): void;
|
|
6
|
+
advance(tracked: TrackedAuthority, fromRoomVersion: string): RefreshPage | null;
|
|
7
|
+
conversations: ViewedConversations;
|
|
8
|
+
};
|
|
9
|
+
export declare function houseNotifications(transport: HouseTransport): HouseNotifications;
|
|
10
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EAEX,aAAa,EACb,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,EAAgD,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAUnG,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG;IAC/C,KAAK,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAAC;IAChF,aAAa,EAAE,mBAAmB,CAAC;CACpC,CAAC;AAaF,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,cAAc,GAAG,kBAAkB,CA0MhF"}
|
package/dist/stream.js
ADDED
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { actionOutcome, HISTORY_PAGE, readConversationHistory } from './actions.js';
|
|
2
|
+
import { selects } from './read.js';
|
|
3
|
+
import { PRIVATE_AUTHORITY } from './transport.js';
|
|
4
|
+
const HELD_POSITIONS_MAX = 256;
|
|
5
|
+
function position(value) {
|
|
6
|
+
if (!/^(?:0|[1-9][0-9]*)$/.test(value)) return null;
|
|
7
|
+
return BigInt(value);
|
|
8
|
+
}
|
|
9
|
+
function messageTurn(message) {
|
|
10
|
+
if (typeof message !== 'object' || message === null) return null;
|
|
11
|
+
const turn = message.message_id;
|
|
12
|
+
return typeof turn === 'string' ? turn : null;
|
|
13
|
+
}
|
|
14
|
+
export function houseNotifications(transport) {
|
|
15
|
+
const stream = transport.stream;
|
|
16
|
+
const held = new Map();
|
|
17
|
+
const locators = new Map();
|
|
18
|
+
const authorities = new Map();
|
|
19
|
+
const observers = new Set();
|
|
20
|
+
const conversationObservers = new Set();
|
|
21
|
+
const subscribedConversations = new Set();
|
|
22
|
+
let selected = [];
|
|
23
|
+
let viewed = [];
|
|
24
|
+
let listening = false;
|
|
25
|
+
function subscribe() {
|
|
26
|
+
const named = [];
|
|
27
|
+
for (const locator of selected){
|
|
28
|
+
const authority = authorities.get(locator);
|
|
29
|
+
if (authority === undefined || authority === PRIVATE_AUTHORITY) continue;
|
|
30
|
+
named.push({
|
|
31
|
+
kind: 'room',
|
|
32
|
+
room: authority
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
if (authorities.has(PRIVATE_AUTHORITY)) named.push({
|
|
36
|
+
kind: 'private'
|
|
37
|
+
});
|
|
38
|
+
for (const conversation of viewed){
|
|
39
|
+
named.push({
|
|
40
|
+
kind: 'conversation',
|
|
41
|
+
conversation
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
stream.subscribe(named);
|
|
45
|
+
}
|
|
46
|
+
function emitConversation(event) {
|
|
47
|
+
if (!viewed.includes(event.conversation)) return;
|
|
48
|
+
for (const observer of conversationObservers)observer(event);
|
|
49
|
+
}
|
|
50
|
+
async function catchUp(conversation, history) {
|
|
51
|
+
const viewedAnswer = await transport.door('/door/conversations/view', {
|
|
52
|
+
conversation_id: conversation
|
|
53
|
+
});
|
|
54
|
+
const summary = actionOutcome(viewedAnswer, 'conversations/view');
|
|
55
|
+
if (summary.kind === 'action' && typeof summary.result === 'object' && summary.result !== null) {
|
|
56
|
+
emitConversation({
|
|
57
|
+
kind: 'session-summary',
|
|
58
|
+
conversation,
|
|
59
|
+
summary: structuredClone('session' in summary.result ? summary.result.session : null)
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
if (!history) return;
|
|
63
|
+
const heldHistory = await readConversationHistory(transport, conversation);
|
|
64
|
+
if ('outcome' in heldHistory) return;
|
|
65
|
+
const newest = heldHistory.messages.slice(-HISTORY_PAGE);
|
|
66
|
+
for (const entry of newest){
|
|
67
|
+
const turn = messageTurn(entry);
|
|
68
|
+
if (turn === null) return;
|
|
69
|
+
emitConversation({
|
|
70
|
+
kind: 'accepted-message',
|
|
71
|
+
conversation,
|
|
72
|
+
message: {
|
|
73
|
+
turn,
|
|
74
|
+
message: structuredClone(entry)
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function receive(frame) {
|
|
80
|
+
if (frame.type === 'draft') {
|
|
81
|
+
emitConversation({
|
|
82
|
+
kind: 'growing-text',
|
|
83
|
+
conversation: frame.conversation_id,
|
|
84
|
+
turn: frame.turn_id,
|
|
85
|
+
text: frame.text
|
|
86
|
+
});
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (frame.type === 'message') {
|
|
90
|
+
const turn = messageTurn(frame.message);
|
|
91
|
+
if (turn === null) return;
|
|
92
|
+
emitConversation({
|
|
93
|
+
kind: 'accepted-message',
|
|
94
|
+
conversation: frame.conversation_id,
|
|
95
|
+
message: {
|
|
96
|
+
turn,
|
|
97
|
+
message: structuredClone(frame.message)
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (frame.type === 'session') {
|
|
103
|
+
emitConversation({
|
|
104
|
+
kind: 'session-summary',
|
|
105
|
+
conversation: frame.conversation_id,
|
|
106
|
+
summary: structuredClone(frame.summary)
|
|
107
|
+
});
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (frame.type === 'subscribed' && viewed.includes(frame.authority)) {
|
|
111
|
+
const reconnect = subscribedConversations.has(frame.authority);
|
|
112
|
+
subscribedConversations.add(frame.authority);
|
|
113
|
+
void catchUp(frame.authority, reconnect);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (frame.type !== 'entries') {
|
|
117
|
+
held.delete(frame.authority);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const at = position(frame.position);
|
|
121
|
+
if (at === null) {
|
|
122
|
+
held.delete(frame.authority);
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const run = held.get(frame.authority) ?? [];
|
|
126
|
+
const last = run.at(-1);
|
|
127
|
+
const continued = last !== undefined && last.position + 1n === at;
|
|
128
|
+
const next = continued ? [
|
|
129
|
+
...run,
|
|
130
|
+
{
|
|
131
|
+
position: at,
|
|
132
|
+
entries: frame.entries
|
|
133
|
+
}
|
|
134
|
+
] : [
|
|
135
|
+
{
|
|
136
|
+
position: at,
|
|
137
|
+
entries: frame.entries
|
|
138
|
+
}
|
|
139
|
+
];
|
|
140
|
+
held.set(frame.authority, next.length > HELD_POSITIONS_MAX ? [] : next);
|
|
141
|
+
const locator = locators.get(frame.authority);
|
|
142
|
+
if (locator === undefined) return;
|
|
143
|
+
for (const observer of observers)observer({
|
|
144
|
+
locator,
|
|
145
|
+
roomVersion: frame.position
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
conversations: {
|
|
150
|
+
view (next) {
|
|
151
|
+
const open = new Set(next);
|
|
152
|
+
for (const conversation of subscribedConversations){
|
|
153
|
+
if (!open.has(conversation)) subscribedConversations.delete(conversation);
|
|
154
|
+
}
|
|
155
|
+
viewed = [
|
|
156
|
+
...next
|
|
157
|
+
];
|
|
158
|
+
subscribe();
|
|
159
|
+
},
|
|
160
|
+
observe (notify) {
|
|
161
|
+
conversationObservers.add(notify);
|
|
162
|
+
if (!listening) {
|
|
163
|
+
listening = true;
|
|
164
|
+
stream.observe(receive);
|
|
165
|
+
}
|
|
166
|
+
return ()=>{
|
|
167
|
+
conversationObservers.delete(notify);
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
track (entries) {
|
|
172
|
+
locators.clear();
|
|
173
|
+
authorities.clear();
|
|
174
|
+
for (const entry of entries){
|
|
175
|
+
locators.set(entry.authority, entry.locator);
|
|
176
|
+
authorities.set(entry.locator, entry.authority);
|
|
177
|
+
}
|
|
178
|
+
for (const authority of held.keys()){
|
|
179
|
+
if (!locators.has(authority)) held.delete(authority);
|
|
180
|
+
}
|
|
181
|
+
},
|
|
182
|
+
select (named) {
|
|
183
|
+
selected = [
|
|
184
|
+
...named
|
|
185
|
+
];
|
|
186
|
+
subscribe();
|
|
187
|
+
},
|
|
188
|
+
observe (notify) {
|
|
189
|
+
observers.add(notify);
|
|
190
|
+
if (!listening) {
|
|
191
|
+
listening = true;
|
|
192
|
+
stream.observe(receive);
|
|
193
|
+
}
|
|
194
|
+
return ()=>{
|
|
195
|
+
observers.delete(notify);
|
|
196
|
+
};
|
|
197
|
+
},
|
|
198
|
+
advance (tracked, fromRoomVersion) {
|
|
199
|
+
const run = held.get(tracked.authority);
|
|
200
|
+
const from = position(fromRoomVersion);
|
|
201
|
+
if (run === undefined || from === null) return null;
|
|
202
|
+
const at = run.findIndex((frame)=>frame.position === from + 1n);
|
|
203
|
+
if (at === -1) return null;
|
|
204
|
+
const pending = run.slice(at);
|
|
205
|
+
const documents = {};
|
|
206
|
+
const revisions = {};
|
|
207
|
+
const removals = [];
|
|
208
|
+
for (const frame of pending){
|
|
209
|
+
for (const entry of frame.entries){
|
|
210
|
+
if (!selects(tracked, entry.path)) continue;
|
|
211
|
+
if (entry.kind === 'removed') {
|
|
212
|
+
delete documents[entry.path];
|
|
213
|
+
delete revisions[entry.path];
|
|
214
|
+
if (!removals.includes(entry.path)) removals.push(entry.path);
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
if (entry.text === undefined || entry.revision === undefined) return null;
|
|
218
|
+
documents[entry.path] = entry.text;
|
|
219
|
+
revisions[entry.path] = entry.revision;
|
|
220
|
+
const removed = removals.indexOf(entry.path);
|
|
221
|
+
if (removed !== -1) removals.splice(removed, 1);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const last = pending.at(-1);
|
|
225
|
+
if (last === undefined) return null;
|
|
226
|
+
held.set(tracked.authority, pending);
|
|
227
|
+
return {
|
|
228
|
+
kind: 'net-advancement',
|
|
229
|
+
roomVersion: last.position.toString(),
|
|
230
|
+
documents,
|
|
231
|
+
revisions,
|
|
232
|
+
binaryTargets: [],
|
|
233
|
+
removals: removals.sort()
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/stream.ts"],"sourcesContent":["import type {\n ConversationEvent,\n RefreshPage,\n RoomVersionNotification,\n SelectedRooms,\n ViewedConversations,\n} from '@agentshouse/mdruntime';\nimport { actionOutcome, HISTORY_PAGE, readConversationHistory } from './actions.js';\nimport type { TrackedAuthority } from './discovery.js';\nimport { selects } from './read.js';\nimport { PRIVATE_AUTHORITY, type HouseStreamAuthority, type HouseTransport } from './transport.js';\nimport type { HouseStreamEntry, HouseStreamFrame } from './transport.js';\n\nconst HELD_POSITIONS_MAX = 256;\n\ntype HeldFrame = {\n position: bigint;\n entries: readonly HouseStreamEntry[];\n};\n\nexport type HouseNotifications = SelectedRooms & {\n track(authorities: readonly TrackedAuthority[]): void;\n advance(tracked: TrackedAuthority, fromRoomVersion: string): RefreshPage | null;\n conversations: ViewedConversations;\n};\n\nfunction position(value: string): bigint | null {\n if (!/^(?:0|[1-9][0-9]*)$/.test(value)) return null;\n return BigInt(value);\n}\n\nfunction messageTurn(message: unknown): string | null {\n if (typeof message !== 'object' || message === null) return null;\n const turn = (message as { message_id?: unknown }).message_id;\n return typeof turn === 'string' ? turn : null;\n}\n\nexport function houseNotifications(transport: HouseTransport): HouseNotifications {\n const stream = transport.stream;\n const held = new Map<string, HeldFrame[]>();\n const locators = new Map<string, string>();\n const authorities = new Map<string, string>();\n const observers = new Set<(notification: RoomVersionNotification) => void>();\n const conversationObservers = new Set<(event: ConversationEvent) => void>();\n const subscribedConversations = new Set<string>();\n let selected: readonly string[] = [];\n let viewed: readonly string[] = [];\n let listening = false;\n\n function subscribe() {\n const named: HouseStreamAuthority[] = [];\n for (const locator of selected) {\n const authority = authorities.get(locator);\n if (authority === undefined || authority === PRIVATE_AUTHORITY) continue;\n named.push({ kind: 'room', room: authority });\n }\n if (authorities.has(PRIVATE_AUTHORITY)) named.push({ kind: 'private' });\n for (const conversation of viewed) {\n named.push({ kind: 'conversation', conversation });\n }\n stream.subscribe(named);\n }\n\n function emitConversation(event: ConversationEvent) {\n if (!viewed.includes(event.conversation)) return;\n for (const observer of conversationObservers) observer(event);\n }\n\n async function catchUp(conversation: string, history: boolean) {\n const viewedAnswer = await transport.door('/door/conversations/view', {\n conversation_id: conversation,\n });\n const summary = actionOutcome(viewedAnswer, 'conversations/view');\n if (\n summary.kind === 'action' &&\n typeof summary.result === 'object' &&\n summary.result !== null\n ) {\n emitConversation({\n kind: 'session-summary',\n conversation,\n summary: structuredClone('session' in summary.result ? summary.result.session : null),\n });\n }\n if (!history) return;\n const heldHistory = await readConversationHistory(transport, conversation);\n if ('outcome' in heldHistory) return;\n const newest = heldHistory.messages.slice(-HISTORY_PAGE);\n for (const entry of newest) {\n const turn = messageTurn(entry);\n if (turn === null) return;\n emitConversation({\n kind: 'accepted-message',\n conversation,\n message: { turn, message: structuredClone(entry) },\n });\n }\n }\n\n function receive(frame: HouseStreamFrame) {\n if (frame.type === 'draft') {\n emitConversation({\n kind: 'growing-text',\n conversation: frame.conversation_id,\n turn: frame.turn_id,\n text: frame.text,\n });\n return;\n }\n if (frame.type === 'message') {\n const turn = messageTurn(frame.message);\n if (turn === null) return;\n emitConversation({\n kind: 'accepted-message',\n conversation: frame.conversation_id,\n message: { turn, message: structuredClone(frame.message) },\n });\n return;\n }\n if (frame.type === 'session') {\n emitConversation({\n kind: 'session-summary',\n conversation: frame.conversation_id,\n summary: structuredClone(frame.summary),\n });\n return;\n }\n if (frame.type === 'subscribed' && viewed.includes(frame.authority)) {\n const reconnect = subscribedConversations.has(frame.authority);\n subscribedConversations.add(frame.authority);\n void catchUp(frame.authority, reconnect);\n return;\n }\n if (frame.type !== 'entries') {\n held.delete(frame.authority);\n return;\n }\n const at = position(frame.position);\n if (at === null) {\n held.delete(frame.authority);\n return;\n }\n const run = held.get(frame.authority) ?? [];\n const last = run.at(-1);\n const continued = last !== undefined && last.position + 1n === at;\n const next = continued\n ? [...run, { position: at, entries: frame.entries }]\n : [{ position: at, entries: frame.entries }];\n held.set(frame.authority, next.length > HELD_POSITIONS_MAX ? [] : next);\n const locator = locators.get(frame.authority);\n if (locator === undefined) return;\n for (const observer of observers) observer({ locator, roomVersion: frame.position });\n }\n\n return {\n conversations: {\n view(next) {\n const open = new Set(next);\n for (const conversation of subscribedConversations) {\n if (!open.has(conversation)) subscribedConversations.delete(conversation);\n }\n viewed = [...next];\n subscribe();\n },\n observe(notify) {\n conversationObservers.add(notify);\n if (!listening) {\n listening = true;\n stream.observe(receive);\n }\n return () => {\n conversationObservers.delete(notify);\n };\n },\n },\n track(entries) {\n locators.clear();\n authorities.clear();\n for (const entry of entries) {\n locators.set(entry.authority, entry.locator);\n authorities.set(entry.locator, entry.authority);\n }\n for (const authority of held.keys()) {\n if (!locators.has(authority)) held.delete(authority);\n }\n },\n select(named) {\n selected = [...named];\n subscribe();\n },\n observe(notify) {\n observers.add(notify);\n if (!listening) {\n listening = true;\n stream.observe(receive);\n }\n return () => {\n observers.delete(notify);\n };\n },\n advance(tracked, fromRoomVersion) {\n const run = held.get(tracked.authority);\n const from = position(fromRoomVersion);\n if (run === undefined || from === null) return null;\n const at = run.findIndex((frame) => frame.position === from + 1n);\n if (at === -1) return null;\n const pending = run.slice(at);\n const documents: Record<string, string> = {};\n const revisions: Record<string, string> = {};\n const removals: string[] = [];\n for (const frame of pending) {\n for (const entry of frame.entries) {\n if (!selects(tracked, entry.path)) continue;\n if (entry.kind === 'removed') {\n delete documents[entry.path];\n delete revisions[entry.path];\n if (!removals.includes(entry.path)) removals.push(entry.path);\n continue;\n }\n if (entry.text === undefined || entry.revision === undefined) return null;\n documents[entry.path] = entry.text;\n revisions[entry.path] = entry.revision;\n const removed = removals.indexOf(entry.path);\n if (removed !== -1) removals.splice(removed, 1);\n }\n }\n const last = pending.at(-1);\n if (last === undefined) return null;\n held.set(tracked.authority, pending);\n return {\n kind: 'net-advancement',\n roomVersion: last.position.toString(),\n documents,\n revisions,\n binaryTargets: [],\n removals: removals.sort(),\n };\n },\n };\n}\n"],"names":["actionOutcome","HISTORY_PAGE","readConversationHistory","selects","PRIVATE_AUTHORITY","HELD_POSITIONS_MAX","position","value","test","BigInt","messageTurn","message","turn","message_id","houseNotifications","transport","stream","held","Map","locators","authorities","observers","Set","conversationObservers","subscribedConversations","selected","viewed","listening","subscribe","named","locator","authority","get","undefined","push","kind","room","has","conversation","emitConversation","event","includes","observer","catchUp","history","viewedAnswer","door","conversation_id","summary","result","structuredClone","session","heldHistory","newest","messages","slice","entry","receive","frame","type","turn_id","text","reconnect","add","delete","at","run","last","continued","next","entries","set","length","roomVersion","conversations","view","open","observe","notify","track","clear","keys","select","advance","tracked","fromRoomVersion","from","findIndex","pending","documents","revisions","removals","path","revision","removed","indexOf","splice","toString","binaryTargets","sort"],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export declare const DOOR_DISCOVER = "/door/discover";
|
|
2
|
+
export declare const DOOR_BOOTSTRAP = "/door/bootstrap";
|
|
3
|
+
export declare const DOOR_ENUMERATE = "/door/enumerate";
|
|
4
|
+
export declare const DOOR_BATCH = "/door/batch";
|
|
5
|
+
export declare const DOOR_BATCH_UPLOAD = "/door/batch-upload";
|
|
6
|
+
export declare const DOOR_REVISIONS = "/door/revisions";
|
|
7
|
+
export declare const PRIVATE_AUTHORITY = "private";
|
|
8
|
+
export type HouseDoorAnswer = {
|
|
9
|
+
status: number;
|
|
10
|
+
body: unknown;
|
|
11
|
+
};
|
|
12
|
+
export type HouseByteAct = 'working_copy_bundle' | 'authored_batch_upload' | 'conversation_original_upload';
|
|
13
|
+
export type HouseByteBody = string | ArrayBuffer | Uint8Array;
|
|
14
|
+
export type HouseByteTransfer = {
|
|
15
|
+
act: HouseByteAct;
|
|
16
|
+
method: 'GET' | 'POST';
|
|
17
|
+
url: string;
|
|
18
|
+
body?: HouseByteBody;
|
|
19
|
+
operation?: string;
|
|
20
|
+
};
|
|
21
|
+
export type HouseStreamAuthority = {
|
|
22
|
+
kind: 'room';
|
|
23
|
+
room: string;
|
|
24
|
+
} | {
|
|
25
|
+
kind: 'private';
|
|
26
|
+
} | {
|
|
27
|
+
kind: 'conversation';
|
|
28
|
+
conversation: string;
|
|
29
|
+
};
|
|
30
|
+
export type HouseStreamEntry = {
|
|
31
|
+
path: string;
|
|
32
|
+
kind: 'edited' | 'removed';
|
|
33
|
+
revision?: string;
|
|
34
|
+
text?: string;
|
|
35
|
+
};
|
|
36
|
+
export type HouseStreamFrame = {
|
|
37
|
+
type: 'entries';
|
|
38
|
+
authority: string;
|
|
39
|
+
position: string;
|
|
40
|
+
entries: readonly HouseStreamEntry[];
|
|
41
|
+
} | {
|
|
42
|
+
type: 'subscribed';
|
|
43
|
+
authority: string;
|
|
44
|
+
position?: string;
|
|
45
|
+
} | {
|
|
46
|
+
type: 'refused';
|
|
47
|
+
authority: string;
|
|
48
|
+
code: string;
|
|
49
|
+
} | {
|
|
50
|
+
type: 'unsubscribed';
|
|
51
|
+
authority: string;
|
|
52
|
+
code?: string;
|
|
53
|
+
} | {
|
|
54
|
+
type: 'draft';
|
|
55
|
+
conversation_id: string;
|
|
56
|
+
session_id: string;
|
|
57
|
+
turn_id: string;
|
|
58
|
+
text: string;
|
|
59
|
+
} | {
|
|
60
|
+
type: 'message';
|
|
61
|
+
conversation_id: string;
|
|
62
|
+
message: unknown;
|
|
63
|
+
} | {
|
|
64
|
+
type: 'session';
|
|
65
|
+
conversation_id: string;
|
|
66
|
+
summary: unknown;
|
|
67
|
+
};
|
|
68
|
+
export type HouseStream = {
|
|
69
|
+
subscribe(authorities: readonly HouseStreamAuthority[]): void;
|
|
70
|
+
observe(receive: (frame: HouseStreamFrame) => void): () => void;
|
|
71
|
+
};
|
|
72
|
+
export type HouseTransport = {
|
|
73
|
+
door(route: string, body: unknown): Promise<HouseDoorAnswer>;
|
|
74
|
+
transfer(request: HouseByteTransfer): Promise<HouseDoorAnswer>;
|
|
75
|
+
stream: HouseStream;
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export const DOOR_DISCOVER = '/door/discover';
|
|
2
|
+
export const DOOR_BOOTSTRAP = '/door/bootstrap';
|
|
3
|
+
export const DOOR_ENUMERATE = '/door/enumerate';
|
|
4
|
+
export const DOOR_BATCH = '/door/batch';
|
|
5
|
+
export const DOOR_BATCH_UPLOAD = '/door/batch-upload';
|
|
6
|
+
export const DOOR_REVISIONS = '/door/revisions';
|
|
7
|
+
export const PRIVATE_AUTHORITY = 'private';
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/workspace/packages/mdruntime-adapter/src/transport.ts"],"sourcesContent":["export const DOOR_DISCOVER = '/door/discover';\n\nexport const DOOR_BOOTSTRAP = '/door/bootstrap';\n\nexport const DOOR_ENUMERATE = '/door/enumerate';\n\nexport const DOOR_BATCH = '/door/batch';\n\nexport const DOOR_BATCH_UPLOAD = '/door/batch-upload';\n\nexport const DOOR_REVISIONS = '/door/revisions';\n\nexport const PRIVATE_AUTHORITY = 'private';\n\nexport type HouseDoorAnswer = {\n status: number;\n body: unknown;\n};\n\nexport type HouseByteAct =\n | 'working_copy_bundle'\n | 'authored_batch_upload'\n | 'conversation_original_upload';\n\nexport type HouseByteBody = string | ArrayBuffer | Uint8Array;\n\nexport type HouseByteTransfer = {\n act: HouseByteAct;\n method: 'GET' | 'POST';\n url: string;\n body?: HouseByteBody;\n operation?: string;\n};\n\nexport type HouseStreamAuthority =\n | { kind: 'room'; room: string }\n | { kind: 'private' }\n | { kind: 'conversation'; conversation: string };\n\nexport type HouseStreamEntry = {\n path: string;\n kind: 'edited' | 'removed';\n revision?: string;\n text?: string;\n};\n\nexport type HouseStreamFrame =\n | {\n type: 'entries';\n authority: string;\n position: string;\n entries: readonly HouseStreamEntry[];\n }\n | { type: 'subscribed'; authority: string; position?: string }\n | { type: 'refused'; authority: string; code: string }\n | { type: 'unsubscribed'; authority: string; code?: string }\n | {\n type: 'draft';\n conversation_id: string;\n session_id: string;\n turn_id: string;\n text: string;\n }\n | { type: 'message'; conversation_id: string; message: unknown }\n | { type: 'session'; conversation_id: string; summary: unknown };\n\nexport type HouseStream = {\n subscribe(authorities: readonly HouseStreamAuthority[]): void;\n observe(receive: (frame: HouseStreamFrame) => void): () => void;\n};\n\nexport type HouseTransport = {\n door(route: string, body: unknown): Promise<HouseDoorAnswer>;\n transfer(request: HouseByteTransfer): Promise<HouseDoorAnswer>;\n stream: HouseStream;\n};\n"],"names":["DOOR_DISCOVER","DOOR_BOOTSTRAP","DOOR_ENUMERATE","DOOR_BATCH","DOOR_BATCH_UPLOAD","DOOR_REVISIONS","PRIVATE_AUTHORITY"],"mappings":"AAAA,OAAO,MAAMA,gBAAgB,iBAAiB;AAE9C,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,aAAa,cAAc;AAExC,OAAO,MAAMC,oBAAoB,qBAAqB;AAEtD,OAAO,MAAMC,iBAAiB,kBAAkB;AAEhD,OAAO,MAAMC,oBAAoB,UAAU"}
|
package/dist/write.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ChangeBatch, HistoryResult, MutationResult } from '@agentshouse/mdruntime';
|
|
2
|
+
export declare const INLINE_BODY_LIMIT_BYTES: number;
|
|
3
|
+
export declare const UPLOAD_LINE_BYTES = 37;
|
|
4
|
+
export declare const UPLOAD_BYTES_MAX: number;
|
|
5
|
+
export type HouseOperation = Readonly<Record<string, unknown>>;
|
|
6
|
+
export type ChangeMapping = {
|
|
7
|
+
kind: 'changes';
|
|
8
|
+
changes: readonly HouseOperation[];
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'unmapped';
|
|
11
|
+
path: string;
|
|
12
|
+
rule: string;
|
|
13
|
+
};
|
|
14
|
+
export declare function houseChanges(batch: ChangeBatch, handle: string | undefined): ChangeMapping;
|
|
15
|
+
export declare function batchPaths(changes: readonly HouseOperation[]): readonly string[];
|
|
16
|
+
export declare function deltaBody(changes: readonly HouseOperation[]): string;
|
|
17
|
+
export declare function deltaBytes(delta: string): number;
|
|
18
|
+
export declare function uploadable(bytes: number): boolean;
|
|
19
|
+
export declare function deltaDigest(delta: string): Promise<string>;
|
|
20
|
+
export declare function mutationOutcome(status: number, body: unknown, locator: string, handle: string | undefined): MutationResult;
|
|
21
|
+
export declare function rejectedMapping(mapping: Extract<ChangeMapping, {
|
|
22
|
+
kind: 'unmapped';
|
|
23
|
+
}>): {
|
|
24
|
+
kind: 'rejected';
|
|
25
|
+
affected: {};
|
|
26
|
+
code: string;
|
|
27
|
+
fields: {
|
|
28
|
+
path: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export declare function revisionBody(input: {
|
|
32
|
+
path: string;
|
|
33
|
+
handle: string | undefined;
|
|
34
|
+
revision?: string;
|
|
35
|
+
pageToken?: string;
|
|
36
|
+
}): Record<string, unknown>;
|
|
37
|
+
export declare function historyOutcome(status: number, body: unknown, locator: string, request: {
|
|
38
|
+
path: string;
|
|
39
|
+
revision?: string;
|
|
40
|
+
}): HistoryResult;
|
|
41
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EACX,aAAa,EAEb,cAAc,EAEf,MAAM,wBAAwB,CAAC;AAKhC,eAAO,MAAM,uBAAuB,QAAkB,CAAC;AAEvD,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,eAAO,MAAM,gBAAgB,QAAuC,CAAC;AAErE,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAE/D,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA6GrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAQ1F;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,SAAS,MAAM,EAAE,CAQhF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,GAAG,MAAM,CAEpE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE1D;AAqCD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,GAAG,SAAS,GACzB,cAAc,CAqDhB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;IAEjF,IAAI,EAAE,UAAU;IAChB,QAAQ;IACR,IAAI;IACJ,MAAM;QAAI,IAAI;;EAEjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAM1B;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,aAAa,CAoDf"}
|