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