@agentshouse/mdruntime-adapter 0.1.0-ce4626067e686 → 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 (55) hide show
  1. package/AGENTS.md +289 -246
  2. package/dist/actions.d.ts +68 -1
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +134 -110
  5. package/dist/adapter.d.ts +1 -0
  6. package/dist/adapter.d.ts.map +1 -1
  7. package/dist/adapter.js +335 -98
  8. package/dist/discovery.d.ts +5 -3
  9. package/dist/discovery.d.ts.map +1 -1
  10. package/dist/discovery.js +34 -12
  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 +4 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +3 -1
  17. package/dist/model.d.ts +0 -1
  18. package/dist/model.d.ts.map +1 -1
  19. package/dist/model.js +0 -3
  20. package/dist/part.d.ts +13 -0
  21. package/dist/part.d.ts.map +1 -0
  22. package/dist/part.js +80 -0
  23. package/dist/read.d.ts +70 -23
  24. package/dist/read.d.ts.map +1 -1
  25. package/dist/read.js +351 -136
  26. package/dist/referrer.d.ts +9 -0
  27. package/dist/referrer.d.ts.map +1 -0
  28. package/dist/referrer.js +41 -0
  29. package/dist/refusal.d.ts.map +1 -1
  30. package/dist/refusal.js +2 -1
  31. package/dist/room-types.d.ts +6 -0
  32. package/dist/room-types.d.ts.map +1 -0
  33. package/dist/room-types.js +66 -0
  34. package/dist/site.d.ts +1 -1
  35. package/dist/site.d.ts.map +1 -1
  36. package/dist/site.js +170 -56
  37. package/dist/stream.d.ts +5 -4
  38. package/dist/stream.d.ts.map +1 -1
  39. package/dist/stream.js +355 -42
  40. package/dist/transport.d.ts +67 -8
  41. package/dist/transport.d.ts.map +1 -1
  42. package/dist/transport.js +4 -0
  43. package/dist/upload.d.ts +12 -0
  44. package/dist/upload.d.ts.map +1 -0
  45. package/dist/upload.js +52 -0
  46. package/dist/version.d.ts +1 -0
  47. package/dist/version.d.ts.map +1 -1
  48. package/dist/version.js +1 -1
  49. package/dist/write.d.ts +13 -9
  50. package/dist/write.d.ts.map +1 -1
  51. package/dist/write.js +141 -40
  52. package/package.json +2 -3
  53. package/dist/links.d.ts +0 -20
  54. package/dist/links.d.ts.map +0 -1
  55. package/dist/links.js +0 -104
package/dist/actions.d.ts CHANGED
@@ -1,9 +1,76 @@
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
+ readonly replaces?: string;
23
+ };
24
+ readonly 'conversation.delete': ConversationControl;
25
+ readonly 'conversation.history': ConversationHistoryRequest;
26
+ readonly 'conversation.interrupt': ConversationControl;
27
+ readonly 'conversation.kill': ConversationControl;
28
+ readonly 'conversation.send': ConversationControl & {
29
+ readonly operation_id: string;
30
+ readonly text: string;
31
+ };
32
+ readonly 'trigger.list': {
33
+ readonly room_refs: readonly string[];
34
+ };
35
+ };
36
+ export type AppAnswers = {
37
+ readonly 'conversation.attach': {
38
+ readonly path: string;
39
+ };
40
+ readonly 'conversation.history': ConversationHistories;
41
+ };
42
+ export type AppAnswerAdditions = {
43
+ readonly 'conversation.create': {
44
+ readonly conversation: string;
45
+ };
46
+ readonly 'conversation.send': {
47
+ readonly turn: string;
48
+ };
49
+ readonly 'record.list': {
50
+ readonly attachments: readonly {
51
+ readonly referrer: {
52
+ readonly room_ref: string;
53
+ readonly record: string;
54
+ };
55
+ }[];
56
+ readonly records: readonly {
57
+ readonly attachments: readonly {
58
+ readonly referrer: {
59
+ readonly room_ref: string;
60
+ readonly record: string;
61
+ };
62
+ }[];
63
+ }[];
64
+ };
65
+ };
3
66
  export declare const HOUSE_APP_ACTS: Readonly<Record<string, string>>;
67
+ export declare const SITE_SUBMIT = "submit";
68
+ export declare const HOUSE_SITE_ACTS: Readonly<Record<string, string>>;
69
+ export declare const HOUSE_APP_BATCHES: Readonly<Partial<Record<string, readonly string[]>>>;
4
70
  export declare function houseConversationAgents(locator: string): ConversationAgents;
