@mastra/factory 0.2.2-alpha.1 → 0.2.2-alpha.2

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 (155) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/auth.js +401 -334
  3. package/dist/auth.js.map +1 -1
  4. package/dist/capabilities/connection.js +1 -1
  5. package/dist/capabilities/intake.js +1 -1
  6. package/dist/capabilities/version-control.js +1 -1
  7. package/dist/factory.js +441 -39622
  8. package/dist/factory.js.map +1 -1
  9. package/dist/index.js +2 -39633
  10. package/dist/integrations/base.js +1 -1
  11. package/dist/integrations/github/config.js +36 -22
  12. package/dist/integrations/github/config.js.map +1 -1
  13. package/dist/integrations/github/factory-session.js +33 -37
  14. package/dist/integrations/github/factory-session.js.map +1 -1
  15. package/dist/integrations/github/integration.js +1037 -3672
  16. package/dist/integrations/github/integration.js.map +1 -1
  17. package/dist/integrations/github/issue-triage.js +71 -71
  18. package/dist/integrations/github/issue-triage.js.map +1 -1
  19. package/dist/integrations/github/pat.js +47 -36
  20. package/dist/integrations/github/pat.js.map +1 -1
  21. package/dist/integrations/github/provenance.js +72 -101
  22. package/dist/integrations/github/provenance.js.map +1 -1
  23. package/dist/integrations/github/routes.js +1272 -1881
  24. package/dist/integrations/github/routes.js.map +1 -1
  25. package/dist/integrations/github/rules.js +203 -471
  26. package/dist/integrations/github/rules.js.map +1 -1
  27. package/dist/integrations/github/sandbox.js +400 -345
  28. package/dist/integrations/github/sandbox.js.map +1 -1
  29. package/dist/integrations/github/session-subscriptions.js +165 -223
  30. package/dist/integrations/github/session-subscriptions.js.map +1 -1
  31. package/dist/integrations/github/subscriptions.js +43 -51
  32. package/dist/integrations/github/subscriptions.js.map +1 -1
  33. package/dist/integrations/github/token-refresh.js +15 -18
  34. package/dist/integrations/github/token-refresh.js.map +1 -1
  35. package/dist/integrations/github/webhook.js +359 -343
  36. package/dist/integrations/github/webhook.js.map +1 -1
  37. package/dist/integrations/linear/agent-tools.js +77 -100
  38. package/dist/integrations/linear/agent-tools.js.map +1 -1
  39. package/dist/integrations/linear/integration.js +611 -1309
  40. package/dist/integrations/linear/integration.js.map +1 -1
  41. package/dist/integrations/linear/routes.js +227 -230
  42. package/dist/integrations/linear/routes.js.map +1 -1
  43. package/dist/integrations/linear/rules.js +126 -346
  44. package/dist/integrations/linear/rules.js.map +1 -1
  45. package/dist/integrations/linear/storage.js +1 -1
  46. package/dist/integrations/platform/api-client.js +131 -135
  47. package/dist/integrations/platform/api-client.js.map +1 -1
  48. package/dist/integrations/platform/github/event-worker.js +275 -573
  49. package/dist/integrations/platform/github/event-worker.js.map +1 -1
  50. package/dist/integrations/platform/github/integration.js +845 -4022
  51. package/dist/integrations/platform/github/integration.js.map +1 -1
  52. package/dist/integrations/platform/linear/integration.js +457 -1309
  53. package/dist/integrations/platform/linear/integration.js.map +1 -1
  54. package/dist/integrations/workos/integration.js +80 -85
  55. package/dist/integrations/workos/integration.js.map +1 -1
  56. package/dist/routes/config.d.ts.map +1 -1
  57. package/dist/routes/config.js +933 -912
  58. package/dist/routes/config.js.map +1 -1
  59. package/dist/routes/custom-provider-source.js +110 -93
  60. package/dist/routes/custom-provider-source.js.map +1 -1
  61. package/dist/routes/fs.js +401 -349
  62. package/dist/routes/fs.js.map +1 -1
  63. package/dist/routes/intake.js +165 -165
  64. package/dist/routes/intake.js.map +1 -1
  65. package/dist/routes/oauth.js +447 -25166
  66. package/dist/routes/oauth.js.map +1 -1
  67. package/dist/routes/projects.js +437 -376
  68. package/dist/routes/projects.js.map +1 -1
  69. package/dist/routes/provider-credentials.js +76 -58
  70. package/dist/routes/provider-credentials.js.map +1 -1
  71. package/dist/routes/route.js +12 -8
  72. package/dist/routes/route.js.map +1 -1
  73. package/dist/routes/skills.js +160 -173
  74. package/dist/routes/skills.js.map +1 -1
  75. package/dist/routes/surface.js +250 -28615
  76. package/dist/routes/surface.js.map +1 -1
  77. package/dist/routes/tenant-credentials.js +141 -166
  78. package/dist/routes/tenant-credentials.js.map +1 -1
  79. package/dist/routes/work-items.js +654 -862
  80. package/dist/routes/work-items.js.map +1 -1
  81. package/dist/rules/binding-context.js +23 -35
  82. package/dist/rules/binding-context.js.map +1 -1
  83. package/dist/rules/defaults.js +200 -309
  84. package/dist/rules/defaults.js.map +1 -1
  85. package/dist/rules/dispatcher.js +438 -683
  86. package/dist/rules/dispatcher.js.map +1 -1
  87. package/dist/rules/index.js +5 -599
  88. package/dist/rules/processor.js +344 -596
  89. package/dist/rules/processor.js.map +1 -1
  90. package/dist/rules/resolve.js +21 -18
  91. package/dist/rules/resolve.js.map +1 -1
  92. package/dist/rules/start-coordinator.js +168 -157
  93. package/dist/rules/start-coordinator.js.map +1 -1
  94. package/dist/rules/tools.js +50 -85
  95. package/dist/rules/tools.js.map +1 -1
  96. package/dist/rules/transition-service.js +183 -454
  97. package/dist/rules/transition-service.js.map +1 -1
  98. package/dist/rules/types.js +33 -29
  99. package/dist/rules/types.js.map +1 -1
  100. package/dist/rules/validation.js +266 -281
  101. package/dist/rules/validation.js.map +1 -1
  102. package/dist/sandbox/fleet.js +272 -250
  103. package/dist/sandbox/fleet.js.map +1 -1
  104. package/dist/sandbox/reattach.js +13 -6
  105. package/dist/sandbox/reattach.js.map +1 -1
  106. package/dist/server-error.js +12 -16
  107. package/dist/server-error.js.map +1 -1
  108. package/dist/skills/service.js +30 -35
  109. package/dist/skills/service.js.map +1 -1
  110. package/dist/spa-static.js +91 -65
  111. package/dist/spa-static.js.map +1 -1
  112. package/dist/state-signing.js +73 -44
  113. package/dist/state-signing.js.map +1 -1
  114. package/dist/storage/domains/audit/agent-audit.js +60 -59
  115. package/dist/storage/domains/audit/agent-audit.js.map +1 -1
  116. package/dist/storage/domains/audit/base.js +169 -112
  117. package/dist/storage/domains/audit/base.js.map +1 -1
  118. package/dist/storage/domains/audit/domain.js +155 -153
  119. package/dist/storage/domains/audit/domain.js.map +1 -1
  120. package/dist/storage/domains/credentials/base.js +259 -243
  121. package/dist/storage/domains/credentials/base.js.map +1 -1
  122. package/dist/storage/domains/custom-providers/base.js +138 -143
  123. package/dist/storage/domains/custom-providers/base.js.map +1 -1
  124. package/dist/storage/domains/intake/base.js +75 -57
  125. package/dist/storage/domains/intake/base.js.map +1 -1
  126. package/dist/storage/domains/integrations/base.js +310 -245
  127. package/dist/storage/domains/integrations/base.js.map +1 -1
  128. package/dist/storage/domains/memory-settings/base.js +117 -102
  129. package/dist/storage/domains/memory-settings/base.js.map +1 -1
  130. package/dist/storage/domains/model-packs/base.js +89 -88
  131. package/dist/storage/domains/model-packs/base.js.map +1 -1
  132. package/dist/storage/domains/projects/base.js +97 -92
  133. package/dist/storage/domains/projects/base.js.map +1 -1
  134. package/dist/storage/domains/queue-health/base.js +111 -76
  135. package/dist/storage/domains/queue-health/base.js.map +1 -1
  136. package/dist/storage/domains/source-control/base.js +777 -706
  137. package/dist/storage/domains/source-control/base.js.map +1 -1
  138. package/dist/storage/domains/source-control/inmemory.js +322 -348
  139. package/dist/storage/domains/source-control/inmemory.js.map +1 -1
  140. package/dist/storage/domains/work-items/base.js +1266 -1148
  141. package/dist/storage/domains/work-items/base.js.map +1 -1
  142. package/dist/storage/domains/work-items/metrics.js +202 -184
  143. package/dist/storage/domains/work-items/metrics.js.map +1 -1
  144. package/dist/timing.js +29 -22
  145. package/dist/timing.js.map +1 -1
  146. package/dist/workspace.js +236 -477
  147. package/dist/workspace.js.map +1 -1
  148. package/package.json +8 -8
  149. package/dist/capabilities/connection.js.map +0 -1
  150. package/dist/capabilities/intake.js.map +0 -1
  151. package/dist/capabilities/version-control.js.map +0 -1
  152. package/dist/index.js.map +0 -1
  153. package/dist/integrations/base.js.map +0 -1
  154. package/dist/integrations/linear/storage.js.map +0 -1
  155. package/dist/rules/index.js.map +0 -1
