@auxx/sdk 0.0.12 → 0.0.14

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 (76) hide show
  1. package/lib/api/api.js +3 -1
  2. package/lib/api/schemas.js +4 -0
  3. package/lib/auth/auth.js +3 -0
  4. package/lib/build/server/find-tool-server-modules.js +279 -0
  5. package/lib/build/server/find-workflow-block-server-modules.js +10 -2
  6. package/lib/build/server/generate-server-entry.js +46 -1
  7. package/lib/build/server/zod-to-provider-tool-schema.js +42 -0
  8. package/lib/client/workflow/index.d.ts +1 -1
  9. package/lib/client/workflow/index.d.ts.map +1 -1
  10. package/lib/commands/build/validate-typescript.js +33 -2
  11. package/lib/commands/build.js +3 -26
  12. package/lib/commands/dev/bundle-javascript.js +17 -1
  13. package/lib/commands/dev/prepare-build-context.js +11 -2
  14. package/lib/commands/dev/server-builder.js +2 -1
  15. package/lib/commands/dev/upload.js +5 -1
  16. package/lib/commands/dev.js +4 -1
  17. package/lib/commands/version/create/bundle-javascript.js +10 -0
  18. package/lib/commands/version/create.js +40 -3
  19. package/lib/constants/app-fields-files.js +1 -0
  20. package/lib/env-loader.js +17 -1
  21. package/lib/env.js +1 -0
  22. package/lib/root/app.d.ts +7 -2
  23. package/lib/root/app.d.ts.map +1 -1
  24. package/lib/root/fields/define-field.d.ts +67 -0
  25. package/lib/root/fields/define-field.d.ts.map +1 -0
  26. package/lib/root/fields/define-field.js +21 -0
  27. package/lib/root/fields/field-types.d.ts +47 -0
  28. package/lib/root/fields/field-types.d.ts.map +1 -0
  29. package/lib/root/fields/field-types.js +25 -0
  30. package/lib/root/fields/index.d.ts +3 -0
  31. package/lib/root/fields/index.d.ts.map +1 -0
  32. package/lib/root/fields/index.js +2 -0
  33. package/lib/root/index.d.ts +5 -2
  34. package/lib/root/index.d.ts.map +1 -1
  35. package/lib/root/index.js +3 -1
  36. package/lib/root/tools/define-tool.d.ts +4 -0
  37. package/lib/root/tools/define-tool.d.ts.map +1 -0
  38. package/lib/root/tools/define-tool.js +21 -0
  39. package/lib/root/tools/index.d.ts +5 -0
  40. package/lib/root/tools/index.d.ts.map +1 -0
  41. package/lib/root/tools/index.js +3 -0
  42. package/lib/root/tools/refs.d.ts +9 -0
  43. package/lib/root/tools/refs.d.ts.map +1 -0
  44. package/lib/root/tools/refs.js +4 -0
  45. package/lib/root/tools/types.d.ts +91 -0
  46. package/lib/root/tools/types.d.ts.map +1 -0
  47. package/lib/root/tools/types.js +1 -0
  48. package/lib/root/workflow/types.d.ts +28 -14
  49. package/lib/root/workflow/types.d.ts.map +1 -1
  50. package/lib/root/workflow/types.js +3 -0
  51. package/lib/root/workflow/utils.d.ts +4 -4
  52. package/lib/root/workflow/utils.d.ts.map +1 -1
  53. package/lib/runtime/workflow.js +19 -2
  54. package/lib/server/connections.d.ts +5 -0
  55. package/lib/server/connections.d.ts.map +1 -1
  56. package/lib/server/entities.d.ts +44 -0
  57. package/lib/server/entities.d.ts.map +1 -0
  58. package/lib/server/entities.js +3 -0
  59. package/lib/server/index.d.ts +2 -0
  60. package/lib/server/index.d.ts.map +1 -1
  61. package/lib/server/storage.d.ts +30 -3
  62. package/lib/server/storage.d.ts.map +1 -1
  63. package/lib/shared/errors.d.ts +34 -0
  64. package/lib/shared/errors.d.ts.map +1 -1
  65. package/lib/shared/errors.js +56 -0
  66. package/lib/shared/index.d.ts +1 -1
  67. package/lib/shared/index.d.ts.map +1 -1
  68. package/lib/shared/index.js +1 -1
  69. package/lib/util/add-auxx-hidden-directory-to-ts-config.js +6 -2
  70. package/lib/util/compile-and-extract-catalog.js +318 -0
  71. package/lib/util/ensure-app-fields-types.js +26 -0
  72. package/lib/util/generate-app-fields-types.js +63 -0
  73. package/lib/util/warn-if-app-type-annotated.js +9 -0
  74. package/package.json +9 -1
  75. package/template/src/events/connection-added.event.ts +17 -2
  76. package/template/tsconfig.json +1 -1
