@apteva/integrations 0.1.0

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 (42) hide show
  1. package/dist/apps/index.d.ts +25 -0
  2. package/dist/apps/index.d.ts.map +1 -0
  3. package/dist/apps/index.js +51 -0
  4. package/dist/apps/index.js.map +1 -0
  5. package/dist/http-executor.d.ts +21 -0
  6. package/dist/http-executor.d.ts.map +1 -0
  7. package/dist/http-executor.js +191 -0
  8. package/dist/http-executor.js.map +1 -0
  9. package/dist/index.d.ts +12 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +13 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/mcp-generator.d.ts +8 -0
  14. package/dist/mcp-generator.d.ts.map +1 -0
  15. package/dist/mcp-generator.js +108 -0
  16. package/dist/mcp-generator.js.map +1 -0
  17. package/dist/oauth.d.ts +49 -0
  18. package/dist/oauth.d.ts.map +1 -0
  19. package/dist/oauth.js +119 -0
  20. package/dist/oauth.js.map +1 -0
  21. package/dist/providers/local.d.ts +55 -0
  22. package/dist/providers/local.d.ts.map +1 -0
  23. package/dist/providers/local.js +209 -0
  24. package/dist/providers/local.js.map +1 -0
  25. package/dist/triggers/local.d.ts +55 -0
  26. package/dist/triggers/local.d.ts.map +1 -0
  27. package/dist/triggers/local.js +103 -0
  28. package/dist/triggers/local.js.map +1 -0
  29. package/dist/types.d.ts +96 -0
  30. package/dist/types.d.ts.map +1 -0
  31. package/dist/types.js +3 -0
  32. package/dist/types.js.map +1 -0
  33. package/package.json +42 -0
  34. package/src/apps/github.json +96 -0
  35. package/src/apps/gmail.json +62 -0
  36. package/src/apps/google-calendar.json +68 -0
  37. package/src/apps/linear.json +85 -0
  38. package/src/apps/notion.json +102 -0
  39. package/src/apps/pushover.json +56 -0
  40. package/src/apps/sendgrid.json +63 -0
  41. package/src/apps/slack.json +74 -0
  42. package/src/apps/stripe.json +85 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { AppTemplate, Connection, ConnectionCredentials, GeneratedMcpServer, IntegrationsStorage } from "../types.js";
