@agentshouse/mdruntime-adapter 0.1.0-ce3fe65a95f49 → 0.1.0-ce5ef9afd7e9a

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.
Files changed (50) hide show
  1. package/AGENTS.md +289 -279
  2. package/dist/actions.d.ts +13 -5
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +85 -115
  5. package/dist/adapter.d.ts +1 -0
  6. package/dist/adapter.d.ts.map +1 -1
  7. package/dist/adapter.js +292 -130
  8. package/dist/discovery.d.ts +5 -3
  9. package/dist/discovery.d.ts.map +1 -1
  10. package/dist/discovery.js +29 -10
  11. package/dist/gather.d.ts +1 -1
  12. package/dist/gather.d.ts.map +1 -1
  13. package/dist/gather.js +4 -14
  14. package/dist/index.d.ts +3 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -0
  17. package/dist/part.d.ts +13 -0
  18. package/dist/part.d.ts.map +1 -0
  19. package/dist/part.js +80 -0
  20. package/dist/read.d.ts +64 -20
  21. package/dist/read.d.ts.map +1 -1
  22. package/dist/read.js +296 -105
  23. package/dist/referrer.d.ts +2 -0
  24. package/dist/referrer.d.ts.map +1 -1
  25. package/dist/referrer.js +8 -2
  26. package/dist/room-types.d.ts +6 -0
  27. package/dist/room-types.d.ts.map +1 -0
  28. package/dist/room-types.js +66 -0
  29. package/dist/site.d.ts +1 -1
  30. package/dist/site.d.ts.map +1 -1
  31. package/dist/site.js +143 -118
  32. package/dist/stream.d.ts +5 -4
  33. package/dist/stream.d.ts.map +1 -1
  34. package/dist/stream.js +275 -77
  35. package/dist/transport.d.ts +46 -7
  36. package/dist/transport.d.ts.map +1 -1
  37. package/dist/transport.js +1 -0
  38. package/dist/upload.d.ts +12 -0
  39. package/dist/upload.d.ts.map +1 -0
  40. package/dist/upload.js +52 -0
  41. package/dist/version.d.ts +1 -0
  42. package/dist/version.d.ts.map +1 -1
  43. package/dist/version.js +1 -1
  44. package/dist/write.d.ts +12 -1
  45. package/dist/write.d.ts.map +1 -1
  46. package/dist/write.js +96 -44
  47. package/package.json +2 -2
  48. package/dist/handed.d.ts +0 -15
  49. package/dist/handed.d.ts.map +0 -1
  50. package/dist/handed.js +0 -38
