@meshagent/meshagent 0.44.11 → 0.44.12

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 (68) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/browser/agent-client.js +1 -1
  3. package/dist/browser/containers-client.js +1 -1
  4. package/dist/browser/datasets-client.d.ts +1 -1
  5. package/dist/browser/datasets-client.js +15 -15
  6. package/dist/browser/developer-client.js +1 -1
  7. package/dist/browser/entrypoint.js +5 -1
  8. package/dist/browser/memory-client.js +1 -1
  9. package/dist/browser/meshagent-client.d.ts +123 -7
  10. package/dist/browser/meshagent-client.js +357 -10
  11. package/dist/browser/messaging-client.js +1 -1
  12. package/dist/browser/queues-client.js +1 -1
  13. package/dist/browser/requirement.d.ts +21 -0
  14. package/dist/browser/requirement.js +87 -1
  15. package/dist/browser/room-client.d.ts +12 -1
  16. package/dist/browser/room-client.js +91 -31
  17. package/dist/browser/secrets-client.js +1 -1
  18. package/dist/browser/services-client.js +2 -2
  19. package/dist/browser/storage-client.d.ts +1 -1
  20. package/dist/browser/storage-client.js +1 -1
  21. package/dist/browser/stream-controller.d.ts +1 -0
  22. package/dist/browser/stream-controller.js +27 -7
  23. package/dist/browser/sync-client.js +1 -1
  24. package/dist/esm/agent-client.js +1 -1
  25. package/dist/esm/containers-client.js +1 -1
  26. package/dist/esm/datasets-client.d.ts +1 -1
  27. package/dist/esm/datasets-client.js +15 -15
  28. package/dist/esm/developer-client.js +1 -1
  29. package/dist/esm/entrypoint.js +6 -1
  30. package/dist/esm/memory-client.js +1 -1
  31. package/dist/esm/meshagent-client.d.ts +123 -7
  32. package/dist/esm/meshagent-client.js +353 -10
  33. package/dist/esm/messaging-client.js +1 -1
  34. package/dist/esm/queues-client.js +1 -1
  35. package/dist/esm/requirement.d.ts +21 -0
  36. package/dist/esm/requirement.js +84 -0
  37. package/dist/esm/room-client.d.ts +12 -1
  38. package/dist/esm/room-client.js +92 -32
  39. package/dist/esm/secrets-client.js +1 -1
  40. package/dist/esm/services-client.js +2 -2
  41. package/dist/esm/storage-client.d.ts +1 -1
  42. package/dist/esm/storage-client.js +1 -1
  43. package/dist/esm/stream-controller.d.ts +1 -0
  44. package/dist/esm/stream-controller.js +27 -7
  45. package/dist/esm/sync-client.js +1 -1
  46. package/dist/node/agent-client.js +1 -1
  47. package/dist/node/containers-client.js +1 -1
  48. package/dist/node/datasets-client.d.ts +1 -1
  49. package/dist/node/datasets-client.js +15 -15
  50. package/dist/node/developer-client.js +1 -1
  51. package/dist/node/entrypoint.js +6 -1
  52. package/dist/node/memory-client.js +1 -1
  53. package/dist/node/meshagent-client.d.ts +123 -7
  54. package/dist/node/meshagent-client.js +357 -10
  55. package/dist/node/messaging-client.js +1 -1
  56. package/dist/node/queues-client.js +1 -1
  57. package/dist/node/requirement.d.ts +21 -0
  58. package/dist/node/requirement.js +87 -1
  59. package/dist/node/room-client.d.ts +12 -1
  60. package/dist/node/room-client.js +91 -31
  61. package/dist/node/secrets-client.js +1 -1
  62. package/dist/node/services-client.js +2 -2
  63. package/dist/node/storage-client.d.ts +1 -1
  64. package/dist/node/storage-client.js +1 -1
  65. package/dist/node/stream-controller.d.ts +1 -0
  66. package/dist/node/stream-controller.js +27 -7
  67. package/dist/node/sync-client.js +1 -1
  68. package/package.json +1 -1
