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

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 (58) hide show
  1. package/README.md +422 -193
  2. package/esm/agent.d.ts +20 -8
  3. package/esm/agent.js +32 -12
  4. package/esm/client.d.ts +4 -8
  5. package/esm/client.js +11 -12
  6. package/esm/emitter.d.ts +16 -0
  7. package/esm/emitter.js +15 -0
  8. package/{script/events.d.ts → esm/event.d.ts} +10 -13
  9. package/esm/{events.js → event.js} +0 -6
  10. package/esm/message/agent-error.d.ts +6 -0
  11. package/esm/message/agent-error.js +3 -0
  12. package/esm/message/agent.d.ts +9 -0
  13. package/esm/message/agent.js +9 -0
  14. package/esm/message/task.d.ts +42 -0
  15. package/esm/message/task.js +38 -0
  16. package/esm/message/tool.d.ts +108 -0
  17. package/esm/message/tool.js +109 -0
  18. package/esm/message/user.d.ts +20 -0
  19. package/esm/message/user.js +19 -0
  20. package/esm/mod.d.ts +6 -3
  21. package/esm/mod.js +1 -0
  22. package/esm/task.d.ts +50 -18
  23. package/esm/task.js +228 -65
  24. package/esm/utils.d.ts +1 -5
  25. package/esm/utils.js +1 -13
  26. package/package.json +1 -1
  27. package/script/agent.d.ts +20 -8
  28. package/script/agent.js +32 -12
  29. package/script/client.d.ts +4 -8
  30. package/script/client.js +11 -12
  31. package/script/emitter.d.ts +16 -0
  32. package/script/emitter.js +19 -0
  33. package/{esm/events.d.ts → script/event.d.ts} +10 -13
  34. package/script/{events.js → event.js} +1 -8
  35. package/script/message/agent-error.d.ts +6 -0
  36. package/script/message/agent-error.js +7 -0
  37. package/script/message/agent.d.ts +9 -0
  38. package/script/message/agent.js +13 -0
  39. package/script/message/task.d.ts +42 -0
  40. package/script/message/task.js +42 -0
  41. package/script/message/tool.d.ts +108 -0
  42. package/script/message/tool.js +113 -0
  43. package/script/message/user.d.ts +20 -0
  44. package/script/message/user.js +23 -0
  45. package/script/mod.d.ts +6 -3
  46. package/script/mod.js +3 -1
  47. package/script/task.d.ts +50 -18
  48. package/script/task.js +228 -65
  49. package/script/utils.d.ts +1 -5
  50. package/script/utils.js +1 -14
  51. package/esm/agent-task.d.ts +0 -61
  52. package/esm/agent-task.js +0 -112
  53. package/esm/message.d.ts +0 -18
  54. package/esm/message.js +0 -18
  55. package/script/agent-task.d.ts +0 -61
  56. package/script/agent-task.js +0 -116
  57. package/script/message.d.ts +0 -18
  58. package/script/message.js +0 -22
package/esm/mod.js CHANGED
@@ -2,3 +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";
package/esm/task.d.ts CHANGED
@@ -1,25 +1,57 @@
1
+ import { Agent } from "./agent.js";
1
2
  import { Client } from "./client.js";
2
- import type { TaskMessage } from "./message.js";
3
+ import { Emitter } from "./emitter.js";
4
+ import { AgentMessage } from "./message/agent.js";
5
+ import type { AnyTaskMessage } from "./message/task.js";
6
+ import { ToolMessage } from "./message/tool.js";
7
+ import { UserMessage } from "./message/user.js";
8
+ export type TaskState = "idle" | "starting-up" | "running" | "pending-approval" | "waiting-for-capacity" | "cancelled" | "timed-out" | "escalated" | "unrecoverable" | "paused" | "completed" | "errored-pending-approval" | "queued-for-approval" | "queued-for-rerun";
3
9
  export type TaskStatus = "not-started" | "idle" | "queued" | "running" | "action" | "complete" | "error";
