@major-tech/agents-client 0.1.1

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.
@@ -0,0 +1,57 @@
1
+ import type { AgentsClientConfig, RunAgentRequest, RunAgentResponse, SendMessageResponse, StopRunResponse, AgentRun, AgentMessage } from "./types";
2
+ /**
3
+ * Client for triggering and interacting with Major agents from a deployed app.
4
+ *
5
+ * Prefer the `createAgentsClient()` factory — it reads platform-managed env
6
+ * vars and (when imported from `@major-tech/agents-client/next`) wires up
7
+ * auto-forwarding of the inbound viewer JWT.
8
+ *
9
+ * A "run" is a Major chat thread; the `chatThreadId` returned by `run()` is the
10
+ * `runId` the run-ops methods (`sendMessage` / `stopAgent` / `getAgentContent`)
11
+ * accept.
12
+ */
13
+ export declare class AgentsClient {
14
+ private readonly baseUrl;
15
+ private readonly majorJwtToken;
16
+ private readonly getHeaders;
17
+ private readonly fetchImpl;
18
+ constructor(config?: AgentsClientConfig);
19
+ /**
20
+ * Start an agent run. Fire-and-forget: returns as soon as the server has
21
+ * created the chat thread and accepted the run; the agent itself runs
22
+ * asynchronously. The returned `chatThreadId` is the `runId` for run-ops.
23
+ */
24
+ run(request: RunAgentRequest): Promise<RunAgentResponse>;
25
+ /**
26
+ * Send a follow-up message to a run this app started. Throws
27
+ * {@link AgentRunNotActiveError} if the run has already finished — call
28
+ * `run()` again to start a new one.
29
+ */
30
+ sendMessage(runId: string, message: string): Promise<SendMessageResponse>;
31
+ /**
32
+ * Stop a run this app started. Idempotent: stopping an already-finished run
33
+ * succeeds and reports `"stopped"`.
34
+ */
35
+ stopAgent(runId: string): Promise<StopRunResponse>;
36
+ /**
37
+ * List runs this app started that are still executing, optionally filtered to
38
+ * a single agent. "Live" means the run's session has not ended.
39
+ */
40
+ getRunningInstancesOfAgent(agentId?: string): Promise<AgentRun[]>;
41
+ /**
42
+ * Read the most recent messages of a run's thread. `n` caps how many trailing
43
+ * messages are returned (the server default applies when omitted).
44
+ */
45
+ getAgentContent(runId: string, n?: number): Promise<AgentMessage[]>;
46
+ private request;
47
+ }
48
+ /**
49
+ * Factory mirroring the convention used by `@major-tech/resource-client`.
50
+ * Equivalent to `new AgentsClient(config)`.
51
+ *
52
+ * In Next.js apps, prefer `createAgentsClient` from
53
+ * `@major-tech/agents-client/next` — it auto-forwards `x-major-user-jwt` from
54
+ * the inbound request headers.
55
+ */
56
+ export declare function createAgentsClient(config?: AgentsClientConfig): AgentsClient;
57
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,QAAQ,EACR,YAAY,EACb,MAAM,SAAS,CAAC;AAUjB;;;;;;;;;;GAUG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiE;IAC5F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,MAAM,GAAE,kBAAuB;IAqB3C;;;;OAIG;IACG,GAAG,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkB9D;;;;OAIG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAe/E;;;OAGG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAYxD;;;OAGG;IACG,0BAA0B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAevE;;;OAGG;IACG,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAoB3D,OAAO;CAuCtB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,kBAAuB,GAAG,YAAY,CAEhF"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Error hierarchy for the Major agents client. Every error extends
3
+ * {@link AgentsClientError}, which carries the HTTP status (when the failure
4
+ * came from a response) and the server's `x-request-id` for support/debugging.
5
+ */
6
+ export declare class AgentsClientError extends Error {
7
+ readonly httpStatus?: number;
8
+ readonly requestId?: string;
9
+ constructor(message: string, httpStatus?: number, requestId?: string);
10
+ }
11
+ /** The request was rejected as invalid (HTTP 400). */
12
+ export declare class AgentsValidationError extends AgentsClientError {
13
+ constructor(message: string, requestId?: string);
14
+ }
15
+ /** Authentication or authorization failed (HTTP 401/403). */
16
+ export declare class AgentsAuthError extends AgentsClientError {
17
+ constructor(message: string, httpStatus?: number, requestId?: string);
18
+ }
19
+ /** The agent or run could not be found, or is not owned by this app (HTTP 404). */
20
+ export declare class AgentNotFoundError extends AgentsClientError {
21
+ constructor(message: string, requestId?: string);
22
+ }
23
+ /** A run could not be started, or a transport error prevented the request. */
24
+ export declare class AgentRunNotStartedError extends AgentsClientError {
25
+ constructor(message: string, httpStatus?: number, requestId?: string);
26
+ }
27
+ /**
28
+ * The targeted run is no longer active, so the operation (e.g. `sendMessage`)
29
+ * cannot be applied (HTTP 409). Re-trigger the agent with `run()` to start a
30
+ * new run.
31
+ */
32
+ export declare class AgentRunNotActiveError extends AgentsClientError {
33
+ constructor(message: string, requestId?: string);
34
+ }
35
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAMrE;AAED,sDAAsD;AACtD,qBAAa,qBAAsB,SAAQ,iBAAiB;gBAC9C,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAIhD;AAED,6DAA6D;AAC7D,qBAAa,eAAgB,SAAQ,iBAAiB;gBACxC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAIrE;AAED,mFAAmF;AACnF,qBAAa,kBAAmB,SAAQ,iBAAiB;gBAC3C,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAIhD;AAED,8EAA8E;AAC9E,qBAAa,uBAAwB,SAAQ,iBAAiB;gBAChD,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAIrE;AAED;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,iBAAiB;gBAC/C,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAIhD"}
package/dist/index.cjs ADDED
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ AgentNotFoundError: () => AgentNotFoundError,
24
+ AgentRunNotActiveError: () => AgentRunNotActiveError,
25
+ AgentRunNotStartedError: () => AgentRunNotStartedError,
26
+ AgentsAuthError: () => AgentsAuthError,
27
+ AgentsClient: () => AgentsClient,
28
+ AgentsClientError: () => AgentsClientError,
29
+ AgentsValidationError: () => AgentsValidationError,
30
+ createAgentsClient: () => createAgentsClient
31
+ });
32
+ module.exports = __toCommonJS(index_exports);
33
+
34
+ // src/errors.ts
35
+ var AgentsClientError = class extends Error {
36
+ httpStatus;
37
+ requestId;
38
+ constructor(message, httpStatus, requestId) {
39
+ super(message);
40
+ this.name = "AgentsClientError";
41
+ this.httpStatus = httpStatus;
42
+ this.requestId = requestId;
43
+ }
44
+ };
45
+ var AgentsValidationError = class extends AgentsClientError {
46
+ constructor(message, requestId) {
47
+ super(message, 400, requestId);
48
+ this.name = "AgentsValidationError";
49
+ }
50
+ };
51
+ var AgentsAuthError = class extends AgentsClientError {
52
+ constructor(message, httpStatus, requestId) {
53
+ super(message, httpStatus, requestId);
54
+ this.name = "AgentsAuthError";
55
+ }
56
+ };
57
+ var AgentNotFoundError = class extends AgentsClientError {
58
+ constructor(message, requestId) {
59
+ super(message, 404, requestId);
60
+ this.name = "AgentNotFoundError";
61
+ }
62
+ };
63
+ var AgentRunNotStartedError = class extends AgentsClientError {
64
+ constructor(message, httpStatus, requestId) {
65
+ super(message, httpStatus, requestId);
66
+ this.name = "AgentRunNotStartedError";
67
+ }
68
+ };
69
+ var AgentRunNotActiveError = class extends AgentsClientError {
70
+ constructor(message, requestId) {
71
+ super(message, 409, requestId);
72
+ this.name = "AgentRunNotActiveError";
73
+ }
74
+ };
75
+
76
+ // src/client.ts
77
+ var AgentsClient = class {
78
+ baseUrl;
79
+ majorJwtToken;
80
+ getHeaders;
81
+ fetchImpl;
82
+ constructor(config = {}) {
83
+ const baseUrl = config.baseUrl ?? process.env.MAJOR_API_BASE_URL;
84
+ if (!baseUrl) {
85
+ throw new AgentsClientError(
86
+ "AgentsClient: baseUrl is required (set MAJOR_API_BASE_URL or pass baseUrl explicitly)."
87
+ );
88
+ }
89
+ const majorJwtToken = config.majorJwtToken ?? process.env.MAJOR_JWT_TOKEN;
90
+ if (!majorJwtToken) {
91
+ throw new AgentsClientError(
92
+ "AgentsClient: majorJwtToken is required (set MAJOR_JWT_TOKEN or pass majorJwtToken explicitly)."
93
+ );
94
+ }
95
+ this.baseUrl = baseUrl.replace(/\/$/, "");
96
+ this.majorJwtToken = majorJwtToken;
97
+ this.getHeaders = config.getHeaders ?? (() => ({}));
98
+ this.fetchImpl = config.fetch ?? globalThis.fetch;
99
+ }
100
+ /**
101
+ * Start an agent run. Fire-and-forget: returns as soon as the server has
102
+ * created the chat thread and accepted the run; the agent itself runs
103
+ * asynchronously. The returned `chatThreadId` is the `runId` for run-ops.
104
+ */
105
+ async run(request) {
106
+ if (!request.agentId) {
107
+ throw new AgentsValidationError("AgentsClient.run: agentId is required.");
108
+ }
109
+ if (!request.prompt) {
110
+ throw new AgentsValidationError("AgentsClient.run: prompt is required.");
111
+ }
112
+ const { agentId, ...body } = request;
113
+ return this.request(
114
+ "POST",
115
+ `/agents/${encodeURIComponent(agentId)}/runs`,
116
+ body,
117
+ (message) => new AgentRunNotStartedError(`Failed to reach Major API: ${message}`)
118
+ );
119
+ }
120
+ /**
121
+ * Send a follow-up message to a run this app started. Throws
122
+ * {@link AgentRunNotActiveError} if the run has already finished — call
123
+ * `run()` again to start a new one.
124
+ */
125
+ async sendMessage(runId, message) {
126
+ if (!runId) {
127
+ throw new AgentsValidationError("AgentsClient.sendMessage: runId is required.");
128
+ }
129
+ if (!message) {
130
+ throw new AgentsValidationError("AgentsClient.sendMessage: message is required.");
131
+ }
132
+ return this.request(
133
+ "POST",
134
+ `/agents/runs/${encodeURIComponent(runId)}/messages`,
135
+ { message }
136
+ );
137
+ }
138
+ /**
139
+ * Stop a run this app started. Idempotent: stopping an already-finished run
140
+ * succeeds and reports `"stopped"`.
141
+ */
142
+ async stopAgent(runId) {
143
+ if (!runId) {
144
+ throw new AgentsValidationError("AgentsClient.stopAgent: runId is required.");
145
+ }
146
+ return this.request(
147
+ "POST",
148
+ `/agents/runs/${encodeURIComponent(runId)}/stop`,
149
+ void 0
150
+ );
151
+ }
152
+ /**
153
+ * List runs this app started that are still executing, optionally filtered to
154
+ * a single agent. "Live" means the run's session has not ended.
155
+ */
156
+ async getRunningInstancesOfAgent(agentId) {
157
+ const params = new URLSearchParams({ status: "active" });
158
+ if (agentId) {
159
+ params.set("agentId", agentId);
160
+ }
161
+ const result = await this.request(
162
+ "GET",
163
+ `/agents/runs?${params.toString()}`,
164
+ void 0
165
+ );
166
+ return result.runs;
167
+ }
168
+ /**
169
+ * Read the most recent messages of a run's thread. `n` caps how many trailing
170
+ * messages are returned (the server default applies when omitted).
171
+ */
172
+ async getAgentContent(runId, n) {
173
+ if (!runId) {
174
+ throw new AgentsValidationError("AgentsClient.getAgentContent: runId is required.");
175
+ }
176
+ const params = new URLSearchParams();
177
+ if (n !== void 0) {
178
+ params.set("n", String(n));
179
+ }
180
+ const query = params.toString();
181
+ const result = await this.request(
182
+ "GET",
183
+ `/agents/runs/${encodeURIComponent(runId)}/messages${query ? `?${query}` : ""}`,
184
+ void 0
185
+ );
186
+ return result.messages;
187
+ }
188
+ async request(method, path, body, onTransportError = (message) => new AgentsClientError(`Failed to reach Major API: ${message}`)) {
189
+ const url = `${this.baseUrl}${path}`;
190
+ const headers = {
191
+ "Content-Type": "application/json",
192
+ "x-major-jwt": this.majorJwtToken
193
+ };
194
+ Object.assign(headers, await this.getHeaders());
195
+ let response;
196
+ try {
197
+ response = await this.fetchImpl(url, {
198
+ method,
199
+ headers,
200
+ body: body === void 0 ? void 0 : JSON.stringify(body)
201
+ });
202
+ } catch (error) {
203
+ const message = error instanceof Error ? error.message : String(error);
204
+ throw onTransportError(message);
205
+ }
206
+ const requestId = response.headers.get("x-request-id") ?? void 0;
207
+ if (response.ok) {
208
+ if (response.status === 204) {
209
+ return void 0;
210
+ }
211
+ return await response.json();
212
+ }
213
+ const errorMessage = await readErrorMessage(response);
214
+ throw toAgentsError(response.status, errorMessage, requestId);
215
+ }
216
+ };
217
+ function createAgentsClient(config = {}) {
218
+ return new AgentsClient(config);
219
+ }
220
+ function toAgentsError(status, message, requestId) {
221
+ if (status === 400) {
222
+ return new AgentsValidationError(message, requestId);
223
+ }
224
+ if (status === 401 || status === 403) {
225
+ return new AgentsAuthError(message, status, requestId);
226
+ }
227
+ if (status === 404) {
228
+ return new AgentNotFoundError(message, requestId);
229
+ }
230
+ if (status === 409) {
231
+ return new AgentRunNotActiveError(message, requestId);
232
+ }
233
+ return new AgentRunNotStartedError(message, status, requestId);
234
+ }
235
+ async function readErrorMessage(response) {
236
+ try {
237
+ const data = await response.json();
238
+ if (typeof data.message === "string") {
239
+ return data.message;
240
+ }
241
+ if (typeof data.error === "string") {
242
+ return data.error;
243
+ }
244
+ } catch {
245
+ }
246
+ return `Major API responded with HTTP ${response.status}`;
247
+ }
248
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts", "../src/errors.ts", "../src/client.ts"],
4
+ "sourcesContent": ["export { AgentsClient, createAgentsClient } from \"./client\";\nexport type {\n AgentsClientConfig,\n RunAgentRequest,\n RunAgentResponse,\n SendMessageResponse,\n StopRunResponse,\n AgentRun,\n AgentMessage,\n} from \"./types\";\nexport {\n AgentsClientError,\n AgentsValidationError,\n AgentsAuthError,\n AgentNotFoundError,\n AgentRunNotStartedError,\n AgentRunNotActiveError,\n} from \"./errors\";\n", "/**\n * Error hierarchy for the Major agents client. Every error extends\n * {@link AgentsClientError}, which carries the HTTP status (when the failure\n * came from a response) and the server's `x-request-id` for support/debugging.\n */\nexport class AgentsClientError extends Error {\n readonly httpStatus?: number;\n readonly requestId?: string;\n\n constructor(message: string, httpStatus?: number, requestId?: string) {\n super(message);\n this.name = \"AgentsClientError\";\n this.httpStatus = httpStatus;\n this.requestId = requestId;\n }\n}\n\n/** The request was rejected as invalid (HTTP 400). */\nexport class AgentsValidationError extends AgentsClientError {\n constructor(message: string, requestId?: string) {\n super(message, 400, requestId);\n this.name = \"AgentsValidationError\";\n }\n}\n\n/** Authentication or authorization failed (HTTP 401/403). */\nexport class AgentsAuthError extends AgentsClientError {\n constructor(message: string, httpStatus?: number, requestId?: string) {\n super(message, httpStatus, requestId);\n this.name = \"AgentsAuthError\";\n }\n}\n\n/** The agent or run could not be found, or is not owned by this app (HTTP 404). */\nexport class AgentNotFoundError extends AgentsClientError {\n constructor(message: string, requestId?: string) {\n super(message, 404, requestId);\n this.name = \"AgentNotFoundError\";\n }\n}\n\n/** A run could not be started, or a transport error prevented the request. */\nexport class AgentRunNotStartedError extends AgentsClientError {\n constructor(message: string, httpStatus?: number, requestId?: string) {\n super(message, httpStatus, requestId);\n this.name = \"AgentRunNotStartedError\";\n }\n}\n\n/**\n * The targeted run is no longer active, so the operation (e.g. `sendMessage`)\n * cannot be applied (HTTP 409). Re-trigger the agent with `run()` to start a\n * new run.\n */\nexport class AgentRunNotActiveError extends AgentsClientError {\n constructor(message: string, requestId?: string) {\n super(message, 409, requestId);\n this.name = \"AgentRunNotActiveError\";\n }\n}\n", "import type {\n AgentsClientConfig,\n RunAgentRequest,\n RunAgentResponse,\n SendMessageResponse,\n StopRunResponse,\n AgentRun,\n AgentMessage,\n} from \"./types\";\nimport {\n AgentsClientError,\n AgentsValidationError,\n AgentsAuthError,\n AgentNotFoundError,\n AgentRunNotStartedError,\n AgentRunNotActiveError,\n} from \"./errors\";\n\n/**\n * Client for triggering and interacting with Major agents from a deployed app.\n *\n * Prefer the `createAgentsClient()` factory \u2014 it reads platform-managed env\n * vars and (when imported from `@major-tech/agents-client/next`) wires up\n * auto-forwarding of the inbound viewer JWT.\n *\n * A \"run\" is a Major chat thread; the `chatThreadId` returned by `run()` is the\n * `runId` the run-ops methods (`sendMessage` / `stopAgent` / `getAgentContent`)\n * accept.\n */\nexport class AgentsClient {\n private readonly baseUrl: string;\n private readonly majorJwtToken: string;\n private readonly getHeaders: () => Promise<Record<string, string>> | Record<string, string>;\n private readonly fetchImpl: typeof fetch;\n\n constructor(config: AgentsClientConfig = {}) {\n const baseUrl = config.baseUrl ?? process.env.MAJOR_API_BASE_URL;\n if (!baseUrl) {\n throw new AgentsClientError(\n \"AgentsClient: baseUrl is required (set MAJOR_API_BASE_URL or pass baseUrl explicitly).\",\n );\n }\n\n const majorJwtToken = config.majorJwtToken ?? process.env.MAJOR_JWT_TOKEN;\n if (!majorJwtToken) {\n throw new AgentsClientError(\n \"AgentsClient: majorJwtToken is required (set MAJOR_JWT_TOKEN or pass majorJwtToken explicitly).\",\n );\n }\n\n this.baseUrl = baseUrl.replace(/\\/$/, \"\");\n this.majorJwtToken = majorJwtToken;\n this.getHeaders = config.getHeaders ?? (() => ({}));\n this.fetchImpl = config.fetch ?? globalThis.fetch;\n }\n\n /**\n * Start an agent run. Fire-and-forget: returns as soon as the server has\n * created the chat thread and accepted the run; the agent itself runs\n * asynchronously. The returned `chatThreadId` is the `runId` for run-ops.\n */\n async run(request: RunAgentRequest): Promise<RunAgentResponse> {\n if (!request.agentId) {\n throw new AgentsValidationError(\"AgentsClient.run: agentId is required.\");\n }\n if (!request.prompt) {\n throw new AgentsValidationError(\"AgentsClient.run: prompt is required.\");\n }\n\n const { agentId, ...body } = request;\n\n return this.request<RunAgentResponse>(\n \"POST\",\n `/agents/${encodeURIComponent(agentId)}/runs`,\n body,\n (message) => new AgentRunNotStartedError(`Failed to reach Major API: ${message}`),\n );\n }\n\n /**\n * Send a follow-up message to a run this app started. Throws\n * {@link AgentRunNotActiveError} if the run has already finished \u2014 call\n * `run()` again to start a new one.\n */\n async sendMessage(runId: string, message: string): Promise<SendMessageResponse> {\n if (!runId) {\n throw new AgentsValidationError(\"AgentsClient.sendMessage: runId is required.\");\n }\n if (!message) {\n throw new AgentsValidationError(\"AgentsClient.sendMessage: message is required.\");\n }\n\n return this.request<SendMessageResponse>(\n \"POST\",\n `/agents/runs/${encodeURIComponent(runId)}/messages`,\n { message },\n );\n }\n\n /**\n * Stop a run this app started. Idempotent: stopping an already-finished run\n * succeeds and reports `\"stopped\"`.\n */\n async stopAgent(runId: string): Promise<StopRunResponse> {\n if (!runId) {\n throw new AgentsValidationError(\"AgentsClient.stopAgent: runId is required.\");\n }\n\n return this.request<StopRunResponse>(\n \"POST\",\n `/agents/runs/${encodeURIComponent(runId)}/stop`,\n undefined,\n );\n }\n\n /**\n * List runs this app started that are still executing, optionally filtered to\n * a single agent. \"Live\" means the run's session has not ended.\n */\n async getRunningInstancesOfAgent(agentId?: string): Promise<AgentRun[]> {\n const params = new URLSearchParams({ status: \"active\" });\n if (agentId) {\n params.set(\"agentId\", agentId);\n }\n\n const result = await this.request<{ runs: AgentRun[] }>(\n \"GET\",\n `/agents/runs?${params.toString()}`,\n undefined,\n );\n\n return result.runs;\n }\n\n /**\n * Read the most recent messages of a run's thread. `n` caps how many trailing\n * messages are returned (the server default applies when omitted).\n */\n async getAgentContent(runId: string, n?: number): Promise<AgentMessage[]> {\n if (!runId) {\n throw new AgentsValidationError(\"AgentsClient.getAgentContent: runId is required.\");\n }\n\n const params = new URLSearchParams();\n if (n !== undefined) {\n params.set(\"n\", String(n));\n }\n const query = params.toString();\n\n const result = await this.request<{ messages: AgentMessage[] }>(\n \"GET\",\n `/agents/runs/${encodeURIComponent(runId)}/messages${query ? `?${query}` : \"\"}`,\n undefined,\n );\n\n return result.messages;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body: unknown,\n onTransportError: (message: string) => AgentsClientError = (message) =>\n new AgentsClientError(`Failed to reach Major API: ${message}`),\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"x-major-jwt\": this.majorJwtToken,\n };\n Object.assign(headers, await this.getHeaders());\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw onTransportError(message);\n }\n\n const requestId = response.headers.get(\"x-request-id\") ?? undefined;\n\n if (response.ok) {\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await response.json()) as T;\n }\n\n const errorMessage = await readErrorMessage(response);\n throw toAgentsError(response.status, errorMessage, requestId);\n }\n}\n\n/**\n * Factory mirroring the convention used by `@major-tech/resource-client`.\n * Equivalent to `new AgentsClient(config)`.\n *\n * In Next.js apps, prefer `createAgentsClient` from\n * `@major-tech/agents-client/next` \u2014 it auto-forwards `x-major-user-jwt` from\n * the inbound request headers.\n */\nexport function createAgentsClient(config: AgentsClientConfig = {}): AgentsClient {\n return new AgentsClient(config);\n}\n\nfunction toAgentsError(status: number, message: string, requestId?: string): AgentsClientError {\n if (status === 400) {\n return new AgentsValidationError(message, requestId);\n }\n if (status === 401 || status === 403) {\n return new AgentsAuthError(message, status, requestId);\n }\n if (status === 404) {\n return new AgentNotFoundError(message, requestId);\n }\n if (status === 409) {\n return new AgentRunNotActiveError(message, requestId);\n }\n return new AgentRunNotStartedError(message, status, requestId);\n}\n\nasync function readErrorMessage(response: Response): Promise<string> {\n try {\n const data = (await response.json()) as { message?: unknown; error?: unknown };\n if (typeof data.message === \"string\") {\n return data.message;\n }\n if (typeof data.error === \"string\") {\n return data.error;\n }\n } catch {\n // Non-JSON error body \u2014 fall through to the generic message.\n }\n\n return `Major API responded with HTTP ${response.status}`;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,4 @@
1
+ export { AgentsClient, createAgentsClient } from "./client";
2
+ export type { AgentsClientConfig, RunAgentRequest, RunAgentResponse, SendMessageResponse, StopRunResponse, AgentRun, AgentMessage, } from "./types";
3
+ export { AgentsClientError, AgentsValidationError, AgentsAuthError, AgentNotFoundError, AgentRunNotStartedError, AgentRunNotActiveError, } from "./errors";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC5D,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,QAAQ,EACR,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,225 @@
1
+ // src/errors.ts
2
+ var AgentsClientError = class extends Error {
3
+ httpStatus;
4
+ requestId;
5
+ constructor(message, httpStatus, requestId) {
6
+ super(message);
7
+ this.name = "AgentsClientError";
8
+ this.httpStatus = httpStatus;
9
+ this.requestId = requestId;
10
+ }
11
+ };
12
+ var AgentsValidationError = class extends AgentsClientError {
13
+ constructor(message, requestId) {
14
+ super(message, 400, requestId);
15
+ this.name = "AgentsValidationError";
16
+ }
17
+ };
18
+ var AgentsAuthError = class extends AgentsClientError {
19
+ constructor(message, httpStatus, requestId) {
20
+ super(message, httpStatus, requestId);
21
+ this.name = "AgentsAuthError";
22
+ }
23
+ };
24
+ var AgentNotFoundError = class extends AgentsClientError {
25
+ constructor(message, requestId) {
26
+ super(message, 404, requestId);
27
+ this.name = "AgentNotFoundError";
28
+ }
29
+ };
30
+ var AgentRunNotStartedError = class extends AgentsClientError {
31
+ constructor(message, httpStatus, requestId) {
32
+ super(message, httpStatus, requestId);
33
+ this.name = "AgentRunNotStartedError";
34
+ }
35
+ };
36
+ var AgentRunNotActiveError = class extends AgentsClientError {
37
+ constructor(message, requestId) {
38
+ super(message, 409, requestId);
39
+ this.name = "AgentRunNotActiveError";
40
+ }
41
+ };
42
+
43
+ // src/client.ts
44
+ var AgentsClient = class {
45
+ baseUrl;
46
+ majorJwtToken;
47
+ getHeaders;
48
+ fetchImpl;
49
+ constructor(config = {}) {
50
+ const baseUrl = config.baseUrl ?? process.env.MAJOR_API_BASE_URL;
51
+ if (!baseUrl) {
52
+ throw new AgentsClientError(
53
+ "AgentsClient: baseUrl is required (set MAJOR_API_BASE_URL or pass baseUrl explicitly)."
54
+ );
55
+ }
56
+ const majorJwtToken = config.majorJwtToken ?? process.env.MAJOR_JWT_TOKEN;
57
+ if (!majorJwtToken) {
58
+ throw new AgentsClientError(
59
+ "AgentsClient: majorJwtToken is required (set MAJOR_JWT_TOKEN or pass majorJwtToken explicitly)."
60
+ );
61
+ }
62
+ this.baseUrl = baseUrl.replace(/\/$/, "");
63
+ this.majorJwtToken = majorJwtToken;
64
+ this.getHeaders = config.getHeaders ?? (() => ({}));
65
+ this.fetchImpl = config.fetch ?? globalThis.fetch;
66
+ }
67
+ /**
68
+ * Start an agent run. Fire-and-forget: returns as soon as the server has
69
+ * created the chat thread and accepted the run; the agent itself runs
70
+ * asynchronously. The returned `chatThreadId` is the `runId` for run-ops.
71
+ */
72
+ async run(request) {
73
+ if (!request.agentId) {
74
+ throw new AgentsValidationError("AgentsClient.run: agentId is required.");
75
+ }
76
+ if (!request.prompt) {
77
+ throw new AgentsValidationError("AgentsClient.run: prompt is required.");
78
+ }
79
+ const { agentId, ...body } = request;
80
+ return this.request(
81
+ "POST",
82
+ `/agents/${encodeURIComponent(agentId)}/runs`,
83
+ body,
84
+ (message) => new AgentRunNotStartedError(`Failed to reach Major API: ${message}`)
85
+ );
86
+ }
87
+ /**
88
+ * Send a follow-up message to a run this app started. Throws
89
+ * {@link AgentRunNotActiveError} if the run has already finished — call
90
+ * `run()` again to start a new one.
91
+ */
92
+ async sendMessage(runId, message) {
93
+ if (!runId) {
94
+ throw new AgentsValidationError("AgentsClient.sendMessage: runId is required.");
95
+ }
96
+ if (!message) {
97
+ throw new AgentsValidationError("AgentsClient.sendMessage: message is required.");
98
+ }
99
+ return this.request(
100
+ "POST",
101
+ `/agents/runs/${encodeURIComponent(runId)}/messages`,
102
+ { message }
103
+ );
104
+ }
105
+ /**
106
+ * Stop a run this app started. Idempotent: stopping an already-finished run
107
+ * succeeds and reports `"stopped"`.
108
+ */
109
+ async stopAgent(runId) {
110
+ if (!runId) {
111
+ throw new AgentsValidationError("AgentsClient.stopAgent: runId is required.");
112
+ }
113
+ return this.request(
114
+ "POST",
115
+ `/agents/runs/${encodeURIComponent(runId)}/stop`,
116
+ void 0
117
+ );
118
+ }
119
+ /**
120
+ * List runs this app started that are still executing, optionally filtered to
121
+ * a single agent. "Live" means the run's session has not ended.
122
+ */
123
+ async getRunningInstancesOfAgent(agentId) {
124
+ const params = new URLSearchParams({ status: "active" });
125
+ if (agentId) {
126
+ params.set("agentId", agentId);
127
+ }
128
+ const result = await this.request(
129
+ "GET",
130
+ `/agents/runs?${params.toString()}`,
131
+ void 0
132
+ );
133
+ return result.runs;
134
+ }
135
+ /**
136
+ * Read the most recent messages of a run's thread. `n` caps how many trailing
137
+ * messages are returned (the server default applies when omitted).
138
+ */
139
+ async getAgentContent(runId, n) {
140
+ if (!runId) {
141
+ throw new AgentsValidationError("AgentsClient.getAgentContent: runId is required.");
142
+ }
143
+ const params = new URLSearchParams();
144
+ if (n !== void 0) {
145
+ params.set("n", String(n));
146
+ }
147
+ const query = params.toString();
148
+ const result = await this.request(
149
+ "GET",
150
+ `/agents/runs/${encodeURIComponent(runId)}/messages${query ? `?${query}` : ""}`,
151
+ void 0
152
+ );
153
+ return result.messages;
154
+ }
155
+ async request(method, path, body, onTransportError = (message) => new AgentsClientError(`Failed to reach Major API: ${message}`)) {
156
+ const url = `${this.baseUrl}${path}`;
157
+ const headers = {
158
+ "Content-Type": "application/json",
159
+ "x-major-jwt": this.majorJwtToken
160
+ };
161
+ Object.assign(headers, await this.getHeaders());
162
+ let response;
163
+ try {
164
+ response = await this.fetchImpl(url, {
165
+ method,
166
+ headers,
167
+ body: body === void 0 ? void 0 : JSON.stringify(body)
168
+ });
169
+ } catch (error) {
170
+ const message = error instanceof Error ? error.message : String(error);
171
+ throw onTransportError(message);
172
+ }
173
+ const requestId = response.headers.get("x-request-id") ?? void 0;
174
+ if (response.ok) {
175
+ if (response.status === 204) {
176
+ return void 0;
177
+ }
178
+ return await response.json();
179
+ }
180
+ const errorMessage = await readErrorMessage(response);
181
+ throw toAgentsError(response.status, errorMessage, requestId);
182
+ }
183
+ };
184
+ function createAgentsClient(config = {}) {
185
+ return new AgentsClient(config);
186
+ }
187
+ function toAgentsError(status, message, requestId) {
188
+ if (status === 400) {
189
+ return new AgentsValidationError(message, requestId);
190
+ }
191
+ if (status === 401 || status === 403) {
192
+ return new AgentsAuthError(message, status, requestId);
193
+ }
194
+ if (status === 404) {
195
+ return new AgentNotFoundError(message, requestId);
196
+ }
197
+ if (status === 409) {
198
+ return new AgentRunNotActiveError(message, requestId);
199
+ }
200
+ return new AgentRunNotStartedError(message, status, requestId);
201
+ }
202
+ async function readErrorMessage(response) {
203
+ try {
204
+ const data = await response.json();
205
+ if (typeof data.message === "string") {
206
+ return data.message;
207
+ }
208
+ if (typeof data.error === "string") {
209
+ return data.error;
210
+ }
211
+ } catch {
212
+ }
213
+ return `Major API responded with HTTP ${response.status}`;
214
+ }
215
+ export {
216
+ AgentNotFoundError,
217
+ AgentRunNotActiveError,
218
+ AgentRunNotStartedError,
219
+ AgentsAuthError,
220
+ AgentsClient,
221
+ AgentsClientError,
222
+ AgentsValidationError,
223
+ createAgentsClient
224
+ };
225
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/errors.ts", "../src/client.ts"],
4
+ "sourcesContent": ["/**\n * Error hierarchy for the Major agents client. Every error extends\n * {@link AgentsClientError}, which carries the HTTP status (when the failure\n * came from a response) and the server's `x-request-id` for support/debugging.\n */\nexport class AgentsClientError extends Error {\n readonly httpStatus?: number;\n readonly requestId?: string;\n\n constructor(message: string, httpStatus?: number, requestId?: string) {\n super(message);\n this.name = \"AgentsClientError\";\n this.httpStatus = httpStatus;\n this.requestId = requestId;\n }\n}\n\n/** The request was rejected as invalid (HTTP 400). */\nexport class AgentsValidationError extends AgentsClientError {\n constructor(message: string, requestId?: string) {\n super(message, 400, requestId);\n this.name = \"AgentsValidationError\";\n }\n}\n\n/** Authentication or authorization failed (HTTP 401/403). */\nexport class AgentsAuthError extends AgentsClientError {\n constructor(message: string, httpStatus?: number, requestId?: string) {\n super(message, httpStatus, requestId);\n this.name = \"AgentsAuthError\";\n }\n}\n\n/** The agent or run could not be found, or is not owned by this app (HTTP 404). */\nexport class AgentNotFoundError extends AgentsClientError {\n constructor(message: string, requestId?: string) {\n super(message, 404, requestId);\n this.name = \"AgentNotFoundError\";\n }\n}\n\n/** A run could not be started, or a transport error prevented the request. */\nexport class AgentRunNotStartedError extends AgentsClientError {\n constructor(message: string, httpStatus?: number, requestId?: string) {\n super(message, httpStatus, requestId);\n this.name = \"AgentRunNotStartedError\";\n }\n}\n\n/**\n * The targeted run is no longer active, so the operation (e.g. `sendMessage`)\n * cannot be applied (HTTP 409). Re-trigger the agent with `run()` to start a\n * new run.\n */\nexport class AgentRunNotActiveError extends AgentsClientError {\n constructor(message: string, requestId?: string) {\n super(message, 409, requestId);\n this.name = \"AgentRunNotActiveError\";\n }\n}\n", "import type {\n AgentsClientConfig,\n RunAgentRequest,\n RunAgentResponse,\n SendMessageResponse,\n StopRunResponse,\n AgentRun,\n AgentMessage,\n} from \"./types\";\nimport {\n AgentsClientError,\n AgentsValidationError,\n AgentsAuthError,\n AgentNotFoundError,\n AgentRunNotStartedError,\n AgentRunNotActiveError,\n} from \"./errors\";\n\n/**\n * Client for triggering and interacting with Major agents from a deployed app.\n *\n * Prefer the `createAgentsClient()` factory \u2014 it reads platform-managed env\n * vars and (when imported from `@major-tech/agents-client/next`) wires up\n * auto-forwarding of the inbound viewer JWT.\n *\n * A \"run\" is a Major chat thread; the `chatThreadId` returned by `run()` is the\n * `runId` the run-ops methods (`sendMessage` / `stopAgent` / `getAgentContent`)\n * accept.\n */\nexport class AgentsClient {\n private readonly baseUrl: string;\n private readonly majorJwtToken: string;\n private readonly getHeaders: () => Promise<Record<string, string>> | Record<string, string>;\n private readonly fetchImpl: typeof fetch;\n\n constructor(config: AgentsClientConfig = {}) {\n const baseUrl = config.baseUrl ?? process.env.MAJOR_API_BASE_URL;\n if (!baseUrl) {\n throw new AgentsClientError(\n \"AgentsClient: baseUrl is required (set MAJOR_API_BASE_URL or pass baseUrl explicitly).\",\n );\n }\n\n const majorJwtToken = config.majorJwtToken ?? process.env.MAJOR_JWT_TOKEN;\n if (!majorJwtToken) {\n throw new AgentsClientError(\n \"AgentsClient: majorJwtToken is required (set MAJOR_JWT_TOKEN or pass majorJwtToken explicitly).\",\n );\n }\n\n this.baseUrl = baseUrl.replace(/\\/$/, \"\");\n this.majorJwtToken = majorJwtToken;\n this.getHeaders = config.getHeaders ?? (() => ({}));\n this.fetchImpl = config.fetch ?? globalThis.fetch;\n }\n\n /**\n * Start an agent run. Fire-and-forget: returns as soon as the server has\n * created the chat thread and accepted the run; the agent itself runs\n * asynchronously. The returned `chatThreadId` is the `runId` for run-ops.\n */\n async run(request: RunAgentRequest): Promise<RunAgentResponse> {\n if (!request.agentId) {\n throw new AgentsValidationError(\"AgentsClient.run: agentId is required.\");\n }\n if (!request.prompt) {\n throw new AgentsValidationError(\"AgentsClient.run: prompt is required.\");\n }\n\n const { agentId, ...body } = request;\n\n return this.request<RunAgentResponse>(\n \"POST\",\n `/agents/${encodeURIComponent(agentId)}/runs`,\n body,\n (message) => new AgentRunNotStartedError(`Failed to reach Major API: ${message}`),\n );\n }\n\n /**\n * Send a follow-up message to a run this app started. Throws\n * {@link AgentRunNotActiveError} if the run has already finished \u2014 call\n * `run()` again to start a new one.\n */\n async sendMessage(runId: string, message: string): Promise<SendMessageResponse> {\n if (!runId) {\n throw new AgentsValidationError(\"AgentsClient.sendMessage: runId is required.\");\n }\n if (!message) {\n throw new AgentsValidationError(\"AgentsClient.sendMessage: message is required.\");\n }\n\n return this.request<SendMessageResponse>(\n \"POST\",\n `/agents/runs/${encodeURIComponent(runId)}/messages`,\n { message },\n );\n }\n\n /**\n * Stop a run this app started. Idempotent: stopping an already-finished run\n * succeeds and reports `\"stopped\"`.\n */\n async stopAgent(runId: string): Promise<StopRunResponse> {\n if (!runId) {\n throw new AgentsValidationError(\"AgentsClient.stopAgent: runId is required.\");\n }\n\n return this.request<StopRunResponse>(\n \"POST\",\n `/agents/runs/${encodeURIComponent(runId)}/stop`,\n undefined,\n );\n }\n\n /**\n * List runs this app started that are still executing, optionally filtered to\n * a single agent. \"Live\" means the run's session has not ended.\n */\n async getRunningInstancesOfAgent(agentId?: string): Promise<AgentRun[]> {\n const params = new URLSearchParams({ status: \"active\" });\n if (agentId) {\n params.set(\"agentId\", agentId);\n }\n\n const result = await this.request<{ runs: AgentRun[] }>(\n \"GET\",\n `/agents/runs?${params.toString()}`,\n undefined,\n );\n\n return result.runs;\n }\n\n /**\n * Read the most recent messages of a run's thread. `n` caps how many trailing\n * messages are returned (the server default applies when omitted).\n */\n async getAgentContent(runId: string, n?: number): Promise<AgentMessage[]> {\n if (!runId) {\n throw new AgentsValidationError(\"AgentsClient.getAgentContent: runId is required.\");\n }\n\n const params = new URLSearchParams();\n if (n !== undefined) {\n params.set(\"n\", String(n));\n }\n const query = params.toString();\n\n const result = await this.request<{ messages: AgentMessage[] }>(\n \"GET\",\n `/agents/runs/${encodeURIComponent(runId)}/messages${query ? `?${query}` : \"\"}`,\n undefined,\n );\n\n return result.messages;\n }\n\n private async request<T>(\n method: string,\n path: string,\n body: unknown,\n onTransportError: (message: string) => AgentsClientError = (message) =>\n new AgentsClientError(`Failed to reach Major API: ${message}`),\n ): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n \"x-major-jwt\": this.majorJwtToken,\n };\n Object.assign(headers, await this.getHeaders());\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw onTransportError(message);\n }\n\n const requestId = response.headers.get(\"x-request-id\") ?? undefined;\n\n if (response.ok) {\n if (response.status === 204) {\n return undefined as T;\n }\n\n return (await response.json()) as T;\n }\n\n const errorMessage = await readErrorMessage(response);\n throw toAgentsError(response.status, errorMessage, requestId);\n }\n}\n\n/**\n * Factory mirroring the convention used by `@major-tech/resource-client`.\n * Equivalent to `new AgentsClient(config)`.\n *\n * In Next.js apps, prefer `createAgentsClient` from\n * `@major-tech/agents-client/next` \u2014 it auto-forwards `x-major-user-jwt` from\n * the inbound request headers.\n */\nexport function createAgentsClient(config: AgentsClientConfig = {}): AgentsClient {\n return new AgentsClient(config);\n}\n\nfunction toAgentsError(status: number, message: string, requestId?: string): AgentsClientError {\n if (status === 400) {\n return new AgentsValidationError(message, requestId);\n }\n if (status === 401 || status === 403) {\n return new AgentsAuthError(message, status, requestId);\n }\n if (status === 404) {\n return new AgentNotFoundError(message, requestId);\n }\n if (status === 409) {\n return new AgentRunNotActiveError(message, requestId);\n }\n return new AgentRunNotStartedError(message, status, requestId);\n}\n\nasync function readErrorMessage(response: Response): Promise<string> {\n try {\n const data = (await response.json()) as { message?: unknown; error?: unknown };\n if (typeof data.message === \"string\") {\n return data.message;\n }\n if (typeof data.error === \"string\") {\n return data.error;\n }\n } catch {\n // Non-JSON error body \u2014 fall through to the generic message.\n }\n\n return `Major API responded with HTTP ${response.status}`;\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }