@agentshouse/mdruntime-adapter 0.1.0-cd61dfca5d699 → 0.1.0-cd7e4bb187177
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/README.md +2 -2
- package/dist/actions.d.ts +3 -65
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +1 -337
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +220 -371
- package/dist/app-reference.d.ts +2 -0
- package/dist/app-reference.d.ts.map +1 -0
- package/dist/app-reference.js +2 -0
- package/dist/crockford.d.ts +4 -0
- package/dist/crockford.d.ts.map +1 -0
- package/dist/crockford.js +3 -0
- package/dist/discovery.d.ts +13 -12
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +62 -51
- package/dist/history.d.ts +12 -0
- package/dist/history.d.ts.map +1 -0
- package/dist/history.js +91 -0
- package/dist/house-model.d.ts +2398 -0
- package/dist/house-model.d.ts.map +1 -0
- package/dist/house-model.js +1321 -0
- package/dist/index.d.ts +10 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -1
- package/dist/model.d.ts +5 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +10 -29
- package/dist/part.d.ts +14 -0
- package/dist/part.d.ts.map +1 -0
- package/dist/part.js +90 -0
- package/dist/read.d.ts +46 -63
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +216 -283
- package/dist/refusal.d.ts +0 -3
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +0 -5
- package/dist/room-stream.d.ts +19 -0
- package/dist/room-stream.d.ts.map +1 -0
- package/dist/room-stream.js +57 -0
- package/dist/room-types.d.ts +7 -0
- package/dist/room-types.d.ts.map +1 -0
- package/dist/room-types.js +126 -0
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +84 -195
- package/dist/stream.d.ts +13 -14
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +150 -420
- package/dist/transport.d.ts +45 -38
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +53 -11
- package/dist/upload.d.ts +12 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +63 -0
- package/dist/write.d.ts +16 -1
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +100 -55
- package/package.json +8 -4
- package/AGENTS.md +0 -299
- package/dist/gather.d.ts +0 -4
- package/dist/gather.d.ts.map +0 -1
- package/dist/gather.js +0 -45
- package/dist/handed.d.ts +0 -15
- package/dist/handed.d.ts.map +0 -1
- package/dist/handed.js +0 -38
- package/dist/referrer.d.ts +0 -7
- package/dist/referrer.d.ts.map +0 -1
- package/dist/referrer.js +0 -35
package/dist/transport.d.ts
CHANGED
|
@@ -1,41 +1,38 @@
|
|
|
1
1
|
import type { ConversationEvent, TurnOperation } from '@agentshouse/mdruntime';
|
|
2
|
-
export declare const
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export declare
|
|
9
|
-
export declare
|
|
10
|
-
export declare const
|
|
2
|
+
export declare const HOUSE_RUNTIME_READS: {
|
|
3
|
+
readonly acts: readonly ['account/push', 'agents/read', 'apps/features/set', 'apps/source/download', 'apps/source/top', 'batch', 'batch-upload', 'bootstrap', 'conversations/history', 'discover', 'files/attach', 'files/finish', 'files/get', 'revisions', 'sites/screenshot/read'];
|
|
4
|
+
readonly frames: readonly ['app-message', 'authority_changed', 'carried', 'caught_up', 'commands', 'conversation', 'conversation_deleted', 'conversations', 'deliveries', 'deployment', 'held', 'interactions', 'link', 'message', 'opening', 'options', 'part', 'process', 'received', 'signal', 'site', 'starting', 'subagents', 'tab-icon', 'turn'];
|
|
5
|
+
};
|
|
6
|
+
export type HouseRuntimeAct = (typeof HOUSE_RUNTIME_READS.acts)[number];
|
|
7
|
+
export type HouseRuntimeFrame = (typeof HOUSE_RUNTIME_READS.frames)[number];
|
|
8
|
+
export declare function houseDoorRoute(act: HouseRuntimeAct): string;
|
|
9
|
+
export declare function houseSiteRoute(act: Extract<HouseRuntimeAct, 'bootstrap' | 'discover'>): string;
|
|
10
|
+
export declare const SITE_SUBMISSION = "site/submission";
|
|
11
11
|
export declare const SITE_DOOR_SUBMIT = "/_house/door/submit";
|
|
12
12
|
export type HouseMode = 'credential' | 'site';
|
|
13
13
|
export type HouseDoorAnswer = {
|
|
14
14
|
status: number;
|
|
15
15
|
body: unknown;
|
|
16
16
|
};
|
|
17
|
-
export declare const DOOR_FILES_GET = "/door/files/get";
|
|
18
17
|
export declare const SITE_FILES = "/_house/files/";
|
|
19
|
-
export
|
|
20
|
-
export type HouseByteAct = 'authored_batch_upload' | 'conversation_file_upload' | 'binary_stage';
|
|
21
|
-
export type HouseByteBody = string | ArrayBuffer | Uint8Array | Blob;
|
|
18
|
+
export type HouseByteAct = 'authored_batch_upload';
|
|
22
19
|
export type HouseBytesAnswer = {
|
|
23
20
|
status: number;
|
|
24
|
-
|
|
21
|
+
body: ReadableStream<Uint8Array> | null;
|
|
22
|
+
mediaType: string;
|
|
25
23
|
};
|
|
26
24
|
export type HouseByteTransfer = {
|
|
27
25
|
act: HouseByteAct;
|
|
28
26
|
url: string;
|
|
29
|
-
body:
|
|
30
|
-
operation?: string;
|
|
27
|
+
body: string;
|
|
31
28
|
};
|
|
32
29
|
export type HouseStreamEntry = {
|
|
33
30
|
path: string;
|
|
34
|
-
kind: 'edited' | 'removed' | '
|
|
31
|
+
kind: 'edited' | 'removed' | 'folder';
|
|
32
|
+
removed?: true;
|
|
35
33
|
revision?: string;
|
|
36
34
|
sha256?: string;
|
|
37
35
|
text?: string;
|
|
38
|
-
file?: string;
|
|
39
36
|
bytes?: number;
|
|
40
37
|
media_type?: string;
|
|
41
38
|
author?: {
|
|
@@ -46,7 +43,6 @@ export type HouseStreamEntry = {
|
|
|
46
43
|
name: string;
|
|
47
44
|
};
|
|
48
45
|
created_at?: string;
|
|
49
|
-
continued?: true;
|
|
50
46
|
};
|
|
51
47
|
type LiveFact<K extends ConversationEvent['kind']> = Extract<ConversationEvent, {
|
|
52
48
|
kind: K;
|
|
@@ -54,21 +50,26 @@ type LiveFact<K extends ConversationEvent['kind']> = Extract<ConversationEvent,
|
|
|
54
50
|
export type HouseListedConversation = {
|
|
55
51
|
conversation_id: string;
|
|
56
52
|
agent_id: string;
|
|
53
|
+
agent_name: string;
|
|
54
|
+
agent_retired: boolean;
|
|
57
55
|
name: string;
|
|
58
56
|
created_at: string;
|
|
59
57
|
finished_at: string | null;
|
|
60
58
|
outcome: string | null;
|
|
61
59
|
waiting: boolean;
|
|
60
|
+
newest: {
|
|
61
|
+
accepted_at: string;
|
|
62
|
+
message_id: string;
|
|
63
|
+
} | null;
|
|
62
64
|
};
|
|
63
|
-
|
|
65
|
+
type Listed<Frame extends {
|
|
66
|
+
readonly type: HouseRuntimeFrame;
|
|
67
|
+
}> = Frame;
|
|
68
|
+
export type HouseStreamFrame = Listed<{
|
|
64
69
|
type: 'part';
|
|
65
70
|
authority: string;
|
|
66
71
|
carry: string;
|
|
67
72
|
index: number;
|
|
68
|
-
after: string;
|
|
69
|
-
from: string;
|
|
70
|
-
target: string;
|
|
71
|
-
handled: number;
|
|
72
73
|
entries: readonly HouseStreamEntry[];
|
|
73
74
|
} | {
|
|
74
75
|
type: 'carried';
|
|
@@ -80,10 +81,18 @@ export type HouseStreamFrame = {
|
|
|
80
81
|
log_epoch: string;
|
|
81
82
|
} | {
|
|
82
83
|
type: 'opening';
|
|
84
|
+
member: unknown;
|
|
85
|
+
bounds: unknown;
|
|
86
|
+
actions: readonly unknown[];
|
|
87
|
+
authorities: readonly unknown[];
|
|
88
|
+
} | {
|
|
89
|
+
type: 'caught_up';
|
|
83
90
|
expired: readonly string[];
|
|
84
91
|
} | {
|
|
85
92
|
type: 'authority_changed';
|
|
86
|
-
|
|
93
|
+
member: unknown;
|
|
94
|
+
authorities: readonly unknown[];
|
|
95
|
+
left: readonly string[];
|
|
87
96
|
} | ({
|
|
88
97
|
type: 'turn';
|
|
89
98
|
conversation_id: string;
|
|
@@ -116,6 +125,10 @@ export type HouseStreamFrame = {
|
|
|
116
125
|
type: 'starting';
|
|
117
126
|
conversation_id: string;
|
|
118
127
|
step: string | null;
|
|
128
|
+
} | {
|
|
129
|
+
type: 'subagents';
|
|
130
|
+
conversation_id: string;
|
|
131
|
+
subagents: LiveFact<'subagents'>['subagents'];
|
|
119
132
|
} | {
|
|
120
133
|
type: 'link';
|
|
121
134
|
conversation_id: string;
|
|
@@ -132,23 +145,11 @@ export type HouseStreamFrame = {
|
|
|
132
145
|
} | {
|
|
133
146
|
type: 'signal';
|
|
134
147
|
service_mode: string;
|
|
135
|
-
}
|
|
136
|
-
export type HouseHeldCarry = {
|
|
137
|
-
id: string;
|
|
138
|
-
parts: number;
|
|
139
|
-
from: string;
|
|
140
|
-
target: string;
|
|
141
|
-
handled: number;
|
|
142
|
-
piece?: {
|
|
143
|
-
sha256: string;
|
|
144
|
-
offset: number;
|
|
145
|
-
};
|
|
146
|
-
};
|
|
148
|
+
}>;
|
|
147
149
|
export type HouseHeldRoom = {
|
|
148
150
|
authority: string;
|
|
149
151
|
position: string;
|
|
150
152
|
log_epoch: string;
|
|
151
|
-
carry?: HouseHeldCarry;
|
|
152
153
|
};
|
|
153
154
|
export type HouseOpening = {
|
|
154
155
|
hold(rooms: readonly HouseHeldRoom[], runtime: string): void;
|
|
@@ -164,17 +165,23 @@ export type HouseStream = {
|
|
|
164
165
|
opened(notify: (opening: HouseOpening) => void): () => void;
|
|
165
166
|
closed(notify: (closing: HouseClosing) => void): () => void;
|
|
166
167
|
};
|
|
168
|
+
export type HouseStreamed = HouseDoorAnswer & {
|
|
169
|
+
room: ReadableStream<Uint8Array> | null;
|
|
170
|
+
};
|
|
167
171
|
export type HouseDoor = {
|
|
168
172
|
door(route: string, body: unknown): Promise<HouseDoorAnswer>;
|
|
169
173
|
stream: HouseStream;
|
|
170
174
|
};
|
|
171
175
|
export type HouseTransport = HouseDoor & {
|
|
176
|
+
streamed(route: string, body: unknown, signal: AbortSignal): Promise<HouseStreamed>;
|
|
172
177
|
transfer(request: HouseByteTransfer): Promise<HouseDoorAnswer>;
|
|
178
|
+
put(url: string, body: Blob, headers: Readonly<Record<string, string>>): Promise<number>;
|
|
173
179
|
download(url: string): Promise<HouseBytesAnswer>;
|
|
174
180
|
};
|
|
175
181
|
export type HouseSiteTransport = HouseDoor & {
|
|
176
182
|
online(): boolean;
|
|
177
183
|
read(route: string): Promise<HouseDoorAnswer>;
|
|
184
|
+
streamed(route: string, signal: AbortSignal): Promise<HouseStreamed>;
|
|
178
185
|
download(route: string): Promise<HouseBytesAnswer>;
|
|
179
186
|
};
|
|
180
187
|
export {};
|
package/dist/transport.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAE/E,eAAO,MAAM,aAAa,mBAAmB,
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
package/dist/transport.js
CHANGED
|
@@ -1,13 +1,55 @@
|
|
|
1
|
-
export const
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
export const HOUSE_RUNTIME_READS = {
|
|
2
|
+
acts: [
|
|
3
|
+
'account/push',
|
|
4
|
+
'agents/read',
|
|
5
|
+
'apps/features/set',
|
|
6
|
+
'apps/source/download',
|
|
7
|
+
'apps/source/top',
|
|
8
|
+
'batch',
|
|
9
|
+
'batch-upload',
|
|
10
|
+
'bootstrap',
|
|
11
|
+
'conversations/history',
|
|
12
|
+
'discover',
|
|
13
|
+
'files/attach',
|
|
14
|
+
'files/finish',
|
|
15
|
+
'files/get',
|
|
16
|
+
'revisions',
|
|
17
|
+
'sites/screenshot/read',
|
|
18
|
+
],
|
|
19
|
+
frames: [
|
|
20
|
+
'app-message',
|
|
21
|
+
'authority_changed',
|
|
22
|
+
'carried',
|
|
23
|
+
'caught_up',
|
|
24
|
+
'commands',
|
|
25
|
+
'conversation',
|
|
26
|
+
'conversation_deleted',
|
|
27
|
+
'conversations',
|
|
28
|
+
'deliveries',
|
|
29
|
+
'deployment',
|
|
30
|
+
'held',
|
|
31
|
+
'interactions',
|
|
32
|
+
'link',
|
|
33
|
+
'message',
|
|
34
|
+
'opening',
|
|
35
|
+
'options',
|
|
36
|
+
'part',
|
|
37
|
+
'process',
|
|
38
|
+
'received',
|
|
39
|
+
'signal',
|
|
40
|
+
'site',
|
|
41
|
+
'starting',
|
|
42
|
+
'subagents',
|
|
43
|
+
'tab-icon',
|
|
44
|
+
'turn',
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
export function houseDoorRoute(act) {
|
|
48
|
+
return `/door/${act}`;
|
|
49
|
+
}
|
|
50
|
+
export function houseSiteRoute(act) {
|
|
51
|
+
return `/_house/door/${act}`;
|
|
52
|
+
}
|
|
53
|
+
export const SITE_SUBMISSION = 'site/submission';
|
|
10
54
|
export const SITE_DOOR_SUBMIT = '/_house/door/submit';
|
|
11
|
-
export const DOOR_FILES_GET = '/door/files/get';
|
|
12
55
|
export const SITE_FILES = '/_house/files/';
|
|
13
|
-
export const SITE_FILE_RECORD = 'record';
|
package/dist/upload.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type HouseDoorAnswer, type HouseTransport } from './transport.js';
|
|
2
|
+
export type HouseUpload = {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly partBytes: number;
|
|
5
|
+
readonly parts: readonly {
|
|
6
|
+
readonly part: number;
|
|
7
|
+
readonly url: string;
|
|
8
|
+
}[];
|
|
9
|
+
};
|
|
10
|
+
export declare function houseUpload(value: unknown): HouseUpload | null;
|
|
11
|
+
export declare function finishedUpload(transport: HouseTransport, first: HouseUpload, blob: Blob): Promise<HouseDoorAnswer | null>;
|
|
12
|
+
//# sourceMappingURL=upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../src/upload.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE3F,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5E,CAAC;AAeF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CAQ9D;AA8BD,wBAAsB,cAAc,CAClC,SAAS,EAAE,cAAc,EACzB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAejC"}
|
package/dist/upload.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { sha256 } from '@agentshouse/mdruntime/digest';
|
|
2
|
+
import { houseDoorRoute } from './transport.js';
|
|
3
|
+
const FINISHING_ROUNDS = 24;
|
|
4
|
+
function record(value) {
|
|
5
|
+
return value !== null && typeof value === 'object' ? value : {};
|
|
6
|
+
}
|
|
7
|
+
function part(value) {
|
|
8
|
+
const { part: number, url } = record(value);
|
|
9
|
+
return Number.isSafeInteger(number) && number > 0 && typeof url === 'string'
|
|
10
|
+
? { part: number, url }
|
|
11
|
+
: null;
|
|
12
|
+
}
|
|
13
|
+
export function houseUpload(value) {
|
|
14
|
+
const { id, part_bytes: partBytes, parts = [] } = record(value);
|
|
15
|
+
if (typeof id !== 'string' || !Number.isSafeInteger(partBytes) || partBytes <= 0)
|
|
16
|
+
return null;
|
|
17
|
+
if (!Array.isArray(parts))
|
|
18
|
+
return null;
|
|
19
|
+
const named = parts.map(part);
|
|
20
|
+
if (named.some((one) => one === null))
|
|
21
|
+
return null;
|
|
22
|
+
return { id, partBytes: partBytes, parts: named };
|
|
23
|
+
}
|
|
24
|
+
function checksum(hex) {
|
|
25
|
+
let bytes = '';
|
|
26
|
+
for (let at = 0; at < hex.length; at += 2)
|
|
27
|
+
bytes += String.fromCharCode(Number.parseInt(hex.slice(at, at + 2), 16));
|
|
28
|
+
return { 'x-amz-checksum-sha256': btoa(bytes) };
|
|
29
|
+
}
|
|
30
|
+
async function partSha256(blob, partBytes) {
|
|
31
|
+
const parts = [];
|
|
32
|
+
for (let start = 0; start === 0 || start < blob.size; start += partBytes)
|
|
33
|
+
parts.push(await sha256(blob.slice(start, start + partBytes)));
|
|
34
|
+
return parts;
|
|
35
|
+
}
|
|
36
|
+
async function sent(transport, upload, blob, digests) {
|
|
37
|
+
for (const { part: number, url } of upload.parts) {
|
|
38
|
+
const start = (number - 1) * upload.partBytes;
|
|
39
|
+
const slice = blob.slice(start, start + upload.partBytes);
|
|
40
|
+
if ((await transport.put(url, slice, checksum(digests[number - 1]))) !== 200)
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
export async function finishedUpload(transport, first, blob) {
|
|
46
|
+
const digests = await partSha256(blob, first.partBytes);
|
|
47
|
+
let upload = first;
|
|
48
|
+
for (let round = 0; round < FINISHING_ROUNDS; round += 1) {
|
|
49
|
+
if (!(await sent(transport, upload, blob, digests)))
|
|
50
|
+
return null;
|
|
51
|
+
const answer = await transport.door(houseDoorRoute('files/finish'), {
|
|
52
|
+
upload: upload.id,
|
|
53
|
+
part_sha256: digests,
|
|
54
|
+
});
|
|
55
|
+
if (answer.status !== 200)
|
|
56
|
+
return answer;
|
|
57
|
+
const missing = houseUpload(record(answer.body).upload);
|
|
58
|
+
if (missing === null)
|
|
59
|
+
return answer;
|
|
60
|
+
upload = missing;
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
package/dist/write.d.ts
CHANGED
|
@@ -10,6 +10,11 @@ export type ChangeMapping = {
|
|
|
10
10
|
rule: string;
|
|
11
11
|
};
|
|
12
12
|
export declare function houseChanges(batch: ChangeBatch, handle: string): ChangeMapping;
|
|
13
|
+
export declare function houseParts(saved: readonly {
|
|
14
|
+
readonly path: string;
|
|
15
|
+
readonly parts: unknown;
|
|
16
|
+
}[], handle: string): ChangeMapping;
|
|
17
|
+
export declare function houseMove(batch: ChangeBatch, source: string, destination: string): ChangeMapping;
|
|
13
18
|
export type OperationHead = {
|
|
14
19
|
readonly operation_id: string;
|
|
15
20
|
readonly app_ref?: string;
|
|
@@ -21,7 +26,17 @@ export declare function deltaBody(changes: readonly HouseOperation[]): string;
|
|
|
21
26
|
export declare function deltaBytes(delta: string): number;
|
|
22
27
|
export declare function uploadable(inline: Readonly<Record<string, unknown>>, bytes: number, bounds: Pick<HouseBounds, 'max_inline_body_bytes' | 'max_upload_bytes'>): boolean;
|
|
23
28
|
export declare function deltaDigest(delta: string): Promise<string>;
|
|
24
|
-
export
|
|
29
|
+
export type MoveAuthorities = {
|
|
30
|
+
readonly source: {
|
|
31
|
+
readonly authority: string;
|
|
32
|
+
readonly handle: string;
|
|
33
|
+
};
|
|
34
|
+
readonly destination: {
|
|
35
|
+
readonly authority: string;
|
|
36
|
+
readonly handle: string;
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
export declare function mutationOutcome(status: number, body: unknown, locator: string, handle: string, move?: MoveAuthorities): Generator<number, MutationResult, void>;
|
|
25
40
|
export declare function rejectedMapping(mapping: Extract<ChangeMapping, {
|
|
26
41
|
kind: 'unmapped';
|
|
27
42
|
}>): {
|
package/dist/write.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"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"}
|
package/dist/write.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { departure, } from '@agentshouse/mdruntime';
|
|
2
|
-
import { binaryFileOf, headChange,
|
|
1
|
+
import { departure, partsChanges, ROW_WEIGHT, } from '@agentshouse/mdruntime';
|
|
2
|
+
import { answered, answering, binaryFileOf, headChange, revised } from './read.js';
|
|
3
3
|
import { sha256Hex, textBytes } from './digest.js';
|
|
4
4
|
import { nativePath, roomLocalPath } from './map.js';
|
|
5
5
|
import { classifyDoor, doorRefusal, scopedRefusal } from './refusal.js';
|
|
@@ -120,6 +120,27 @@ export function houseChanges(batch, handle) {
|
|
|
120
120
|
}
|
|
121
121
|
return { kind: 'changes', changes };
|
|
122
122
|
}
|
|
123
|
+
export function houseParts(saved, handle) {
|
|
124
|
+
return houseChanges({ id: '', baseRoomVersion: '', ...partsChanges(saved) }, handle);
|
|
125
|
+
}
|
|
126
|
+
export function houseMove(batch, source, destination) {
|
|
127
|
+
const changes = [];
|
|
128
|
+
for (const { path, to } of batch.between?.moves ?? []) {
|
|
129
|
+
const existence = priorExistence(batch, path);
|
|
130
|
+
if (existence === undefined)
|
|
131
|
+
return { kind: 'unmapped', path, rule: 'precondition-missing' };
|
|
132
|
+
if (!('base' in existence)) {
|
|
133
|
+
return { kind: 'unmapped', path, rule: 'presence-base-unrepresentable' };
|
|
134
|
+
}
|
|
135
|
+
changes.push({
|
|
136
|
+
op: 'rename',
|
|
137
|
+
path: nativePath(path, source),
|
|
138
|
+
to: nativePath(to, destination),
|
|
139
|
+
base: existence.base,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
return { kind: 'changes', changes };
|
|
143
|
+
}
|
|
123
144
|
export function operationHead(batch) {
|
|
124
145
|
const writer = batch.writtenBy;
|
|
125
146
|
return writer === undefined
|
|
@@ -129,7 +150,7 @@ export function operationHead(batch) {
|
|
|
129
150
|
export function batchPaths(changes) {
|
|
130
151
|
return [
|
|
131
152
|
...new Set(changes.flatMap((change) => change.op === 'rename' ? [String(change.path), String(change.to)] : [String(change.path)])),
|
|
132
|
-
]
|
|
153
|
+
];
|
|
133
154
|
}
|
|
134
155
|
export function deltaBody(changes) {
|
|
135
156
|
return JSON.stringify({ changes });
|
|
@@ -144,16 +165,19 @@ export function uploadable(inline, bytes, bounds) {
|
|
|
144
165
|
export function deltaDigest(delta) {
|
|
145
166
|
return sha256Hex(delta);
|
|
146
167
|
}
|
|
147
|
-
function material(value, handle) {
|
|
168
|
+
function* material(value, handle, within = () => true) {
|
|
148
169
|
if (!Array.isArray(value))
|
|
149
170
|
return null;
|
|
150
171
|
const held = [];
|
|
151
172
|
for (const entry of value) {
|
|
173
|
+
yield ROW_WEIGHT;
|
|
152
174
|
if (typeof entry !== 'object' || entry === null)
|
|
153
175
|
return null;
|
|
154
176
|
const file = entry;
|
|
155
177
|
if (typeof file.path !== 'string')
|
|
156
178
|
return null;
|
|
179
|
+
if (!within(file.path))
|
|
180
|
+
continue;
|
|
157
181
|
if (file.content !== null && typeof file.content !== 'string')
|
|
158
182
|
return null;
|
|
159
183
|
if (file.revision !== null && file.revision !== undefined && typeof file.revision !== 'string')
|
|
@@ -181,15 +205,59 @@ function material(value, handle) {
|
|
|
181
205
|
}
|
|
182
206
|
return held;
|
|
183
207
|
}
|
|
184
|
-
function affectedOf(held) {
|
|
208
|
+
function* affectedOf(held) {
|
|
185
209
|
const affected = {};
|
|
186
210
|
for (const entry of held) {
|
|
187
211
|
if (entry.content !== null)
|
|
188
212
|
affected[entry.path] = entry.content;
|
|
213
|
+
yield ROW_WEIGHT;
|
|
189
214
|
}
|
|
190
215
|
return affected;
|
|
191
216
|
}
|
|
192
|
-
|
|
217
|
+
function* acceptedOf(at, contents) {
|
|
218
|
+
const answer = answering();
|
|
219
|
+
for (const entry of contents) {
|
|
220
|
+
yield ROW_WEIGHT + (entry.content?.length ?? 0);
|
|
221
|
+
if (entry.revision === null) {
|
|
222
|
+
answer.removals.add(entry.path);
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
if (entry.content !== null)
|
|
226
|
+
answer.documents.set(entry.path, entry.content);
|
|
227
|
+
if (entry.binary !== undefined)
|
|
228
|
+
answer.binaryFiles.set(entry.path, entry.binary);
|
|
229
|
+
revised(answer, entry.path, entry.revision);
|
|
230
|
+
if (entry.head !== undefined)
|
|
231
|
+
answer.changes.set(entry.path, entry.head);
|
|
232
|
+
}
|
|
233
|
+
const unbinaried = answer.binaryFiles.size === 0;
|
|
234
|
+
const { binaryFiles, ...room } = yield* answered(answer);
|
|
235
|
+
return { roomVersion: roomVersion(at), ...room, ...(unbinaried ? {} : { binaryFiles }) };
|
|
236
|
+
}
|
|
237
|
+
function* movedOutcome(held, move) {
|
|
238
|
+
const authorities = Array.isArray(held.authorities) ? held.authorities : [];
|
|
239
|
+
const at = (authority) => {
|
|
240
|
+
const entry = authorities.find((one) => typeof one === 'object' &&
|
|
241
|
+
one !== null &&
|
|
242
|
+
one.authority === authority);
|
|
243
|
+
return entry === undefined ? null : readPosition(entry);
|
|
244
|
+
};
|
|
245
|
+
const left = at(move.source.authority);
|
|
246
|
+
const arrived = at(move.destination.authority);
|
|
247
|
+
if (left === null || arrived === null)
|
|
248
|
+
return { kind: 'transport-uncertainty' };
|
|
249
|
+
const under = (handle) => (path) => path.startsWith(`/rooms/${handle}/`);
|
|
250
|
+
const leaving = yield* material(held.contents, move.source.handle, under(move.source.handle));
|
|
251
|
+
const arriving = yield* material(held.contents, move.destination.handle, under(move.destination.handle));
|
|
252
|
+
if (leaving === null || arriving === null)
|
|
253
|
+
return { kind: 'transport-uncertainty' };
|
|
254
|
+
return {
|
|
255
|
+
kind: 'accepted',
|
|
256
|
+
...(yield* acceptedOf(left, leaving)),
|
|
257
|
+
destination: yield* acceptedOf(arrived, arriving),
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
export function* mutationOutcome(status, body, locator, handle, move) {
|
|
193
261
|
const refusal = doorRefusal(body);
|
|
194
262
|
if (refusal !== null && refusal.code === 'service_mode_write_halted') {
|
|
195
263
|
return { kind: 'write-halted' };
|
|
@@ -201,10 +269,10 @@ export function mutationOutcome(status, body, locator, handle) {
|
|
|
201
269
|
}
|
|
202
270
|
if (refusal !== null && refusal.code === 'edit_conflict') {
|
|
203
271
|
const { current, ...fields } = refusal.fields;
|
|
204
|
-
const held = material(current, handle) ?? [];
|
|
272
|
+
const held = (yield* material(current, handle)) ?? [];
|
|
205
273
|
return {
|
|
206
274
|
kind: 'conflicted',
|
|
207
|
-
affected: affectedOf(held),
|
|
275
|
+
affected: yield* affectedOf(held),
|
|
208
276
|
code: refusal.code,
|
|
209
277
|
fields,
|
|
210
278
|
retryable: refusal.retryable,
|
|
@@ -228,8 +296,9 @@ export function mutationOutcome(status, body, locator, handle) {
|
|
|
228
296
|
}
|
|
229
297
|
if (classified !== null && classified.kind !== 'scoped-refusal')
|
|
230
298
|
return classified;
|
|
231
|
-
if (classified !== null && status === 403)
|
|
299
|
+
if (classified !== null && status === 403 && refusal?.code === 'operation_denied') {
|
|
232
300
|
return classified;
|
|
301
|
+
}
|
|
233
302
|
if (refusal !== null && status >= 400) {
|
|
234
303
|
return {
|
|
235
304
|
kind: 'rejected',
|
|
@@ -243,40 +312,15 @@ export function mutationOutcome(status, body, locator, handle) {
|
|
|
243
312
|
return { kind: 'transport-uncertainty' };
|
|
244
313
|
}
|
|
245
314
|
const held = body;
|
|
315
|
+
if (move !== undefined)
|
|
316
|
+
return yield* movedOutcome(held, move);
|
|
246
317
|
const at = readPosition(held);
|
|
247
318
|
if (at === null)
|
|
248
319
|
return { kind: 'transport-uncertainty' };
|
|
249
|
-
const contents = material(held.contents, handle);
|
|
320
|
+
const contents = yield* material(held.contents, handle);
|
|
250
321
|
if (contents === null)
|
|
251
322
|
return { kind: 'transport-uncertainty' };
|
|
252
|
-
|
|
253
|
-
const revisions = {};
|
|
254
|
-
const changes = {};
|
|
255
|
-
const binaryFiles = {};
|
|
256
|
-
const removals = [];
|
|
257
|
-
for (const entry of contents) {
|
|
258
|
-
if (entry.revision === null) {
|
|
259
|
-
removals.push(entry.path);
|
|
260
|
-
continue;
|
|
261
|
-
}
|
|
262
|
-
if (entry.content !== null)
|
|
263
|
-
documents[entry.path] = entry.content;
|
|
264
|
-
if (entry.binary !== undefined)
|
|
265
|
-
binaryFiles[entry.path] = entry.binary;
|
|
266
|
-
revisions[entry.path] = entry.revision;
|
|
267
|
-
if (entry.head !== undefined)
|
|
268
|
-
changes[entry.path] = entry.head;
|
|
269
|
-
}
|
|
270
|
-
return {
|
|
271
|
-
kind: 'accepted',
|
|
272
|
-
roomVersion: roomVersion(at),
|
|
273
|
-
documents,
|
|
274
|
-
revisions,
|
|
275
|
-
...identities(revisions),
|
|
276
|
-
changes,
|
|
277
|
-
removals: removals.sort(),
|
|
278
|
-
...(Object.keys(binaryFiles).length === 0 ? {} : { binaryFiles }),
|
|
279
|
-
};
|
|
323
|
+
return { kind: 'accepted', ...(yield* acceptedOf(at, contents)) };
|
|
280
324
|
}
|
|
281
325
|
export function rejectedMapping(mapping) {
|
|
282
326
|
return {
|
|
@@ -297,26 +341,27 @@ export function revisionBody(input) {
|
|
|
297
341
|
function revisionAuthor(entry) {
|
|
298
342
|
const user = entry.author_user;
|
|
299
343
|
const site = entry.author_site;
|
|
300
|
-
const
|
|
301
|
-
|
|
344
|
+
const siteName = entry.author_site_name;
|
|
345
|
+
const inbox = entry.author_inbox;
|
|
346
|
+
const inboxName = entry.author_inbox_name;
|
|
347
|
+
const app = entry.author_app;
|
|
348
|
+
const appName = entry.author_app_name;
|
|
349
|
+
const named = [site, siteName, inbox, inboxName, app, appName].filter((held) => held !== undefined);
|
|
350
|
+
if (typeof user === 'string' && named.length === 0)
|
|
302
351
|
return { kind: 'user', id: user };
|
|
352
|
+
if (user !== null || named.length !== 2)
|
|
353
|
+
return null;
|
|
354
|
+
if (typeof site === 'string' && typeof siteName === 'string') {
|
|
355
|
+
return { kind: 'site', id: site, name: siteName };
|
|
356
|
+
}
|
|
357
|
+
if (typeof inbox === 'string' && typeof inboxName === 'string') {
|
|
358
|
+
return { kind: 'inbox', id: inbox, name: inboxName };
|
|
303
359
|
}
|
|
304
|
-
if (
|
|
305
|
-
return { kind: '
|
|
360
|
+
if (typeof app === 'string' && typeof appName === 'string') {
|
|
361
|
+
return { kind: 'app', id: app, name: appName };
|
|
306
362
|
}
|
|
307
363
|
return null;
|
|
308
364
|
}
|
|
309
|
-
function historyBinary(entry) {
|
|
310
|
-
if (entry.file === undefined)
|
|
311
|
-
return undefined;
|
|
312
|
-
const { file, bytes, media_type: mediaType, sha256 } = entry;
|
|
313
|
-
if (typeof file !== 'string' ||
|
|
314
|
-
typeof bytes !== 'number' ||
|
|
315
|
-
typeof mediaType !== 'string' ||
|
|
316
|
-
typeof sha256 !== 'string')
|
|
317
|
-
return null;
|
|
318
|
-
return { fileRef: file, byteLength: bytes, mediaType, sha256 };
|
|
319
|
-
}
|
|
320
365
|
export function historyOutcome(status, body, locator, request) {
|
|
321
366
|
const classified = classifyDoor(status, body, locator);
|
|
322
367
|
if (classified !== null)
|
|
@@ -347,7 +392,7 @@ export function historyOutcome(status, body, locator, request) {
|
|
|
347
392
|
retryable: false,
|
|
348
393
|
};
|
|
349
394
|
}
|
|
350
|
-
if (typeof named.
|
|
395
|
+
if (typeof named.media_type === 'string')
|
|
351
396
|
return { kind: 'no-history' };
|
|
352
397
|
if (typeof named.content !== 'string')
|
|
353
398
|
return { kind: 'transport-uncertainty' };
|
|
@@ -363,7 +408,7 @@ export function historyOutcome(status, body, locator, request) {
|
|
|
363
408
|
typeof entry.created_at !== 'string') {
|
|
364
409
|
return { kind: 'transport-uncertainty' };
|
|
365
410
|
}
|
|
366
|
-
const binaryFile =
|
|
411
|
+
const binaryFile = binaryFileOf(entry);
|
|
367
412
|
if (binaryFile === null)
|
|
368
413
|
return { kind: 'transport-uncertainty' };
|
|
369
414
|
revisions.push({
|