package/dist/actions.d.ts CHANGED
@@ -6,10 +6,11 @@ type Operated = {
6
6
  type ConversationControl = Operated & {
7
7
  readonly conversation: string;
8
8
  };
9
- type SentFile = FileDeclaration & {
10
- readonly blob: Blob;
11
- };
12
9
  export type AppInputs = {
10
+ readonly 'conversation.attach': FileDeclaration & {
11
+ readonly room: string;
12
+ readonly blob: Blob;
13
+ };
13
14
  readonly 'conversation.answer': ConversationControl & {
14
15
  readonly answer: {
15
16
  readonly interaction_id: string;
@@ -18,17 +19,24 @@ export type AppInputs = {
18
19
  };
19
20
  readonly 'conversation.create': Operated & {
20
21
  readonly agent_id: string;
22
+ readonly replaces?: string;
21
23
  };
22
24
  readonly 'conversation.delete': ConversationControl;
23
25
  readonly 'conversation.history': ConversationHistoryRequest;
24
26
  readonly 'conversation.interrupt': ConversationControl;
25
27
  readonly 'conversation.kill': ConversationControl;
26
28
  readonly 'conversation.send': ConversationControl & {
27
- readonly text?: string;
28
- readonly files?: readonly SentFile[];
29
+ readonly operation_id: string;
30
+ readonly text: string;
31
+ };
32
+ readonly 'trigger.list': {
33
+ readonly room_refs: readonly string[];
29
34
  };
30
35
  };
31
36
  export type AppAnswers = {
37
+ readonly 'conversation.attach': {
38
+ readonly path: string;
39
+ };
32
40
  readonly 'conversation.history': ConversationHistories;
33
41
  };
34
42
  export type AppAnswerAdditions = {
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"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"}
package/dist/actions.js CHANGED
@@ -1,7 +1,9 @@
1
1
  import { changeBatchIdentity, } from '@agentshouse/mdruntime';
2
2
  import { doorRefusal } from './refusal.js';
3
+ import { finishedUpload, houseUpload } from './upload.js';
3
4
  const HISTORY_PAGE = 100;
4
5
  const HISTORY_CONVERSATIONS = 64;
6
+ const TRIGGER_ROOMS = 100;
5
7
  const OCTET_STREAM = 'application/octet-stream';
6
8
  function mapped(door, input = (given) => given) {
7
9
  return {
@@ -11,16 +13,18 @@ function mapped(door, input = (given) => given) {
11
13
  },
12
14
  };
13
15
  }
14
- function carried(door, carry, batched) {
16
+ function carried(door, carry, batched, room) {
15
17
  return {
16
18
  door,
17
19
  ...(batched === undefined ? {} : { batched }),
20
+ ...(room === undefined ? {} : { room }),
18
21
  carry: (transport, input, name) => carry(transport, `/door/${door}`, input, name),
19
22
  };
20
23
  }
21
24
  const APP_ACTS = {
22
25
  'access.read': mapped('rooms/access/read'),
23
26
  'conversation.answer': mapped('conversations/interaction/answer', answerBody),
27
+ 'conversation.attach': carried('conversations/attach', attachAction, undefined, 'room'),
24
28
  'conversation.create': carried('conversations/create', createAction),
25
29
  'conversation.delete': mapped('conversations/delete', controlBody),
26
30
  'conversation.history': carried('conversations/history', historyAction, ['conversations']),
@@ -28,11 +32,15 @@ const APP_ACTS = {
28
32
  'conversation.kill': mapped('conversations/kill', controlBody),
29
33
  'conversation.markDone': mapped('conversations/done'),
30
34
  'conversation.rename': mapped('conversations/rename'),
35
+ 'conversation.retry': mapped('conversations/retry'),
31
36
  'conversation.send': carried('conversations/send', sendAction),
32
37
  'conversation.setOption': mapped('conversations/option'),
33
38
  'feature.list': mapped('apps/features/read'),
34
39
  'holder.list': mapped('apps/holders'),
35
40
  'holder.ring': mapped('apps/ring'),
41
+ 'inboxChat.assign': mapped('chats/assign'),
42
+ 'inboxChat.return': mapped('chats/return'),
43
+ 'inboxChat.takeControl': mapped('chats/take-control'),
36
44
  'member.list': mapped('rooms/members'),
37
45
  'message.send': mapped('apps/messages/send'),
38
46
  'processing.read': mapped('rooms/settings/processing/read'),
@@ -43,7 +51,7 @@ const APP_ACTS = {
43
51
  'routineAllowance.list': mapped('routines/allowance'),
44
52
  'routineRequest.list': mapped('routines/requests'),
45
53
  'storage.read': mapped('storage/inventory'),
46
- 'trigger.list': mapped('triggers/read'),
54
+ 'trigger.list': carried('triggers/read', triggersAction, ['room_refs'], 'room_refs'),
47
55
  'triggerOccurrence.list': mapped('triggers/fired'),
48
56
  };
49
57
  export const HOUSE_APP_ACTS = Object.fromEntries(Object.entries(APP_ACTS).map(([name, act]) => [name, act.door]));
@@ -53,15 +61,15 @@ export const HOUSE_SITE_ACTS = {
53
61
  };
54
62
  export const HOUSE_APP_BATCHES = Object.fromEntries(Object.entries(APP_ACTS).flatMap(([name, act]) => act.batched === undefined ? [] : [[name, act.batched]]));
55
63
  const APP_NAMES = new Map(Object.entries(APP_ACTS).map(([name, act]) => [act.door, name]));
64
+ const APP_ROOMS = new Map(Object.entries(APP_ACTS).flatMap(([name, act]) => act.room === undefined ? [] : [[name, act.room]]));
56
65
  export function houseConversationAgents(locator) {
57
66
  return { locator, type: 'house-agent', identity: 'agent', name: 'name', retired: 'retired' };
58
67
  }
59
68
  export function declaredActions(routes) {
60
- return routes.map((route) => ({
61
- name: APP_NAMES.get(route) ?? route,
62
- inputShape: {},
63
- resultKind: 'house',
64
- }));
69
+ return routes.map((route) => {
70
+ const name = APP_NAMES.get(route) ?? route;
71
+ return { name, inputShape: {}, resultKind: 'house', room: APP_ROOMS.get(name) ?? 'room_ref' };
72
+ });
65
73
  }
66
74
  export function houseAction(transport, request) {
67
75
  if (Object.hasOwn(APP_ACTS, request.name)) {
@@ -102,7 +110,12 @@ function unimplemented(name) {
102
110
  return { kind: 'rejected', code: 'action-unimplemented', fields: { name }, retryable: false };
103
111
  }
104
112
  function createBody(input) {
105
- return { agent_id: text(input, 'agent_id'), operation_id: operationId(input) };
113
+ const replaces = text(input, 'replaces');
114
+ return {
115
+ agent_id: text(input, 'agent_id'),
116
+ operation_id: operationId(input),
117
+ ...(replaces === undefined ? {} : { replaces }),
118
+ };
106
119
  }
107
120
  function controlBody(input) {
108
121
  return { conversation_id: text(input, 'conversation'), operation_id: operationId(input) };
@@ -140,6 +153,8 @@ export function actionOutcome(answer, name) {
140
153
  if (answer.status === 401)
141
154
  return { kind: 'revoked-authorization' };
142
155
  const refusal = doorRefusal(answer.body);
156
+ if (refusal?.code === 'operation_contended')
157
+ return { kind: 'transport-uncertainty' };
143
158
  if (refusal !== null)
144
159
  return { kind: 'rejected', ...refusal };
145
160
  if (answer.status === 404)
@@ -177,104 +192,12 @@ async function recordsAction(transport, route, input, name) {
177
192
  async function carry(transport, route, name, input) {
178
193
  return actionOutcome(await transport.door(route, input), name);
179
194
  }
180
- function sendFile(entry) {
181
- const file = record(entry);
182
- const name = text(file, 'name');
183
- const bytes = file.byteLength;
184
- const sha256 = text(file, 'contentHash');
185
- if (name === undefined || typeof bytes !== 'number' || sha256 === undefined)
186
- return null;
187
- const mediaType = text(file, 'mediaType');
188
- const width = file.width;
189
- const height = file.height;
190
- return {
191
- name,
192
- media_type: mediaType !== undefined && mediaType.length > 0 ? mediaType : OCTET_STREAM,
193
- bytes,
194
- sha256,
195
- ...(typeof width === 'number' && typeof height === 'number'
196
- ? { dimensions: { width, height } }
197
- : {}),
198
- };
199
- }
200
- function sendFiles(input) {
201
- const files = record(input).files;
202
- if (files === undefined)
203
- return [];
204
- if (!Array.isArray(files))
205
- return null;
206
- const declared = [];
207
- for (const entry of files) {
208
- const file = sendFile(entry);
209
- if (file === null)
210
- return null;
211
- declared.push(file);
212
- }
213
- return declared;
214
- }
215
195
  function sendBody(input) {
216
- const files = sendFiles(input);
217
- if (files === null)
218
- return null;
219
- const textValue = text(input, 'text');
220
- return {
221
- conversation_id: text(input, 'conversation'),
222
- operation_id: operationId(input),
223
- ...(textValue !== undefined && textValue.length > 0 ? { text: textValue } : {}),
224
- ...(files.length === 0 ? {} : { files }),
225
- };
226
- }
227
- async function fileBytes(file) {
228
- const blob = record(file).blob;
229
- if (blob === undefined || typeof blob !== 'object' || blob === null)
196
+ const operation = text(input, 'operation_id');
197
+ const said = text(input, 'text');
198
+ if (operation === undefined || said === undefined)
230
199
  return null;
231
- if (!('arrayBuffer' in blob) || typeof blob.arrayBuffer !== 'function')
232
- return null;
233
- return new Uint8Array(await blob.arrayBuffer());
234
- }
235
- function delivered(answer, name) {
236
- return answer.status === 200 ? null : actionOutcome(answer, name);
237
- }
238
- function uploadGrant(entry) {
239
- if (!('upload' in record(entry)))
240
- return 'absent';
241
- const upload = record(record(entry).upload);
242
- if (upload.method !== 'POST')
243
- return null;
244
- if (typeof upload.operation !== 'string' || typeof upload.url !== 'string')
245
- return null;
246
- return { method: 'POST', operation: upload.operation, url: upload.url };
247
- }
248
- async function uploadFiles(transport, input, result, name) {
249
- const sent = record(result).files;
250
- if (!Array.isArray(sent) || sent.length === 0)
251
- return null;
252
- const files = Array.isArray(record(input).files) ? record(input).files : [];
253
- for (const [index, entry] of sent.entries()) {
254
- const grant = uploadGrant(entry);
255
- if (grant === 'absent')
256
- continue;
257
- if (grant === null)
258
- return malformed();
259
- const bytes = index < files.length ? await fileBytes(files[index]) : null;
260
- if (bytes === null) {
261
- return {
262
- kind: 'rejected',
263
- code: 'conversation_file_descriptor_required',
264
- fields: {},
265
- retryable: false,
266
- };
267
- }
268
- const failed = delivered(await transport.transfer({
269
- act: 'conversation_file_upload',
270
- url: grant.url,
271
- body: bytes,
272
- operation: grant.operation,
273
- }), name);
274
- if (failed !== null)
275
- return failed;
276
- }
277
- return null;
200
+ return { conversation_id: text(input, 'conversation'), operation_id: operation, text: said };
278
201
  }
279
202
  async function sendAction(transport, route, input, name) {
280
203
  const body = sendBody(input);
@@ -283,11 +206,49 @@ async function sendAction(transport, route, input, name) {
283
206
  const outcome = actionOutcome(await transport.door(route, body), name);
284
207
  if (outcome.kind !== 'action')
285
208
  return outcome;
286
- const uploaded = await uploadFiles(transport, input, outcome.result, name);
287
- if (uploaded !== null)
288
- return uploaded;
289
209
  return { ...outcome, result: withTurn(outcome.result) };
290
210
  }
211
+ function attachBody(input) {
212
+ const room = text(input, 'room');
213
+ const name = text(input, 'name');
214
+ const sha256 = text(input, 'contentHash');
215
+ const bytes = record(input).byteLength;
216
+ if (room === undefined || name === undefined || sha256 === undefined)
217
+ return null;
218
+ if (typeof bytes !== 'number')
219
+ return null;
220
+ const mediaType = text(input, 'mediaType');
221
+ return {
222
+ room_ref: room,
223
+ name,
224
+ bytes,
225
+ sha256,
226
+ media_type: mediaType !== undefined && mediaType.length > 0 ? mediaType : OCTET_STREAM,
227
+ };
228
+ }
229
+ async function attachAction(transport, route, input, name) {
230
+ const body = attachBody(input);
231
+ const blob = record(input).blob;
232
+ if (body === null || !(blob instanceof Blob))
233
+ return malformed();
234
+ const outcome = actionOutcome(await transport.door(route, body), name);
235
+ if (outcome.kind !== 'action')
236
+ return outcome;
237
+ const upload = houseUpload(record(outcome.result).upload);
238
+ if (upload === null)
239
+ return { kind: 'transport-uncertainty' };
240
+ const finished = await finishedUpload(transport, upload, blob);
241
+ if (finished === null)
242
+ return { kind: 'transport-uncertainty' };
243
+ const settled = actionOutcome(finished, name);
244
+ if (settled.kind !== 'action')
245
+ return settled;
246
+ const path = text(settled.result, 'path');
247
+ if (path === undefined)
248
+ return { kind: 'transport-uncertainty' };
249
+ const result = { path };
250
+ return { kind: 'action', result };
251
+ }
291
252
  function historyCursor(value) {
292
253
  const acceptedAt = text(value, 'accepted_at');
293
254
  const messageId = text(value, 'message_id');
@@ -310,19 +271,12 @@ export function acceptedMessage(entry) {
310
271
  const cursor = historyCursor(entry);
311
272
  if (cursor === null)
312
273
  return null;
313
- const message = structuredClone(record(entry));
314
- const referrer = { message: cursor.message_id };
315
274
  return {
316
275
  identity: cursor.message_id,
317
276
  turn: text(entry, 'turn_id') ?? cursor.message_id,
318
277
  position: position(cursor),
319
278
  text: text(entry, 'text') ?? '',
320
- message: Array.isArray(message.files)
321
- ? {
322
- ...message,
323
- files: message.files.map((file) => ({ ...record(file), referrer })),
324
- }
325
- : message,
279
+ message: structuredClone(record(entry)),
326
280
  };
327
281
  }
328
282
  function historyPage(entry) {
@@ -359,6 +313,22 @@ function historyAsks(input) {
359
313
  }
360
314
  return asks;
361
315
  }
316
+ async function triggersAction(transport, route, input, name) {
317
+ const asked = record(input).room_refs;
318
+ if (!Array.isArray(asked) || asked.length === 0)
319
+ return malformed();
320
+ const rooms = [];
321
+ for (let at = 0; at < asked.length; at += TRIGGER_ROOMS) {
322
+ const outcome = actionOutcome(await transport.door(route, { room_refs: asked.slice(at, at + TRIGGER_ROOMS) }), name);
323
+ if (outcome.kind !== 'action')
324
+ return outcome;
325
+ const answered = record(outcome.result).rooms;
326
+ if (!Array.isArray(answered))
327
+ return { kind: 'transport-uncertainty' };
328
+ rooms.push(...answered);
329
+ }
330
+ return { kind: 'action', result: { rooms } };
331
+ }
362
332
  async function historyAction(transport, route, input, name) {
363
333
  const asks = historyAsks(input);
364
334
  if (asks === null)
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
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,OAAO,EACP,aAAa,EAgBd,MAAM,wBAAwB,CAAC;AAuChC,OAAO,EASL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAyBxB,MAAM,MAAM,yBAAyB,GACjC;IACE,SAAS,EAAE,cAAc,CAAC;IAC1B,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;CACrC,GACD;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAwBjC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CA8cpF"}
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;AAwChC,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,CAknBpF"}