@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,14 @@
1
+ /**
2
+ * Lifts `x-major-user-jwt` from the current Next.js request headers and returns
3
+ * it as a header bag suitable for `AgentsClientConfig.getHeaders`.
4
+ *
5
+ * Returns `{}` when:
6
+ * - called outside a Next.js request scope (e.g. background job, build step) —
7
+ * `headers()` throws there and we swallow it,
8
+ * - the inbound request did not carry an `x-major-user-jwt`.
9
+ *
10
+ * A missing user JWT is a valid state — the server falls back to the deployment
11
+ * identity, which is correct for headless callers.
12
+ */
13
+ export declare function defaultGetHeaders(): Promise<Record<string, string>>;
14
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/next/auth.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAczE"}
@@ -0,0 +1,268 @@
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/next/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 headers2 = {
191
+ "Content-Type": "application/json",
192
+ "x-major-jwt": this.majorJwtToken
193
+ };
194
+ Object.assign(headers2, await this.getHeaders());
195
+ let response;
196
+ try {
197
+ response = await this.fetchImpl(url, {
198
+ method,
199
+ headers: headers2,
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 toAgentsError(status, message, requestId) {
218
+ if (status === 400) {
219
+ return new AgentsValidationError(message, requestId);
220
+ }
221
+ if (status === 401 || status === 403) {
222
+ return new AgentsAuthError(message, status, requestId);
223
+ }
224
+ if (status === 404) {
225
+ return new AgentNotFoundError(message, requestId);
226
+ }
227
+ if (status === 409) {
228
+ return new AgentRunNotActiveError(message, requestId);
229
+ }
230
+ return new AgentRunNotStartedError(message, status, requestId);
231
+ }
232
+ async function readErrorMessage(response) {
233
+ try {
234
+ const data = await response.json();
235
+ if (typeof data.message === "string") {
236
+ return data.message;
237
+ }
238
+ if (typeof data.error === "string") {
239
+ return data.error;
240
+ }
241
+ } catch {
242
+ }
243
+ return `Major API responded with HTTP ${response.status}`;
244
+ }
245
+
246
+ // src/next/auth.ts
247
+ var import_headers = require("next/headers");
248
+ async function defaultGetHeaders() {
249
+ let userJwt = null;
250
+ try {
251
+ userJwt = (await (0, import_headers.headers)()).get("x-major-user-jwt");
252
+ } catch {
253
+ return {};
254
+ }
255
+ if (!userJwt) {
256
+ return {};
257
+ }
258
+ return { "x-major-user-jwt": userJwt };
259
+ }
260
+
261
+ // src/next/index.ts
262
+ function createAgentsClient(config = {}) {
263
+ return new AgentsClient({
264
+ ...config,
265
+ getHeaders: config.getHeaders ?? defaultGetHeaders
266
+ });
267
+ }
268
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/next/index.ts", "../../src/errors.ts", "../../src/client.ts", "../../src/next/auth.ts"],
4
+ "sourcesContent": ["import { AgentsClient } from \"../client\";\nimport type { AgentsClientConfig } from \"../types\";\nimport { defaultGetHeaders } from \"./auth\";\n\n/**\n * Next.js-aware factory: identical to the base `createAgentsClient`, but\n * defaults `getHeaders` to lift `x-major-user-jwt` from the inbound request so\n * per-user-OAuth agents work transparently. Pass an explicit `getHeaders` to\n * override (e.g. `() => ({})` in a background job).\n */\nexport function createAgentsClient(config: AgentsClientConfig = {}): AgentsClient {\n return new AgentsClient({\n ...config,\n getHeaders: config.getHeaders ?? defaultGetHeaders,\n });\n}\n\nexport { AgentsClient } 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", "import { headers } from \"next/headers\";\n\n/**\n * Lifts `x-major-user-jwt` from the current Next.js request headers and returns\n * it as a header bag suitable for `AgentsClientConfig.getHeaders`.\n *\n * Returns `{}` when:\n * - called outside a Next.js request scope (e.g. background job, build step) \u2014\n * `headers()` throws there and we swallow it,\n * - the inbound request did not carry an `x-major-user-jwt`.\n *\n * A missing user JWT is a valid state \u2014 the server falls back to the deployment\n * identity, which is correct for headless callers.\n */\nexport async function defaultGetHeaders(): Promise<Record<string, string>> {\n let userJwt: string | null = null;\n\n try {\n userJwt = (await headers()).get(\"x-major-user-jwt\");\n } catch {\n return {};\n }\n\n if (!userJwt) {\n return {};\n }\n\n return { \"x-major-user-jwt\": userJwt };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["headers"]
7
+ }
@@ -0,0 +1,13 @@
1
+ import { AgentsClient } from "../client";
2
+ import type { AgentsClientConfig } from "../types";
3
+ /**
4
+ * Next.js-aware factory: identical to the base `createAgentsClient`, but
5
+ * defaults `getHeaders` to lift `x-major-user-jwt` from the inbound request so
6
+ * per-user-OAuth agents work transparently. Pass an explicit `getHeaders` to
7
+ * override (e.g. `() => ({})` in a background job).
8
+ */
9
+ export declare function createAgentsClient(config?: AgentsClientConfig): AgentsClient;
10
+ export { AgentsClient } from "../client";
11
+ export type { AgentsClientConfig, RunAgentRequest, RunAgentResponse, SendMessageResponse, StopRunResponse, AgentRun, AgentMessage, } from "../types";
12
+ export { AgentsClientError, AgentsValidationError, AgentsAuthError, AgentNotFoundError, AgentRunNotStartedError, AgentRunNotActiveError, } from "../errors";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAGnD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,kBAAuB,GAAG,YAAY,CAKhF;AAED,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EACV,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,QAAQ,EACR,YAAY,GACb,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,245 @@
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 headers2 = {
158
+ "Content-Type": "application/json",
159
+ "x-major-jwt": this.majorJwtToken
160
+ };
161
+ Object.assign(headers2, await this.getHeaders());
162
+ let response;
163
+ try {
164
+ response = await this.fetchImpl(url, {
165
+ method,
166
+ headers: headers2,
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 toAgentsError(status, message, requestId) {
185
+ if (status === 400) {
186
+ return new AgentsValidationError(message, requestId);
187
+ }
188
+ if (status === 401 || status === 403) {
189
+ return new AgentsAuthError(message, status, requestId);
190
+ }
191
+ if (status === 404) {
192
+ return new AgentNotFoundError(message, requestId);
193
+ }
194
+ if (status === 409) {
195
+ return new AgentRunNotActiveError(message, requestId);
196
+ }
197
+ return new AgentRunNotStartedError(message, status, requestId);
198
+ }
199
+ async function readErrorMessage(response) {
200
+ try {
201
+ const data = await response.json();
202
+ if (typeof data.message === "string") {
203
+ return data.message;
204
+ }
205
+ if (typeof data.error === "string") {
206
+ return data.error;
207
+ }
208
+ } catch {
209
+ }
210
+ return `Major API responded with HTTP ${response.status}`;
211
+ }
212
+
213
+ // src/next/auth.ts
214
+ import { headers } from "next/headers";
215
+ async function defaultGetHeaders() {
216
+ let userJwt = null;
217
+ try {
218
+ userJwt = (await headers()).get("x-major-user-jwt");
219
+ } catch {
220
+ return {};
221
+ }
222
+ if (!userJwt) {
223
+ return {};
224
+ }
225
+ return { "x-major-user-jwt": userJwt };
226
+ }
227
+
228
+ // src/next/index.ts
229
+ function createAgentsClient(config = {}) {
230
+ return new AgentsClient({
231
+ ...config,
232
+ getHeaders: config.getHeaders ?? defaultGetHeaders
233
+ });
234
+ }
235
+ export {
236
+ AgentNotFoundError,
237
+ AgentRunNotActiveError,
238
+ AgentRunNotStartedError,
239
+ AgentsAuthError,
240
+ AgentsClient,
241
+ AgentsClientError,
242
+ AgentsValidationError,
243
+ createAgentsClient
244
+ };
245
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/errors.ts", "../../src/client.ts", "../../src/next/auth.ts", "../../src/next/index.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", "import { headers } from \"next/headers\";\n\n/**\n * Lifts `x-major-user-jwt` from the current Next.js request headers and returns\n * it as a header bag suitable for `AgentsClientConfig.getHeaders`.\n *\n * Returns `{}` when:\n * - called outside a Next.js request scope (e.g. background job, build step) \u2014\n * `headers()` throws there and we swallow it,\n * - the inbound request did not carry an `x-major-user-jwt`.\n *\n * A missing user JWT is a valid state \u2014 the server falls back to the deployment\n * identity, which is correct for headless callers.\n */\nexport async function defaultGetHeaders(): Promise<Record<string, string>> {\n let userJwt: string | null = null;\n\n try {\n userJwt = (await headers()).get(\"x-major-user-jwt\");\n } catch {\n return {};\n }\n\n if (!userJwt) {\n return {};\n }\n\n return { \"x-major-user-jwt\": userJwt };\n}\n", "import { AgentsClient } from \"../client\";\nimport type { AgentsClientConfig } from \"../types\";\nimport { defaultGetHeaders } from \"./auth\";\n\n/**\n * Next.js-aware factory: identical to the base `createAgentsClient`, but\n * defaults `getHeaders` to lift `x-major-user-jwt` from the inbound request so\n * per-user-OAuth agents work transparently. Pass an explicit `getHeaders` to\n * override (e.g. `() => ({})` in a background job).\n */\nexport function createAgentsClient(config: AgentsClientConfig = {}): AgentsClient {\n return new AgentsClient({\n ...config,\n getHeaders: config.getHeaders ?? defaultGetHeaders,\n });\n}\n\nexport { AgentsClient } 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"],
5
+ "mappings": "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",
6
+ "names": ["headers"]
7
+ }