@relevanceai/sdk 3.0.0-alpha.4 → 3.0.0-alpha.6

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 (76) hide show
  1. package/README.md +240 -98
  2. package/esm/agent.d.ts +47 -8
  3. package/esm/agent.js +161 -14
  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 +30 -12
  16. package/esm/message/tool.js +46 -10
  17. package/esm/message/user.d.ts +19 -2
  18. package/esm/message/user.js +21 -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 +3 -7
  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/tool.d.ts +22 -0
  32. package/esm/tool.js +27 -0
  33. package/esm/utils.d.ts +1 -0
  34. package/esm/utils.js +4 -0
  35. package/esm/workforce.d.ts +22 -0
  36. package/esm/workforce.js +50 -0
  37. package/package.json +7 -1
  38. package/script/agent.d.ts +47 -8
  39. package/script/agent.js +162 -14
  40. package/script/client.d.ts +6 -1
  41. package/script/client.js +37 -3
  42. package/script/event.d.ts +6 -25
  43. package/script/event.js +6 -23
  44. package/script/key.d.ts +1 -1
  45. package/script/message/agent-error.d.ts +7 -2
  46. package/script/message/agent-error.js +7 -1
  47. package/script/message/agent.d.ts +2 -2
  48. package/script/message/agent.js +1 -1
  49. package/script/message/task.d.ts +25 -4
  50. package/script/message/task.js +28 -4
  51. package/script/message/tool.d.ts +30 -12
  52. package/script/message/tool.js +45 -9
  53. package/script/message/user.d.ts +19 -2
  54. package/script/message/user.js +20 -1
  55. package/script/message/workforce-agent-handover.d.ts +23 -0
  56. package/script/message/workforce-agent-handover.js +7 -0
  57. package/script/message/workforce-agent.d.ts +23 -0
  58. package/script/message/workforce-agent.js +7 -0
  59. package/script/mod.d.ts +3 -7
  60. package/script/mod.js +3 -3
  61. package/script/task/agent-strategy.d.ts +26 -0
  62. package/script/task/agent-strategy.js +67 -0
  63. package/script/task/task.d.ts +59 -0
  64. package/script/task/task.js +170 -0
  65. package/script/task/workforce-strategy.d.ts +17 -0
  66. package/script/task/workforce-strategy.js +72 -0
  67. package/script/tool.d.ts +22 -0
  68. package/script/tool.js +31 -0
  69. package/script/utils.d.ts +1 -0
  70. package/script/utils.js +5 -0
  71. package/script/workforce.d.ts +22 -0
  72. package/script/workforce.js +54 -0
  73. package/esm/task.d.ts +0 -57
  74. package/esm/task.js +0 -259
  75. package/script/task.d.ts +0 -57
  76. package/script/task.js +0 -263