5
71
  export declare function declaredActions(routes: readonly string[]): readonly ActionDeclaration[];
6
72
  export declare function houseAction(transport: HouseTransport, request: ActionRequest): Promise<ActionResult>;
7
73
  export declare function actionOutcome(answer: HouseDoorAnswer, name: string): ActionResult;
8
74
  export declare function acceptedMessage(entry: unknown): AcceptedMessage | null;
75
+ export {};
9
76
  //# sourceMappingURL=actions.d.ts.map
@@ -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,EAGxB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAiEtE,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE3D,CAAC;AAMF,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAE3E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,iBAAiB,EAAE,CAMvF;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,cAAc,EACzB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,YAAY,CAAC,CAQvB;AAyDD,wBAAgB,aAAa,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAOjF;AAqJD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,IAAI,CAUtE"}
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,51 +13,63 @@ function mapped(door, input = (given) => given) {
11
13
  },
12
14
  };
13
15
  }
14
- function carried(door, carry) {
16
+ function carried(door, carry, batched, room) {
15
17
  return {
16
18
  door,
19
+ ...(batched === undefined ? {} : { batched }),
20
+ ...(room === undefined ? {} : { room }),
17
21
  carry: (transport, input, name) => carry(transport, `/door/${door}`, input, name),
18
22
  };
19
23
  }
20
24
  const APP_ACTS = {
21
25
  'access.read': mapped('rooms/access/read'),
22
26
  'conversation.answer': mapped('conversations/interaction/answer', answerBody),
23
- 'conversation.create': mapped('conversations/create', createBody),
27
+ 'conversation.attach': carried('conversations/attach', attachAction, undefined, 'room'),
28
+ 'conversation.create': carried('conversations/create', createAction),
24
29
  'conversation.delete': mapped('conversations/delete', controlBody),
25
- 'conversation.history': carried('conversations/history', historyAction),
30
+ 'conversation.history': carried('conversations/history', historyAction, ['conversations']),
26
31
  'conversation.interrupt': mapped('conversations/interrupt', controlBody),
27
32
  'conversation.kill': mapped('conversations/kill', controlBody),
28
33
  'conversation.markDone': mapped('conversations/done'),
29
34
  'conversation.rename': mapped('conversations/rename'),
35
+ 'conversation.retry': mapped('conversations/retry'),
30
36
  'conversation.send': carried('conversations/send', sendAction),
31
37
  'conversation.setOption': mapped('conversations/option'),
32
38
  'feature.list': mapped('apps/features/read'),
33
39
  'holder.list': mapped('apps/holders'),
34
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'),
35
44
  'member.list': mapped('rooms/members'),
36
45
  'message.send': mapped('apps/messages/send'),
37
46
  'processing.read': mapped('rooms/settings/processing/read'),
38
- 'record.list': mapped('records/read'),
47
+ 'record.list': carried('records/read', recordsAction),
39
48
  'relay.read': mapped('apps/relay'),
40
49
  'routine.list': mapped('routines/access'),
41
50
  'routineAccess.list': mapped('routines/granted'),
42
51
  'routineAllowance.list': mapped('routines/allowance'),
43
52
  'routineRequest.list': mapped('routines/requests'),
44
53
  'storage.read': mapped('storage/inventory'),
45
- 'trigger.list': mapped('triggers/read'),
54
+ 'trigger.list': carried('triggers/read', triggersAction, ['room_refs'], 'room_refs'),
46
55
  'triggerOccurrence.list': mapped('triggers/fired'),
47
56
  };
48
57
  export const HOUSE_APP_ACTS = Object.fromEntries(Object.entries(APP_ACTS).map(([name, act]) => [name, act.door]));
58
+ export const SITE_SUBMIT = 'submit';
59
+ export const HOUSE_SITE_ACTS = {
60
+ [SITE_SUBMIT]: 'site/submission',
61
+ };
62
+ export const HOUSE_APP_BATCHES = Object.fromEntries(Object.entries(APP_ACTS).flatMap(([name, act]) => act.batched === undefined ? [] : [[name, act.batched]]));
49
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]]));
50
65
  export function houseConversationAgents(locator) {
51
- return { locator, type: 'house-agent', identity: 'agent', name: 'name' };
66
+ return { locator, type: 'house-agent', identity: 'agent', name: 'name', retired: 'retired' };
52
67
  }