@@ -1,160 +1,156 @@
1
- // src/integrations/platform/api-client.ts
1
+ //#region src/integrations/platform/api-client.ts
2
2
  function platformApiClientConfigFromEnv() {
3
- const sharedApiUrl = process.env.MASTRA_SHARED_API_URL?.trim() || "https://platform.mastra.ai/v1";
4
- const accessToken = process.env.MASTRA_PLATFORM_SECRET_KEY?.trim();
5
- if (!accessToken) {
6
- throw new Error("Platform integration: missing required environment variable MASTRA_PLATFORM_SECRET_KEY.");
7
- }
8
- return { baseUrl: normalizeSharedApiUrl(sharedApiUrl), accessToken };
3
+ const sharedApiUrl = process.env.MASTRA_SHARED_API_URL?.trim() || "https://platform.mastra.ai/v1";
4
+ const accessToken = process.env.MASTRA_PLATFORM_SECRET_KEY?.trim();
5
+ if (!accessToken) throw new Error("Platform integration: missing required environment variable MASTRA_PLATFORM_SECRET_KEY.");
6
+ return {
7
+ baseUrl: normalizeSharedApiUrl(sharedApiUrl),
8
+ accessToken
9
+ };
9
10
  }
10
11
  function normalizeSharedApiUrl(sharedApiUrl) {
11
- return sharedApiUrl.replace(/\/+$/, "").replace(/\/v1$/, "");
12
+ return sharedApiUrl.replace(/\/+$/, "").replace(/\/v1$/, "");
12
13
  }
