@relevanceai/sdk 3.0.0-alpha.3 → 3.0.0-alpha.5

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 (72) hide show
  1. package/README.md +195 -100
  2. package/esm/agent.d.ts +41 -8
  3. package/esm/agent.js +150 -13
  4. package/esm/client.d.ts +6 -1
  5. package/esm/client.js +38 -4
  6. package/esm/event.d.ts +6 -25
  7. package/esm/event.js +4 -19
  8. package/esm/key.d.ts +1 -1
  9. package/esm/message/agent-error.d.ts +7 -2
  10. package/esm/message/agent-error.js +8 -2
  11. package/esm/message/agent.d.ts +2 -2
  12. package/esm/message/agent.js +2 -2
  13. package/esm/message/task.d.ts +25 -4
  14. package/esm/message/task.js +26 -2
  15. package/esm/message/tool.d.ts +16 -6
  16. package/esm/message/tool.js +32 -6
  17. package/esm/message/user.d.ts +2 -2
  18. package/esm/message/user.js +2 -2
  19. package/esm/message/workforce-agent-handover.d.ts +23 -0
  20. package/esm/message/workforce-agent-handover.js +3 -0
  21. package/esm/message/workforce-agent.d.ts +23 -0
  22. package/esm/message/workforce-agent.js +3 -0
  23. package/esm/mod.d.ts +1 -6
  24. package/esm/mod.js +1 -1
  25. package/esm/task/agent-strategy.d.ts +26 -0
  26. package/esm/task/agent-strategy.js +63 -0
  27. package/esm/task/task.d.ts +59 -0
  28. package/esm/task/task.js +166 -0
  29. package/esm/task/workforce-strategy.d.ts +17 -0
  30. package/esm/task/workforce-strategy.js +68 -0
  31. package/esm/utils.d.ts +1 -0
  32. package/esm/utils.js +4 -0
  33. package/esm/workforce.d.ts +22 -0
  34. package/esm/workforce.js +50 -0
  35. package/package.json +1 -1
  36. package/script/agent.d.ts +41 -8
  37. package/script/agent.js +151 -13
  38. package/script/client.d.ts +6 -1
  39. package/script/client.js +37 -3
  40. package/script/event.d.ts +6 -25
  41. package/script/event.js +6 -23
  42. package/script/key.d.ts +1 -1
  43. package/script/message/agent-error.d.ts +7 -2
  44. package/script/message/agent-error.js +7 -1
  45. package/script/message/agent.d.ts +2 -2
  46. package/script/message/agent.js +1 -1
  47. package/script/message/task.d.ts +25 -4
  48. package/script/message/task.js +28 -4
  49. package/script/message/tool.d.ts +16 -6
  50. package/script/message/tool.js +31 -5
  51. package/script/message/user.d.ts +2 -2
  52. package/script/message/user.js +1 -1
  53. package/script/message/workforce-agent-handover.d.ts +23 -0
  54. package/script/message/workforce-agent-handover.js +7 -0
  55. package/script/message/workforce-agent.d.ts +23 -0
  56. package/script/message/workforce-agent.js +7 -0
  57. package/script/mod.d.ts +1 -6
  58. package/script/mod.js +3 -3
  59. package/script/task/agent-strategy.d.ts +26 -0
  60. package/script/task/agent-strategy.js +67 -0
  61. package/script/task/task.d.ts +59 -0
  62. package/script/task/task.js +170 -0
  63. package/script/task/workforce-strategy.d.ts +17 -0
  64. package/script/task/workforce-strategy.js +72 -0
  65. package/script/utils.d.ts +1 -0
  66. package/script/utils.js +5 -0
  67. package/script/workforce.d.ts +22 -0
  68. package/script/workforce.js +54 -0
  69. package/esm/task.d.ts +0 -57
  70. package/esm/task.js +0 -259
  71. package/script/task.d.ts +0 -57
  72. package/script/task.js +0 -263
package/script/agent.js CHANGED
@@ -1,13 +1,98 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Agent = void 0;
4
+ exports.stateToStatus = stateToStatus;
4
5
  const client_js_1 = require("./client.js");
5
- const task_js_1 = require("./task.js");
6
6
  const utils_js_1 = require("./utils.js");