53
68
  export function declaredActions(routes) {
54
- return routes.map((route) => ({
55
- name: APP_NAMES.get(route) ?? route,
56
- inputShape: {},
57
- resultKind: 'house',
58
- }));
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
+ });
59
73
  }
60
74
  export function houseAction(transport, request) {
61
75
  if (Object.hasOwn(APP_ACTS, request.name)) {
@@ -96,7 +110,12 @@ function unimplemented(name) {
96
110
  return { kind: 'rejected', code: 'action-unimplemented', fields: { name }, retryable: false };
97
111
  }
98
112
  function createBody(input) {
99
- 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
+ };
100
119
  }
101
120
  function controlBody(input) {
102
121
  return { conversation_id: text(input, 'conversation'), operation_id: operationId(input) };
@@ -110,15 +129,32 @@ function answerBody(input) {
110
129
  response: nested.response,
111
130
  };
112
131
  }
132
+ async function createAction(transport, route, input, name) {
133
+ const outcome = actionOutcome(await transport.door(route, createBody(input)), name);
134
+ if (outcome.kind !== 'action')
135
+ return outcome;
136
+ const held = record(outcome.result);
137
+ const conversation = text(held, 'conversation_id');
138
+ return conversation === undefined
139
+ ? outcome
140
+ : {
141
+ ...outcome,
142
+ result: { ...held, conversation },
143
+ };
144
+ }
113
145
  function withTurn(body) {
114
146
  const held = record(body);
115
147
  const turn = text(held, 'message_id');
116
- return turn === undefined ? body : { ...held, turn };
148
+ return turn === undefined
149
+ ? body
150
+ : { ...held, turn };
117
151
  }
118
152
  export function actionOutcome(answer, name) {
119
153
  if (answer.status === 401)
120
154
  return { kind: 'revoked-authorization' };
121
155
  const refusal = doorRefusal(answer.body);
156
+ if (refusal?.code === 'operation_contended')
157
+ return { kind: 'transport-uncertainty' };
122
158
  if (refusal !== null)
123
159
  return { kind: 'rejected', ...refusal };
124
160
  if (answer.status === 404)
@@ -127,107 +163,41 @@ export function actionOutcome(answer, name) {
127
163
  return { kind: 'transport-uncertainty' };
128
164
  return { kind: 'action', result: answer.body };
129
165
  }
130
- async function carry(transport, route, name, input) {
131
- return actionOutcome(await transport.door(route, input), name);
132
- }
133
- function sendFile(entry) {
134
- const file = record(entry);
135
- const name = text(file, 'name');
136
- const bytes = file.byteLength;
137
- const sha256 = text(file, 'contentHash');
138
- if (name === undefined || typeof bytes !== 'number' || sha256 === undefined)
139
- return null;
140
- const mediaType = text(file, 'mediaType');
141
- const width = file.width;
142
- const height = file.height;
166
+ function referredRecord(view, roomRef) {
167
+ const held = record(view);
168
+ if (roomRef === undefined || typeof held.record !== 'string' || !Array.isArray(held.attachments))
169
+ return view;
170
+ const referrer = {
171
+ room_ref: roomRef,
172
+ record: held.record,
173
+ };
143
174
  return {
144
- name,
145
- media_type: mediaType !== undefined && mediaType.length > 0 ? mediaType : OCTET_STREAM,
146
- bytes,
147
- sha256,
148
- ...(typeof width === 'number' && typeof height === 'number'
149
- ? { dimensions: { width, height } }
150
- : {}),
175
+ ...held,
176
+ attachments: held.attachments.map((attachment) => ({ ...record(attachment), referrer })),
151
177
  };
152
178
  }
153
- function sendFiles(input) {
154
- const files = record(input).files;
155
- if (files === undefined)
156
- return [];
157
- if (!Array.isArray(files))
158
- return null;
159
- const declared = [];
160
- for (const entry of files) {
161
- const file = sendFile(entry);
162
- if (file === null)
163
- return null;
164
- declared.push(file);
165
- }
166
- return declared;
167
- }
168
- function sendBody(input) {
169
- const files = sendFiles(input);
170
- if (files === null)
171
- return null;
172
- const textValue = text(input, 'text');
179
+ async function recordsAction(transport, route, input, name) {
180
+ const outcome = actionOutcome(await transport.door(route, input), name);
181
+ if (outcome.kind !== 'action')
182
+ return outcome;
183
+ const roomRef = text(input, 'room_ref');
184
+ const read = record(outcome.result);
173
185
  return {
174
- conversation_id: text(input, 'conversation'),
175
- operation_id: operationId(input),
176
- ...(textValue !== undefined && textValue.length > 0 ? { text: textValue } : {}),
177
- ...(files.length === 0 ? {} : { files }),
186
+ ...outcome,
187
+ result: Array.isArray(read.records)
188
+ ? { ...read, records: read.records.map((view) => referredRecord(view, roomRef)) }
189
+ : referredRecord(outcome.result, roomRef),
178
190
  };
179
191
  }
180
- async function fileBytes(file) {
181
- const blob = record(file).blob;
182
- if (blob === undefined || typeof blob !== 'object' || blob === null)
183
- return null;
184
- if (!('arrayBuffer' in blob) || typeof blob.arrayBuffer !== 'function')
185
- return null;
186
- return new Uint8Array(await blob.arrayBuffer());
187
- }
188
- function delivered(answer, name) {
189
- return answer.status === 200 ? null : actionOutcome(answer, name);
190
- }
191
- function uploadGrant(entry) {
192
- if (!('upload' in record(entry)))
193
- return 'absent';
194
- const upload = record(record(entry).upload);
195
- if (upload.method !== 'POST')
196
- return null;
197
- if (typeof upload.operation !== 'string' || typeof upload.url !== 'string')
198
- return null;
199
- return { method: 'POST', operation: upload.operation, url: upload.url };
192
+ async function carry(transport, route, name, input) {
193
+ return actionOutcome(await transport.door(route, input), name);
200
194
  }
201
- async function uploadFiles(transport, input, result, name) {
202
- const sent = record(result).files;
203
- if (!Array.isArray(sent) || sent.length === 0)
195
+ function sendBody(input) {
196
+ const operation = text(input, 'operation_id');
197
+ const said = text(input, 'text');
198
+ if (operation === undefined || said === undefined)
204
199
  return null;
205
- const files = Array.isArray(record(input).files) ? record(input).files : [];
206
- for (const [index, entry] of sent.entries()) {
207
- const grant = uploadGrant(entry);
208
- if (grant === 'absent')
209
- continue;
210
- if (grant === null)
211
- return malformed();
212
- const bytes = index < files.length ? await fileBytes(files[index]) : null;
213
- if (bytes === null) {
214
- return {
215
- kind: 'rejected',
216
- code: 'conversation_file_descriptor_required',
217
- fields: {},
218
- retryable: false,
219
- };
220
- }
221
- const failed = delivered(await transport.transfer({
222
- act: 'conversation_file_upload',
223
- url: grant.url,
224
- body: bytes,
225
- operation: grant.operation,
226
- }), name);
227
- if (failed !== null)
228
- return failed;
229
- }
230
- return null;
200
+ return { conversation_id: text(input, 'conversation'), operation_id: operation, text: said };
231
201
  }
232
202
  async function sendAction(transport, route, input, name) {
233
203
  const body = sendBody(input);
@@ -236,11 +206,49 @@ async function sendAction(transport, route, input, name) {
236
206
  const outcome = actionOutcome(await transport.door(route, body), name);
237
207
  if (outcome.kind !== 'action')
238
208
  return outcome;
239
- const uploaded = await uploadFiles(transport, input, outcome.result, name);
240
- if (uploaded !== null)
241
- return uploaded;
242
209
  return { ...outcome, result: withTurn(outcome.result) };
243
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
+ }
244
252
  function historyCursor(value) {
245
253
  const acceptedAt = text(value, 'accepted_at');
246
254
  const messageId = text(value, 'message_id');
@@ -268,7 +276,7 @@ export function acceptedMessage(entry) {
268
276
  turn: text(entry, 'turn_id') ?? cursor.message_id,
269
277
  position: position(cursor),
270
278
  text: text(entry, 'text') ?? '',
271
- message: structuredClone(entry),
279
+ message: structuredClone(record(entry)),
272
280
  };
273
281
  }
274
282
  function historyPage(entry) {
@@ -305,6 +313,22 @@ function historyAsks(input) {
305
313
  }
306
314
  return asks;
307
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
+ }
308
332
  async function historyAction(transport, route, input, name) {
309
333
  const asks = historyAsks(input);
310
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,EAWd,MAAM,wBAAwB,CAAC;AAuChC,OAAO,EAOL,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,CAuYpF"}
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"}