@@ -216,6 +216,7 @@ class RoomClient {
216
216
  this._eventEmitter = new event_emitter_js_1.EventEmitter();
217
217
  this._pendingRequests = new Map();
218
218
  this._toolCallStreams = new Map();
219
+ this._toolCallPreOpenErrors = new Map();
219
220
  this._ignoredResponseLabels = new Map();
220
221
  this._ready = new completer_js_1.Completer();
221
222
  this._roomClosed = new completer_js_1.Completer();
@@ -1199,13 +1200,10 @@ class RoomClient {
1199
1200
  }
1200
1201
  return toolkits;
1201
1202
  }
1202
- async invoke(params) {
1203
- const input = params.input ?? params.arguments ?? new response_js_1.EmptyContent();
1204
- const request = {
1205
- toolkit: params.toolkit,
1206
- tool: params.tool,
1207
- };
1208
- let requestData;
1203
+ _normalizeInvokeInput(input) {
1204
+ if (input === undefined) {
1205
+ return new response_js_1.EmptyContent();
1206
+ }
1209
1207
  if (input instanceof response_js_1.BinaryContent ||
1210
1208
  input instanceof response_js_1.EmptyContent ||
1211
1209
  input instanceof response_js_1.ErrorContent ||
@@ -1213,35 +1211,53 @@ class RoomClient {
1213
1211
  input instanceof response_js_1.JsonContent ||
1214
1212
  input instanceof response_js_1.LinkContent ||
1215
1213
  input instanceof response_js_1.TextContent) {
1216
- const packed = input.pack();
1217
- request["arguments"] = JSON.parse((0, utils_js_1.splitMessageHeader)(packed));
1218
- const payload = (0, utils_js_1.splitMessagePayload)(packed);
1219
- if (payload.length > 0) {
1220
- requestData = payload;
1221
- }
1214
+ return input;
1222
1215
  }
1223
- else if (typeof input === "object" && input !== null && !Array.isArray(input)) {
1224
- request["arguments"] = {
1225
- type: "json",
1226
- json: input,
1227
- };
1216
+ if (typeof input === "object" && input !== null && !Array.isArray(input)) {
1217
+ return new response_js_1.JsonContent({ json: input });
1228
1218
  }
1229
- else {
1230
- throw new room_server_client_js_1.RoomServerException("invoke input must be a content value or JSON object");
1231
- }
1232
- if (params.participantId != null) {
1233
- request["participant_id"] = params.participantId;
1234
- }
1235
- if (params.onBehalfOfId != null) {
1236
- request["on_behalf_of_id"] = params.onBehalfOfId;
1219
+ throw new room_server_client_js_1.RoomServerException("invoke input must be a content value or JSON object");
1220
+ }
1221
+ invoke(params) {
1222
+ const outputPromise = this.invokeToolCall({
1223
+ toolkit: params.toolkit,
1224
+ tool: params.tool,
1225
+ input: this._normalizeInvokeInput(params.input ?? params.arguments),
1226
+ participantId: params.participantId,
1227
+ onBehalfOfId: params.onBehalfOfId,
1228
+ });
1229
+ void outputPromise.catch(() => undefined);
1230
+ return {
1231
+ async *[Symbol.asyncIterator]() {
1232
+ const output = await outputPromise;
1233
+ if (output.kind === "stream") {
1234
+ yield* output.stream;
1235
+ return;
1236
+ }
1237
+ yield output.content;
1238
+ },
1239
+ };
1240
+ }
1241
+ async invokeContent(params) {
1242
+ const output = await this.invokeToolCall({
1243
+ toolkit: params.toolkit,
1244
+ tool: params.tool,
1245
+ input: this._normalizeInvokeInput(params.input ?? params.arguments),
1246
+ participantId: params.participantId,
1247
+ onBehalfOfId: params.onBehalfOfId,
1248
+ });
1249
+ if (output.kind !== "content") {
1250
+ throw new room_server_client_js_1.RoomServerException("unexpected streamed output from " + params.toolkit + "." + params.tool);
1237
1251
  }
1238
- return await this.sendRequest("room.invoke_tool", request, requestData);
1252
+ return output.content;
1239
1253
  }
1240
1254
  async invokeToolCall(params) {
1241
1255
  const toolCallId = `${Date.now()}-${Math.random().toString(16).slice(2)}`;
1242
1256
  const controller = new stream_controller_js_1.StreamController();
1243
1257
  const responseIterator = controller.stream[Symbol.asyncIterator]();
1258
+ const preOpenError = new completer_js_1.Completer();
1244
1259
  this._toolCallStreams.set(toolCallId, controller);
1260
+ this._toolCallPreOpenErrors.set(toolCallId, preOpenError);
1245
1261
  const request = {
1246
1262
  toolkit: params.toolkit,
1247
1263
  tool: params.tool,
@@ -1269,7 +1285,11 @@ class RoomClient {
1269
1285
  request["on_behalf_of_id"] = params.onBehalfOfId;
1270
1286
  }
1271
1287
  try {
1272
- const response = await this.sendRequest("room.invoke_tool", request, requestData);
1288
+ const response = await Promise.race([
1289
+ this.sendRequest("room.invoke_tool", request, requestData),
1290
+ preOpenError.fut,
1291
+ ]);
1292
+ this._toolCallPreOpenErrors.delete(toolCallId);
1273
1293
  if (response instanceof response_js_1.ControlContent && response.method === "open") {
1274
1294
  if (requestTask != null) {
1275
1295
  void requestTask.catch((error) => {
@@ -1277,7 +1297,7 @@ class RoomClient {
1277
1297
  if (stream == null) {
1278
1298
  return;
1279
1299
  }
1280
- stream.add(new response_js_1.ErrorContent({ text: `request stream failed: ${String(error)}` }));
1300
+ stream.addError(error);
1281
1301
  stream.close();
1282
1302
  this._toolCallStreams.delete(toolCallId);
1283
1303
  });
@@ -1301,6 +1321,7 @@ class RoomClient {
1301
1321
  }
1302
1322
  catch (error) {
1303
1323
  await Promise.resolve(requestTask).catch(() => undefined);
1324
+ this._toolCallPreOpenErrors.delete(toolCallId);
1304
1325
  this._toolCallStreams.delete(toolCallId);
1305
1326
  controller.close();
1306
1327
  throw error;
@@ -1338,7 +1359,9 @@ class RoomClient {
1338
1359
  const toolCallId = `${Date.now()}-${Math.random().toString(16).slice(2)}`;
1339
1360
  const controller = new stream_controller_js_1.StreamController();
1340
1361
  const responseIterator = controller.stream[Symbol.asyncIterator]();
1362
+ const preOpenError = new completer_js_1.Completer();
1341
1363
  this._toolCallStreams.set(toolCallId, controller);
1364
+ this._toolCallPreOpenErrors.set(toolCallId, preOpenError);
1342
1365
  const request = {
1343
1366
  toolkit: params.toolkit,
1344
1367
  tool: params.tool,
@@ -1357,11 +1380,24 @@ class RoomClient {
1357
1380
  if (stream == null) {
1358
1381
  return;
1359
1382
  }
1360
- stream.add(new response_js_1.ErrorContent({ text: `request stream failed: ${String(error)}` }));
1383
+ stream.addError(error);
1361
1384
  stream.close();
1362
1385
  this._toolCallStreams.delete(toolCallId);
1363
1386
  });
1364
- const response = await this.sendRequest("room.invoke_tool", request);
1387
+ let response;
1388
+ try {
1389
+ response = await Promise.race([
1390
+ this.sendRequest("room.invoke_tool", request),
1391
+ preOpenError.fut,
1392
+ ]);
1393
+ }
1394
+ catch (error) {
1395
+ this._toolCallPreOpenErrors.delete(toolCallId);
1396
+ this._toolCallStreams.delete(toolCallId);
1397
+ controller.close();
1398
+ throw error;
1399
+ }
1400
+ this._toolCallPreOpenErrors.delete(toolCallId);
1365
1401
  if (!(response instanceof response_js_1.ControlContent) || response.method !== "open") {
1366
1402
  this._toolCallStreams.delete(toolCallId);
1367
1403
  controller.close();
@@ -1418,10 +1454,34 @@ class RoomClient {
1418
1454
  return;
1419
1455
  }
1420
1456
  const content = this._decodeToolCallContent({ header, payload });
1457
+ const preOpenError = this._toolCallPreOpenErrors.get(toolCallId);
1458
+ if (preOpenError != null && content instanceof response_js_1.ErrorContent) {
1459
+ const error = new room_server_client_js_1.RoomServerException(content.text, content.code);
1460
+ if (!preOpenError.completed) {
1461
+ preOpenError.completeError(error);
1462
+ }
1463
+ stream.addError(error);
1464
+ stream.close();
1465
+ this._toolCallStreams.delete(toolCallId);
1466
+ this._toolCallPreOpenErrors.delete(toolCallId);
1467
+ return;
1468
+ }
1469
+ if (content instanceof response_js_1.ControlContent &&
1470
+ content.method === "close" &&
1471
+ content.statusCode !== undefined &&
1472
+ content.statusCode !== response_js_1.ControlCloseStatus.NORMAL) {
1473
+ const error = new room_server_client_js_1.RoomServerException(content.message ?? `tool call stream closed with status ${content.statusCode}`, undefined, { statusCode: content.statusCode });
1474
+ stream.addError(error);
1475
+ stream.close();
1476
+ this._toolCallStreams.delete(toolCallId);
1477
+ this._toolCallPreOpenErrors.delete(toolCallId);
1478
+ return;
1479
+ }
1421
1480
  stream.add(content);
1422
1481
  if (content instanceof response_js_1.ControlContent && content.method === "close") {
1423
1482
  stream.close();
1424
1483
  this._toolCallStreams.delete(toolCallId);
1484
+ this._toolCallPreOpenErrors.delete(toolCallId);
1425
1485
  }
1426
1486
  }
1427
1487
  async _handleResponse(protocol, messageId, _type, data) {
@@ -21,7 +21,7 @@ class SecretsClient {
21
21
  return new room_server_client_js_1.RoomServerException(`unexpected return type from secrets.${operation}`);
22
22
  }
23
23
  async invoke(operation, input) {
24
- return await this.client.invoke({
24
+ return await this.client.invokeContent({
25
25
  toolkit: "secrets",
26
26
  tool: operation,
27
27
  input,
@@ -53,7 +53,7 @@ class ServicesClient {
53
53
  return (await this.listWithState()).services;
54
54
  }
55
55
  async listWithState() {
56
- const response = await this.room.invoke({
56
+ const response = await this.room.invokeContent({
57
57
  toolkit: "services",
58
58
  tool: "list",
59
59
  input: {},
@@ -77,7 +77,7 @@ class ServicesClient {
77
77
  };
78
78
  }
79
79
  async restart(params) {
80
- const response = await this.room.invoke({
80
+ const response = await this.room.invokeContent({
81
81
  toolkit: "services",
82
82
  tool: "restart",
83
83
  input: {
@@ -3,7 +3,7 @@ import { Protocol } from "./protocol.js";
3
3
  import { RoomEvent } from "./room-event.js";
4
4
  import { BinaryContent, FileContent } from "./response.js";
5
5
  import { EventEmitter } from "./event-emitter.js";
6
- type StorageClientRoom = Pick<RoomClient, "invoke" | "invokeStream" | "emit"> & {
6
+ type StorageClientRoom = Pick<RoomClient, "invokeContent" | "invokeStream" | "emit"> & {
7
7
  isActiveProtocol(protocol: Protocol): boolean;
8
8
  protocol: Pick<Protocol, "addHandler">;
9
9
  };
@@ -137,7 +137,7 @@ class StorageClient extends event_emitter_js_1.EventEmitter {
137
137
  });
138
138
  }
139
139
  async _invoke(operation, input) {
140
- return await this.client.invoke({
140
+ return await this.client.invokeContent({
141
141
  toolkit: "storage",
142
142
  tool: operation,
143
143
  input,
@@ -3,5 +3,6 @@ export declare class StreamController<T> {
3
3
  private subs;
4
4
  get stream(): AsyncIterable<T>;
5
5
  add(value: T): void;
6
+ addError(error: unknown): void;
6
7
  close(): void;
7
8
  }
@@ -19,21 +19,26 @@ class StreamController {
19
19
  if (sub.waiter) {
20
20
  const w = sub.waiter;
21
21
  sub.waiter = null;
22
- w({ done: true, value: undefined });
22
+ w.resolve({ done: true, value: undefined });
23
23
  }
24
24
  self.subs.delete(sub);
25
25
  };
26
26
  return {
27
27
  async next() {
28
28
  if (sub.queue.length > 0) {
29
- return { done: false, value: sub.queue.shift() };
29
+ const item = sub.queue.shift();
30
+ if (item.kind === "error") {
31
+ cleanup();
32
+ return Promise.reject(item.error);
33
+ }
34
+ return { done: false, value: item.value };
30
35
  }
31
36
  if (self.closed) {
32
37
  cleanup();
33
38
  return { done: true, value: undefined };
34
39
  }
35
- return new Promise(resolve => {
36
- sub.waiter = resolve;
40
+ return new Promise((resolve, reject) => {
41
+ sub.waiter = { resolve, reject };
37
42
  });
38
43
  },
39
44
  async return() {
@@ -55,10 +60,25 @@ class StreamController {
55
60
  if (sub.waiter) {
56
61
  const w = sub.waiter;
57
62
  sub.waiter = null;
58
- w({ done: false, value });
63
+ w.resolve({ done: false, value });
59
64
  }
60
65
  else {
61
- sub.queue.push(value);
66
+ sub.queue.push({ kind: "value", value });
67
+ }
68
+ }
69
+ }
70
+ addError(error) {
71
+ if (this.closed)
72
+ return;
73
+ for (const sub of [...this.subs]) {
74
+ if (sub.waiter) {
75
+ const w = sub.waiter;
76
+ sub.waiter = null;
77
+ w.reject(error);
78
+ this.subs.delete(sub);
79
+ }
80
+ else {
81
+ sub.queue.push({ kind: "error", error });
62
82
  }
63
83
  }
64
84
  }
@@ -70,7 +90,7 @@ class StreamController {
70
90
  if (sub.waiter) {
71
91
  const w = sub.waiter;
72
92
  sub.waiter = null;
73
- w({ done: true, value: undefined });
93
+ w.resolve({ done: true, value: undefined });
74
94
  }
75
95
  }
76
96
  }
@@ -164,7 +164,7 @@ class SyncClient extends event_emitter_js_1.EventEmitter {
164
164
  return new room_server_client_js_1.RoomServerException(`unexpected return type from sync.${operation}`);
165
165
  }
166
166
  async _invoke(operation, input) {
167
- return await this.room.invoke({
167
+ return await this.room.invokeContent({
168
168
  toolkit: "sync",
169
169
  tool: operation,
170
170
  input,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meshagent/meshagent",
3
- "version": "0.44.11",
3
+ "version": "0.44.12",
4
4
  "description": "Meshagent Client",
5
5
  "homepage": "https://github.com/meshagent/meshagent-ts",
6
6
  "scripts": {