@@ -1,12 +1,33 @@
1
- import { TaskMessage } from "./task.js";
2
- export class ToolMessage extends TaskMessage {
1
+ import { GenericMessage } from "./task.js";
2
+ import { Tool } from "../tool.js";
3
+ export class ToolMessage extends GenericMessage {
4
+ tool;
5
+ constructor(message) {
6
+ super(message);
7
+ if (message.content.tool_config.type === "tool") {
8
+ const { id, ...config } = message.content.tool_config;
9
+ this.tool = new Tool({ studio_id: id, ...config });
10
+ }
11
+ // @todo: subagent
12
+ }
3
13
  /**
4
14
  * The tool status for _this_ message.
5
15
  *
6
- * @property {"cancelled" | "error" | "finished" | "pending" | "running"}
16
+ * @property {ToolStatus}
7
17
  */
18
+ // deno-lint-ignore getter-return
8
19
  get status() {
9
- return this.message.content.tool_run_state;
20
+ const status = this.message.content.tool_run_state;
21
+ switch (status) {
22
+ case "cancelled":
23
+ case "pending":
24
+ case "running":
25
+ case "error":
26
+ return status;
27
+ // agents and tools have different end statuses, align them
28
+ case "finished":
29
+ return "completed";
30
+ }
10
31
  }
11
32
  /**
12
33
  * Parameters used to call the tool.
@@ -22,7 +43,7 @@ export class ToolMessage extends TaskMessage {
22
43
  * @property {object|null}
23
44
  */
24
45
  get output() {
25
- return this.status === "finished" ? this.message.content.output : null;
46
+ return this.status === "completed" ? this.message.content.output : null;
26
47
  }
27
48
  /**
28
49
  * Tool errors.
@@ -37,18 +58,18 @@ export class ToolMessage extends TaskMessage {
37
58
  }));
38
59
  }
39
60
  /**
40
- * The tool's ID.
61
+ * The tool or agent ID.
41
62
  *
42
63
  * @property {string}
43
64
  */
44
- get toolId() {
65
+ get toolOrAgentId() {
45
66
  return this.message.content.tool_config.id;
46
67
  }
47
68
  /**
48
69
  * The agent's ID, if a sub-agent.
49
70
  *
50
71
  * @property {string}
51
- * @see {@link ToolMessage.isSubAgent}
72
+ * @see {@link ToolMessage#isSubAgent}
52
73
  */
53
74
  get agentId() {
54
75
  return this.isSubAgent()
@@ -72,8 +93,8 @@ export class ToolMessage extends TaskMessage {
72
93
  return this.message.content.tool_config.region;
73
94
  }
74
95
  /**
75
- * The task ID the sub-agent ran. Will be `null` if the tool message is not
76
- * a sub-agent.
96
+ * The task ID the subagent ran. Will be `null` if the tool message is not
97
+ * a subagent.
77
98
  *
78
99
  * @property {string}
79
100
  * @see {@link ToolMessage.isSubAgent}
@@ -106,4 +127,19 @@ export class ToolMessage extends TaskMessage {
106
127
  hasErrors() {
107
128
  return this.message.content.errors.length > 0;
108
129
  }
130
+ /**
131
+ * Checks if the tool message is currently running. Note that pending tools
132
+ * are also classified as running as they are just scheduled for running.
133
+ *
134
+ * @returns {boolean}
135
+ */
136
+ isRunning() {
137
+ switch (this.status) {
138
+ case "pending":
139
+ case "running":
140
+ return true;
141
+ default:
142
+ return false;
143
+ }
144
+ }
109
145
  }
@@ -1,10 +1,15 @@
1
- import { TaskMessage } from "./task.js";
1
+ import type { Attachment } from "../client.js";
2
+ import { GenericMessage } from "./task.js";
2
3
  export interface UserMessageContent {
4
+ attachments?: {
5
+ file_url: string;
6
+ file_name: string;
7
+ }[];
3
8
  type: "user-message";
4
9
  text: string;
5
10
  is_trigger_message: boolean;
6
11
  }
7
- export declare class UserMessage extends TaskMessage<UserMessageContent> {
12
+ export declare class UserMessage extends GenericMessage<UserMessageContent> {
8
13
  /**
9
14
  * The message as text sent.
10
15
  *
@@ -17,4 +22,16 @@ export declare class UserMessage extends TaskMessage<UserMessageContent> {
17
22
  * @returns {boolean}
18
23
  */
19
24
  isTrigger(): boolean;
25
+ /**
26
+ * The attachments sent with the message.
27
+ *
28
+ * @property {Attachment[]}
29
+ */
30
+ get attachments(): Attachment[];
31
+ /**
32
+ * Returns if the message has attachments.
33
+ *
34
+ * @returns {boolean}
35
+ */
36
+ hasAttachments(): boolean;
20
37
  }
@@ -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
  *
@@ -16,4 +16,23 @@ export class UserMessage extends TaskMessage {
16
16
  isTrigger() {
17
17
  return this.message.content.is_trigger_message;
18
18
  }
19
+ /**
20
+ * The attachments sent with the message.
21
+ *
22
+ * @property {Attachment[]}
23
+ */
24
+ get attachments() {
25
+ return (this.message.content.attachments?.map(({ file_name, file_url }) => ({
26
+ fileName: file_name,
27
+ fileUrl: file_url,
28
+ })) ?? []);
29
+ }
30
+ /**
31
+ * Returns if the message has attachments.
32
+ *
33
+ * @returns {boolean}
34
+ */
35
+ hasAttachments() {
36
+ return this.attachments.length > 0;
37
+ }
19
38
  }
@@ -0,0 +1,23 @@
1
+ import { GenericMessage } from "./task.js";
2
+ export interface WorkforceAgentHandoverMessageContent {
3
+ type: "workforce-agent-handover";
4
+ task_details?: {
5
+ project: string;
6
+ region: string;
7
+ conversation_id: string;
8
+ };
9
+ agent_details: {
10
+ agent_id: string;
11
+ project: string;
12
+ region: string;
13
+ name?: string;
14
+ emoji?: string;
15
+ description?: string;
16
+ deleted_reason?: "entity_deleted";
17
+ };
18
+ trigger: {
19
+ message: string;
20
+ };
21
+ }
22
+ export declare class WorkforceAgentHandoverMessage extends GenericMessage<WorkforceAgentHandoverMessageContent> {
23
+ }
@@ -0,0 +1,3 @@
1
+ import { GenericMessage } from "./task.js";
2
+ export class WorkforceAgentHandoverMessage extends GenericMessage {
3
+ }
@@ -0,0 +1,23 @@
1
+ import type { AgentTaskState } from "../agent.js";
2
+ import { GenericMessage } from "./task.js";
3
+ export interface WorkforceAgentMessageContent {
4
+ type: "workforce-agent-run";
5
+ task_details: {
6
+ project: string;
7
+ region: string;
8
+ conversation_id: string;
9
+ finished_state?: AgentTaskState;
10
+ current_state?: AgentTaskState;
11
+ };
12
+ agent_details?: {
13
+ agent_id: string;
14
+ project: string;
15
+ region: string;
16
+ name?: string;
17
+ emoji?: string;
18
+ description?: string;
19
+ deleted_reason?: "entity_deleted";
20
+ };
21
+ }
22
+ export declare class WorkforceAgentMessage extends GenericMessage<WorkforceAgentMessageContent> {
23
+ }
@@ -0,0 +1,3 @@
1
+ import { GenericMessage } from "./task.js";
2
+ export class WorkforceAgentMessage extends GenericMessage {
3
+ }
package/esm/mod.d.ts CHANGED
@@ -1,10 +1,6 @@
1
1
  export { Agent } from "./agent.js";
2
- export { Client, createClient } from "./client.js";
2
+ export { type Attachment, Client, createClient } from "./client.js";
3
3
  export { Key } from "./key.js";
4
4
  export { type Region, REGION_AU, REGION_EU, REGION_US } from "./region.js";
5
- export { Task, type TaskStatus } from "./task.js";
6
- export type { AgentErrorMessage } from "./message/agent-error.js";
7
- export type { AgentMessage } from "./message/agent.js";
8
- export type { ToolMessage } from "./message/tool.js";
9
- export type { UserMessage } from "./message/user.js";
10
- export type { AnyTaskMessage } from "./message/task.js";
5
+ export { Workforce } from "./workforce.js";
6
+ export type { Task } from "./task/task.js";
package/esm/mod.js CHANGED
@@ -2,4 +2,4 @@ export { Agent } from "./agent.js";
2
2
  export { Client, createClient } from "./client.js";
3
3
  export { Key } from "./key.js";
4
4
  export { REGION_AU, REGION_EU, REGION_US } from "./region.js";
5
- export { Task } from "./task.js";
5
+ export { Workforce } from "./workforce.js";
@@ -0,0 +1,26 @@
1
+ import { type Agent, type AgentTaskState } from "../agent.js";
2
+ import { Client } from "../client.js";
3
+ import type { AnyTaskMessage } from "../message/task.js";
4
+ import { Task, type TaskMetadata, type TaskStrategy } from "./task.js";
5
+ export type AgentTaskMetadata = {
6
+ knowledge_set: string;
7
+ insert_date: string;
8
+ update_date: string;
9
+ conversation: {
10
+ created_by_user_id: string;
11
+ state: AgentTaskState;
12
+ title: string;
13
+ };
14
+ };
15
+ export declare class AgentStrategy implements TaskStrategy<Agent> {
16
+ static get(id: string, agent: Agent, client?: Client): Promise<Task<Agent>>;
17
+ private readonly id;
18
+ private readonly agent;
19
+ private readonly client;
20
+ constructor(id: string, agent: Agent, client: Client);
21
+ get subject(): Agent;
22
+ getMetadata(): Promise<TaskMetadata>;
23
+ getMessages({ after }?: {
24
+ after?: Date;
25
+ }): Promise<AnyTaskMessage[]>;
26
+ }
@@ -0,0 +1,63 @@
1
+ import { stateToStatus } from "../agent.js";
2
+ import { Client } from "../client.js";
3
+ import { AgentErrorMessage, } from "../message/agent-error.js";
4
+ import { AgentMessage } from "../message/agent.js";
5
+ import { ToolMessage } from "../message/tool.js";
6
+ import { UserMessage } from "../message/user.js";
7
+ import { Task } from "./task.js";
8
+ export class AgentStrategy {
9
+ static async get(id, agent, client = Client.default()) {
10
+ const subject = new this(id, agent, client);
11
+ return new Task(await subject.getMetadata(), subject);
12
+ }
13
+ id;
14
+ agent;
15
+ client;
16
+ constructor(id, agent, client) {
17
+ this.id = id;
18
+ this.agent = agent;
19
+ this.client = client;
20
+ }
21
+ get subject() {
22
+ return this.agent;
23
+ }
24
+ async getMetadata() {
25
+ const { metadata } = await this.client.fetch(`/agents/${this.agent.id}/tasks/${this.id}/metadata`);
26
+ return {
27
+ id: this.id,
28
+ region: this.client.region,
29
+ project: this.client.project,
30
+ name: metadata.conversation.title,
31
+ status: stateToStatus(metadata.conversation.state),
32
+ createdAt: new Date(metadata.insert_date),
33
+ updatedAt: new Date(metadata.update_date),
34
+ };
35
+ }
36
+ async getMessages({ after = new Date(0) } = {}) {
37
+ const url = `/agents/${this.agent.id}/tasks/${this.id}/view`;
38
+ const res = await this.client.fetch(url, {
39
+ method: "POST",
40
+ body: JSON.stringify({
41
+ page_size: 1_000, // @todo: pagination
42
+ cursor: {
43
+ after: after.toISOString(),
44
+ },
45
+ }),
46
+ });
47
+ // message should be in ascending order
48
+ return res.results.reverse().map((data) => {
49
+ switch (data.content.type) {
50
+ case "agent-error":
51
+ return new AgentErrorMessage(data);
52
+ case "agent-message":
53
+ return new AgentMessage(data);
54
+ case "tool-run":
55
+ return new ToolMessage(data);
56
+ case "user-message":
57
+ return new UserMessage(data);
58
+ default:
59
+ throw new Error("unknown message response");
60
+ }
61
+ });
62
+ }
63
+ }
@@ -0,0 +1,59 @@
1
+ import { Emitter } from "../emitter.js";
2
+ import type { AnyTaskMessage } from "../message/task.js";
3
+ import type { Region } from "../region.js";
4
+ import type { Workforce } from "../workforce.js";
5
+ import type { Agent } from "../agent.js";
6
+ import type { AgentErrorMessage } from "../message/agent-error.js";
7
+ export type TaskStatus = "not-started" | "idle" | "paused" | "queued" | "running" | "action" | "completed" | "cancelled" | "error";
8
+ export interface TaskMetadata {
9
+ id: string;
10
+ region: Region;
11
+ project: string;
12
+ status: TaskStatus;
13
+ name: string;
14
+ createdAt: Date;
15
+ updatedAt: Date;
16
+ }
17
+ type TaskEventMap = {
18
+ updated: undefined;
19
+ message: {
20
+ message: AnyTaskMessage;
21
+ };
22
+ error: {
23
+ message: AgentErrorMessage;
24
+ };
25
+ };
26
+ export interface TaskStrategy<S> {
27
+ subject: S;
28
+ getMessages(options?: {
29
+ after?: Date;
30
+ }): Promise<AnyTaskMessage[]>;
31
+ getMetadata(): Promise<TaskMetadata>;
32
+ }
33
+ export declare const resetBackoffDuration: unique symbol;
34
+ export declare class Task<S extends Agent | Workforce, E extends TaskEventMap = TaskEventMap> extends Emitter<E> {
35
+ #private;
36
+ private subscribed;
37
+ private backoff;
38
+ private backoffDuration;
39
+ private readonly strategy;
40
+ constructor(metadata: TaskMetadata, strategy: TaskStrategy<S>);
41
+ get subject(): S;
42
+ get id(): string;
43
+ get region(): Region;
44
+ get project(): string;
45
+ get name(): string;
46
+ get status(): TaskStatus;
47
+ get createdAt(): Date;
48
+ get updatedAt(): Date;
49
+ getMessages(options?: {
50
+ after?: Date;
51
+ }): Promise<AnyTaskMessage[]>;
52
+ isRunning(): boolean;
53
+ unsubscribe(): void;
54
+ [resetBackoffDuration](): void;
55
+ addEventListener<K extends keyof E>(type: Extract<K, string>, listener: ((event: CustomEvent<E[K]>) => void) | {
56
+ handleEvent: (event: CustomEvent<E[K]>) => void;
57
+ } | null, options?: boolean | AddEventListenerOptions): void;
58
+ }
59
+ export {};
@@ -0,0 +1,166 @@
1
+ import { Emitter } from "../emitter.js";
2
+ import { abortPromise, delay } from "../utils.js";
3
+ import { TaskErrorEvent, TaskMessageEvent, TaskUpdateEvent, } from "../event.js";
4
+ export const resetBackoffDuration = Symbol("resetBackoffDuration");
5
+ const backoffStartingDuration = 1_000;
6
+ const backoffMaxDuration = 60_000;
7
+ export class Task extends Emitter {
8
+ subscribed = null;
9
+ backoff = null;
10
+ backoffDuration = 0;
11
+ strategy;
12
+ #metadata;
13
+ constructor(metadata, strategy) {
14
+ super();
15
+ this.strategy = strategy;
16
+ this.#metadata = metadata;
17
+ }
18
+ get subject() {
19
+ return this.strategy.subject;
20
+ }
21
+ get id() {
22
+ return this.#metadata.id;
23
+ }
24
+ get region() {
25
+ return this.#metadata.region;
26
+ }
27
+ get project() {
28
+ return this.#metadata.project;
29
+ }
30
+ get name() {
31
+ return this.#metadata.name;
32
+ }
33
+ get status() {
34
+ return this.#metadata.status;
35
+ }
36
+ get createdAt() {
37
+ return this.#metadata.createdAt;
38
+ }
39
+ get updatedAt() {
40
+ return this.#metadata.updatedAt;
41
+ }
42
+ getMessages(options) {
43
+ return this.strategy.getMessages(options);
44
+ }
45
+ isRunning() {
46
+ switch (this.status) {
47
+ case "queued":
48
+ case "running":
49
+ return true;
50
+ default:
51
+ return false;
52
+ }
53
+ }
54
+ #subscribe() {
55
+ if (this.subscribed) {
56
+ return;
57
+ }
58
+ const subscribed = new AbortController();
59
+ this.subscribed = subscribed; // subscribed ref
60
+ const isSubscribed = () => !subscribed.signal.aborted;
61
+ this.backoffDuration = backoffStartingDuration;
62
+ const cursor = new Date(0);
63
+ const emitted = new Set();
64
+ const pending = new Map();
65
+ void (async () => {
66
+ while (isSubscribed()) {
67
+ try {
68
+ const [metadata, messages] = await Promise.all([
69
+ this.strategy.getMetadata(),
70
+ this.strategy.getMessages({ after: cursor }),
71
+ ]);
72
+ if (!isSubscribed()) {
73
+ break;
74
+ }
75
+ let hasChanges = false;
76
+ if (metadata.updatedAt > this.updatedAt) {
77
+ this.dispatchEvent(new TaskUpdateEvent());
78
+ hasChanges = true;
79
+ }
80
+ this.#metadata = metadata;
81
+ if (messages.length) {
82
+ for (const message of messages) {
83
+ if (emitted.has(message.id)) {
84
+ continue;
85
+ }
86
+ switch (message.type) {
87
+ case "agent-error":
88
+ emitted.add(message.id);
89
+ this.dispatchEvent(new TaskErrorEvent(message));
90
+ break;
91
+ case "tool-run": {
92
+ const { status } = message;
93
+ if (pending.get(message.id)?.status == status) {
94
+ // no change to the tool status
95
+ continue;
96
+ }
97
+ if (["pending", "running"].includes(status)) {
98
+ pending.set(message.id, message);
99
+ }
100
+ else {
101
+ emitted.add(message.id);
102
+ pending.delete(message.id);
103
+ }
104
+ this.dispatchEvent(new TaskMessageEvent(message));
105
+ break;
106
+ }
107
+ case "agent-message":
108
+ case "user-message":
109
+ hasChanges = true;
110
+ emitted.add(message.id);
111
+ this.dispatchEvent(new TaskMessageEvent(message));
112
+ }
113
+ }
114
+ let latest = messages.at(-1).createdAt;
115
+ for (const message of pending.values()) {
116
+ if (latest > message.createdAt) {
117
+ latest = message.createdAt;
118
+ }
119
+ }
120
+ cursor.setTime(latest.getTime());
121
+ }
122
+ if (hasChanges) {
123
+ this.backoffDuration = backoffStartingDuration;
124
+ }
125
+ else if (!this.isRunning()) {
126
+ this.backoffDuration = Math.min(this.backoffDuration * 2, backoffMaxDuration);
127
+ }
128
+ }
129
+ finally {
130
+ if (isSubscribed()) {
131
+ const backoff = new AbortController();
132
+ this.backoff = backoff;
133
+ await Promise.race([
134
+ delay(this.backoffDuration),
135
+ abortPromise(AbortSignal.any([subscribed.signal, backoff.signal])),
136
+ ]);
137
+ }
138
+ }
139
+ }
140
+ })();
141
+ }
142
+ unsubscribe() {
143
+ this.subscribed?.abort();
144
+ this.subscribed = null;
145
+ this.backoff?.abort();
146
+ this.backoff = null;
147
+ this.backoffDuration = 0;
148
+ }
149
+ [resetBackoffDuration]() {
150
+ this.backoffDuration = backoffStartingDuration;
151
+ }
152
+ addEventListener(type, listener, options) {
153
+ this.#subscribe();
154
+ const signal = AbortSignal.any([
155
+ ...(options && typeof options === "object" && options.signal
156
+ ? [options.signal]
157
+ : []),
158
+ ...(this.subscribed ? [this.subscribed.signal] : []),
159
+ ]);
160
+ const capture = typeof options === "boolean"
161
+ ? options
162
+ : Boolean(options?.capture);
163
+ const addOptions = Object.assign({}, options, { signal, capture });
164
+ super.addEventListener(type, listener, addOptions);
165
+ }
166
+ }
@@ -0,0 +1,17 @@
1
+ import type { AnyTaskMessage } from "../message/task.js";
2
+ import { Client } from "../client.js";
3
+ import { Task, type TaskMetadata, type TaskStatus, type TaskStrategy } from "./task.js";
4
+ import type { Workforce } from "../workforce.js";
5
+ export declare class WorkforceStrategy implements TaskStrategy<Workforce> {
6
+ static get(id: string, workforce: Workforce, client?: Client): Promise<Task<Workforce>>;
7
+ static convertStatus(): TaskStatus;
8
+ private readonly id;
9
+ private readonly workforce;
10
+ private readonly client;
11
+ private constructor();
12
+ get subject(): Workforce;
13
+ getMessages({ after: _after }: {
14
+ after?: Date;
15
+ }): Promise<AnyTaskMessage[]>;
16
+ getMetadata(): Promise<TaskMetadata>;
17
+ }
@@ -0,0 +1,68 @@
1
+ import { Client } from "../client.js";
2
+ import { Task, } from "./task.js";
3
+ import { AgentErrorMessage, } from "../message/agent-error.js";
4
+ import { AgentMessage } from "../message/agent.js";
5
+ import { ToolMessage } from "../message/tool.js";
6
+ import { UserMessage } from "../message/user.js";
7
+ import { WorkforceAgentMessage, } from "../message/workforce-agent.js";
8
+ import { WorkforceAgentHandoverMessage, } from "../message/workforce-agent-handover.js";
9
+ export class WorkforceStrategy {
10
+ static async get(id, workforce, client = Client.default()) {
11
+ const subject = new this(id, workforce, client);
12
+ const metadata = await subject.getMetadata();
13
+ return new Task(metadata, subject);
14
+ }
15
+ static convertStatus() {
16
+ return "not-implemented";
17
+ }
18
+ id;
19
+ workforce;
20
+ client;
21
+ constructor(id, workforce, client) {
22
+ this.id = id;
23
+ this.workforce = workforce;
24
+ this.client = client;
25
+ }
26
+ get subject() {
27
+ return this.workforce;
28
+ }
29
+ async getMessages({ after: _after }) {
30
+ const { results } = await this.client.fetch(`/workforce/items/${this.workforce.id}/tasks/${this.id}/messages`, {
31
+ method: "POST",
32
+ body: JSON.stringify({
33
+ page_size: 1_000, // @todo: pagination
34
+ // @todo: cursor "before" :S
35
+ }),
36
+ });
37
+ return results.map((data) => {
38
+ switch (data.content.type) {
39
+ case "agent-error":
40
+ return new AgentErrorMessage(data);
41
+ case "agent-message":
42
+ return new AgentMessage(data);
43
+ case "tool-run":
44
+ return new ToolMessage(data);
45
+ case "user-message":
46
+ return new UserMessage(data);
47
+ case "workforce-agent-run":
48
+ return new WorkforceAgentMessage(data);
49
+ case "workforce-agent-handover":
50
+ return new WorkforceAgentHandoverMessage(data);
51
+ default:
52
+ throw new Error("unknown message response");
53
+ }
54
+ });
55
+ }
56
+ async getMetadata() {
57
+ const { metadata } = await this.client.fetch(`/workforce/tasks/${this.id}/metadata`);
58
+ return {
59
+ id: this.id,
60
+ region: this.client.region,
61
+ project: this.client.project,
62
+ name: metadata.title,
63
+ status: WorkforceStrategy.convertStatus(), // @todo: not implemented
64
+ createdAt: new Date(metadata.insert_date),
65
+ updatedAt: new Date(metadata.update_date),
66
+ };
67
+ }
68
+ }
package/esm/tool.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import type { Region } from "./region.js";
2
+ import type { JSONSchema4 } from "json-schema";
3
+ export type ToolConfig = {
4
+ region: Region;
5
+ project: string;
6
+ studio_id: string;
7
+ title: string;
8
+ description: string;
9
+ emoji?: string;
10
+ params_schema: JSONSchema4;
11
+ };
12
+ export declare class Tool {
13
+ #private;
14
+ constructor(config: ToolConfig);
15
+ get id(): string;
16
+ get region(): Region;
17
+ get project(): string;
18
+ get name(): string;
19
+ get avatar(): string | undefined;
20
+ get description(): string | undefined;
21
+ get parametersSchema(): JSONSchema4;
22
+ }