@agentshouse/mdruntime-adapter 0.1.0-cd028205a5103 → 0.1.0-cd23c45caa798
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 +285 -225
- package/dist/actions.d.ts +68 -1
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +196 -193
- package/dist/adapter.d.ts +1 -0
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +384 -103
- package/dist/discovery.d.ts +7 -4
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +46 -13
- package/dist/gather.d.ts +2 -1
- package/dist/gather.d.ts.map +1 -1
- package/dist/gather.js +15 -20
- package/dist/handed.d.ts +15 -0
- package/dist/handed.d.ts.map +1 -0
- package/dist/handed.js +45 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/model.d.ts +1 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +6 -2
- 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 +53 -16
- package/dist/read.d.ts.map +1 -1
- package/dist/read.js +265 -147
- package/dist/referrer.d.ts +7 -0
- package/dist/referrer.d.ts.map +1 -0
- package/dist/referrer.js +33 -0
- package/dist/refusal.d.ts +2 -5
- package/dist/refusal.d.ts.map +1 -1
- package/dist/refusal.js +6 -9
- package/dist/site.d.ts +1 -1
- package/dist/site.d.ts.map +1 -1
- package/dist/site.js +175 -58
- package/dist/stream.d.ts +4 -4
- package/dist/stream.d.ts.map +1 -1
- package/dist/stream.js +340 -42
- package/dist/transport.d.ts +64 -10
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +3 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/write.d.ts +14 -9
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +156 -37
- 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
|
+
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[]>>>;
|
|
3
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":"AAAA,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAE1B,KAAK,0BAA0B,EAC/B,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAUtE,KAAK,QAAQ,GAAG;IAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnD,KAAK,mBAAmB,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,qBAAqB,EAAE,eAAe,GAAG;QAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,qBAAqB,EAAE,mBAAmB,GAAG;QACpD,QAAQ,CAAC,MAAM,EAAE;YAAE,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;SAAE,CAAC;KAClF,CAAC;IACF,QAAQ,CAAC,qBAAqB,EAAE,QAAQ,GAAG;QAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,QAAQ,CAAC,qBAAqB,EAAE,mBAAmB,CAAC;IACpD,QAAQ,CAAC,sBAAsB,EAAE,0BAA0B,CAAC;IAC5D,QAAQ,CAAC,wBAAwB,EAAE,mBAAmB,CAAC;IACvD,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAClD,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,GAAG;QAClD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,cAAc,EAAE;QAAE,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;CACpE,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,qBAAqB,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,QAAQ,CAAC,sBAAsB,EAAE,qBAAqB,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,qBAAqB,EAAE;QAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAClE,QAAQ,CAAC,mBAAmB,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,QAAQ,CAAC,aAAa,EAAE;QACtB,QAAQ,CAAC,WAAW,EAAE,SAAS;YAC7B,QAAQ,CAAC,QAAQ,EAAE;gBAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;aAAE,CAAC;SAC3E,EAAE,CAAC;QACJ,QAAQ,CAAC,OAAO,EAAE,SAAS;YACzB,QAAQ,CAAC,WAAW,EAAE,SAAS;gBAC7B,QAAQ,CAAC,QAAQ,EAAE;oBAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;oBAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;iBAAE,CAAC;aAC3E,EAAE,CAAC;SACL,EAAE,CAAC;KACL,CAAC;CACH,CAAC;AA6EF,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE3D,CAAC;AAEF,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE5D,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAKhF,CAAC;AAYJ,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAE3E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,iBAAiB,EAAE,CAKvF;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAQvB;AA6ED,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAQjF;AAyID,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAUtE"}
|
package/dist/actions.js
CHANGED
|
@@ -2,45 +2,83 @@ import { changeBatchIdentity, } from '@agentshouse/mdruntime';
|
|
|
2
2
|
import { doorRefusal } from './refusal.js';
|
|
3
3
|
const HISTORY_PAGE = 100;
|
|
4
4
|
const HISTORY_CONVERSATIONS = 64;
|
|
5
|
+
const TRIGGER_ROOMS = 100;
|
|
5
6
|
const OCTET_STREAM = 'application/octet-stream';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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'),
|
|
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]]));
|
|
15
61
|
export function houseConversationAgents(locator) {
|
|
16
|
-
return { locator, type: 'house-agent', identity: 'agent', name: 'name' };
|
|
62
|
+
return { locator, type: 'house-agent', identity: 'agent', name: 'name', retired: 'retired' };
|
|
17
63
|
}
|
|
18
64
|
export function declaredActions(routes) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
name:
|
|
22
|
-
|
|
23
|
-
resultKind: 'house',
|
|
24
|
-
}));
|
|
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
|
+
});
|
|
25
69
|
}
|
|
26
70
|
export function houseAction(transport, request) {
|
|
27
|
-
if (request.name
|
|
28
|
-
return
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return attachAction(transport, request.input);
|
|
33
|
-
if (request.name === 'attachments/get')
|
|
34
|
-
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));
|
|
35
76
|
const route = routeOf(request.name);
|
|
36
77
|
if (route === null)
|
|
37
78
|
return Promise.resolve(malformed());
|
|
38
79
|
return carry(transport, route, request.name, request.input);
|
|
39
80
|
}
|
|
40
81
|
function routeOf(name) {
|
|
41
|
-
const mapped = CONVERSATION_ROUTES.get(name);
|
|
42
|
-
if (mapped !== undefined)
|
|
43
|
-
return mapped;
|
|
44
82
|
const parts = name.split('/');
|
|
45
83
|
if (parts.some((part) => part === '.' || part === '..'))
|
|
46
84
|
return null;
|
|
@@ -62,208 +100,157 @@ function operationId(input) {
|
|
|
62
100
|
return text(input, 'operation_id') ?? changeBatchIdentity();
|
|
63
101
|
}
|
|
64
102
|
function malformed() {
|
|
65
|
-
return { kind: 'rejected', code: 'invalid_request', fields: {} };
|
|
103
|
+
return { kind: 'rejected', code: 'invalid_request', fields: {}, retryable: false };
|
|
66
104
|
}
|
|
67
|
-
function
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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 },
|
|
83
134
|
};
|
|
84
|
-
}
|
|
85
|
-
return input;
|
|
86
135
|
}
|
|
87
136
|
function withTurn(body) {
|
|
88
137
|
const held = record(body);
|
|
89
138
|
const turn = text(held, 'message_id');
|
|
90
|
-
return turn === undefined
|
|
139
|
+
return turn === undefined
|
|
140
|
+
? body
|
|
141
|
+
: { ...held, turn };
|
|
91
142
|
}
|
|
92
143
|
export function actionOutcome(answer, name) {
|
|
93
144
|
if (answer.status === 401)
|
|
94
145
|
return { kind: 'revoked-authorization' };
|
|
95
146
|
const refusal = doorRefusal(answer.body);
|
|
96
|
-
if (refusal
|
|
97
|
-
return { kind: '
|
|
98
|
-
|
|
147
|
+
if (refusal?.code === 'operation_contended')
|
|
148
|
+
return { kind: 'transport-uncertainty' };
|
|
149
|
+
if (refusal !== null)
|
|
150
|
+
return { kind: 'rejected', ...refusal };
|
|
99
151
|
if (answer.status === 404)
|
|
100
|
-
return
|
|
152
|
+
return unimplemented(name);
|
|
101
153
|
if (answer.status === 0 || answer.status >= 400)
|
|
102
154
|
return { kind: 'transport-uncertainty' };
|
|
103
|
-
if (name === 'conversation.send')
|
|
104
|
-
return { kind: 'action', result: withTurn(answer.body) };
|
|
105
155
|
return { kind: 'action', result: answer.body };
|
|
106
156
|
}
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const sha256 = text(file, 'contentHash');
|
|
116
|
-
if (name === undefined || typeof bytes !== 'number' || sha256 === undefined)
|
|
117
|
-
return null;
|
|
118
|
-
const mediaType = text(file, 'mediaType');
|
|
119
|
-
const width = file.width;
|
|
120
|
-
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
|
+
};
|
|
121
165
|
return {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
bytes,
|
|
125
|
-
sha256,
|
|
126
|
-
...(typeof width === 'number' && typeof height === 'number'
|
|
127
|
-
? { dimensions: { width, height } }
|
|
128
|
-
: {}),
|
|
166
|
+
...held,
|
|
167
|
+
attachments: held.attachments.map((attachment) => ({ ...record(attachment), referrer })),
|
|
129
168
|
};
|
|
130
169
|
}
|
|
131
|
-
function
|
|
132
|
-
const
|
|
133
|
-
if (
|
|
134
|
-
return
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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);
|
|
145
185
|
}
|
|
146
186
|
function sendBody(input) {
|
|
147
|
-
const
|
|
148
|
-
|
|
187
|
+
const operation = text(input, 'operation_id');
|
|
188
|
+
const said = text(input, 'text');
|
|
189
|
+
if (operation === undefined || said === undefined)
|
|
149
190
|
return null;
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
conversation_id: text(input, 'conversation'),
|
|
153
|
-
operation_id: operationId(input),
|
|
154
|
-
...(textValue !== undefined && textValue.length > 0 ? { text: textValue } : {}),
|
|
155
|
-
...(files.length === 0 ? {} : { files }),
|
|
156
|
-
};
|
|
191
|
+
return { conversation_id: text(input, 'conversation'), operation_id: operation, text: said };
|
|
157
192
|
}
|
|
158
|
-
async function
|
|
159
|
-
const
|
|
160
|
-
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)
|
|
161
208
|
return null;
|
|
162
|
-
if (
|
|
209
|
+
if (typeof bytes !== 'number')
|
|
163
210
|
return null;
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
+
};
|
|
168
219
|
}
|
|
169
|
-
function uploadGrant(
|
|
170
|
-
|
|
171
|
-
return 'absent';
|
|
172
|
-
const upload = record(record(entry).upload);
|
|
220
|
+
function uploadGrant(answer) {
|
|
221
|
+
const upload = record(record(answer).upload);
|
|
173
222
|
if (upload.method !== 'POST')
|
|
174
223
|
return null;
|
|
175
224
|
if (typeof upload.operation !== 'string' || typeof upload.url !== 'string')
|
|
176
225
|
return null;
|
|
177
|
-
return {
|
|
178
|
-
}
|
|
179
|
-
async function uploadOriginals(transport, input, result) {
|
|
180
|
-
const originals = record(result).originals;
|
|
181
|
-
if (!Array.isArray(originals) || originals.length === 0)
|
|
182
|
-
return null;
|
|
183
|
-
const files = Array.isArray(record(input).files) ? record(input).files : [];
|
|
184
|
-
for (const [index, entry] of originals.entries()) {
|
|
185
|
-
const grant = uploadGrant(entry);
|
|
186
|
-
if (grant === 'absent')
|
|
187
|
-
continue;
|
|
188
|
-
if (grant === null)
|
|
189
|
-
return malformed();
|
|
190
|
-
const bytes = index < files.length ? await fileBytes(files[index]) : null;
|
|
191
|
-
if (bytes === null) {
|
|
192
|
-
return { kind: 'rejected', code: 'conversation_original_descriptor_required', fields: {} };
|
|
193
|
-
}
|
|
194
|
-
const failed = delivered(await transport.transfer({
|
|
195
|
-
act: 'conversation_original_upload',
|
|
196
|
-
method: 'POST',
|
|
197
|
-
url: grant.url,
|
|
198
|
-
answer: 'json',
|
|
199
|
-
body: bytes,
|
|
200
|
-
operation: grant.operation,
|
|
201
|
-
}), 'conversation.send');
|
|
202
|
-
if (failed !== null)
|
|
203
|
-
return failed;
|
|
204
|
-
}
|
|
205
|
-
return null;
|
|
226
|
+
return { operation: upload.operation, url: upload.url };
|
|
206
227
|
}
|
|
207
|
-
async function attachAction(transport, input) {
|
|
208
|
-
const
|
|
209
|
-
const
|
|
210
|
-
if (
|
|
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))
|
|
211
232
|
return malformed();
|
|
212
|
-
const
|
|
213
|
-
const outcome = actionOutcome(answer, 'attachments/upload');
|
|
233
|
+
const outcome = actionOutcome(await transport.door(route, body), name);
|
|
214
234
|
if (outcome.kind !== 'action')
|
|
215
235
|
return outcome;
|
|
216
236
|
const grant = uploadGrant(outcome.result);
|
|
217
|
-
if (grant === 'absent')
|
|
218
|
-
return outcome;
|
|
219
237
|
if (grant === null)
|
|
220
|
-
return
|
|
221
|
-
const
|
|
222
|
-
act: '
|
|
223
|
-
method: 'POST',
|
|
238
|
+
return { kind: 'transport-uncertainty' };
|
|
239
|
+
const sent = await transport.transfer({
|
|
240
|
+
act: 'file_upload',
|
|
224
241
|
url: grant.url,
|
|
225
|
-
|
|
226
|
-
body: bytes,
|
|
242
|
+
body: new Uint8Array(await blob.arrayBuffer()),
|
|
227
243
|
operation: grant.operation,
|
|
228
244
|
});
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
const
|
|
234
|
-
if (
|
|
235
|
-
return outcome;
|
|
236
|
-
const { download, ...opened } = record(outcome.result);
|
|
237
|
-
if (download === undefined)
|
|
238
|
-
return outcome;
|
|
239
|
-
const grant = record(download);
|
|
240
|
-
if (grant.method !== 'GET' || typeof grant.url !== 'string')
|
|
241
|
-
return malformed();
|
|
242
|
-
const read = await transport.transfer({
|
|
243
|
-
act: 'original_download',
|
|
244
|
-
method: 'GET',
|
|
245
|
-
url: grant.url,
|
|
246
|
-
answer: 'bytes',
|
|
247
|
-
});
|
|
248
|
-
const failed = delivered(read, 'attachments/get');
|
|
249
|
-
if (failed !== null)
|
|
250
|
-
return failed;
|
|
251
|
-
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)
|
|
252
251
|
return { kind: 'transport-uncertainty' };
|
|
253
|
-
|
|
254
|
-
}
|
|
255
|
-
async function sendAction(transport, input) {
|
|
256
|
-
const body = sendBody(input);
|
|
257
|
-
if (body === null)
|
|
258
|
-
return malformed();
|
|
259
|
-
const answer = await transport.door('/door/conversations/send', body);
|
|
260
|
-
const outcome = actionOutcome(answer, 'conversation.send');
|
|
261
|
-
if (outcome.kind !== 'action')
|
|
262
|
-
return outcome;
|
|
263
|
-
const uploaded = await uploadOriginals(transport, input, outcome.result);
|
|
264
|
-
if (uploaded !== null)
|
|
265
|
-
return uploaded;
|
|
266
|
-
return outcome;
|
|
252
|
+
const result = { path };
|
|
253
|
+
return { kind: 'action', result };
|
|
267
254
|
}
|
|
268
255
|
function historyCursor(value) {
|
|
269
256
|
const acceptedAt = text(value, 'accepted_at');
|
|
@@ -292,7 +279,7 @@ export function acceptedMessage(entry) {
|
|
|
292
279
|
turn: text(entry, 'turn_id') ?? cursor.message_id,
|
|
293
280
|
position: position(cursor),
|
|
294
281
|
text: text(entry, 'text') ?? '',
|
|
295
|
-
message: structuredClone(entry),
|
|
282
|
+
message: structuredClone(record(entry)),
|
|
296
283
|
};
|
|
297
284
|
}
|
|
298
285
|
function historyPage(entry) {
|
|
@@ -329,17 +316,33 @@ function historyAsks(input) {
|
|
|
329
316
|
}
|
|
330
317
|
return asks;
|
|
331
318
|
}
|
|
332
|
-
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) {
|
|
333
336
|
const asks = historyAsks(input);
|
|
334
337
|
if (asks === null)
|
|
335
338
|
return malformed();
|
|
336
339
|
const histories = [];
|
|
337
340
|
for (let at = 0; at < asks.length; at += HISTORY_CONVERSATIONS) {
|
|
338
|
-
const answer = await transport.door(
|
|
341
|
+
const answer = await transport.door(route, {
|
|
339
342
|
conversations: asks.slice(at, at + HISTORY_CONVERSATIONS),
|
|
340
343
|
limit: HISTORY_PAGE,
|
|
341
344
|
});
|
|
342
|
-
const outcome = actionOutcome(answer,
|
|
345
|
+
const outcome = actionOutcome(answer, name);
|
|
343
346
|
if (outcome.kind !== 'action')
|
|
344
347
|
return outcome;
|
|
345
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;AA6ChC,OAAO,EASL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AA0BxB,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;AAuFrD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CA2mBpF"}
|