@agentshouse/mdruntime-adapter 0.1.0-cca5d676bc88e → 0.1.0-ccda1a2da11c3
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 +291 -213
- package/dist/actions.d.ts +69 -2
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +197 -198
- package/dist/adapter.d.ts +1 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +378 -112
- package/dist/discovery.d.ts +7 -6
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +50 -18
- package/dist/gather.d.ts +2 -1
- package/dist/gather.d.ts.map +1 -1
- package/dist/gather.js +15 -20
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/model.d.ts +1 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +21 -7
- package/dist/part.d.ts +13 -0
- package/dist/part.d.ts.map +1 -0
- package/dist/part.js +80 -0
- package/dist/read.d.ts +72 -20
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +353 -155
- package/dist/referrer.d.ts +9 -0
- package/dist/referrer.d.ts.map +1 -0
- package/dist/referrer.js +41 -0
- package/dist/refusal.d.ts +5 -9
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +31 -17
- package/dist/room-types.d.ts +6 -0
- package/dist/room-types.d.ts.map +1 -0
- package/dist/room-types.js +66 -0
- package/dist/site.d.ts +1 -1
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +184 -62
- package/dist/stream.d.ts +6 -4
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +360 -42
- package/dist/transport.d.ts +67 -11
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +3 -1
- package/dist/version.d.ts +1 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/write.d.ts +14 -9
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +172 -47
- package/package.json +3 -4
- package/dist/links.d.ts +0 -20
- package/dist/links.d.ts.map +0 -1
- package/dist/links.js +0 -104
package/dist/actions.d.ts
CHANGED
|
@@ -1,8 +1,75 @@
|
|
|
1
|
-
import { type AcceptedMessage, type ActionDeclaration, type ActionRequest, type ActionResult, type ConversationAgents } from '@agentshouse/mdruntime';
|
|
1
|
+
import { type AcceptedMessage, type ActionDeclaration, type ActionRequest, type ActionResult, type ConversationAgents, type ConversationHistories, type ConversationHistoryRequest, type FileDeclaration } from '@agentshouse/mdruntime';
|
|
2
2
|
import type { HouseDoorAnswer, HouseTransport } from './transport.js';
|
|
3
|
-
|
|
3
|
+
type Operated = {
|
|
4
|
+
readonly operation_id?: string;
|
|
5
|
+
};
|
|
6
|
+
type ConversationControl = Operated & {
|
|
7
|
+
readonly conversation: string;
|
|
8
|
+
};
|
|
9
|
+
export type AppInputs = {
|
|
10
|
+
readonly 'conversation.attach': FileDeclaration & {
|
|
11
|
+
readonly room: string;
|
|
12
|
+
readonly blob: Blob;
|
|
13
|
+
};
|
|
14
|
+
readonly 'conversation.answer': ConversationControl & {
|
|
15
|
+
readonly answer: {
|
|
16
|
+
readonly interaction_id: string;
|
|
17
|
+
readonly response: unknown;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
readonly 'conversation.create': Operated & {
|
|
21
|
+
readonly agent_id: string;
|
|
22
|
+
};
|
|
23
|
+
readonly 'conversation.delete': ConversationControl;
|
|
24
|
+
readonly 'conversation.history': ConversationHistoryRequest;
|
|
25
|
+
readonly 'conversation.interrupt': ConversationControl;
|
|
26
|
+
readonly 'conversation.kill': ConversationControl;
|
|
27
|
+
readonly 'conversation.send': ConversationControl & {
|
|
28
|
+
readonly operation_id: string;
|
|
29
|
+
readonly text: string;
|
|
30
|
+
};
|
|
31
|
+
readonly 'trigger.list': {
|
|
32
|
+
readonly room_refs: readonly string[];
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export type AppAnswers = {
|
|
36
|
+
readonly 'conversation.attach': {
|
|
37
|
+
readonly path: string;
|
|
38
|
+
};
|
|
39
|
+
readonly 'conversation.history': ConversationHistories;
|
|
40
|
+
};
|
|
41
|
+
export type AppAnswerAdditions = {
|
|
42
|
+
readonly 'conversation.create': {
|
|
43
|
+
readonly conversation: string;
|
|
44
|
+
};
|
|
45
|
+
readonly 'conversation.send': {
|
|
46
|
+
readonly turn: string;
|
|
47
|
+
};
|
|
48
|
+
readonly 'record.list': {
|
|
49
|
+
readonly attachments: readonly {
|
|
50
|
+
readonly referrer: {
|
|
51
|
+
readonly room_ref: string;
|
|
52
|
+
readonly record: string;
|
|
53
|
+
};
|
|
54
|
+
}[];
|
|
55
|
+
readonly records: readonly {
|
|
56
|
+
readonly attachments: readonly {
|
|
57
|
+
readonly referrer: {
|
|
58
|
+
readonly room_ref: string;
|
|
59
|
+
readonly record: string;
|
|
60
|
+
};
|
|
61
|
+
}[];
|
|
62
|
+
}[];
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
export declare const HOUSE_APP_ACTS: Readonly<Record<string, string>>;
|
|
66
|
+
export declare const SITE_SUBMIT = "submit";
|
|
67
|
+
export declare const HOUSE_SITE_ACTS: Readonly<Record<string, string>>;
|
|
68
|
+
export declare const HOUSE_APP_BATCHES: Readonly<Partial<Record<string, readonly string[]>>>;
|
|
69
|
+
export declare function houseConversationAgents(locator: string): ConversationAgents;
|
|
4
70
|
export declare function declaredActions(routes: readonly string[]): readonly ActionDeclaration[];
|
|
5
71
|
export declare function houseAction(transport: HouseTransport, request: ActionRequest): Promise<ActionResult>;
|
|
6
72
|
export declare function actionOutcome(answer: HouseDoorAnswer, name: string): ActionResult;
|
|
7
73
|
export declare function acceptedMessage(entry: unknown): AcceptedMessage | null;
|
|
74
|
+
export {};
|
|
8
75
|
//# sourceMappingURL=actions.d.ts.map
|
package/dist/actions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
|
package/dist/actions.js
CHANGED
|
@@ -1,50 +1,84 @@
|
|
|
1
1
|
import { changeBatchIdentity, } from '@agentshouse/mdruntime';
|
|
2
2
|
import { doorRefusal } from './refusal.js';
|
|
3
|
-
import { PRIVATE_LOCATOR } from './transport.js';
|
|
4
3
|
const HISTORY_PAGE = 100;
|
|
5
4
|
const HISTORY_CONVERSATIONS = 64;
|
|
5
|
+
const TRIGGER_ROOMS = 100;
|
|
6
6
|
const OCTET_STREAM = 'application/octet-stream';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
7
|
+
function mapped(door, input = (given) => given) {
|
|
8
|
+
return {
|
|
9
|
+
door,
|
|
10
|
+
async carry(transport, given, name) {
|
|
11
|
+
return actionOutcome(await transport.door(`/door/${door}`, input(given)), name);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function carried(door, carry, batched, room) {
|
|
16
|
+
return {
|
|
17
|
+
door,
|
|
18
|
+
...(batched === undefined ? {} : { batched }),
|
|
19
|
+
...(room === undefined ? {} : { room }),
|
|
20
|
+
carry: (transport, input, name) => carry(transport, `/door/${door}`, input, name),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const APP_ACTS = {
|
|
24
|
+
'access.read': mapped('rooms/access/read'),
|
|
25
|
+
'conversation.answer': mapped('conversations/interaction/answer', answerBody),
|
|
26
|
+
'conversation.attach': carried('conversations/attach', attachAction, undefined, 'room'),
|
|
27
|
+
'conversation.create': carried('conversations/create', createAction),
|
|
28
|
+
'conversation.delete': mapped('conversations/delete', controlBody),
|
|
29
|
+
'conversation.history': carried('conversations/history', historyAction, ['conversations']),
|
|
30
|
+
'conversation.interrupt': mapped('conversations/interrupt', controlBody),
|
|
31
|
+
'conversation.kill': mapped('conversations/kill', controlBody),
|
|
32
|
+
'conversation.markDone': mapped('conversations/done'),
|
|
33
|
+
'conversation.rename': mapped('conversations/rename'),
|
|
34
|
+
'conversation.retry': mapped('conversations/retry'),
|
|
35
|
+
'conversation.send': carried('conversations/send', sendAction),
|
|
36
|
+
'conversation.setOption': mapped('conversations/option'),
|
|
37
|
+
'feature.list': mapped('apps/features/read'),
|
|
38
|
+
'holder.list': mapped('apps/holders'),
|
|
39
|
+
'holder.ring': mapped('apps/ring'),
|
|
40
|
+
'member.list': mapped('rooms/members'),
|
|
41
|
+
'message.send': mapped('apps/messages/send'),
|
|
42
|
+
'processing.read': mapped('rooms/settings/processing/read'),
|
|
43
|
+
'record.list': carried('records/read', recordsAction),
|
|
44
|
+
'relay.read': mapped('apps/relay'),
|
|
45
|
+
'routine.list': mapped('routines/access'),
|
|
46
|
+
'routineAccess.list': mapped('routines/granted'),
|
|
47
|
+
'routineAllowance.list': mapped('routines/allowance'),
|
|
48
|
+
'routineRequest.list': mapped('routines/requests'),
|
|
49
|
+
'storage.read': mapped('storage/inventory'),
|
|
50
|
+
'trigger.list': carried('triggers/read', triggersAction, ['room_refs'], 'room_refs'),
|
|
51
|
+
'triggerOccurrence.list': mapped('triggers/fired'),
|
|
21
52
|
};
|
|
53
|
+
export const HOUSE_APP_ACTS = Object.fromEntries(Object.entries(APP_ACTS).map(([name, act]) => [name, act.door]));
|
|
54
|
+
export const SITE_SUBMIT = 'submit';
|
|
55
|
+
export const HOUSE_SITE_ACTS = {
|
|
56
|
+
[SITE_SUBMIT]: 'site/submission',
|
|
57
|
+
};
|
|
58
|
+
export const HOUSE_APP_BATCHES = Object.fromEntries(Object.entries(APP_ACTS).flatMap(([name, act]) => act.batched === undefined ? [] : [[name, act.batched]]));
|
|
59
|
+
const APP_NAMES = new Map(Object.entries(APP_ACTS).map(([name, act]) => [act.door, name]));
|
|
60
|
+
const APP_ROOMS = new Map(Object.entries(APP_ACTS).flatMap(([name, act]) => act.room === undefined ? [] : [[name, act.room]]));
|
|
61
|
+
export function houseConversationAgents(locator) {
|
|
62
|
+
return { locator, type: 'house-agent', identity: 'agent', name: 'name', retired: 'retired' };
|
|
63
|
+
}
|
|
22
64
|
export function declaredActions(routes) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
name:
|
|
26
|
-
|
|
27
|
-
resultKind: 'house',
|
|
28
|
-
}));
|
|
65
|
+
return routes.map((route) => {
|
|
66
|
+
const name = APP_NAMES.get(route) ?? route;
|
|
67
|
+
return { name, inputShape: {}, resultKind: 'house', room: APP_ROOMS.get(name) ?? 'room_ref' };
|
|
68
|
+
});
|
|
29
69
|
}
|
|
30
70
|
export function houseAction(transport, request) {
|
|
31
|
-
if (request.name
|
|
32
|
-
return
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return attachAction(transport, request.input);
|
|
37
|
-
if (request.name === 'attachments/get')
|
|
38
|
-
return openAction(transport, request.input);
|
|
71
|
+
if (Object.hasOwn(APP_ACTS, request.name)) {
|
|
72
|
+
return APP_ACTS[request.name].carry(transport, request.input, request.name);
|
|
73
|
+
}
|
|
74
|
+
if (APP_NAMES.has(request.name))
|
|
75
|
+
return Promise.resolve(unimplemented(request.name));
|
|
39
76
|
const route = routeOf(request.name);
|
|
40
77
|
if (route === null)
|
|
41
78
|
return Promise.resolve(malformed());
|
|
42
79
|
return carry(transport, route, request.name, request.input);
|
|
43
80
|
}
|
|
44
81
|
function routeOf(name) {
|
|
45
|
-
const mapped = CONVERSATION_ROUTES.get(name);
|
|
46
|
-
if (mapped !== undefined)
|
|
47
|
-
return mapped;
|
|
48
82
|
const parts = name.split('/');
|
|
49
83
|
if (parts.some((part) => part === '.' || part === '..'))
|
|
50
84
|
return null;
|
|
@@ -66,208 +100,157 @@ function operationId(input) {
|
|
|
66
100
|
return text(input, 'operation_id') ?? changeBatchIdentity();
|
|
67
101
|
}
|
|
68
102
|
function malformed() {
|
|
69
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {} };
|
|
103
|
+
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
70
104
|
}
|
|
71
|
-
function
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
105
|
+
function unimplemented(name) {
|
|
106
|
+
return { kind: 'rejected', code: 'action-unimplemented', fields: { name }, retryable: false };
|
|
107
|
+
}
|
|
108
|
+
function createBody(input) {
|
|
109
|
+
return { agent_id: text(input, 'agent_id'), operation_id: operationId(input) };
|
|
110
|
+
}
|
|
111
|
+
function controlBody(input) {
|
|
112
|
+
return { conversation_id: text(input, 'conversation'), operation_id: operationId(input) };
|
|
113
|
+
}
|
|
114
|
+
function answerBody(input) {
|
|
115
|
+
const nested = record(record(input).answer);
|
|
116
|
+
return {
|
|
117
|
+
conversation_id: text(input, 'conversation'),
|
|
118
|
+
operation_id: operationId(input),
|
|
119
|
+
interaction_id: text(nested, 'interaction_id'),
|
|
120
|
+
response: nested.response,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
async function createAction(transport, route, input, name) {
|
|
124
|
+
const outcome = actionOutcome(await transport.door(route, createBody(input)), name);
|
|
125
|
+
if (outcome.kind !== 'action')
|
|
126
|
+
return outcome;
|
|
127
|
+
const held = record(outcome.result);
|
|
128
|
+
const conversation = text(held, 'conversation_id');
|
|
129
|
+
return conversation === undefined
|
|
130
|
+
? outcome
|
|
131
|
+
: {
|
|
132
|
+
...outcome,
|
|
133
|
+
result: { ...held, conversation },
|
|
87
134
|
};
|
|
88
|
-
}
|
|
89
|
-
return input;
|
|
90
135
|
}
|
|
91
136
|
function withTurn(body) {
|
|
92
137
|
const held = record(body);
|
|
93
138
|
const turn = text(held, 'message_id');
|
|
94
|
-
return turn === undefined
|
|
139
|
+
return turn === undefined
|
|
140
|
+
? body
|
|
141
|
+
: { ...held, turn };
|
|
95
142
|
}
|
|
96
143
|
export function actionOutcome(answer, name) {
|
|
97
144
|
if (answer.status === 401)
|
|
98
145
|
return { kind: 'revoked-authorization' };
|
|
99
146
|
const refusal = doorRefusal(answer.body);
|
|
100
|
-
if (refusal
|
|
101
|
-
return { kind: '
|
|
102
|
-
|
|
147
|
+
if (refusal?.code === 'operation_contended')
|
|
148
|
+
return { kind: 'transport-uncertainty' };
|
|
149
|
+
if (refusal !== null)
|
|
150
|
+
return { kind: 'rejected', ...refusal };
|
|
103
151
|
if (answer.status === 404)
|
|
104
|
-
return
|
|
152
|
+
return unimplemented(name);
|
|
105
153
|
if (answer.status === 0 || answer.status >= 400)
|
|
106
154
|
return { kind: 'transport-uncertainty' };
|
|
107
|
-
if (name === 'conversation.send')
|
|
108
|
-
return { kind: 'action', result: withTurn(answer.body) };
|
|
109
155
|
return { kind: 'action', result: answer.body };
|
|
110
156
|
}
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const sha256 = text(file, 'contentHash');
|
|
120
|
-
if (name === undefined || typeof bytes !== 'number' || sha256 === undefined)
|
|
121
|
-
return null;
|
|
122
|
-
const mediaType = text(file, 'mediaType');
|
|
123
|
-
const width = file.width;
|
|
124
|
-
const height = file.height;
|
|
157
|
+
function referredRecord(view, roomRef) {
|
|
158
|
+
const held = record(view);
|
|
159
|
+
if (roomRef === undefined || typeof held.record !== 'string' || !Array.isArray(held.attachments))
|
|
160
|
+
return view;
|
|
161
|
+
const referrer = {
|
|
162
|
+
room_ref: roomRef,
|
|
163
|
+
record: held.record,
|
|
164
|
+
};
|
|
125
165
|
return {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
bytes,
|
|
129
|
-
sha256,
|
|
130
|
-
...(typeof width === 'number' && typeof height === 'number'
|
|
131
|
-
? { dimensions: { width, height } }
|
|
132
|
-
: {}),
|
|
166
|
+
...held,
|
|
167
|
+
attachments: held.attachments.map((attachment) => ({ ...record(attachment), referrer })),
|
|
133
168
|
};
|
|
134
169
|
}
|
|
135
|
-
function
|
|
136
|
-
const
|
|
137
|
-
if (
|
|
138
|
-
return
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
170
|
+
async function recordsAction(transport, route, input, name) {
|
|
171
|
+
const outcome = actionOutcome(await transport.door(route, input), name);
|
|
172
|
+
if (outcome.kind !== 'action')
|
|
173
|
+
return outcome;
|
|
174
|
+
const roomRef = text(input, 'room_ref');
|
|
175
|
+
const read = record(outcome.result);
|
|
176
|
+
return {
|
|
177
|
+
...outcome,
|
|
178
|
+
result: Array.isArray(read.records)
|
|
179
|
+
? { ...read, records: read.records.map((view) => referredRecord(view, roomRef)) }
|
|
180
|
+
: referredRecord(outcome.result, roomRef),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
async function carry(transport, route, name, input) {
|
|
184
|
+
return actionOutcome(await transport.door(route, input), name);
|
|
149
185
|
}
|
|
150
186
|
function sendBody(input) {
|
|
151
|
-
const
|
|
152
|
-
|
|
187
|
+
const operation = text(input, 'operation_id');
|
|
188
|
+
const said = text(input, 'text');
|
|
189
|
+
if (operation === undefined || said === undefined)
|
|
153
190
|
return null;
|
|
154
|
-
|
|
155
|
-
return {
|
|
156
|
-
conversation_id: text(input, 'conversation'),
|
|
157
|
-
operation_id: operationId(input),
|
|
158
|
-
...(textValue !== undefined && textValue.length > 0 ? { text: textValue } : {}),
|
|
159
|
-
...(files.length === 0 ? {} : { files }),
|
|
160
|
-
};
|
|
191
|
+
return { conversation_id: text(input, 'conversation'), operation_id: operation, text: said };
|
|
161
192
|
}
|
|
162
|
-
async function
|
|
163
|
-
const
|
|
164
|
-
if (
|
|
193
|
+
async function sendAction(transport, route, input, name) {
|
|
194
|
+
const body = sendBody(input);
|
|
195
|
+
if (body === null)
|
|
196
|
+
return malformed();
|
|
197
|
+
const outcome = actionOutcome(await transport.door(route, body), name);
|
|
198
|
+
if (outcome.kind !== 'action')
|
|
199
|
+
return outcome;
|
|
200
|
+
return { ...outcome, result: withTurn(outcome.result) };
|
|
201
|
+
}
|
|
202
|
+
function attachBody(input) {
|
|
203
|
+
const room = text(input, 'room');
|
|
204
|
+
const name = text(input, 'name');
|
|
205
|
+
const sha256 = text(input, 'contentHash');
|
|
206
|
+
const bytes = record(input).byteLength;
|
|
207
|
+
if (room === undefined || name === undefined || sha256 === undefined)
|
|
165
208
|
return null;
|
|
166
|
-
if (
|
|
209
|
+
if (typeof bytes !== 'number')
|
|
167
210
|
return null;
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
211
|
+
const mediaType = text(input, 'mediaType');
|
|
212
|
+
return {
|
|
213
|
+
room_ref: room,
|
|
214
|
+
name,
|
|
215
|
+
bytes,
|
|
216
|
+
sha256,
|
|
217
|
+
media_type: mediaType !== undefined && mediaType.length > 0 ? mediaType : OCTET_STREAM,
|
|
218
|
+
};
|
|
172
219
|
}
|
|
173
|
-
function uploadGrant(
|
|
174
|
-
|
|
175
|
-
return 'absent';
|
|
176
|
-
const upload = record(record(entry).upload);
|
|
220
|
+
function uploadGrant(answer) {
|
|
221
|
+
const upload = record(record(answer).upload);
|
|
177
222
|
if (upload.method !== 'POST')
|
|
178
223
|
return null;
|
|
179
224
|
if (typeof upload.operation !== 'string' || typeof upload.url !== 'string')
|
|
180
225
|
return null;
|
|
181
|
-
return {
|
|
226
|
+
return { operation: upload.operation, url: upload.url };
|
|
182
227
|
}
|
|
183
|
-
async function
|
|
184
|
-
const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const files = Array.isArray(record(input).files) ? record(input).files : [];
|
|
188
|
-
for (const [index, entry] of originals.entries()) {
|
|
189
|
-
const grant = uploadGrant(entry);
|
|
190
|
-
if (grant === 'absent')
|
|
191
|
-
continue;
|
|
192
|
-
if (grant === null)
|
|
193
|
-
return malformed();
|
|
194
|
-
const bytes = index < files.length ? await fileBytes(files[index]) : null;
|
|
195
|
-
if (bytes === null) {
|
|
196
|
-
return { kind: 'rejected', code: 'conversation_original_descriptor_required', fields: {} };
|
|
197
|
-
}
|
|
198
|
-
const failed = delivered(await transport.transfer({
|
|
199
|
-
act: 'conversation_original_upload',
|
|
200
|
-
method: 'POST',
|
|
201
|
-
url: grant.url,
|
|
202
|
-
answer: 'json',
|
|
203
|
-
body: bytes,
|
|
204
|
-
operation: grant.operation,
|
|
205
|
-
}), 'conversation.send');
|
|
206
|
-
if (failed !== null)
|
|
207
|
-
return failed;
|
|
208
|
-
}
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
async function attachAction(transport, input) {
|
|
212
|
-
const { blob, ...descriptor } = record(input);
|
|
213
|
-
const bytes = await fileBytes({ blob });
|
|
214
|
-
if (bytes === null)
|
|
228
|
+
async function attachAction(transport, route, input, name) {
|
|
229
|
+
const body = attachBody(input);
|
|
230
|
+
const blob = record(input).blob;
|
|
231
|
+
if (body === null || !(blob instanceof Blob))
|
|
215
232
|
return malformed();
|
|
216
|
-
const
|
|
217
|
-
const outcome = actionOutcome(answer, 'attachments/upload');
|
|
233
|
+
const outcome = actionOutcome(await transport.door(route, body), name);
|
|
218
234
|
if (outcome.kind !== 'action')
|
|
219
235
|
return outcome;
|
|
220
236
|
const grant = uploadGrant(outcome.result);
|
|
221
|
-
if (grant === 'absent')
|
|
222
|
-
return outcome;
|
|
223
237
|
if (grant === null)
|
|
224
|
-
return
|
|
225
|
-
const
|
|
226
|
-
act: '
|
|
227
|
-
method: 'POST',
|
|
238
|
+
return { kind: 'transport-uncertainty' };
|
|
239
|
+
const sent = await transport.transfer({
|
|
240
|
+
act: 'file_upload',
|
|
228
241
|
url: grant.url,
|
|
229
|
-
|
|
230
|
-
body: bytes,
|
|
242
|
+
body: new Uint8Array(await blob.arrayBuffer()),
|
|
231
243
|
operation: grant.operation,
|
|
232
244
|
});
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
const
|
|
238
|
-
if (
|
|
239
|
-
return outcome;
|
|
240
|
-
const { download, ...opened } = record(outcome.result);
|
|
241
|
-
if (download === undefined)
|
|
242
|
-
return outcome;
|
|
243
|
-
const grant = record(download);
|
|
244
|
-
if (grant.method !== 'GET' || typeof grant.url !== 'string')
|
|
245
|
-
return malformed();
|
|
246
|
-
const read = await transport.transfer({
|
|
247
|
-
act: 'original_download',
|
|
248
|
-
method: 'GET',
|
|
249
|
-
url: grant.url,
|
|
250
|
-
answer: 'bytes',
|
|
251
|
-
});
|
|
252
|
-
const failed = delivered(read, 'attachments/get');
|
|
253
|
-
if (failed !== null)
|
|
254
|
-
return failed;
|
|
255
|
-
if (!(read.body instanceof Blob))
|
|
245
|
+
if (sent.status !== 200) {
|
|
246
|
+
const refusal = doorRefusal(sent.body);
|
|
247
|
+
return refusal === null ? { kind: 'transport-uncertainty' } : { kind: 'rejected', ...refusal };
|
|
248
|
+
}
|
|
249
|
+
const path = text(sent.body, 'path');
|
|
250
|
+
if (path === undefined)
|
|
256
251
|
return { kind: 'transport-uncertainty' };
|
|
257
|
-
|
|
258
|
-
}
|
|
259
|
-
async function sendAction(transport, input) {
|
|
260
|
-
const body = sendBody(input);
|
|
261
|
-
if (body === null)
|
|
262
|
-
return malformed();
|
|
263
|
-
const answer = await transport.door('/door/conversations/send', body);
|
|
264
|
-
const outcome = actionOutcome(answer, 'conversation.send');
|
|
265
|
-
if (outcome.kind !== 'action')
|
|
266
|
-
return outcome;
|
|
267
|
-
const uploaded = await uploadOriginals(transport, input, outcome.result);
|
|
268
|
-
if (uploaded !== null)
|
|
269
|
-
return uploaded;
|
|
270
|
-
return outcome;
|
|
252
|
+
const result = { path };
|
|
253
|
+
return { kind: 'action', result };
|
|
271
254
|
}
|
|
272
255
|
function historyCursor(value) {
|
|
273
256
|
const acceptedAt = text(value, 'accepted_at');
|
|
@@ -296,7 +279,7 @@ export function acceptedMessage(entry) {
|
|
|
296
279
|
turn: text(entry, 'turn_id') ?? cursor.message_id,
|
|
297
280
|
position: position(cursor),
|
|
298
281
|
text: text(entry, 'text') ?? '',
|
|
299
|
-
message: structuredClone(entry),
|
|
282
|
+
message: structuredClone(record(entry)),
|
|
300
283
|
};
|
|
301
284
|
}
|
|
302
285
|
function historyPage(entry) {
|
|
@@ -333,17 +316,33 @@ function historyAsks(input) {
|
|
|
333
316
|
}
|
|
334
317
|
return asks;
|
|
335
318
|
}
|
|
336
|
-
async function
|
|
319
|
+
async function triggersAction(transport, route, input, name) {
|
|
320
|
+
const asked = record(input).room_refs;
|
|
321
|
+
if (!Array.isArray(asked) || asked.length === 0)
|
|
322
|
+
return malformed();
|
|
323
|
+
const rooms = [];
|
|
324
|
+
for (let at = 0; at < asked.length; at += TRIGGER_ROOMS) {
|
|
325
|
+
const outcome = actionOutcome(await transport.door(route, { room_refs: asked.slice(at, at + TRIGGER_ROOMS) }), name);
|
|
326
|
+
if (outcome.kind !== 'action')
|
|
327
|
+
return outcome;
|
|
328
|
+
const answered = record(outcome.result).rooms;
|
|
329
|
+
if (!Array.isArray(answered))
|
|
330
|
+
return { kind: 'transport-uncertainty' };
|
|
331
|
+
rooms.push(...answered);
|
|
332
|
+
}
|
|
333
|
+
return { kind: 'action', result: { rooms } };
|
|
334
|
+
}
|
|
335
|
+
async function historyAction(transport, route, input, name) {
|
|
337
336
|
const asks = historyAsks(input);
|
|
338
337
|
if (asks === null)
|
|
339
338
|
return malformed();
|
|
340
339
|
const histories = [];
|
|
341
340
|
for (let at = 0; at < asks.length; at += HISTORY_CONVERSATIONS) {
|
|
342
|
-
const answer = await transport.door(
|
|
341
|
+
const answer = await transport.door(route, {
|
|
343
342
|
conversations: asks.slice(at, at + HISTORY_CONVERSATIONS),
|
|
344
343
|
limit: HISTORY_PAGE,
|
|
345
344
|
});
|
|
346
|
-
const outcome = actionOutcome(answer,
|
|
345
|
+
const outcome = actionOutcome(answer, name);
|
|
347
346
|
if (outcome.kind !== 'action')
|
|
348
347
|
return outcome;
|
|
349
348
|
const answered = record(outcome.result).histories;
|
package/dist/adapter.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export type AgentsHouseAdapterOptions = {
|
|
|
5
5
|
authorize(): Promise<Authorization>;
|
|
6
6
|
} | {
|
|
7
7
|
site: HouseSiteTransport;
|
|
8
|
+
snapshot?: boolean;
|
|
8
9
|
};
|
|
9
10
|
export declare function createAgentsHouseAdapter(options: AgentsHouseAdapterOptions): Adapter;
|
|
10
11
|
//# sourceMappingURL=adapter.d.ts.map
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,OAAO,EACP,aAAa,EAmBd,MAAM,wBAAwB,CAAC;AAuChC,OAAO,EASL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AA2BxB,MAAM,MAAM,yBAAyB,GACjC;IACE,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC,GACD;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AA4ErD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAunBpF"}
|