13
14
  var PlatformApiError = class extends Error {
14
- status;
15
- retryAfterSeconds;
16
- constructor(message, status, retryAfterSeconds = null) {
17
- super(message);
18
- this.name = "PlatformApiError";
19
- this.status = status;
20
- this.retryAfterSeconds = retryAfterSeconds;
21
- }
15
+ status;
16
+ retryAfterSeconds;
17
+ constructor(message, status, retryAfterSeconds = null) {
18
+ super(message);
19
+ this.name = "PlatformApiError";
20
+ this.status = status;
21
+ this.retryAfterSeconds = retryAfterSeconds;
22
+ }
22
23
  };
23
24
  var PlatformApiClient = class {
24
- #baseUrl;
25
- #accessToken;
26
- #fetch;
27
- constructor(config) {
28
- const missing = ["baseUrl", "accessToken"].filter((field) => !config[field]);
29
- if (missing.length > 0) {
30
- throw new Error(`Platform integration: missing required config field(s): ${missing.join(", ")}.`);
31
- }
32
- this.#baseUrl = config.baseUrl.replace(/\/+$/, "");
33
- this.#accessToken = config.accessToken;
34
- this.#fetch = config.fetchImpl ?? globalThis.fetch;
35
- }
36
- async request(method, path, body, options) {
37
- const response = await this.#send(method, path, body, options);
38
- if (!response.ok) {
39
- const message = redact(await extractError(response), this.#accessToken);
40
- const retryAfterSeconds = parseRetryAfter(response.headers.get("retry-after"));
41
- logPlatformError("Platform API request failed", {
42
- method,
43
- path,
44
- status: response.status,
45
- retryAfterSeconds,
46
- message
47
- });
48
- throw new PlatformApiError(message, response.status, retryAfterSeconds);
49
- }
50
- if (response.status === 204) return void 0;
51
- return await response.json();
52
- }
53
- async requestRedirect(method, path, options) {
54
- const response = await this.#send(method, path, void 0, options, "manual");
55
- if (response.status >= 300 && response.status < 400) {
56
- const location = response.headers.get("location");
57
- if (location) return location;
58
- }
59
- if (!response.ok) {
60
- const message = redact(await extractError(response), this.#accessToken);
61
- const retryAfterSeconds = parseRetryAfter(response.headers.get("retry-after"));
62
- logPlatformError("Platform API redirect request failed", {
63
- method,
64
- path,
65
- status: response.status,
66
- retryAfterSeconds,
67
- message
68
- });
69
- throw new PlatformApiError(message, response.status, retryAfterSeconds);
70
- }
71
- logPlatformError("Platform API request did not return a redirect", { method, path, status: response.status });
72
- throw new PlatformApiError("Platform API request did not return a redirect.", response.status);
73
- }
74
- async #send(method, path, body, options, redirect) {
75
- const headers = {
76
- accept: "application/json",
77
- authorization: `Bearer ${this.#accessToken}`
78
- };
79
- if (options?.actingUserId) {
80
- headers["x-acting-user-id"] = options.actingUserId;
81
- }
82
- const timeoutSignal = AbortSignal.timeout(15e3);
83
- const init = {
84
- method,
85
- headers,
86
- redirect,
87
- signal: options?.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal
88
- };
89
- if (body !== void 0) {
90
- headers["content-type"] = "application/json";
91
- init.body = JSON.stringify(body);
92
- }
93
- try {
94
- return await this.#fetch(`${this.#baseUrl}${path}`, init);
95
- } catch (error) {
96
- if (error instanceof Error && error.message.includes(this.#accessToken)) {
97
- const redacted = new Error(redact(error.message, this.#accessToken));
98
- redacted.name = error.name;
99
- logPlatformError("Platform API transport error", {
100
- method,
101
- path,
102
- name: redacted.name,
103
- message: redacted.message
104
- });
105
- throw redacted;
106
- }
107
- logPlatformError("Platform API transport error", {
108
- method,
109
- path,
110
- name: error instanceof Error ? error.name : void 0,
111
- message: error instanceof Error ? error.message : String(error)
112
- });
113
- throw error;
114
- }
115
- }
25
+ #baseUrl;
26
+ #accessToken;
27
+ #fetch;
28
+ constructor(config) {
29
+ const missing = ["baseUrl", "accessToken"].filter((field) => !config[field]);
30
+ if (missing.length > 0) throw new Error(`Platform integration: missing required config field(s): ${missing.join(", ")}.`);
31
+ this.#baseUrl = config.baseUrl.replace(/\/+$/, "");
32
+ this.#accessToken = config.accessToken;
33
+ this.#fetch = config.fetchImpl ?? globalThis.fetch;
34
+ }
35
+ async request(method, path, body, options) {
36
+ const response = await this.#send(method, path, body, options);
37
+ if (!response.ok) {
38
+ const message = redact(await extractError(response), this.#accessToken);
39
+ const retryAfterSeconds = parseRetryAfter(response.headers.get("retry-after"));
40
+ logPlatformError("Platform API request failed", {
41
+ method,
42
+ path,
43
+ status: response.status,
44
+ retryAfterSeconds,
45
+ message
46
+ });
47
+ throw new PlatformApiError(message, response.status, retryAfterSeconds);
48
+ }
49
+ if (response.status === 204) return void 0;
50
+ return await response.json();
51
+ }
52
+ async requestRedirect(method, path, options) {
53
+ const response = await this.#send(method, path, void 0, options, "manual");
54
+ if (response.status >= 300 && response.status < 400) {
55
+ const location = response.headers.get("location");
56
+ if (location) return location;
57
+ }
58
+ if (!response.ok) {
59
+ const message = redact(await extractError(response), this.#accessToken);
60
+ const retryAfterSeconds = parseRetryAfter(response.headers.get("retry-after"));
61
+ logPlatformError("Platform API redirect request failed", {
62
+ method,
63
+ path,
64
+ status: response.status,
65
+ retryAfterSeconds,
66
+ message
67
+ });
68
+ throw new PlatformApiError(message, response.status, retryAfterSeconds);
69
+ }
70
+ logPlatformError("Platform API request did not return a redirect", {
71
+ method,
72
+ path,
73
+ status: response.status
74
+ });
75
+ throw new PlatformApiError("Platform API request did not return a redirect.", response.status);
76
+ }
77
+ async #send(method, path, body, options, redirect) {
78
+ const headers = {
79
+ accept: "application/json",
80
+ authorization: `Bearer ${this.#accessToken}`
81
+ };
82
+ if (options?.actingUserId) headers["x-acting-user-id"] = options.actingUserId;
83
+ const timeoutSignal = AbortSignal.timeout(15e3);
84
+ const init = {
85
+ method,
86
+ headers,
87
+ redirect,
88
+ signal: options?.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal
89
+ };
90
+ if (body !== void 0) {
91
+ headers["content-type"] = "application/json";
92
+ init.body = JSON.stringify(body);
93
+ }
94
+ try {
95
+ return await this.#fetch(`${this.#baseUrl}${path}`, init);
96
+ } catch (error) {
97
+ if (error instanceof Error && error.message.includes(this.#accessToken)) {
98
+ const redacted = new Error(redact(error.message, this.#accessToken));
99
+ redacted.name = error.name;
100
+ logPlatformError("Platform API transport error", {
101
+ method,
102
+ path,
103
+ name: redacted.name,
104
+ message: redacted.message
105
+ });
106
+ throw redacted;
107
+ }
108
+ logPlatformError("Platform API transport error", {
109
+ method,
110
+ path,
111
+ name: error instanceof Error ? error.name : void 0,
112
+ message: error instanceof Error ? error.message : String(error)
113
+ });
114
+ throw error;
115
+ }
116
+ }
116
117
  };
117
118
  async function extractError(response) {
118
- try {
119
- const data = await response.clone().json();
120
- for (const field of ["detail", "error", "title"]) {
121
- if (typeof data[field] === "string" && data[field]) return data[field];
122
- }
123
- } catch {
124
- }
125
- return `Platform API request failed (${response.status})`;
119
+ try {
120
+ const data = await response.clone().json();
121
+ for (const field of [
122
+ "detail",
123
+ "error",
124
+ "title"
125
+ ]) if (typeof data[field] === "string" && data[field]) return data[field];
126
+ } catch {}
127
+ return `Platform API request failed (${response.status})`;
126
128
  }
127
129
  function redact(message, accessToken) {
128
- return message.split(accessToken).join("[REDACTED]");
130
+ return message.split(accessToken).join("[REDACTED]");
129
131
  }
130
132
  function logPlatformInfo(message, fields) {
131
- writePlatformLog("info", message, fields);
133
+ writePlatformLog("info", message, fields);
132
134
  }
133
135
  function logPlatformWarn(message, fields) {
134
- writePlatformLog("warn", message, fields);
136
+ writePlatformLog("warn", message, fields);
135
137
  }
136
138
  function logPlatformError(message, fields) {
137
- writePlatformLog("error", message, fields);
139
+ writePlatformLog("error", message, fields);
138
140
  }
139
141
  function writePlatformLog(level, message, fields) {
140
- const metadata = fields ? ` ${JSON.stringify(stripUndefined(fields))}` : "";
141
- process.stderr.write(`[Mastra Factory] ${level.toUpperCase()} ${message}${metadata}
142
- `);
142
+ const metadata = fields ? ` ${JSON.stringify(stripUndefined(fields))}` : "";
143
+ process.stderr.write(`[Mastra Factory] ${level.toUpperCase()} ${message}${metadata}\n`);
143
144
  }
144
145
  function stripUndefined(fields) {
145
- return Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== void 0));
146
+ return Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== void 0));
146
147
  }
147
148
  function parseRetryAfter(value) {
148
- if (!value) return null;
149
- const seconds = Number.parseInt(value, 10);
150
- return Number.isSafeInteger(seconds) && seconds >= 0 ? seconds : null;
149
+ if (!value) return null;
150
+ const seconds = Number.parseInt(value, 10);
151
+ return Number.isSafeInteger(seconds) && seconds >= 0 ? seconds : null;
151
152
  }
152
- export {
153
- PlatformApiClient,
154
- PlatformApiError,
155
- logPlatformError,
156
- logPlatformInfo,
157
- logPlatformWarn,
158
- platformApiClientConfigFromEnv
159
- };
153
+ //#endregion
154
+ export { PlatformApiClient, PlatformApiError, logPlatformError, logPlatformInfo, logPlatformWarn, platformApiClientConfigFromEnv };
155
+
160
156
  //# sourceMappingURL=api-client.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/integrations/platform/api-client.ts"],"sourcesContent":["export interface PlatformApiClientConfig {\n baseUrl: string;\n accessToken: string;\n fetchImpl?: typeof fetch;\n}\n\nexport function platformApiClientConfigFromEnv(): PlatformApiClientConfig {\n const sharedApiUrl = process.env.MASTRA_SHARED_API_URL?.trim() || 'https://platform.mastra.ai/v1';\n const accessToken = process.env.MASTRA_PLATFORM_SECRET_KEY?.trim();\n if (!accessToken) {\n throw new Error('Platform integration: missing required environment variable MASTRA_PLATFORM_SECRET_KEY.');\n }\n return { baseUrl: normalizeSharedApiUrl(sharedApiUrl), accessToken };\n}\n\nfunction normalizeSharedApiUrl(sharedApiUrl: string): string {\n return sharedApiUrl.replace(/\\/+$/, '').replace(/\\/v1$/, '');\n}\n\nexport class PlatformApiError extends Error {\n readonly status: number;\n readonly retryAfterSeconds: number | null;\n\n constructor(message: string, status: number, retryAfterSeconds: number | null = null) {\n super(message);\n this.name = 'PlatformApiError';\n this.status = status;\n this.retryAfterSeconds = retryAfterSeconds;\n }\n}\n\nexport class PlatformApiClient {\n readonly #baseUrl: string;\n readonly #accessToken: string;\n readonly #fetch: typeof fetch;\n\n constructor(config: PlatformApiClientConfig) {\n const missing = ['baseUrl', 'accessToken'].filter(field => !config[field as keyof PlatformApiClientConfig]);\n if (missing.length > 0) {\n throw new Error(`Platform integration: missing required config field(s): ${missing.join(', ')}.`);\n }\n this.#baseUrl = config.baseUrl.replace(/\\/+$/, '');\n this.#accessToken = config.accessToken;\n this.#fetch = config.fetchImpl ?? globalThis.fetch;\n }\n\n async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options?: { signal?: AbortSignal; actingUserId?: string },\n ): Promise<T> {\n const response = await this.#send(method, path, body, options);\n if (!response.ok) {\n const message = redact(await extractError(response), this.#accessToken);\n const retryAfterSeconds = parseRetryAfter(response.headers.get('retry-after'));\n logPlatformError('Platform API request failed', {\n method,\n path,\n status: response.status,\n retryAfterSeconds,\n message,\n });\n throw new PlatformApiError(message, response.status, retryAfterSeconds);\n }\n if (response.status === 204) return undefined as T;\n return (await response.json()) as T;\n }\n\n async requestRedirect(method: string, path: string, options?: { signal?: AbortSignal }): Promise<string> {\n const response = await this.#send(method, path, undefined, options, 'manual');\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get('location');\n if (location) return location;\n }\n if (!response.ok) {\n const message = redact(await extractError(response), this.#accessToken);\n const retryAfterSeconds = parseRetryAfter(response.headers.get('retry-after'));\n logPlatformError('Platform API redirect request failed', {\n method,\n path,\n status: response.status,\n retryAfterSeconds,\n message,\n });\n throw new PlatformApiError(message, response.status, retryAfterSeconds);\n }\n logPlatformError('Platform API request did not return a redirect', { method, path, status: response.status });\n throw new PlatformApiError('Platform API request did not return a redirect.', response.status);\n }\n\n async #send(\n method: string,\n path: string,\n body?: unknown,\n options?: { signal?: AbortSignal; actingUserId?: string },\n redirect?: RequestInit['redirect'],\n ): Promise<Response> {\n const headers: Record<string, string> = {\n accept: 'application/json',\n authorization: `Bearer ${this.#accessToken}`,\n };\n // Acting end-user for platform GitHub writes: the platform resolves this\n // user's GitHub OAuth connection (org-scoped) so issues/PRs are authored\n // by the human instead of the App bot. Ignored by older platforms.\n if (options?.actingUserId) {\n headers['x-acting-user-id'] = options.actingUserId;\n }\n const timeoutSignal = AbortSignal.timeout(15_000);\n const init: RequestInit = {\n method,\n headers,\n redirect,\n signal: options?.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal,\n };\n if (body !== undefined) {\n headers['content-type'] = 'application/json';\n init.body = JSON.stringify(body);\n }\n\n try {\n return await this.#fetch(`${this.#baseUrl}${path}`, init);\n } catch (error) {\n if (error instanceof Error && error.message.includes(this.#accessToken)) {\n const redacted = new Error(redact(error.message, this.#accessToken));\n redacted.name = error.name;\n logPlatformError('Platform API transport error', {\n method,\n path,\n name: redacted.name,\n message: redacted.message,\n });\n throw redacted;\n }\n logPlatformError('Platform API transport error', {\n method,\n path,\n name: error instanceof Error ? error.name : undefined,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n}\n\nasync function extractError(response: Response): Promise<string> {\n try {\n const data = (await response.clone().json()) as Record<string, unknown>;\n for (const field of ['detail', 'error', 'title']) {\n if (typeof data[field] === 'string' && data[field]) return data[field];\n }\n } catch {\n // Fall through to the status-based message.\n }\n return `Platform API request failed (${response.status})`;\n}\n\nfunction redact(message: string, accessToken: string): string {\n return message.split(accessToken).join('[REDACTED]');\n}\n\nexport function logPlatformInfo(message: string, fields?: Record<string, unknown>): void {\n writePlatformLog('info', message, fields);\n}\n\nexport function logPlatformWarn(message: string, fields?: Record<string, unknown>): void {\n writePlatformLog('warn', message, fields);\n}\n\nexport function logPlatformError(message: string, fields?: Record<string, unknown>): void {\n writePlatformLog('error', message, fields);\n}\n\nfunction writePlatformLog(level: 'info' | 'warn' | 'error', message: string, fields?: Record<string, unknown>): void {\n const metadata = fields ? ` ${JSON.stringify(stripUndefined(fields))}` : '';\n process.stderr.write(`[Mastra Factory] ${level.toUpperCase()} ${message}${metadata}\\n`);\n}\n\nfunction stripUndefined(fields: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined));\n}\n\nfunction parseRetryAfter(value: string | null): number | null {\n if (!value) return null;\n const seconds = Number.parseInt(value, 10);\n return Number.isSafeInteger(seconds) && seconds >= 0 ? seconds : null;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"api-client.js","names":["#baseUrl","#accessToken","#fetch","#send"],"sources":["../../../src/integrations/platform/api-client.ts"],"sourcesContent":["export interface PlatformApiClientConfig {\n baseUrl: string;\n accessToken: string;\n fetchImpl?: typeof fetch;\n}\n\nexport function platformApiClientConfigFromEnv(): PlatformApiClientConfig {\n const sharedApiUrl = process.env.MASTRA_SHARED_API_URL?.trim() || 'https://platform.mastra.ai/v1';\n const accessToken = process.env.MASTRA_PLATFORM_SECRET_KEY?.trim();\n if (!accessToken) {\n throw new Error('Platform integration: missing required environment variable MASTRA_PLATFORM_SECRET_KEY.');\n }\n return { baseUrl: normalizeSharedApiUrl(sharedApiUrl), accessToken };\n}\n\nfunction normalizeSharedApiUrl(sharedApiUrl: string): string {\n return sharedApiUrl.replace(/\\/+$/, '').replace(/\\/v1$/, '');\n}\n\nexport class PlatformApiError extends Error {\n readonly status: number;\n readonly retryAfterSeconds: number | null;\n\n constructor(message: string, status: number, retryAfterSeconds: number | null = null) {\n super(message);\n this.name = 'PlatformApiError';\n this.status = status;\n this.retryAfterSeconds = retryAfterSeconds;\n }\n}\n\nexport class PlatformApiClient {\n readonly #baseUrl: string;\n readonly #accessToken: string;\n readonly #fetch: typeof fetch;\n\n constructor(config: PlatformApiClientConfig) {\n const missing = ['baseUrl', 'accessToken'].filter(field => !config[field as keyof PlatformApiClientConfig]);\n if (missing.length > 0) {\n throw new Error(`Platform integration: missing required config field(s): ${missing.join(', ')}.`);\n }\n this.#baseUrl = config.baseUrl.replace(/\\/+$/, '');\n this.#accessToken = config.accessToken;\n this.#fetch = config.fetchImpl ?? globalThis.fetch;\n }\n\n async request<T>(\n method: string,\n path: string,\n body?: unknown,\n options?: { signal?: AbortSignal; actingUserId?: string },\n ): Promise<T> {\n const response = await this.#send(method, path, body, options);\n if (!response.ok) {\n const message = redact(await extractError(response), this.#accessToken);\n const retryAfterSeconds = parseRetryAfter(response.headers.get('retry-after'));\n logPlatformError('Platform API request failed', {\n method,\n path,\n status: response.status,\n retryAfterSeconds,\n message,\n });\n throw new PlatformApiError(message, response.status, retryAfterSeconds);\n }\n if (response.status === 204) return undefined as T;\n return (await response.json()) as T;\n }\n\n async requestRedirect(method: string, path: string, options?: { signal?: AbortSignal }): Promise<string> {\n const response = await this.#send(method, path, undefined, options, 'manual');\n if (response.status >= 300 && response.status < 400) {\n const location = response.headers.get('location');\n if (location) return location;\n }\n if (!response.ok) {\n const message = redact(await extractError(response), this.#accessToken);\n const retryAfterSeconds = parseRetryAfter(response.headers.get('retry-after'));\n logPlatformError('Platform API redirect request failed', {\n method,\n path,\n status: response.status,\n retryAfterSeconds,\n message,\n });\n throw new PlatformApiError(message, response.status, retryAfterSeconds);\n }\n logPlatformError('Platform API request did not return a redirect', { method, path, status: response.status });\n throw new PlatformApiError('Platform API request did not return a redirect.', response.status);\n }\n\n async #send(\n method: string,\n path: string,\n body?: unknown,\n options?: { signal?: AbortSignal; actingUserId?: string },\n redirect?: RequestInit['redirect'],\n ): Promise<Response> {\n const headers: Record<string, string> = {\n accept: 'application/json',\n authorization: `Bearer ${this.#accessToken}`,\n };\n // Acting end-user for platform GitHub writes: the platform resolves this\n // user's GitHub OAuth connection (org-scoped) so issues/PRs are authored\n // by the human instead of the App bot. Ignored by older platforms.\n if (options?.actingUserId) {\n headers['x-acting-user-id'] = options.actingUserId;\n }\n const timeoutSignal = AbortSignal.timeout(15_000);\n const init: RequestInit = {\n method,\n headers,\n redirect,\n signal: options?.signal ? AbortSignal.any([options.signal, timeoutSignal]) : timeoutSignal,\n };\n if (body !== undefined) {\n headers['content-type'] = 'application/json';\n init.body = JSON.stringify(body);\n }\n\n try {\n return await this.#fetch(`${this.#baseUrl}${path}`, init);\n } catch (error) {\n if (error instanceof Error && error.message.includes(this.#accessToken)) {\n const redacted = new Error(redact(error.message, this.#accessToken));\n redacted.name = error.name;\n logPlatformError('Platform API transport error', {\n method,\n path,\n name: redacted.name,\n message: redacted.message,\n });\n throw redacted;\n }\n logPlatformError('Platform API transport error', {\n method,\n path,\n name: error instanceof Error ? error.name : undefined,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n }\n }\n}\n\nasync function extractError(response: Response): Promise<string> {\n try {\n const data = (await response.clone().json()) as Record<string, unknown>;\n for (const field of ['detail', 'error', 'title']) {\n if (typeof data[field] === 'string' && data[field]) return data[field];\n }\n } catch {\n // Fall through to the status-based message.\n }\n return `Platform API request failed (${response.status})`;\n}\n\nfunction redact(message: string, accessToken: string): string {\n return message.split(accessToken).join('[REDACTED]');\n}\n\nexport function logPlatformInfo(message: string, fields?: Record<string, unknown>): void {\n writePlatformLog('info', message, fields);\n}\n\nexport function logPlatformWarn(message: string, fields?: Record<string, unknown>): void {\n writePlatformLog('warn', message, fields);\n}\n\nexport function logPlatformError(message: string, fields?: Record<string, unknown>): void {\n writePlatformLog('error', message, fields);\n}\n\nfunction writePlatformLog(level: 'info' | 'warn' | 'error', message: string, fields?: Record<string, unknown>): void {\n const metadata = fields ? ` ${JSON.stringify(stripUndefined(fields))}` : '';\n process.stderr.write(`[Mastra Factory] ${level.toUpperCase()} ${message}${metadata}\\n`);\n}\n\nfunction stripUndefined(fields: Record<string, unknown>): Record<string, unknown> {\n return Object.fromEntries(Object.entries(fields).filter(([, value]) => value !== undefined));\n}\n\nfunction parseRetryAfter(value: string | null): number | null {\n if (!value) return null;\n const seconds = Number.parseInt(value, 10);\n return Number.isSafeInteger(seconds) && seconds >= 0 ? seconds : null;\n}\n"],"mappings":"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"}