7
+ const agent_strategy_js_1 = require("./task/agent-strategy.js");
8
+ const task_js_1 = require("./task/task.js");
9
+ /**
10
+ * Converts an AgentTaskState to a simplified TaskStatus.
11
+ *
12
+ * @dev
13
+ * We want to simplify because our states are simplified in the UI and also
14
+ * some states have combined reasoning that the consumer does not need to care
15
+ * about. i.e. "queued-for-approval" "queued-for-rerun" should just be "queued".
16
+ *
17
+ * @param {AgentTaskState} state The agent task state to convert.
18
+ * @returns {TaskStatus} The simplified task status.
19
+ */
20
+ function stateToStatus(state) {
21
+ switch (state) {
22
+ case "paused":
23
+ return "paused";
24
+ case "idle":
25
+ return "idle";
26
+ case "starting-up":
27
+ case "waiting-for-capacity":
28
+ case "queued-for-approval":
29
+ case "queued-for-rerun":
30
+ return "queued";
31
+ case "running":
32
+ return "running";
33
+ case "pending-approval":
34
+ case "escalated":
35
+ return "action";
36
+ case "timed-out":
37
+ return "error";
38
+ case "cancelled":
39
+ return "cancelled";
40
+ case "completed":
41
+ return "completed";
42
+ case "unrecoverable":
43
+ case "errored-pending-approval":
44
+ return "error";
45
+ default:
46
+ throw new Error(`unhandled task state: ${state}`);
47
+ }
48
+ }
49
+ /**
50
+ * Reverses {@link stateToStatus} returning the group of task states a _simplified_
51
+ * status may relate to.
52
+ *
53
+ * @see {stateToStatus}
54
+ * @param {TaskStatus} status
55
+ * @returns {AgentTaskState[]}
56
+ */
57
+ function statusToStates(status) {
58
+ switch (status) {
59
+ case "not-started":
60
+ // a special sdk-only status
61
+ return [];
62
+ case "idle":
63
+ return ["idle"];
64
+ case "paused":
65
+ return ["paused"];
66
+ case "queued":
67
+ return [
68
+ "starting-up",
69
+ "waiting-for-capacity",
70
+ "queued-for-approval",
71
+ "queued-for-rerun",
72
+ ];
73
+ case "running":
74
+ return ["running"];
75
+ case "action":
76
+ return ["pending-approval", "escalated"];
77
+ case "completed":
78
+ return ["completed"];
79
+ case "cancelled":
80
+ return ["cancelled"];
81
+ case "error":
82
+ return ["errored-pending-approval", "timed-out", "unrecoverable"];
83
+ }
84
+ }
85
+ function sortOptionsToParam(sort) {
86
+ if ("createdAt" in sort) {
87
+ return { insert_date: sort.createdAt };
88
+ }
89
+ else if ("updatedAt" in sort) {
90
+ return { update_date: sort.updatedAt };
91
+ }
92
+ throw new Error("invalid sort option");
93
+ }
7
94
  const taskPrefixDelimiter = "_-_";