4
- export declare abstract class Task<S, E extends Record<string, unknown>> extends EventTarget {
10
+ type TaskMetadata = {
11
+ knowledge_set: string;
12
+ insert_date: string;
13
+ update_date: string;
14
+ conversation: {
15
+ created_by_user_id: string;
16
+ state: TaskState;
17
+ title: string;
18
+ };
19
+ };
20
+ type TaskEventMap = {
21
+ start: {
22
+ status: TaskStatus;
23
+ };
24
+ status: {
25
+ status: TaskStatus;
26
+ };
27
+ message: {
28
+ message: AgentMessage | UserMessage;
29
+ };
30
+ update: {
31
+ message: ToolMessage;
32
+ };
33
+ };
34
+ export declare const resetSubscribeBackoff: unique symbol;
35
+ export declare class Task extends Emitter<TaskEventMap> {
5
36
  #private;
6
- readonly subject: S;
37
+ static get(id: string, agentOrAgentId: Agent | string, client?: Client): Promise<Task>;
38
+ readonly agent: Agent;
7
39
  protected readonly client: Client;
8
- private listenController;
9
- abstract fetchMessages(fetchOptions?: {
40
+ protected constructor(metadata: TaskMetadata, agent: Agent, client?: Client);
41
+ get id(): string;
42
+ get title(): string;
43
+ get status(): TaskStatus;
44
+ isRunning(): boolean;
45
+ getMessages({ from }?: {
10
46
  from?: Date;
11
- }): Promise<TaskMessage[]>;
12
- abstract fetchStatus(): Promise<TaskStatus>;
13
- constructor(subject: S, id?: string | undefined, client?: Client);
14
- get id(): string | undefined;
15
- protected setId(id: string, status?: TaskStatus): void;
16
- listen(): void;
17
- isListening(): boolean;
18
- stopListening(): void;
19
- addEventListener<K extends keyof E>(type: Extract<K, string>, listener: ((event: CustomEvent<E[K]>) => void) | {
20
- handleEvent: (event: CustomEvent<E[K]>) => void;
21
- } | null, options?: boolean | AddEventListenerOptions): void;
22
- removeEventListener<K extends keyof E>(type: Extract<K, string>, listener: ((event: CustomEvent<E[K]>) => void) | {
23
- handleEvent: (event: CustomEvent<E[K]>) => void;
47
+ }): Promise<AnyTaskMessage[]>;
48
+ protected refresh(): Promise<void>;
49
+ [resetSubscribeBackoff](): void;
50
+ subscribe(): void;
51
+ protected isSubscribed(): boolean;
52
+ unsubscribe(): void;
53
+ addEventListener<K extends keyof TaskEventMap>(type: Extract<K, string>, listener: ((event: CustomEvent<TaskEventMap[K]>) => void) | {
54
+ handleEvent: (event: CustomEvent<TaskEventMap[K]>) => void;
24
55
  } | null, options?: boolean | AddEventListenerOptions): void;
25
56
  }
57
+ export {};
package/esm/task.js CHANGED
@@ -1,88 +1,254 @@
1
+ import { Agent } from "./agent.js";
1
2
  import { Client } from "./client.js";
2
- import { TaskErrorEvent, TaskMessageEvent, TaskStartEvent, TaskStatusEvent, TaskUpdateEvent, } from "./events.js";
3
- import { runInterval } from "./utils.js";
4
- export class Task extends EventTarget {
5
- subject;
3
+ import { Emitter } from "./emitter.js";
4
+ import { TaskErrorEvent, TaskMessageEvent, TaskStatusEvent, TaskUpdateEvent, } from "./event.js";
5
+ import { AgentErrorMessage, } from "./message/agent-error.js";
6
+ import { AgentMessage } from "./message/agent.js";
7
+ import { ToolMessage } from "./message/tool.js";
8
+ import { UserMessage } from "./message/user.js";
9
+ import { abortPromise, delay } from "./utils.js";
10
+ /**
11
+ * Converts an AgentTaskState to a simplified TaskStatus.
12
+ *
13
+ * @internal
14
+ *
15
+ * @param {AgentTaskState} state The agent task state to convert.
16
+ * @returns {TaskStatus} The simplified task status.
17
+ */
18
+ function stateToStatus(state) {
19
+ switch (state) {
20
+ case "paused":
21
+ case "idle":
22
+ return "idle";
23
+ case "starting-up":
24
+ case "waiting-for-capacity":
25
+ case "queued-for-approval":
26
+ case "queued-for-rerun":
27
+ return "queued";
28
+ case "running":
29
+ return "running";
30
+ case "pending-approval":
31
+ case "escalated":
32
+ return "action";
33
+ case "timed-out":
34
+ return "error";
35
+ case "cancelled":
36
+ case "completed":
37
+ return "complete";
38
+ case "unrecoverable":
39
+ case "errored-pending-approval":
40
+ return "error";
41
+ default:
42
+ throw new Error(`unhandled task state: ${state}`);
43
+ }
44
+ }
45
+ export const resetSubscribeBackoff = Symbol("resetSubscribeBackoff");
46
+ export class Task extends Emitter {
47
+ static async get(id, agentOrAgentId, client = Client.default()) {
48
+ const agent = typeof agentOrAgentId === "string"
49
+ ? await Agent.get(agentOrAgentId, client)
50
+ : agentOrAgentId;
51
+ const metadata = await Task.#fetchMetadata(id, agent.id, client);
52
+ return new Task(metadata, agent, client);
53
+ }
54
+ static #fetchMetadata(id, agentId, client) {
55
+ return client.fetch(`/agents/${agentId}/tasks/${id}/metadata`).then(({ metadata }) => metadata);
56
+ }
57
+ #controller;
58
+ #backoffMs = 1000;
59
+ #lastUpdatedAt;
60
+ #delayController;
61
+ #metadata;
62
+ agent;
6
63
  client;
7
- #id;
8
- listenController;
9
- constructor(subject, id = undefined, client = Client.default()) {
64
+ constructor(metadata, agent, client = Client.default()) {
10
65
  super();
11
- this.subject = subject;
66
+ this.#metadata = metadata;
67
+ this.agent = agent;
12
68
  this.client = client;
13
- this.#id = id;
14
69
  }
15
70
  get id() {
16
- return this.#id;
71
+ return this.#metadata.knowledge_set;
72
+ }
73
+ get title() {
74
+ return this.#metadata.conversation.title ?? "";
75
+ }
76
+ get status() {
77
+ return stateToStatus(this.#metadata.conversation.state);
17
78
  }
18
- setId(id, status = "not-started") {
19
- if (this.#id) {
20
- throw new Error("task id is already set");
79
+ isRunning() {
80
+ switch (this.status) {
81
+ case "queued":
82
+ case "running":
83
+ return true;
84
+ default:
85
+ return false;
21
86
  }
22
- // @ts-ignore: allow assignment to readonly in this special case
23
- this.#id = id;
24
- this.dispatchEvent(new TaskStartEvent(id, status));
25
87
  }
26
- listen() {
27
- if (this.isListening()) {
88
+ async getMessages({ from = new Date(0) } = {}) {
89
+ const url = `/agents/${this.agent.id}/tasks/${this.id}/view`;
90
+ const res = await this.client.fetch(url, {
91
+ method: "POST",
92
+ body: JSON.stringify({
93
+ page_size: 1_000, // @todo: pagination
94
+ cursor: {
95
+ after: from.toISOString(),
96
+ },
97
+ }),
98
+ });
99
+ // message should be in ascending order
100
+ return res.results.reverse().map((data) => {
101
+ switch (data.content.type) {
102
+ case "agent-error":
103
+ return new AgentErrorMessage(data);
104
+ case "agent-message":
105
+ return new AgentMessage(data);
106
+ case "tool-run":
107
+ return new ToolMessage(data);
108
+ case "user-message":
109
+ return new UserMessage(data);
110
+ default:
111
+ throw new Error("unknown message response");
112
+ }
113
+ });
114
+ }
115
+ async refresh() {
116
+ this.#metadata = await Task.#fetchMetadata(this.id, this.agent.id, this.client);
117
+ }
118
+ [resetSubscribeBackoff]() {
119
+ this.#backoffMs = 1000;
120
+ this.#delayController?.abort();
121
+ }
122
+ subscribe() {
123
+ if (this.isSubscribed()) {
28
124
  return;
29
125
  }
30
- this.listenController = new AbortController();
31
- const signal = this.listenController.signal;
32
- let currentStatus = null;
126
+ this.#controller = new AbortController();
127
+ const signal = this.#controller.signal;
128
+ let currentStatus = this.status;
33
129
  const messagesCursor = new Date(0);
34
- void runInterval(async () => {
35
- // no task, yet
36
- if (!this.id) {
37
- return;
38
- }
39
- const [status, messages] = await Promise.all([
40
- this.fetchStatus(),
41
- this.fetchMessages({
42
- from: messagesCursor,
43
- }),
44
- ]);
45
- if (!this.isListening()) {
46
- return;
47
- }
48
- if (status !== currentStatus) {
49
- currentStatus = status;
50
- this.dispatchEvent(new TaskStatusEvent(status));
51
- }
52
- if (messages.length) {
53
- for (const message of messages) {
54
- switch (message.type) {
55
- case "agent-error":
56
- this.dispatchEvent(new TaskErrorEvent(message));
57
- break;
58
- case "tool-run":
59
- this.dispatchEvent(new TaskUpdateEvent(message));
60
- break;
61
- case "agent-message":
62
- case "user-message":
63
- this.dispatchEvent(new TaskMessageEvent(message));
130
+ const emitted = new Set();
131
+ let lastMessage = null;
132
+ const pendingTools = new Map();
133
+ // Initialize backoff and tracking
134
+ this.#backoffMs = 1000;
135
+ this.#lastUpdatedAt = this.#metadata.update_date;
136
+ void (async () => {
137
+ while (this.isSubscribed() && !signal.aborted) {
138
+ try {
139
+ const [, result] = await Promise.allSettled([
140
+ this.refresh(),
141
+ this.getMessages({ from: messagesCursor }),
142
+ ]);
143
+ if (!this.isSubscribed() || signal.aborted) {
144
+ break;
145
+ }
146
+ const messages = result.status === "fulfilled" ? result.value : [];
147
+ // Track if any changes occurred
148
+ let hasChanges = false;
149
+ // Check for status changes
150
+ if (this.status !== currentStatus) {
151
+ currentStatus = this.status;
152
+ this.dispatchEvent(new TaskStatusEvent(this.status));
153
+ hasChanges = true;
154
+ }
155
+ // Check for metadata update_date changes
156
+ if (this.#metadata.update_date !== this.#lastUpdatedAt) {
157
+ this.#lastUpdatedAt = this.#metadata.update_date;
158
+ hasChanges = true;
159
+ }
160
+ // Process messages
161
+ if (messages.length) {
162
+ hasChanges = true;
163
+ for (const message of messages) {
164
+ if (emitted.has(message.id)) {
165
+ switch (message.type) {
166
+ case "agent-error":
167
+ case "agent-message":
168
+ case "user-message":
169
+ // don't re-fire
170
+ continue;
171
+ }
172
+ }
173
+ emitted.add(message.id);
174
+ switch (message.type) {
175
+ case "agent-error":
176
+ this.dispatchEvent(new TaskErrorEvent(message));
177
+ break;
178
+ case "tool-run": {
179
+ const { status } = message;
180
+ if (pendingTools.get(message.id)?.status == status) {
181
+ // no change to the tool status
182
+ continue;
183
+ }
184
+ if (["pending", "running"].includes(status)) {
185
+ pendingTools.set(message.id, message);
186
+ }
187
+ else {
188
+ pendingTools.delete(message.id);
189
+ }
190
+ this.dispatchEvent(new TaskUpdateEvent(message));
191
+ break;
192
+ }
193
+ case "agent-message":
194
+ case "user-message":
195
+ this.dispatchEvent(new TaskMessageEvent(message));
196
+ }
197
+ lastMessage = message;
198
+ }
199
+ // +1 the api treats after inclusively
200
+ let nextCursor = messages.at(-1).createdAt.getTime() + 1;
201
+ // set the cursor as the earliest pending tool
202
+ for (const pending of pendingTools.values()) {
203
+ if (nextCursor > pending.createdAt.getTime()) {
204
+ nextCursor = pending.createdAt.getTime();
205
+ }
206
+ }
207
+ messagesCursor.setTime(nextCursor);
208
+ }
209
+ // Apply backoff logic
210
+ if (hasChanges) {
211
+ // Reset backoff on any changes
212
+ this.#backoffMs = 1000;
213
+ }
214
+ else if (!this.isRunning() && lastMessage?.isAgent()) {
215
+ // Apply exponential backoff when idle with last message from agent
216
+ this.#backoffMs = Math.min(this.#backoffMs * 2, 60000);
217
+ }
218
+ }
219
+ finally {
220
+ // Wait for the backoff period or abort signal
221
+ if (!signal.aborted) {
222
+ // Create a new controller for this delay that can be aborted independently
223
+ this.#delayController = new AbortController();
224
+ await Promise.race([
225
+ delay(this.#backoffMs),
226
+ abortPromise(AbortSignal.any([
227
+ signal,
228
+ this.#delayController.signal,
229
+ ])),
230
+ ]);
64
231
  }
65
232
  }
66
- messagesCursor.setTime(
67
- // +1 the api treats after inclusively
68
- messages.at(-1).createdAt.getTime() + 1);
69
233
  }
70
- }, 15_000, { signal });
234
+ })();
71
235
  }
72
- isListening() {
73
- return this.listenController !== undefined;
236
+ isSubscribed() {
237
+ return this.#controller !== undefined;
74
238
  }
75
- stopListening() {
76
- this.listenController?.abort();
77
- this.listenController = undefined;
239
+ unsubscribe() {
240
+ this.#delayController?.abort();
241
+ this.#controller?.abort();
242
+ this.#delayController = undefined;
243
+ this.#controller = undefined;
78
244
  }
79
245
  addEventListener(type, listener, options) {
80
- this.listen();
246
+ this.subscribe();
81
247
  const signal = AbortSignal.any([
82
248
  ...(options && typeof options === "object" && options.signal
83
249
  ? [options.signal]
84
250
  : []),
85
- this.listenController.signal,
251
+ this.#controller.signal,
86
252
  ]);
87
253
  const capture = typeof options === "boolean"
88
254
  ? options
@@ -90,7 +256,4 @@ export class Task extends EventTarget {
90
256
  const addOptions = Object.assign({}, options, { signal, capture });
91
257
  super.addEventListener(type, listener, addOptions);
92
258
  }
93
- removeEventListener(type, listener, options) {
94
- super.removeEventListener(type, listener, options);
95
- }
96
259
  }
package/esm/utils.d.ts CHANGED
@@ -1,8 +1,4 @@
1
1
  export declare function abortPromise(signal: AbortSignal, reject?: boolean): Promise<void>;
2
- export declare function delay(timeout: number): Promise<void>;
3
- export declare function runInterval(runner: () => Promise<void> | void, interval: number, { signal, }?: {
4
- signal?: AbortSignal;
5
- immediate?: boolean;
6
- }): Promise<void>;
2
+ export declare function delay(timeout: number | (() => number)): Promise<void>;
7
3
  export declare function cleanPath(path: string, version?: string): string;
8
4
  export declare function randomUUID(): Promise<any>;
package/esm/utils.js CHANGED
@@ -2,19 +2,7 @@ export function abortPromise(signal, reject) {
2
2
  return new Promise((res, rej) => signal.addEventListener("abort", () => reject ? rej() : res()));
3
3
  }
4
4
  export function delay(timeout) {
5
- return new Promise((done) => setTimeout(done, timeout));
6
- }
7
- export async function runInterval(runner, interval, { signal, } = {}) {
8
- while (true) {
9
- if (signal?.aborted) {
10
- break;
11
- }
12
- await runner();
13
- await Promise.race([
14
- delay(interval),
15
- signal ? abortPromise(signal) : new Promise(() => { }),
16
- ]);
17
- }
5
+ return new Promise((done) => setTimeout(done, typeof timeout === "number" ? timeout : timeout()));
18
6
  }
19
7
  export function cleanPath(path, version = "latest") {
20
8
  return `/${version}/${path.trim().replace(/^\/+/, "")}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@relevanceai/sdk",
3
- "version": "3.0.0-alpha.2",
3
+ "version": "3.0.0-alpha.4",
4
4
  "license": "MIT",
5
5
  "main": "./script/mod.js",
6
6
  "module": "./esm/mod.js",
package/script/agent.d.ts CHANGED
@@ -1,17 +1,29 @@
1
- import type { AgentTaskState } from "./agent-task.js";
2
1
  import { Client } from "./client.js";
2
+ import type { Region } from "./region.js";
3
+ import { Task } from "./task.js";
4
+ interface AgentConfig {
5
+ agent_id: string;
6
+ public: boolean;
7
+ name?: string;
8
+ description?: string;
9
+ emoji?: string;
10
+ insert_date_: string;
11
+ update_date_: string;
12
+ }
3
13
  export declare class Agent {
4
14
  #private;
5
15
  private readonly client;
6
- static fetch(agentId: string, cli?: Client): Promise<Agent>;
7
- private constructor();
16
+ static get(id: string, client?: Client): Promise<Agent>;
17
+ constructor(config: AgentConfig, client: Client);
8
18
  get id(): string;
9
19
  get name(): string | undefined;
10
20
  get description(): string | undefined;
11
21
  get avatar(): string | undefined;
12
- isPublic(): boolean;
13
- trigger(message: string, taskId?: string): Promise<{
14
- id: string;
15
- state: AgentTaskState;
16
- }>;
22
+ get createdAt(): Date;
23
+ get updatedAt(): Date;
24
+ get region(): Region;
25
+ get project(): string;
26
+ getTask(taskId: string): Promise<Task>;
27
+ sendMessage(message: string, task?: Task): Promise<Task>;
17
28
  }
29
+ export {};
package/script/agent.js CHANGED
@@ -2,18 +2,22 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Agent = void 0;
4
4
  const client_js_1 = require("./client.js");
5
+ const task_js_1 = require("./task.js");
5
6
  const utils_js_1 = require("./utils.js");
6
7
  const taskPrefixDelimiter = "_-_";
7
8
  class Agent {
8
9
  #config;
9
10
  client;
10
- static async fetch(agentId, cli = client_js_1.Client.default()) {
11
- const config = await cli.fetch(`/agents/${agentId}/get`);
12
- return new Agent(config.agent, cli);
11
+ static async get(id, client = client_js_1.Client.default()) {
12
+ const config = await Agent.#fetchConfig(id, client);
13
+ return new Agent(config, client);
14
+ }
15
+ static #fetchConfig(agentId, client = client_js_1.Client.default()) {
16
+ return client.fetch(`/agents/${agentId}/get`).then(({ agent }) => agent);
13
17
  }
14
18
  constructor(config, client) {
15
- this.#config = config;
16
19
  this.client = client;
20
+ this.#config = config;
17
21
  }
18
22
  get id() {
19
23
  return this.#config.agent_id;
@@ -27,14 +31,30 @@ class Agent {
27
31
  get avatar() {
28
32
  return this.#config.emoji;
29
33
  }
30
- isPublic() {
31
- return this.#config.public;
34
+ get createdAt() {
35
+ return new Date(this.#config.insert_date_);
36
+ }
37
+ get updatedAt() {
38
+ return new Date(this.#config.update_date_);
39
+ }
40
+ get region() {
41
+ return this.client.region;
32
42
  }
33
- async trigger(message, taskId) {
43
+ get project() {
44
+ return this.client.project;
45
+ }
46
+ getTask(taskId) {
47
+ return task_js_1.Task.get(taskId, this, this.client);
48
+ }
49
+ async sendMessage(message, task) {
50
+ let taskId;
34
51
  // embed keys require a task prefixing for new tasks
35
- if (!taskId && this.client.isEmbedKey()) {
52
+ if (!task && this.client.isEmbedKey()) {
36
53
  taskId = [this.client.key.taskPrefix, await (0, utils_js_1.randomUUID)()].join(taskPrefixDelimiter);
37
54
  }
55
+ else if (task) {
56
+ taskId = task.id;
57
+ }
38
58
  const res = await this.client.fetch("/agents/trigger", {
39
59
  method: "POST",
40
60
  body: JSON.stringify({
@@ -47,10 +67,10 @@ class Agent {
47
67
  },
48
68
  }),
49
69
  });
50
- return {
51
- id: res.conversation_id,
52
- state: res.state,
53
- };
70
+ if (task) {
71
+ task[task_js_1.resetSubscribeBackoff]();
72
+ }
73
+ return task ?? this.getTask(res.conversation_id);
54
74
  }
55
75
  }
56
76
  exports.Agent = Agent;
@@ -1,6 +1,4 @@
1
- import { Agent } from "./agent.js";
2
1
  import { type Region } from "./region.js";
3
- import { AgentTask } from "./agent-task.js";
4
2
  import { Key } from "./key.js";
5
3
  type CreateClientOptions = {
6
4
  apiKey: string;
@@ -11,7 +9,7 @@ type CreateClientOptions = {
11
9
  * Creates and returns the _default_ client instance.
12
10
  *
13
11
  * @throws {Error} if a default client already exists.
14
- * @see {Client.default}
12
+ * @see {@link Client.default}
15
13
  */
16
14
  export declare function createClient(keyOrOptions: Key | CreateClientOptions): Client;
17
15
  export declare class Client {
@@ -19,7 +17,7 @@ export declare class Client {
19
17
  * Returns the _default_ client instance.
20
18
  *
21
19
  * @throws {Error} if there is no default client.
22
- * @see {createClient}
20
+ * @see {@link createClient}
23
21
  */
24
22
  static default(): Client;
25
23
  readonly key: Key;
@@ -28,9 +26,7 @@ export declare class Client {
28
26
  get region(): Region;
29
27
  get project(): string;
30
28
  isEmbedKey(): boolean;
31
- createTask({ agent }: {
32
- agent: string | Agent;
33
- }): Promise<AgentTask>;
34
- fetch<T>(input: `/agents/trigger` | `/agents/${string}/get` | `/agents/${string}/tasks/${string}/metadata` | `/agents/${string}/tasks/${string}/view`, init?: RequestInit): Promise<T>;
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>;
30
+ url(path: string): URL;
35
31
  }
36
32
  export {};
package/script/client.js CHANGED
@@ -2,9 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Client = void 0;
4
4
  exports.createClient = createClient;
5
- const agent_js_1 = require("./agent.js");
6
5
  const region_js_1 = require("./region.js");
7
- const agent_task_js_1 = require("./agent-task.js");
8
6
  const utils_js_1 = require("./utils.js");
9
7
  const key_js_1 = require("./key.js");
10
8
  let defaultClient;
@@ -12,7 +10,7 @@ let defaultClient;
12
10
  * Creates and returns the _default_ client instance.
13
11
  *
14
12
  * @throws {Error} if a default client already exists.
15
- * @see {Client.default}
13
+ * @see {@link Client.default}
16
14
  */
17
15
  function createClient(keyOrOptions) {
18
16
  if (defaultClient) {
@@ -31,7 +29,7 @@ class Client {
31
29
  * Returns the _default_ client instance.
32
30
  *
33
31
  * @throws {Error} if there is no default client.
34
- * @see {createClient}
32
+ * @see {@link createClient}
35
33
  */
36
34
  static default() {
37
35
  if (!defaultClient) {
@@ -54,21 +52,22 @@ class Client {
54
52
  isEmbedKey() {
55
53
  return this.key.isEmbed();
56
54
  }
57
- async createTask({ agent }) {
58
- if (agent) {
59
- return new agent_task_js_1.AgentTask(typeof agent === "string" ? await agent_js_1.Agent.fetch(agent) : agent, undefined, this);
60
- }
61
- throw new Error("task not implemented");
62
- }
63
55
  async fetch(input, init) {
64
- const url = new URL((0, utils_js_1.cleanPath)(input), this.baseURL);
56
+ const url = this.url(input);
65
57
  const headers = new Headers(this.key.fetchHeaders());
66
58
  const response = await fetch(url, Object.assign({ headers }, init));
67
59
  if (!response.ok) {
68
- console.error(url, init, headers);
60
+ const body = await response.text();
61
+ console.error(url, init, headers, body);
69
62
  throw new Error(response.statusText);
70
63
  }
71
64
  return response.json();
72
65
  }
66
+ url(path) {
67
+ if (/^https?:\/\//.test(path)) {
68
+ return new URL(path);
69
+ }
70
+ return new URL((0, utils_js_1.cleanPath)(path), this.baseURL);
71
+ }
73
72
  }
74
73
  exports.Client = Client;