@@ -0,0 +1,318 @@
1
+ import * as esbuild from 'esbuild';
2
+ import fs from 'fs/promises';
3
+ import path from 'path';
4
+ import { fileURLToPath, pathToFileURL } from 'url';
5
+ import { HIDDEN_AUXX_DIRECTORY } from '../constants/hidden-auxx-directory.js';
6
+ import { complete, errored } from '../errors.js';
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = path.dirname(__filename);
9
+ const SDK_ROOT = path.resolve(__dirname, '..', '..');
10
+ export async function compileAndExtractCatalog() {
11
+ const srcDirAbsolute = path.resolve('src');
12
+ const candidates = ['app.ts', 'app.tsx'];
13
+ let appEntry;
14
+ for (const c of candidates) {
15
+ const p = path.join(srcDirAbsolute, c);
16
+ try {
17
+ await fs.access(p);
18
+ appEntry = p;
19
+ break;
20
+ }
21
+ catch {
22
+ }
23
+ }
24
+ if (!appEntry) {
25
+ return complete(undefined);
26
+ }
27
+ const auxxDir = path.resolve(HIDDEN_AUXX_DIRECTORY);
28
+ await fs.mkdir(auxxDir, { recursive: true });
29
+ const outputPath = path.join(auxxDir, 'app.catalog.mjs');
30
+ const stubServerImports = {
31
+ name: 'auxx-stub-server-imports',
32
+ setup(build) {
33
+ build.onResolve({ filter: /\.server(\.tsx?)?$/ }, (args) => ({
34
+ path: args.path,
35
+ namespace: 'auxx-server-stub',
36
+ }));
37
+ build.onLoad({ filter: /.*/, namespace: 'auxx-server-stub' }, () => ({
38
+ contents: 'export default async () => { throw new Error("stubbed at catalog extraction") }',
39
+ loader: 'js',
40
+ }));
41
+ },
42
+ };
43
+ const SDK_REAL_BARE = path.join(SDK_ROOT, 'lib', 'root', 'index.js');
44
+ const SDK_REAL_TOOLS = path.join(SDK_ROOT, 'lib', 'root', 'tools', 'index.js');
45
+ const SDK_REAL_WORKFLOW = path.join(SDK_ROOT, 'lib', 'root', 'workflow', 'index.js');
46
+ const SDK_REAL_FIELDS = path.join(SDK_ROOT, 'lib', 'root', 'fields', 'index.js');
47
+ const stubSdkSubpaths = {
48
+ name: 'auxx-stub-sdk-subpaths',
49
+ setup(build) {
50
+ build.onResolve({ filter: /^@auxx\/sdk(\/.*)?$/ }, (args) => {
51
+ if (args.path === '@auxx/sdk')
52
+ return { path: SDK_REAL_BARE };
53
+ if (args.path === '@auxx/sdk/tools')
54
+ return { path: SDK_REAL_TOOLS };
55
+ if (args.path === '@auxx/sdk/workflow')
56
+ return { path: SDK_REAL_WORKFLOW };
57
+ if (args.path === '@auxx/sdk/fields')
58
+ return { path: SDK_REAL_FIELDS };
59
+ return { path: args.path, namespace: 'auxx-sdk-stub' };
60
+ });
61
+ build.onLoad({ filter: /.*/, namespace: 'auxx-sdk-stub' }, () => ({
62
+ contents: `
63
+ const noop = () => null;
64
+ const handler = { get: (target, prop) => {
65
+ if (prop in target) return target[prop];
66
+ if (prop === '__esModule') return true;
67
+ if (typeof prop === 'symbol') return undefined;
68
+ return noop;
69
+ }};
70
+ module.exports = new Proxy({}, handler);
71
+ `,
72
+ loader: 'js',
73
+ }));
74
+ },
75
+ };
76
+ try {
77
+ await esbuild.build({
78
+ entryPoints: [appEntry],
79
+ bundle: true,
80
+ outfile: outputPath,
81
+ format: 'esm',
82
+ platform: 'node',
83
+ target: ['node18'],
84
+ logLevel: 'silent',
85
+ write: true,
86
+ loader: {
87
+ '.png': 'empty',
88
+ '.jpg': 'empty',
89
+ '.jpeg': 'empty',
90
+ '.gif': 'empty',
91
+ '.webp': 'empty',
92
+ '.svg': 'empty',
93
+ },
94
+ plugins: [stubServerImports, stubSdkSubpaths],
95
+ });
96
+ }
97
+ catch (error) {
98
+ return errored({
99
+ code: 'CATALOG_COMPILE_FAILED',
100
+ error: error instanceof Error ? error : new Error(String(error)),
101
+ });
102
+ }
103
+ let appModule;
104
+ try {
105
+ const fileUrl = pathToFileURL(outputPath).href;
106
+ appModule = await import(`${fileUrl}?t=${Date.now()}`);
107
+ }
108
+ catch (error) {
109
+ return errored({
110
+ code: 'CATALOG_LOAD_FAILED',
111
+ error: error instanceof Error ? error : new Error(String(error)),
112
+ });
113
+ }
114
+ const app = appModule.app;
115
+ if (!app) {
116
+ return complete(undefined);
117
+ }
118
+ const toolsArr = (app.tools ?? []);
119
+ const toolsetsArr = (app.toolsets ?? []);
120
+ const workflowBlocksArr = (app.workflow?.blocks ?? []);
121
+ const workflowTriggersArr = (app.workflow?.triggers ?? []);
122
+ const fieldsArr = (app.fields ?? []);
123
+ if (!toolsArr.length &&
124
+ !toolsetsArr.length &&
125
+ !workflowBlocksArr.length &&
126
+ !workflowTriggersArr.length &&
127
+ !fieldsArr.length) {
128
+ return complete(undefined);
129
+ }
130
+ const { zodToProviderToolSchema } = await import('../build/server/zod-to-provider-tool-schema.js');
131
+ const slugByToolId = new Map();
132
+ const cataloguedToolsets = [];
133
+ for (const ts of toolsetsArr) {
134
+ if (!ts?.id) {
135
+ return errored({ code: 'CATALOG_VALIDATION_FAILED', message: 'Toolset is missing an id' });
136
+ }
137
+ const slug = `app:${ts.id.replace('.', ':')}`;
138
+ cataloguedToolsets.push({
139
+ slug,
140
+ name: ts.name,
141
+ description: ts.description,
142
+ iconKey: null,
143
+ subGroup: ts.subGroup ?? null,
144
+ });
145
+ for (const toolId of ts.tools ?? []) {
146
+ slugByToolId.set(toolId, slug);
147
+ }
148
+ }
149
+ const cataloguedTools = [];
150
+ const cataloguedAgentTools = [];
151
+ const cataloguedActions = [];
152
+ for (const tool of toolsArr) {
153
+ if (!tool?.id) {
154
+ return errored({ code: 'CATALOG_VALIDATION_FAILED', message: 'Tool is missing an id' });
155
+ }
156
+ const inputs = zodToProviderToolSchema(tool.inputs);
157
+ const outputs = zodToProviderToolSchema(tool.outputs);
158
+ const baseTool = {
159
+ id: tool.id,
160
+ name: tool.name,
161
+ description: tool.description,
162
+ inputsJsonSchema: inputs.jsonSchema,
163
+ outputsJsonSchema: outputs.jsonSchema,
164
+ requiresConnection: Boolean(tool.config?.requiresConnection),
165
+ timeoutMs: tool.config?.timeout ?? 15000,
166
+ streaming: Boolean(tool.agent?.streaming ?? tool.config?.streaming),
167
+ refs: outputs.refs,
168
+ ...(tool.exampleOutput !== undefined
169
+ ? { exampleOutput: JSON.parse(JSON.stringify(tool.exampleOutput)) }
170
+ : {}),
171
+ };
172
+ cataloguedTools.push(baseTool);
173
+ if (tool.agent) {
174
+ const toolsetSlug = slugByToolId.get(tool.id) ?? `app:unknown:default`;
175
+ cataloguedAgentTools.push({
176
+ ...baseTool,
177
+ agentName: tool.agent.name ?? tool.id,
178
+ agentDescription: tool.agent.description ?? tool.description,
179
+ toolsetSlug,
180
+ idempotent: tool.agent.idempotent ?? tool.config?.idempotent,
181
+ surfaces: tool.agent.surfaces,
182
+ externalSafe: tool.agent.externalSafe,
183
+ inputBindings: tool.agent.inputBindings,
184
+ });
185
+ }
186
+ if (tool.action) {
187
+ cataloguedActions.push({
188
+ toolId: tool.id,
189
+ label: tool.action.label,
190
+ description: tool.action.description,
191
+ iconKey: null,
192
+ color: tool.action.color,
193
+ surface: tool.action.surface,
194
+ requiresConfirmation: tool.action.requiresConfirmation,
195
+ confirmationMessage: tool.action.confirmationMessage,
196
+ });
197
+ }
198
+ }
199
+ const cataloguedTriggers = [];
200
+ const cataloguedWorkflowTriggers = [];
201
+ const cataloguedAgentTriggers = [];
202
+ for (const trigger of workflowTriggersArr) {
203
+ if (!trigger?.id) {
204
+ return errored({ code: 'CATALOG_VALIDATION_FAILED', message: 'Trigger is missing an id' });
205
+ }
206
+ const triggerInputs = serializeWorkflowSchemaInputs(trigger.schema);
207
+ cataloguedTriggers.push({
208
+ id: trigger.id,
209
+ label: trigger.label,
210
+ description: trigger.description,
211
+ iconKey: null,
212
+ color: trigger.color,
213
+ inputsJsonSchema: triggerInputs,
214
+ refs: [],
215
+ });
216
+ if (trigger.workflow) {
217
+ cataloguedWorkflowTriggers.push({
218
+ triggerId: trigger.id,
219
+ label: trigger.label,
220
+ description: trigger.description,
221
+ iconKey: null,
222
+ color: trigger.color,
223
+ inputsJsonSchema: triggerInputs,
224
+ refs: [],
225
+ });
226
+ }
227
+ if (trigger.agent) {
228
+ cataloguedAgentTriggers.push({
229
+ triggerId: trigger.id,
230
+ label: trigger.agent.label ?? trigger.label,
231
+ description: trigger.agent.description ?? trigger.description,
232
+ iconKey: null,
233
+ color: trigger.color,
234
+ inputsJsonSchema: triggerInputs,
235
+ refs: [],
236
+ });
237
+ }
238
+ }
239
+ const cataloguedBlocks = [];
240
+ for (const block of workflowBlocksArr) {
241
+ if (!block?.id) {
242
+ return errored({ code: 'CATALOG_VALIDATION_FAILED', message: 'Block is missing an id' });
243
+ }
244
+ cataloguedBlocks.push({
245
+ id: block.id,
246
+ label: block.label,
247
+ description: block.description,
248
+ iconKey: null,
249
+ color: block.color,
250
+ inputsJsonSchema: serializeWorkflowSchemaInputs(block.schema),
251
+ toolMap: block.toolMap ?? {},
252
+ refs: [],
253
+ });
254
+ }
255
+ const cataloguedFields = [];
256
+ const seenFieldKeys = new Set();
257
+ for (const field of fieldsArr) {
258
+ if (!field?.appFieldKey) {
259
+ return errored({ code: 'CATALOG_VALIDATION_FAILED', message: 'Field is missing appFieldKey' });
260
+ }
261
+ const dedupeKey = `${field.targetEntity}:${field.appFieldKey}`;
262
+ if (seenFieldKeys.has(dedupeKey)) {
263
+ return errored({
264
+ code: 'CATALOG_VALIDATION_FAILED',
265
+ message: `Duplicate field "${field.appFieldKey}" on entity "${field.targetEntity}"`,
266
+ });
267
+ }
268
+ seenFieldKeys.add(dedupeKey);
269
+ cataloguedFields.push({
270
+ appFieldKey: field.appFieldKey,
271
+ scope: field.scope,
272
+ targetEntity: field.targetEntity,
273
+ type: field.type,
274
+ name: field.name,
275
+ description: field.description,
276
+ options: field.options,
277
+ relationship: field.relationship,
278
+ calc: field.calc,
279
+ capabilities: field.capabilities,
280
+ });
281
+ }
282
+ const catalog = {
283
+ tools: cataloguedTools,
284
+ triggers: cataloguedTriggers,
285
+ toolsets: cataloguedToolsets,
286
+ workflow: {
287
+ blocks: cataloguedBlocks,
288
+ triggers: cataloguedWorkflowTriggers,
289
+ },
290
+ agent: {
291
+ tools: cataloguedAgentTools,
292
+ triggers: cataloguedAgentTriggers,
293
+ toolsets: cataloguedToolsets,
294
+ },
295
+ actions: cataloguedActions,
296
+ fields: cataloguedFields,
297
+ };
298
+ try {
299
+ JSON.stringify(catalog);
300
+ }
301
+ catch (error) {
302
+ return errored({
303
+ code: 'CATALOG_NOT_SERIALIZABLE',
304
+ message: error instanceof Error ? error.message : String(error),
305
+ });
306
+ }
307
+ return complete(catalog);
308
+ }
309
+ function serializeWorkflowSchemaInputs(schema) {
310
+ if (!schema || typeof schema !== 'object' || !schema.inputs)
311
+ return {};
312
+ const out = {};
313
+ for (const [key, field] of Object.entries(schema.inputs)) {
314
+ const fieldNode = field;
315
+ out[key] = typeof fieldNode?.toJSON === 'function' ? fieldNode.toJSON() : field;
316
+ }
317
+ return out;
318
+ }
@@ -0,0 +1,26 @@
1
+ import chalk from 'chalk';
2
+ import { HIDDEN_AUXX_DIRECTORY } from '../constants/hidden-auxx-directory.js';
3
+ import { isErrored } from '../errors.js';
4
+ import { addAuxxHiddenDirectoryToTsConfig } from './add-auxx-hidden-directory-to-ts-config.js';
5
+ import { generateAppFieldsTypes } from './generate-app-fields-types.js';
6
+ import { isAppExportTypeAnnotated } from './warn-if-app-type-annotated.js';
7
+ export async function ensureAppFieldsTypes() {
8
+ if (await isAppExportTypeAnnotated()) {
9
+ process.stderr.write(chalk.yellow('⚠ Your `app` export is annotated `: App`, which erases field literals — ' +
10
+ 'typed value I/O (@auxx/sdk/server) will fall back to permissive types. ' +
11
+ 'Use `satisfies App` (or no annotation) to keep `setFieldValues`/`getFieldValue` narrowed.\n'));
12
+ }
13
+ const tsconfigResult = await addAuxxHiddenDirectoryToTsConfig();
14
+ if (isErrored(tsconfigResult)) {
15
+ process.stderr.write(chalk.yellow(`⚠ Could not add the ${HIDDEN_AUXX_DIRECTORY} directory to tsconfig "include". ` +
16
+ 'Typed field values may not be picked up.\n'));
17
+ }
18
+ const generateResult = await generateAppFieldsTypes();
19
+ if (isErrored(generateResult)) {
20
+ process.stderr.write(chalk.yellow(`⚠ Could not generate .auxx/app-fields.d.ts at ${generateResult.error.path}. ` +
21
+ 'Field value I/O will use permissive types.\n'));
22
+ }
23
+ else if (generateResult.value === 'skipped_unmanaged') {
24
+ process.stderr.write(chalk.yellow('⚠ Skipping .auxx/app-fields.d.ts generation because the existing file is unmanaged.\n'));
25
+ }
26
+ }
@@ -0,0 +1,63 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import { APP_FIELDS_TYPES_FILENAME } from '../constants/app-fields-files.js';
4
+ import { HIDDEN_AUXX_DIRECTORY } from '../constants/hidden-auxx-directory.js';
5
+ import { complete, errored } from '../errors.js';
6
+ const GENERATED_MARKER = '// Auto-generated by auxx CLI. Do not edit.';
7
+ const APP_FIELDS_TYPES_FILE_CONTENT = `// .auxx/${APP_FIELDS_TYPES_FILENAME}
8
+ ${GENERATED_MARKER}
9
+ import '@auxx/sdk/server'
10
+ import type { app } from '../src/app'
11
+
12
+ type __AppFields = typeof app extends { fields: infer F } ? F : []
13
+
14
+ declare module '@auxx/sdk/server' {
15
+ export interface AppOwnedFieldRegistry {
16
+ fields: __AppFields
17
+ }
18
+ }
19
+ `;
20
+ export async function generateAppFieldsTypes(rootDirAbsolute = path.resolve('.')) {
21
+ const hiddenDirAbsolute = path.join(rootDirAbsolute, HIDDEN_AUXX_DIRECTORY);
22
+ const typesFilePath = path.join(hiddenDirAbsolute, APP_FIELDS_TYPES_FILENAME);
23
+ try {
24
+ await fs.mkdir(hiddenDirAbsolute, { recursive: true });
25
+ }
26
+ catch {
27
+ return errored({ code: 'FAILED_TO_CREATE_HIDDEN_DIRECTORY', path: hiddenDirAbsolute });
28
+ }
29
+ let existingContent = null;
30
+ try {
31
+ existingContent = await fs.readFile(typesFilePath, 'utf8');
32
+ }
33
+ catch (error) {
34
+ if (typeof error === 'object' && error !== null && 'code' in error && error.code === 'ENOENT') {
35
+ existingContent = null;
36
+ }
37
+ else {
38
+ return errored({ code: 'FAILED_TO_READ_APP_FIELDS_TYPES_FILE', path: typesFilePath });
39
+ }
40
+ }
41
+ if (existingContent === null) {
42
+ try {
43
+ await fs.writeFile(typesFilePath, APP_FIELDS_TYPES_FILE_CONTENT, 'utf8');
44
+ return complete('created');
45
+ }
46
+ catch {
47
+ return errored({ code: 'FAILED_TO_WRITE_APP_FIELDS_TYPES_FILE', path: typesFilePath });
48
+ }
49
+ }
50
+ if (existingContent === APP_FIELDS_TYPES_FILE_CONTENT) {
51
+ return complete('unchanged');
52
+ }
53
+ if (!existingContent.includes(GENERATED_MARKER)) {
54
+ return complete('skipped_unmanaged');
55
+ }
56
+ try {
57
+ await fs.writeFile(typesFilePath, APP_FIELDS_TYPES_FILE_CONTENT, 'utf8');
58
+ return complete('updated');
59
+ }
60
+ catch {
61
+ return errored({ code: 'FAILED_TO_WRITE_APP_FIELDS_TYPES_FILE', path: typesFilePath });
62
+ }
63
+ }
@@ -0,0 +1,9 @@
1
+ import path from 'path';
2
+ import { getAppEntryPoint } from './get-app-entry-point.js';
3
+ export async function isAppExportTypeAnnotated(rootDirAbsolute = path.resolve('.')) {
4
+ const entryPoint = await getAppEntryPoint(path.join(rootDirAbsolute, 'src'));
5
+ if (entryPoint === null) {
6
+ return false;
7
+ }
8
+ return /export\s+const\s+app\s*:\s*App\b/.test(entryPoint.content);
9
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@auxx/sdk",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
4
4
  "description": "CLI tool and SDK for creating Auxx apps",
5
5
  "type": "module",
6
6
  "bin": {
@@ -38,6 +38,14 @@
38
38
  "types": "./lib/root/workflow/index.d.ts",
39
39
  "import": "./lib/root/workflow/index.js"
40
40
  },
41
+ "./tools": {
42
+ "types": "./lib/root/tools/index.d.ts",
43
+ "import": "./lib/root/tools/index.js"
44
+ },
45
+ "./fields": {
46
+ "types": "./lib/root/fields/index.d.ts",
47
+ "import": "./lib/root/fields/index.js"
48
+ },
41
49
  "./shared": {
42
50
  "types": "./lib/shared/index.d.ts",
43
51
  "import": "./lib/shared/index.js"
@@ -1,8 +1,12 @@
1
1
  // src/events/connection-added.event.ts
2
2
  import { createWebhookHandler, updateWebhookHandler } from '@auxx/sdk/server'
3
- import type { Connection } from '@auxx/sdk/server'
3
+ import type { Connection, ConnectionAddedResult } from '@auxx/sdk/server'
4
4
 
5
- export default async function connectionAdded({ connection }: { connection: Connection }) {
5
+ export default async function connectionAdded({
6
+ connection,
7
+ }: {
8
+ connection: Connection
9
+ }): Promise<ConnectionAddedResult> {
6
10
  // You can create multiple webhook handlers for the same file
7
11
  const webhookHandler = await createWebhookHandler({
8
12
  fileName: 'example',
@@ -31,4 +35,15 @@ export default async function connectionAdded({ connection }: { connection: Conn
31
35
  await updateWebhookHandler(webhookHandler.id, {
32
36
  externalWebhookId: 'someId', //body.webhookId,
33
37
  })
38
+
39
+ // Optionally name this connection so it's recognizable in the connections
40
+ // list (otherwise it falls back to the app name, e.g. "Acme (2)"). Use
41
+ // whatever identifies the account — the authenticated email, a workspace
42
+ // name, a shop domain, etc. Returning nothing keeps the default label.
43
+ // const profile = await fetch('https://api.acmeinc.com/me', {
44
+ // headers: { Authorization: `Bearer ${connection.value}` },
45
+ // }).then((r) => r.json())
46
+ // return { label: profile.email }
47
+
48
+ return {}
34
49
  }
@@ -38,5 +38,5 @@
38
38
  "types": ["@auxx/sdk/client"]
39
39
  },
40
40
  "exclude": ["node_modules"],
41
- "include": ["src", ".auxx"]
41
+ "include": ["src", ".auxx/**/*"]
42
42
  }