8
95
  class Agent {
9
- #config;
10
- client;
11
96
  static async get(id, client = client_js_1.Client.default()) {
12
97
  const config = await Agent.#fetchConfig(id, client);
13
98
  return new Agent(config, client);
@@ -15,6 +100,8 @@ class Agent {
15
100
  static #fetchConfig(agentId, client = client_js_1.Client.default()) {
16
101
  return client.fetch(`/agents/${agentId}/get`).then(({ agent }) => agent);
17
102
  }
103
+ #config;
104
+ client;
18
105
  constructor(config, client) {
19
106
  this.client = client;
20
107
  this.#config = config;
@@ -22,6 +109,12 @@ class Agent {
22
109
  get id() {
23
110
  return this.#config.agent_id;
24
111
  }
112
+ get region() {
113
+ return this.client.region;
114
+ }
115
+ get project() {
116
+ return this.client.project;
117
+ }
25
118
  get name() {
26
119
  return this.#config.name;
27
120
  }
@@ -37,16 +130,54 @@ class Agent {
37
130
  get updatedAt() {
38
131
  return new Date(this.#config.update_date_);
39
132
  }
40
- get region() {
41
- return this.client.region;
42
- }
43
- get project() {
44
- return this.client.project;
45
- }
46
133
  getTask(taskId) {
47
- return task_js_1.Task.get(taskId, this, this.client);
134
+ return agent_strategy_js_1.AgentStrategy.get(taskId, this, this.client);
135
+ }
136
+ async getTasks({ sort = { createdAt: "asc" }, pageSize = 100, page = 1, search, filter, } = {}) {
137
+ const filtersParam = [{
138
+ condition: "==",
139
+ condition_value: [this.id],
140
+ field: "conversation.agent_id",
141
+ filter_type: "exact_match",
142
+ }];
143
+ if (filter) {
144
+ for (const [field, value] of Object.entries(filter)) {
145
+ switch (field) {
146
+ case "status":
147
+ filtersParam.push({
148
+ condition: "==",
149
+ condition_value: value.flatMap((s) => statusToStates(s)),
150
+ field: "conversation.state",
151
+ filter_type: "exact_match",
152
+ });
153
+ }
154
+ }
155
+ }
156
+ const sortParam = sortOptionsToParam(sort);
157
+ const query = new URLSearchParams([
158
+ ["filters", JSON.stringify(filtersParam)],
159
+ ["sort", JSON.stringify([sortParam])],
160
+ ["page_size", pageSize.toString()],
161
+ ["page", page.toString()],
162
+ ]);
163
+ if (search?.trim()) {
164
+ query.set("query", search.trim());
165
+ }
166
+ const { results } = await this.client.fetch(`/agents/conversations/list?${query.toString()}`);
167
+ return results.map(({ metadata }) => new task_js_1.Task({
168
+ id: metadata.knowledge_set,
169
+ region: this.client.region,
170
+ project: this.client.project,
171
+ name: metadata.conversation.title,
172
+ status: stateToStatus(metadata.conversation.state),
173
+ createdAt: new Date(metadata.insert_date),
174
+ updatedAt: new Date(metadata.update_date),
175
+ }, new agent_strategy_js_1.AgentStrategy(metadata.knowledge_set, this, this.client)));
48
176
  }
49
- async sendMessage(message, task) {
177
+ async sendMessage(message, attachOrTask, maybeTask) {
178
+ const hasAttachments = Array.isArray(attachOrTask);
179
+ const attachFiles = hasAttachments ? attachOrTask : [];
180
+ const task = hasAttachments ? maybeTask : attachOrTask;
50
181
  let taskId;
51
182
  // embed keys require a task prefixing for new tasks
52
183
  if (!task && this.client.isEmbedKey()) {
@@ -55,6 +186,10 @@ class Agent {
55
186
  else if (task) {
56
187
  taskId = task.id;
57
188
  }
189
+ const attachments = [];
190
+ for (const item of attachFiles) {
191
+ attachments.push(item instanceof File ? await this.client.uploadTempFile(item) : item);
192
+ }
58
193
  const res = await this.client.fetch("/agents/trigger", {
59
194
  method: "POST",
60
195
  body: JSON.stringify({
@@ -63,12 +198,15 @@ class Agent {
63
198
  message: {
64
199
  role: "user",
65
200
  content: message,
66
- attachments: [], // @todo
201
+ attachments: attachments.map(({ fileName, fileUrl }) => ({
202
+ file_name: fileName,
203
+ file_url: fileUrl,
204
+ })),
67
205
  },
68
206
  }),
69
207
  });
70
208
  if (task) {
71
- task[task_js_1.resetSubscribeBackoff]();
209
+ task[task_js_1.resetBackoffDuration]();
72
210
  }
73
211
  return task ?? this.getTask(res.conversation_id);
74
212
  }
@@ -5,6 +5,10 @@ type CreateClientOptions = {
5
5
  region: Region;
6
6
  project: string;
7
7
  };
8
+ export type Attachment = {
9
+ fileName: string;
10
+ fileUrl: string;
11
+ };
8
12
  /**
9
13
  * Creates and returns the _default_ client instance.
10
14
  *
@@ -26,7 +30,8 @@ export declare class Client {
26
30
  get region(): Region;
27
31
  get project(): string;
28
32
  isEmbedKey(): boolean;
29
- fetch<T>(input: "/agents/trigger" | `/agents/${string}/get` | `/agents/${string}/tasks/${string}/metadata` | `/agents/${string}/tasks/${string}/view` | "/agents/conversations/list", init?: RequestInit): Promise<T>;
33
+ fetch<T>(input: "/agents/trigger" | `/agents/${string}/get` | `/agents/${string}/tasks/${string}/metadata` | `/agents/${string}/tasks/${string}/view` | "/agents/conversations/list" | "/services/get_temporary_file_upload_url" | `/workforce/items/${string}` | `/workforce/tasks/${string}/metadata` | `/workforce/items/${string}/tasks/${string}/messages` | "/workforce/trigger", init?: RequestInit): Promise<T>;
30
34
  url(path: string): URL;
35
+ uploadTempFile(file: File): Promise<Attachment>;
31
36
  }
32
37
  export {};
package/script/client.js CHANGED
@@ -54,11 +54,16 @@ class Client {
54
54
  }
55
55
  async fetch(input, init) {
56
56
  const url = this.url(input);
57
- const headers = new Headers(this.key.fetchHeaders());
58
- const response = await fetch(url, Object.assign({ headers }, init));
57
+ const reqInit = Object.assign({}, init, {
58
+ headers: {
59
+ ...this.key.fetchHeaders(),
60
+ ...init?.headers,
61
+ },
62
+ });
63
+ const response = await fetch(url, reqInit);
59
64
  if (!response.ok) {
60
65
  const body = await response.text();
61
- console.error(url, init, headers, body);
66
+ console.error("client#fetch(): request failed.", url, body, reqInit);
62
67
  throw new Error(response.statusText);
63
68
  }
64
69
  return response.json();
@@ -69,5 +74,34 @@ class Client {
69
74
  }
70
75
  return new URL((0, utils_js_1.cleanPath)(path), this.baseURL);
71
76
  }
77
+ async uploadTempFile(file) {
78
+ const { upload_url: uploadUrl, download_url: downloadUrl } = await this
79
+ .fetch("/services/get_temporary_file_upload_url", {
80
+ method: "POST",
81
+ body: JSON.stringify({
82
+ filename: file.name,
83
+ extension: (0, utils_js_1.getFileExtension)(file.name),
84
+ }),
85
+ });
86
+ let content = file.type;
87
+ if (file.type.startsWith("text/")) {
88
+ content += "; charset=utf-8"; // force utf-8 for text files
89
+ }
90
+ const response = await fetch(uploadUrl, {
91
+ method: "PUT",
92
+ body: file,
93
+ headers: {
94
+ "content-type": content,
95
+ "x-amz-tagging": "Expire=true",
96
+ },
97
+ });
98
+ if (!response.ok) {
99
+ throw new Error(response.statusText);
100
+ }
101
+ return {
102
+ fileName: file.name,
103
+ fileUrl: downloadUrl,
104
+ };
105
+ }
72
106
  }
73
107
  exports.Client = Client;
package/script/event.d.ts CHANGED
@@ -1,33 +1,14 @@
1
1
  import type { AgentErrorMessage } from "./message/agent-error.js";
2
- import type { AgentMessage } from "./message/agent.js";
3
- import type { ToolMessage } from "./message/tool.js";
4
- import type { UserMessage } from "./message/user.js";
5
- import type { TaskStatus } from "./task.js";
6
- export declare class TaskStartEvent extends CustomEvent<{
7
- id: string;
8
- status: TaskStatus;
9
- }> {
10
- readonly type = "start";
11
- constructor(id: string, status: TaskStatus);
12
- }
13
- export declare class TaskStatusEvent extends CustomEvent<{
14
- status: TaskStatus;
15
- }> {
16
- readonly type = "status";
17
- constructor(status: TaskStatus);
2
+ import type { AnyTaskMessage } from "./message/task.js";
3
+ export declare class TaskUpdatedEvent extends CustomEvent<void> {
4
+ readonly type = "update";
5
+ constructor();
18
6
  }
19
7
  export declare class TaskMessageEvent extends CustomEvent<{
20
- message: AgentMessage | UserMessage;
8
+ message: AnyTaskMessage;
21
9
  }> {
22
10
  readonly type = "message";
23
- constructor(message: AgentMessage | UserMessage);
24
- isUserMessage(): boolean;
25
- }
26
- export declare class TaskUpdateEvent extends CustomEvent<{
27
- message: ToolMessage;
28
- }> {
29
- readonly type = "update";
30
- constructor(message: ToolMessage);
11
+ constructor(message: AnyTaskMessage);
31
12
  }
32
13
  export declare class TaskErrorEvent extends CustomEvent<{
33
14
  message: AgentErrorMessage;
package/script/event.js CHANGED
@@ -1,37 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TaskErrorEvent = exports.TaskUpdateEvent = exports.TaskMessageEvent = exports.TaskStatusEvent = exports.TaskStartEvent = void 0;
4
- class TaskStartEvent extends CustomEvent {
5
- type = "start";
6
- constructor(id, status) {
7
- super("start", { detail: { id, status } });
8
- }
9
- }
10
- exports.TaskStartEvent = TaskStartEvent;
11
- class TaskStatusEvent extends CustomEvent {
12
- type = "status";
13
- constructor(status) {
14
- super("status", { detail: { status } });
3
+ exports.TaskErrorEvent = exports.TaskMessageEvent = exports.TaskUpdatedEvent = void 0;
4
+ class TaskUpdatedEvent extends CustomEvent {
5
+ type = "update";
6
+ constructor() {
7
+ super("update");
15
8
  }
16
9
  }
17
- exports.TaskStatusEvent = TaskStatusEvent;
10
+ exports.TaskUpdatedEvent = TaskUpdatedEvent;
18
11
  class TaskMessageEvent extends CustomEvent {
19
12
  type = "message";
20
13
  constructor(message) {
21
14
  super("message", { detail: { message } });
22
15
  }
23
- isUserMessage() {
24
- return this.detail.message.type === "user-message";
25
- }
26
16
  }
27
17
  exports.TaskMessageEvent = TaskMessageEvent;
28
- class TaskUpdateEvent extends CustomEvent {
29
- type = "update";
30
- constructor(message) {
31
- super("update", { detail: { message } });
32
- }
33
- }
34
- exports.TaskUpdateEvent = TaskUpdateEvent;
35
18
  class TaskErrorEvent extends CustomEvent {
36
19
  type = "error";
37
20
  constructor(message) {
package/script/key.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { Region } from "./mod.js";
1
+ import type { Region } from "./region.js";
2
2
  type CreateKeyOptions = {
3
3
  key: string;
4
4
  region: Region;
@@ -1,6 +1,11 @@
1
- import { TaskMessage } from "./task.js";
1
+ import { GenericMessage } from "./task.js";
2
2
  export interface AgentErrorMessageContent {
3
3
  type: "agent-error";
4
+ errors: {
5
+ body: string;
6
+ }[];
4
7
  }
5
- export declare class AgentErrorMessage extends TaskMessage<AgentErrorMessageContent> {
8
+ export declare class AgentErrorMessage extends GenericMessage<AgentErrorMessageContent> {
9
+ get errors(): string[];
10
+ get lastError(): string;
6
11
  }
@@ -2,6 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AgentErrorMessage = void 0;
4
4
  const task_js_1 = require("./task.js");
5
- class AgentErrorMessage extends task_js_1.TaskMessage {
5
+ class AgentErrorMessage extends task_js_1.GenericMessage {
6
+ get errors() {
7
+ return this.message.content.errors.map((e) => e.body);
8
+ }
9
+ get lastError() {
10
+ return this.errors.at(-1);
11
+ }
6
12
  }
7
13
  exports.AgentErrorMessage = AgentErrorMessage;
@@ -1,9 +1,9 @@
1
- import { TaskMessage } from "./task.js";
1
+ import { GenericMessage } from "./task.js";
2
2
  export interface AgentMessageContent {
3
3
  type: "agent-message";
4
4
  text: string;
5
5
  }
6
- export declare class AgentMessage extends TaskMessage<AgentMessageContent> {
6
+ export declare class AgentMessage extends GenericMessage<AgentMessageContent> {
7
7
  get text(): string;
8
8
  get agentId(): string;
9
9
  }
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AgentMessage = void 0;
4
4
  const task_js_1 = require("./task.js");
5
- class AgentMessage extends task_js_1.TaskMessage {
5
+ class AgentMessage extends task_js_1.GenericMessage {
6
6
  get text() {
7
7
  return this.message.content.text;
8
8
  }
@@ -2,7 +2,10 @@ import type { AgentMessage } from "./agent.js";
2
2
  import type { AgentErrorMessage } from "./agent-error.js";
3
3
  import type { ToolMessage } from "./tool.js";
4
4
  import type { UserMessage } from "./user.js";
5
- export type AnyTaskMessage = AgentMessage | AgentErrorMessage | ToolMessage | UserMessage;
5
+ import type { WorkforceAgentMessage } from "./workforce-agent.js";
6
+ import type { WorkforceAgentHandoverMessage } from "./workforce-agent-handover.js";
7
+ export type AnyTaskMessage = AgentMessage | AgentErrorMessage | ToolMessage | UserMessage | WorkforceAgentMessage | WorkforceAgentHandoverMessage;
8
+ export type TaskMessageType = AnyTaskMessage["type"];
6
9
  interface MessageContent {
7
10
  type: AnyTaskMessage["type"];
8
11
  }
@@ -11,13 +14,13 @@ export interface TaskMessageData<C extends MessageContent = MessageContent> {
11
14
  insert_date_: string;
12
15
  content: C;
13
16
  }
14
- export declare abstract class TaskMessage<C extends MessageContent = MessageContent> {
17
+ export declare abstract class GenericMessage<C extends MessageContent = MessageContent> {
15
18
  protected readonly message: TaskMessageData<C>;
16
19
  constructor(message: TaskMessageData<C>);
17
20
  /**
18
21
  * The task's message type.
19
22
  *
20
- * @property {"agent-error" | "agent-message" | "tool-run" | "user-message"}
23
+ * @property {TaskMessageType}
21
24
  */
22
25
  get type(): C["type"];
23
26
  /**
@@ -37,6 +40,24 @@ export declare abstract class TaskMessage<C extends MessageContent = MessageCont
37
40
  *
38
41
  * @returns {boolean}
39
42
  */
40
- isAgent(): boolean;
43
+ isAgent(): this is AgentMessage;
44
+ /**
45
+ * Returns if the message is from a tool.
46
+ *
47
+ * @returns {boolean}
48
+ */
49
+ isTool(): this is ToolMessage;
50
+ /**
51
+ * Returns if the message was sent from a user.
52
+ *
53
+ * @returns {boolean}
54
+ */
55
+ isUser(): this is UserMessage;
56
+ /**
57
+ * Returns if the message was an error sent by the agent.
58
+ *
59
+ * @returns {boolean}
60
+ */
61
+ isAgentError(): this is AgentErrorMessage;
41
62
  }
42
63
  export {};
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TaskMessage = void 0;
4
- class TaskMessage {
3
+ exports.GenericMessage = void 0;
4
+ class GenericMessage {
5
5
  message;
6
6
  constructor(message) {
7
7
  this.message = message;
@@ -9,7 +9,7 @@ class TaskMessage {
9
9
  /**
10
10
  * The task's message type.
11
11
  *
12
- * @property {"agent-error" | "agent-message" | "tool-run" | "user-message"}
12
+ * @property {TaskMessageType}
13
13
  */
14
14
  get type() {
15
15
  return this.message.content.type;
@@ -38,5 +38,29 @@ class TaskMessage {
38
38
  isAgent() {
39
39
  return this.type === "agent-message";
40
40
  }
41
+ /**
42
+ * Returns if the message is from a tool.
43
+ *
44
+ * @returns {boolean}
45
+ */
46
+ isTool() {
47
+ return this.type === "tool-run";
48
+ }
49
+ /**
50
+ * Returns if the message was sent from a user.
51
+ *
52
+ * @returns {boolean}
53
+ */
54
+ isUser() {
55
+ return this.type === "user-message";
56
+ }
57
+ /**
58
+ * Returns if the message was an error sent by the agent.
59
+ *
60
+ * @returns {boolean}
61
+ */
62
+ isAgentError() {
63
+ return this.type === "agent-error";
64
+ }
41
65
  }
42
- exports.TaskMessage = TaskMessage;
66
+ exports.GenericMessage = GenericMessage;
@@ -1,8 +1,10 @@
1
1
  import type { Region } from "../region.js";
2
- import { TaskMessage } from "./task.js";
2
+ import { GenericMessage } from "./task.js";
3
+ type ToolState = "cancelled" | "error" | "finished" | "pending" | "running";
4
+ export type ToolStatus = "cancelled" | "error" | "completed" | "pending" | "running";
3
5
  export interface ToolMessageContent {
4
6
  type: "tool-run";
5
- tool_run_state: "cancelled" | "error" | "finished" | "pending" | "running";
7
+ tool_run_state: ToolState;
6
8
  output: Record<string, unknown> & {
7
9
  _agent_conversation_details?: {
8
10
  agent_id: string;
@@ -25,13 +27,13 @@ export interface ToolMessageContent {
25
27
  project: string;
26
28
  };
27
29
  }
28
- export declare class ToolMessage extends TaskMessage<ToolMessageContent> {
30
+ export declare class ToolMessage extends GenericMessage<ToolMessageContent> {
29
31
  /**
30
32
  * The tool status for _this_ message.
31
33
  *
32
- * @property {"cancelled" | "error" | "finished" | "pending" | "running"}
34
+ * @property {ToolStatus}
33
35
  */
34
- get status(): "cancelled" | "error" | "finished" | "pending" | "running";
36
+ get status(): ToolStatus;
35
37
  /**
36
38
  * Parameters used to call the tool.
37
39
  *
@@ -64,7 +66,7 @@ export declare class ToolMessage extends TaskMessage<ToolMessageContent> {
64
66
  * The agent's ID, if a sub-agent.
65
67
  *
66
68
  * @property {string}
67
- * @see {@link ToolMessage.isSubAgent}
69
+ * @see {@link ToolMessage#isSubAgent}
68
70
  */
69
71
  get agentId(): string | null;
70
72
  /**
@@ -105,4 +107,12 @@ export declare class ToolMessage extends TaskMessage<ToolMessageContent> {
105
107
  * @returns {boolean}
106
108
  */
107
109
  hasErrors(): boolean;
110
+ /**
111
+ * Checks if the tool message is currently running. Note that pending tools
112
+ * are also classified as running as they are just scheduled for running.
113
+ *
114
+ * @returns {boolean}
115
+ */
116
+ isRunning(): boolean;
108
117
  }
118
+ export {};
@@ -2,14 +2,25 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ToolMessage = void 0;
4
4
  const task_js_1 = require("./task.js");
5
- class ToolMessage extends task_js_1.TaskMessage {
5
+ class ToolMessage extends task_js_1.GenericMessage {
6
6
  /**
7
7
  * The tool status for _this_ message.
8
8
  *
9
- * @property {"cancelled" | "error" | "finished" | "pending" | "running"}
9
+ * @property {ToolStatus}
10
10
  */
11
+ // deno-lint-ignore getter-return
11
12
  get status() {
12
- return this.message.content.tool_run_state;
13
+ const status = this.message.content.tool_run_state;
14
+ switch (status) {
15
+ case "cancelled":
16
+ case "pending":
17
+ case "running":
18
+ case "error":
19
+ return status;
20
+ // agents and tools have different end statuses, align them
21
+ case "finished":
22
+ return "completed";
23
+ }
13
24
  }
14
25
  /**
15
26
  * Parameters used to call the tool.
@@ -25,7 +36,7 @@ class ToolMessage extends task_js_1.TaskMessage {
25
36
  * @property {object|null}
26
37
  */
27
38
  get output() {
28
- return this.status === "finished" ? this.message.content.output : null;
39
+ return this.status === "completed" ? this.message.content.output : null;
29
40
  }
30
41
  /**
31
42
  * Tool errors.
@@ -51,7 +62,7 @@ class ToolMessage extends task_js_1.TaskMessage {
51
62
  * The agent's ID, if a sub-agent.
52
63
  *
53
64
  * @property {string}
54
- * @see {@link ToolMessage.isSubAgent}
65
+ * @see {@link ToolMessage#isSubAgent}
55
66
  */
56
67
  get agentId() {
57
68
  return this.isSubAgent()
@@ -109,5 +120,20 @@ class ToolMessage extends task_js_1.TaskMessage {
109
120
  hasErrors() {
110
121
  return this.message.content.errors.length > 0;
111
122
  }
123
+ /**
124
+ * Checks if the tool message is currently running. Note that pending tools
125
+ * are also classified as running as they are just scheduled for running.
126
+ *
127
+ * @returns {boolean}
128
+ */
129
+ isRunning() {
130
+ switch (this.status) {
131
+ case "pending":
132
+ case "running":
133
+ return true;
134
+ default:
135
+ return false;
136
+ }
137
+ }
112
138
  }
113
139
  exports.ToolMessage = ToolMessage;
@@ -1,10 +1,10 @@
1
- import { TaskMessage } from "./task.js";
1
+ import { GenericMessage } from "./task.js";
2
2
  export interface UserMessageContent {
3
3
  type: "user-message";
4
4
  text: string;
5
5
  is_trigger_message: boolean;
6
6
  }
7
- export declare class UserMessage extends TaskMessage<UserMessageContent> {
7
+ export declare class UserMessage extends GenericMessage<UserMessageContent> {
8
8
  /**
9
9
  * The message as text sent.
10
10
  *