2
+ export interface LocalProviderConfig {
3
+ storage: IntegrationsStorage;
4
+ oauthRedirectUri?: string;
5
+ }
6
+ /**
7
+ * LocalIntegrationProvider manages connections and tool execution
8
+ * entirely locally — no external integration cloud needed.
9
+ */
10
+ export declare class LocalIntegrationProvider {
11
+ private storage;
12
+ private oauthRedirectUri;
13
+ constructor(config: LocalProviderConfig);
14
+ listApps(): {
15
+ slug: string;
16
+ name: string;
17
+ description: string;
18
+ categories: string[];
19
+ toolCount: number;
20
+ }[];
21
+ getApp(slug: string): AppTemplate | undefined;
22
+ listAppSlugs(): string[];
23
+ createConnection(opts: {
24
+ appSlug: string;
25
+ name: string;
26
+ authType: Connection["auth_type"];
27
+ credentials: ConnectionCredentials;
28
+ projectId?: string | null;
29
+ }): Connection;
30
+ getConnection(id: string): Connection | null;
31
+ listConnections(projectId?: string | null): Connection[];
32
+ deleteConnection(id: string): boolean;
33
+ startOAuth(appSlug: string, opts?: {
34
+ clientId?: string;
35
+ state?: string;
36
+ scopes?: string[];
37
+ }): string;
38
+ handleOAuthCallback(appSlug: string, code: string, opts: {
39
+ clientId: string;
40
+ clientSecret: string;
41
+ connectionName?: string;
42
+ projectId?: string | null;
43
+ }): Promise<Connection>;
44
+ refreshConnectionIfNeeded(connectionId: string): Promise<Connection | null>;
45
+ executeTool(connectionId: string, toolName: string, input: Record<string, unknown>): Promise<{
46
+ success: boolean;
47
+ status: number;
48
+ data: unknown;
49
+ }>;
50
+ generateMcpServer(connectionId: string): GeneratedMcpServer | null;
51
+ generateAllMcpServers(projectId?: string | null): GeneratedMcpServer[];
52
+ private encryptCredentials;
53
+ private decryptCredentials;
54
+ }
55
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/providers/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AAYrB,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,mBAAmB;IAOvC,QAAQ;;;;;;;IAIR,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI7C,YAAY,IAAI,MAAM,EAAE;IAMxB,gBAAgB,CAAC,IAAI,EAAE;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;QAClC,WAAW,EAAE,qBAAqB,CAAC;QACnC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,GAAG,UAAU;IAkBd,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAQ5C,eAAe,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,EAAE;IAIxD,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAMrC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,MAAM;IAiB9F,mBAAmB,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GACnG,OAAO,CAAC,UAAU,CAAC;IAyBhB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAuC3E,WAAW,CACf,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAqB/D,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAUlE,qBAAqB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,EAAE;IAkBtE,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,kBAAkB;CAU3B"}
@@ -0,0 +1,209 @@
1
+ import { getAppTemplate, listApps, loadAppTemplates } from "../apps/index.js";
2
+ import { executeTool } from "../http-executor.js";
3
+ import { generateMcpServer } from "../mcp-generator.js";
4
+ import { getAuthorizationUrl, exchangeCode, refreshAccessToken, tokensToCredentials, isTokenExpired, } from "../oauth.js";
5
+ /**
6
+ * LocalIntegrationProvider manages connections and tool execution
7
+ * entirely locally — no external integration cloud needed.
8
+ */
9
+ export class LocalIntegrationProvider {
10
+ storage;
11
+ oauthRedirectUri;
12
+ constructor(config) {
13
+ this.storage = config.storage;
14
+ this.oauthRedirectUri = config.oauthRedirectUri || "http://localhost:3000/api/integrations/oauth/callback";
15
+ }
16
+ // ─── App Discovery ───
17
+ listApps() {
18
+ return listApps();
19
+ }
20
+ getApp(slug) {
21
+ return getAppTemplate(slug);
22
+ }
23
+ listAppSlugs() {
24
+ return Array.from(loadAppTemplates().keys());
25
+ }
26
+ // ─── Connection Management ───
27
+ createConnection(opts) {
28
+ const app = getAppTemplate(opts.appSlug);
29
+ if (!app)
30
+ throw new Error(`Unknown app: ${opts.appSlug}`);
31
+ // Encrypt sensitive credential fields
32
+ const encrypted = this.encryptCredentials(opts.credentials);
33
+ return this.storage.createConnection({
34
+ app_slug: opts.appSlug,
35
+ app_name: app.name,
36
+ name: opts.name,
37
+ auth_type: opts.authType,
38
+ credentials: encrypted,
39
+ status: "active",
40
+ project_id: opts.projectId ?? null,
41
+ });
42
+ }
43
+ getConnection(id) {
44
+ const conn = this.storage.getConnection(id);
45
+ if (!conn)
46
+ return null;
47
+ // Decrypt credentials on read
48
+ conn.credentials = this.decryptCredentials(conn.credentials);
49
+ return conn;
50
+ }
51
+ listConnections(projectId) {
52
+ return this.storage.listConnections(projectId);
53
+ }
54
+ deleteConnection(id) {
55
+ return this.storage.deleteConnection(id);
56
+ }
57
+ // ─── OAuth Flow ───
58
+ startOAuth(appSlug, opts) {
59
+ const app = getAppTemplate(appSlug);
60
+ if (!app)
61
+ throw new Error(`Unknown app: ${appSlug}`);
62
+ if (!app.auth.oauth2)
63
+ throw new Error(`App "${appSlug}" does not support OAuth2`);
64
+ const clientId = opts?.clientId;
65
+ if (!clientId)
66
+ throw new Error("Client ID is required for OAuth2");
67
+ return getAuthorizationUrl({
68
+ app,
69
+ clientId,
70
+ redirectUri: this.oauthRedirectUri,
71
+ state: opts?.state,
72
+ scopes: opts?.scopes,
73
+ });
74
+ }
75
+ async handleOAuthCallback(appSlug, code, opts) {
76
+ const app = getAppTemplate(appSlug);
77
+ if (!app)
78
+ throw new Error(`Unknown app: ${appSlug}`);
79
+ const tokens = await exchangeCode({
80
+ app,
81
+ clientId: opts.clientId,
82
+ clientSecret: opts.clientSecret,
83
+ redirectUri: this.oauthRedirectUri,
84
+ code,
85
+ });
86
+ const credentials = tokensToCredentials(tokens, opts.clientId, opts.clientSecret);
87
+ return this.createConnection({
88
+ appSlug,
89
+ name: opts.connectionName || `${app.name} Connection`,
90
+ authType: "oauth2",
91
+ credentials,
92
+ projectId: opts.projectId,
93
+ });
94
+ }
95
+ // ─── Token Refresh ───
96
+ async refreshConnectionIfNeeded(connectionId) {
97
+ const conn = this.getConnection(connectionId);
98
+ if (!conn)
99
+ return null;
100
+ if (!isTokenExpired(conn.credentials))
101
+ return conn;
102
+ if (!conn.credentials.refresh_token)
103
+ return conn;
104
+ const app = getAppTemplate(conn.app_slug);
105
+ if (!app || !app.auth.oauth2)
106
+ return conn;
107
+ try {
108
+ const tokens = await refreshAccessToken({
109
+ app,
110
+ clientId: conn.credentials.client_id || "",
111
+ clientSecret: conn.credentials.client_secret || "",
112
+ refreshToken: conn.credentials.refresh_token,
113
+ });
114
+ const newCreds = tokensToCredentials(tokens);
115
+ const updatedCreds = {
116
+ ...conn.credentials,
117
+ ...newCreds,
118
+ };
119
+ this.storage.updateConnection(connectionId, {
120
+ credentials: this.encryptCredentials(updatedCreds),
121
+ status: "active",
122
+ });
123
+ conn.credentials = updatedCreds;
124
+ return conn;
125
+ }
126
+ catch (error) {
127
+ this.storage.updateConnection(connectionId, { status: "expired" });
128
+ return conn;
129
+ }
130
+ }
131
+ // ─── Tool Execution ───
132
+ async executeTool(connectionId, toolName, input) {
133
+ // Auto-refresh token if needed
134
+ const conn = await this.refreshConnectionIfNeeded(connectionId);
135
+ if (!conn)
136
+ throw new Error(`Connection not found: ${connectionId}`);
137
+ const app = getAppTemplate(conn.app_slug);
138
+ if (!app)
139
+ throw new Error(`App not found: ${conn.app_slug}`);
140
+ const tool = app.tools.find((t) => t.name === toolName);
141
+ if (!tool)
142
+ throw new Error(`Tool "${toolName}" not found in app "${app.slug}"`);
143
+ return executeTool({
144
+ app,
145
+ tool,
146
+ credentials: conn.credentials,
147
+ input,
148
+ });
149
+ }
150
+ // ─── MCP Server Generation ───
151
+ generateMcpServer(connectionId) {
152
+ const conn = this.getConnection(connectionId);
153
+ if (!conn)
154
+ return null;
155
+ const app = getAppTemplate(conn.app_slug);
156
+ if (!app)
157
+ return null;
158
+ return generateMcpServer(conn, app);
159
+ }
160
+ generateAllMcpServers(projectId) {
161
+ const connections = this.listConnections(projectId);
162
+ const servers = [];
163
+ for (const conn of connections) {
164
+ const app = getAppTemplate(conn.app_slug);
165
+ if (!app)
166
+ continue;
167
+ // Decrypt for server generation
168
+ const decrypted = this.getConnection(conn.id);
169
+ if (!decrypted)
170
+ continue;
171
+ servers.push(generateMcpServer(decrypted, app));
172
+ }
173
+ return servers;
174
+ }
175
+ // ─── Credential Encryption ───
176
+ encryptCredentials(creds) {
177
+ const encrypted = { ...creds };
178
+ if (encrypted.api_key)
179
+ encrypted.api_key = this.storage.encrypt(encrypted.api_key);
180
+ if (encrypted.bearer_token)
181
+ encrypted.bearer_token = this.storage.encrypt(encrypted.bearer_token);
182
+ if (encrypted.password)
183
+ encrypted.password = this.storage.encrypt(encrypted.password);
184
+ if (encrypted.access_token)
185
+ encrypted.access_token = this.storage.encrypt(encrypted.access_token);
186
+ if (encrypted.refresh_token)
187
+ encrypted.refresh_token = this.storage.encrypt(encrypted.refresh_token);
188
+ if (encrypted.client_secret)
189
+ encrypted.client_secret = this.storage.encrypt(encrypted.client_secret);
190
+ return encrypted;
191
+ }
192
+ decryptCredentials(creds) {
193
+ const decrypted = { ...creds };
194
+ if (decrypted.api_key)
195
+ decrypted.api_key = this.storage.decrypt(decrypted.api_key);
196
+ if (decrypted.bearer_token)
197
+ decrypted.bearer_token = this.storage.decrypt(decrypted.bearer_token);
198
+ if (decrypted.password)
199
+ decrypted.password = this.storage.decrypt(decrypted.password);
200
+ if (decrypted.access_token)
201
+ decrypted.access_token = this.storage.decrypt(decrypted.access_token);
202
+ if (decrypted.refresh_token)
203
+ decrypted.refresh_token = this.storage.decrypt(decrypted.refresh_token);
204
+ if (decrypted.client_secret)
205
+ decrypted.client_secret = this.storage.decrypt(decrypted.client_secret);
206
+ return decrypted;
207
+ }
208
+ }
209
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/providers/local.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,GACf,MAAM,aAAa,CAAC;AAOrB;;;GAGG;AACH,MAAM,OAAO,wBAAwB;IAC3B,OAAO,CAAsB;IAC7B,gBAAgB,CAAS;IAEjC,YAAY,MAA2B;QACrC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,uDAAuD,CAAC;IAC7G,CAAC;IAED,wBAAwB;IAExB,QAAQ;QACN,OAAO,QAAQ,EAAE,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,YAAY;QACV,OAAO,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,gCAAgC;IAEhC,gBAAgB,CAAC,IAMhB;QACC,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAE1D,sCAAsC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE5D,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YACnC,QAAQ,EAAE,IAAI,CAAC,OAAO;YACtB,QAAQ,EAAE,GAAG,CAAC,IAAI;YAClB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,WAAW,EAAE,SAAS;YACtB,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;SACnC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,EAAU;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,8BAA8B;QAC9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe,CAAC,SAAyB;QACvC,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;IACjD,CAAC;IAED,gBAAgB,CAAC,EAAU;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,qBAAqB;IAErB,UAAU,CAAC,OAAe,EAAE,IAA+D;QACzF,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,OAAO,2BAA2B,CAAC,CAAC;QAElF,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAC;QAChC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAEnE,OAAO,mBAAmB,CAAC;YACzB,GAAG;YACH,QAAQ;YACR,WAAW,EAAE,IAAI,CAAC,gBAAgB;YAClC,KAAK,EAAE,IAAI,EAAE,KAAK;YAClB,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,mBAAmB,CACvB,OAAe,EACf,IAAY,EACZ,IAAoG;QAEpG,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,GAAG;YACH,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,WAAW,EAAE,IAAI,CAAC,gBAAgB;YAClC,IAAI;SACL,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAA0B,CAAC;QAE3G,OAAO,IAAI,CAAC,gBAAgB,CAAC;YAC3B,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,cAAc,IAAI,GAAG,GAAG,CAAC,IAAI,aAAa;YACrD,QAAQ,EAAE,QAAQ;YAClB,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,wBAAwB;IAExB,KAAK,CAAC,yBAAyB,CAAC,YAAoB;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa;YAAE,OAAO,IAAI,CAAC;QAEjD,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAE1C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;gBACtC,GAAG;gBACH,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,SAAS,IAAI,EAAE;gBAC1C,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,aAAa,IAAI,EAAE;gBAClD,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,aAAa;aAC7C,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC7C,MAAM,YAAY,GAA0B;gBAC1C,GAAG,IAAI,CAAC,WAAW;gBACnB,GAAG,QAAQ;aACZ,CAAC;YAEF,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE;gBAC1C,WAAW,EAAE,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC;gBAClD,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;YAEH,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACnE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,yBAAyB;IAEzB,KAAK,CAAC,WAAW,CACf,YAAoB,EACpB,QAAgB,EAChB,KAA8B;QAE9B,+BAA+B;QAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;QAEpE,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAE7D,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,uBAAuB,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;QAEhF,OAAO,WAAW,CAAC;YACjB,GAAG;YACH,IAAI;YACJ,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,KAAK;SACN,CAAC,CAAC;IACL,CAAC;IAED,gCAAgC;IAEhC,iBAAiB,CAAC,YAAoB;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,OAAO,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,qBAAqB,CAAC,SAAyB;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,OAAO,GAAyB,EAAE,CAAC;QAEzC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,gCAAgC;YAChC,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9C,IAAI,CAAC,SAAS;gBAAE,SAAS;YACzB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,gCAAgC;IAExB,kBAAkB,CAAC,KAA4B;QACrD,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAC/B,IAAI,SAAS,CAAC,OAAO;YAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnF,IAAI,SAAS,CAAC,YAAY;YAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClG,IAAI,SAAS,CAAC,QAAQ;YAAE,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtF,IAAI,SAAS,CAAC,YAAY;YAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClG,IAAI,SAAS,CAAC,aAAa;YAAE,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACrG,IAAI,SAAS,CAAC,aAAa;YAAE,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACrG,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,kBAAkB,CAAC,KAA4B;QACrD,MAAM,SAAS,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;QAC/B,IAAI,SAAS,CAAC,OAAO;YAAE,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACnF,IAAI,SAAS,CAAC,YAAY;YAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClG,IAAI,SAAS,CAAC,QAAQ;YAAE,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtF,IAAI,SAAS,CAAC,YAAY;YAAE,SAAS,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAClG,IAAI,SAAS,CAAC,aAAa;YAAE,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACrG,IAAI,SAAS,CAAC,aAAa;YAAE,SAAS,CAAC,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACrG,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,55 @@
1
+ import type { LocalTriggerConfig } from "../types.js";
2
+ export interface TriggerStorage {
3
+ createTrigger(trigger: Omit<LocalTriggerConfig, "id" | "created_at">): LocalTriggerConfig;
4
+ getTrigger(id: string): LocalTriggerConfig | null;
5
+ getTriggerByPath(webhookPath: string): LocalTriggerConfig | null;
6
+ listTriggers(projectId?: string | null): LocalTriggerConfig[];
7
+ updateTrigger(id: string, updates: Partial<LocalTriggerConfig>): LocalTriggerConfig | null;
8
+ deleteTrigger(id: string): boolean;
9
+ }
10
+ export interface WebhookPayload {
11
+ headers: Record<string, string>;
12
+ body: unknown;
13
+ method: string;
14
+ path: string;
15
+ }
16
+ export interface TriggerResult {
17
+ matched: boolean;
18
+ trigger?: LocalTriggerConfig;
19
+ verified: boolean;
20
+ payload?: unknown;
21
+ }
22
+ /**
23
+ * LocalTriggerProvider manages webhook-based triggers locally.
24
+ * Webhooks are received at /api/webhooks/local/:id and dispatched
25
+ * to the associated agent.
26
+ */
27
+ export declare class LocalTriggerProvider {
28
+ private storage;
29
+ constructor(storage: TriggerStorage);
30
+ createTrigger(opts: {
31
+ slug: string;
32
+ name: string;
33
+ description: string;
34
+ agentId: string;
35
+ useHmac?: boolean;
36
+ projectId?: string | null;
37
+ }): LocalTriggerConfig;
38
+ getTrigger(id: string): LocalTriggerConfig | null;
39
+ listTriggers(projectId?: string | null): LocalTriggerConfig[];
40
+ enableTrigger(id: string): LocalTriggerConfig | null;
41
+ disableTrigger(id: string): LocalTriggerConfig | null;
42
+ deleteTrigger(id: string): boolean;
43
+ regenerateSecret(id: string): LocalTriggerConfig | null;
44
+ /**
45
+ * Process an incoming webhook request.
46
+ * Returns the matched trigger and verification status.
47
+ */
48
+ processWebhook(payload: WebhookPayload): TriggerResult;
49
+ /**
50
+ * Get the full webhook URL for a trigger, given the server's base URL.
51
+ */
52
+ getWebhookUrl(triggerId: string, baseUrl: string): string | null;
53
+ private verifyHmac;
54
+ }
55
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/triggers/local.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,GAAG,YAAY,CAAC,GAAG,kBAAkB,CAAC;IAC1F,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAAC;IAClD,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAAC;IACjE,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,EAAE,CAAC;IAC9D,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAAC;IAC3F,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,EAAE,cAAc;IAMnC,aAAa,CAAC,IAAI,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAC3B,GAAG,kBAAkB;IAgBtB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAIjD,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,kBAAkB,EAAE;IAI7D,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAIpD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAIrD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIlC,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAOvD;;;OAGG;IACH,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa;IAwBtD;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQhE,OAAO,CAAC,UAAU;CA0BnB"}
@@ -0,0 +1,103 @@
1
+ import { randomBytes, createHmac } from "crypto";
2
+ /**
3
+ * LocalTriggerProvider manages webhook-based triggers locally.
4
+ * Webhooks are received at /api/webhooks/local/:id and dispatched
5
+ * to the associated agent.
6
+ */
7
+ export class LocalTriggerProvider {
8
+ storage;
9
+ constructor(storage) {
10
+ this.storage = storage;
11
+ }
12
+ // ─── Trigger Management ───
13
+ createTrigger(opts) {
14
+ const webhookPath = `/api/webhooks/local/${randomBytes(16).toString("hex")}`;
15
+ const hmacSecret = opts.useHmac ? randomBytes(32).toString("hex") : null;
16
+ return this.storage.createTrigger({
17
+ slug: opts.slug,
18
+ name: opts.name,
19
+ description: opts.description,
20
+ agent_id: opts.agentId,
21
+ webhook_path: webhookPath,
22
+ hmac_secret: hmacSecret,
23
+ enabled: true,
24
+ project_id: opts.projectId ?? null,
25
+ });
26
+ }
27
+ getTrigger(id) {
28
+ return this.storage.getTrigger(id);
29
+ }
30
+ listTriggers(projectId) {
31
+ return this.storage.listTriggers(projectId);
32
+ }
33
+ enableTrigger(id) {
34
+ return this.storage.updateTrigger(id, { enabled: true });
35
+ }
36
+ disableTrigger(id) {
37
+ return this.storage.updateTrigger(id, { enabled: false });
38
+ }
39
+ deleteTrigger(id) {
40
+ return this.storage.deleteTrigger(id);
41
+ }
42
+ regenerateSecret(id) {
43
+ const newSecret = randomBytes(32).toString("hex");
44
+ return this.storage.updateTrigger(id, { hmac_secret: newSecret });
45
+ }
46
+ // ─── Webhook Processing ───
47
+ /**
48
+ * Process an incoming webhook request.
49
+ * Returns the matched trigger and verification status.
50
+ */
51
+ processWebhook(payload) {
52
+ const trigger = this.storage.getTriggerByPath(payload.path);
53
+ if (!trigger) {
54
+ return { matched: false, verified: false };
55
+ }
56
+ if (!trigger.enabled) {
57
+ return { matched: true, trigger, verified: false };
58
+ }
59
+ // Verify HMAC if configured
60
+ let verified = true;
61
+ if (trigger.hmac_secret) {
62
+ verified = this.verifyHmac(payload, trigger.hmac_secret);
63
+ }
64
+ return {
65
+ matched: true,
66
+ trigger,
67
+ verified,
68
+ payload: payload.body,
69
+ };
70
+ }
71
+ /**
72
+ * Get the full webhook URL for a trigger, given the server's base URL.
73
+ */
74
+ getWebhookUrl(triggerId, baseUrl) {
75
+ const trigger = this.storage.getTrigger(triggerId);
76
+ if (!trigger)
77
+ return null;
78
+ return `${baseUrl.replace(/\/$/, "")}${trigger.webhook_path}`;
79
+ }
80
+ // ─── HMAC Verification ───
81
+ verifyHmac(payload, secret) {
82
+ const signature = payload.headers["x-hub-signature-256"] ||
83
+ payload.headers["x-signature-256"] ||
84
+ payload.headers["x-webhook-signature"];
85
+ if (!signature)
86
+ return false;
87
+ const body = typeof payload.body === "string"
88
+ ? payload.body
89
+ : JSON.stringify(payload.body);
90
+ const expected = createHmac("sha256", secret).update(body).digest("hex");
91
+ // Handle "sha256=..." prefix
92
+ const actual = signature.replace(/^sha256=/, "");
93
+ // Constant-time comparison
94
+ if (actual.length !== expected.length)
95
+ return false;
96
+ let diff = 0;
97
+ for (let i = 0; i < actual.length; i++) {
98
+ diff |= actual.charCodeAt(i) ^ expected.charCodeAt(i);
99
+ }
100
+ return diff === 0;
101
+ }
102
+ }
103
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/triggers/local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ export interface AppTemplate {
2
+ slug: string;
3
+ name: string;
4
+ description: string;
5
+ logo: string | null;
6
+ categories: string[];
7
+ auth: AppAuthConfig;
8
+ base_url: string;
9
+ tools: AppToolTemplate[];
10
+ }
11
+ export interface AppAuthConfig {
12
+ types: AuthType[];
13
+ oauth2?: OAuthConfig;
14
+ headers?: Record<string, string>;
15
+ query_params?: Record<string, string>;
16
+ }
17
+ export type AuthType = "api_key" | "bearer" | "basic" | "oauth2";
18
+ export interface OAuthConfig {
19
+ authorize_url: string;
20
+ token_url: string;
21
+ scopes: string[];
22
+ client_id_required: boolean;
23
+ pkce: boolean;
24
+ }
25
+ export interface AppToolTemplate {
26
+ name: string;
27
+ description: string;
28
+ method: "GET" | "POST" | "PUT" | "PATCH" | "DELETE";
29
+ path: string;
30
+ input_schema: Record<string, unknown>;
31
+ response_path?: string;
32
+ }
33
+ export interface Connection {
34
+ id: string;
35
+ app_slug: string;
36
+ app_name: string;
37
+ name: string;
38
+ auth_type: AuthType;
39
+ credentials: ConnectionCredentials;
40
+ status: "active" | "pending" | "expired" | "error";
41
+ project_id: string | null;
42
+ created_at: string;
43
+ updated_at: string;
44
+ }
45
+ export interface ConnectionCredentials {
46
+ api_key?: string;
47
+ bearer_token?: string;
48
+ username?: string;
49
+ password?: string;
50
+ access_token?: string;
51
+ refresh_token?: string;
52
+ token_expires_at?: string;
53
+ client_id?: string;
54
+ client_secret?: string;
55
+ fields?: Record<string, string>;
56
+ }
57
+ export interface LocalTriggerConfig {
58
+ id: string;
59
+ slug: string;
60
+ name: string;
61
+ description: string;
62
+ agent_id: string;
63
+ webhook_path: string;
64
+ hmac_secret: string | null;
65
+ enabled: boolean;
66
+ project_id: string | null;
67
+ created_at: string;
68
+ }
69
+ export interface GeneratedMcpServer {
70
+ name: string;
71
+ type: "local";
72
+ source: "local-integration";
73
+ tools: GeneratedMcpTool[];
74
+ }
75
+ export interface GeneratedMcpTool {
76
+ name: string;
77
+ description: string;
78
+ input_schema: Record<string, unknown>;
79
+ handler_type: "http";
80
+ http_config: {
81
+ method: string;
82
+ url: string;
83
+ headers: Record<string, string>;
84
+ body_template?: string;
85
+ };
86
+ }
87
+ export interface IntegrationsStorage {
88
+ createConnection(conn: Omit<Connection, "id" | "created_at" | "updated_at">): Connection;
89
+ getConnection(id: string): Connection | null;
90
+ listConnections(projectId?: string | null): Connection[];
91
+ updateConnection(id: string, updates: Partial<Connection>): Connection | null;
92
+ deleteConnection(id: string): boolean;
93
+ encrypt(value: string): string;
94
+ decrypt(value: string): string;
95
+ }
96
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ // ============ App Templates ============
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,0CAA0C"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@apteva/integrations",
3
+ "version": "0.1.0",
4
+ "description": "Local integrations, connections, and webhooks for Apteva. Self-contained app templates, OAuth engine, and trigger provider.",
5
+ "author": "Apteva <hello@apteva.com>",
6
+ "license": "Elastic-2.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/apteva/integrations.git"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "type": "module",
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ },
22
+ "./apps": {
23
+ "types": "./dist/apps/index.d.ts",
24
+ "import": "./dist/apps/index.js"
25
+ }
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "src/apps/*.json"
30
+ ],
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "dev": "tsc --watch",
34
+ "prepublishOnly": "npm run build"
35
+ },
36
+ "devDependencies": {
37
+ "typescript": "^5.0.0"
38
+ },
39
+ "engines": {
40
+ "node": ">=18.0.0"
41
+ }
42
+ }