@auxx/sdk 0.0.16 → 0.0.17

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 (32) hide show
  1. package/lib/build/server/find-tool-server-modules.js +49 -0
  2. package/lib/build/server/generate-server-entry.js +46 -1
  3. package/lib/client/forms/index.d.ts +4 -0
  4. package/lib/client/forms/index.d.ts.map +1 -1
  5. package/lib/client/forms/types/picker.d.ts +21 -0
  6. package/lib/client/forms/types/picker.d.ts.map +1 -0
  7. package/lib/client/forms/types/picker.js +3 -0
  8. package/lib/client/forms/types.d.ts +15 -0
  9. package/lib/client/forms/types.d.ts.map +1 -1
  10. package/lib/client/hooks/index.d.ts +4 -3
  11. package/lib/client/hooks/index.d.ts.map +1 -1
  12. package/lib/commands/dev/prepare-build-context.js +7 -2
  13. package/lib/commands/dev/server-builder.js +2 -1
  14. package/lib/root/app.d.ts +2 -0
  15. package/lib/root/app.d.ts.map +1 -1
  16. package/lib/root/data-connectors/define-data-connector.d.ts +4 -0
  17. package/lib/root/data-connectors/define-data-connector.d.ts.map +1 -0
  18. package/lib/root/data-connectors/define-data-connector.js +33 -0
  19. package/lib/root/data-connectors/index.d.ts +3 -0
  20. package/lib/root/data-connectors/index.d.ts.map +1 -0
  21. package/lib/root/data-connectors/index.js +1 -0
  22. package/lib/root/data-connectors/types.d.ts +80 -0
  23. package/lib/root/data-connectors/types.d.ts.map +1 -0
  24. package/lib/root/data-connectors/types.js +1 -0
  25. package/lib/root/index.d.ts +2 -0
  26. package/lib/root/index.d.ts.map +1 -1
  27. package/lib/root/index.js +1 -0
  28. package/lib/runtime/reconciler/tags/form-tag.d.ts +2 -0
  29. package/lib/runtime/reconciler/tags/form-tag.d.ts.map +1 -1
  30. package/lib/runtime/reconciler/tags/form-tag.js +31 -0
  31. package/lib/util/compile-and-extract-catalog.js +49 -1
  32. package/package.json +5 -1
@@ -277,3 +277,52 @@ export async function findToolModules(srcDirAbsolute) {
277
277
  modules: new Map(),
278
278
  });
279
279
  }
280
+ export function findDataConnectorModulesFromSource(source, currPath, helpers) {
281
+ const result = new Map();
282
+ try {
283
+ const ast = parse(source, { range: true, jsx: true });
284
+ const scopeManager = analyze(ast, { sourceType: 'module' });
285
+ const moduleScope = scopeManager.acquire(ast, true);
286
+ if (moduleScope === null) {
287
+ throw new Error('Expected to be able to acquire module scope');
288
+ }
289
+ ;
290
+ walk(ast, null, {
291
+ ExportNamedDeclaration(node) {
292
+ if (!node.declaration || node.declaration.type !== 'VariableDeclaration')
293
+ return;
294
+ if (node.declaration.declarations.length !== 1)
295
+ return;
296
+ const declaration = node.declaration.declarations[0];
297
+ if (declaration.id.type !== 'Identifier' || declaration.id.name !== 'app')
298
+ return;
299
+ const appValue = declaration.init;
300
+ if (!appValue || appValue.type !== 'ObjectExpression')
301
+ return;
302
+ const connectors = findProperty(appValue, 'dataConnectors', moduleScope);
303
+ if (connectors?.type !== 'ArrayExpression')
304
+ return;
305
+ for (const element of connectors.elements) {
306
+ if (element)
307
+ visitTool(element, moduleScope, result, currPath, helpers);
308
+ }
309
+ },
310
+ });
311
+ }
312
+ catch (error) {
313
+ const message = error instanceof Error ? error.message : String(error);
314
+ return errored({ code: 'DATA_CONNECTOR_RESOLUTION_FAILED', message });
315
+ }
316
+ return complete(result);
317
+ }
318
+ export async function findDataConnectorModules(srcDirAbsolute) {
319
+ const appEntryPoint = await getAppEntryPoint(srcDirAbsolute);
320
+ if (!appEntryPoint) {
321
+ return complete(new Map());
322
+ }
323
+ return findDataConnectorModulesFromSource(appEntryPoint.content, appEntryPoint.path, {
324
+ getModuleSource: (p) => fs.readFileSync(p, 'utf-8'),
325
+ doesModuleExist: (p) => fs.existsSync(p),
326
+ modules: new Map(),
327
+ });
328
+ }
@@ -16,7 +16,7 @@ async function findServerFunctionModules(cwd, pattern) {
16
16
  });
17
17
  }
18
18
  }
19
- export async function generateServerEntry({ appDirAbsolute, srcDirAbsolute, webhooksDirAbsolute, eventDirAbsolute, workflowBlockModules, toolModules = new Map(), log, }) {
19
+ export async function generateServerEntry({ appDirAbsolute, srcDirAbsolute, webhooksDirAbsolute, eventDirAbsolute, workflowBlockModules, toolModules = new Map(), dataConnectorModules = new Map(), log, }) {
20
20
  const pathsResult = await combineAsync({
21
21
  serverFunctionConcretePaths: findServerFunctionModules(srcDirAbsolute, 'server'),
22
22
  webhookConcretePaths: findServerFunctionModules(webhooksDirAbsolute, 'webhook'),
@@ -150,6 +150,51 @@ export async function generateServerEntry({ appDirAbsolute, srcDirAbsolute, webh
150
150
  };
151
151
  }
152
152
 
153
+ // Data connector module registry
154
+ const dataConnectorModulesMap = new Map()
155
+
156
+ ${[...dataConnectorModules.entries()]
157
+ .map(([connectorId, handlers]) => `dataConnectorModulesMap.set(
158
+ ${JSON.stringify(connectorId)},
159
+ {
160
+ ${[...Object.entries(handlers)]
161
+ .map(([handler, data]) => data
162
+ ? `${JSON.stringify(handler)}: {
163
+ module: () => import(${JSON.stringify(path.join(appDirAbsolute, data.path))}),
164
+ export: ${JSON.stringify(data.export)}
165
+ },`
166
+ : '')
167
+ .join('\n')}
168
+ }
169
+ )`)
170
+ .join('\n')}
171
+
172
+ // Build __AUXX_DATA_CONNECTORS__ — the connector registry read by the
173
+ // lambda data-connector-executor. Mirrors __AUXX_TOOLS__: the executor
174
+ // reads execute({ streamKey, mode, state, connection, config }) off this
175
+ // global. See plans/data-connectors/claude/03-connectors-and-sources.md §4.
176
+ const __AUXX_DATA_CONNECTORS__ = {};
177
+
178
+ for (const [connectorId, handlers] of dataConnectorModulesMap.entries()) {
179
+ __AUXX_DATA_CONNECTORS__[connectorId] = {
180
+ execute: async (...args) => {
181
+ const executeHandler = handlers.execute;
182
+ if (!executeHandler) {
183
+ throw new Error(\`No execute handler for data connector \${connectorId}\`);
184
+ }
185
+ const module = await executeHandler.module();
186
+ const func = module[executeHandler.export];
187
+ if (!func) {
188
+ throw new Error(\`Execute export not found in data connector \${connectorId}\`);
189
+ }
190
+ if (typeof func !== "function") {
191
+ throw new Error(\`Execute export in data connector \${connectorId} is not a function\`);
192
+ }
193
+ return await func(...args);
194
+ }
195
+ };
196
+ }
197
+
153
198
  var stdin_default;
154
199
  var stdin_webhooks_default;
155
200
  var stdin_events_default;
@@ -1,11 +1,13 @@
1
1
  import { FormBoolean } from './types/boolean.js';
2
2
  import { FormNumber } from './types/number.js';
3
+ import { FormPicker } from './types/picker.js';
3
4
  import { FormSelect } from './types/select.js';
4
5
  import { FormString } from './types/string.js';
5
6
  import type { SelectOption } from './types.js';
6
7
  export * from './base.js';
7
8
  export { FormBoolean } from './types/boolean.js';
8
9
  export { FormNumber } from './types/number.js';
10
+ export { FormPicker, type PickerConfig } from './types/picker.js';
9
11
  export { FormSelect } from './types/select.js';
10
12
  export { FormString } from './types/string.js';
11
13
  export * from './types.js';
@@ -16,11 +18,13 @@ export declare const Forms: {
16
18
  number: () => FormNumber;
17
19
  boolean: () => FormBoolean;
18
20
  select: <T extends string>(options: SelectOption<T>[]) => FormSelect<T>;
21
+ picker: typeof FormPicker.create;
19
22
  };
20
23
  export declare const Settings: {
21
24
  string: () => FormString;
22
25
  number: () => FormNumber;
23
26
  boolean: () => FormBoolean;
24
27
  select: <T extends string>(options: SelectOption<T>[]) => FormSelect<T>;
28
+ picker: typeof FormPicker.create;
25
29
  };
26
30
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/forms/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,cAAc,YAAY,CAAA;AAC1B,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AAgBrC,eAAO,MAAM,KAAK;;;;aAIP,CAAC,SAAS,MAAM,WAAW,YAAY,CAAC,CAAC,CAAC,EAAE;CACtD,CAAA;AAeD,eAAO,MAAM,QAAQ;;;;aAhBV,CAAC,SAAS,MAAM,WAAW,YAAY,CAAC,CAAC,CAAC,EAAE;CAgB1B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/forms/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAqB,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,cAAc,YAAY,CAAA;AAC1B,cAAc,sBAAsB,CAAA;AACpC,cAAc,uBAAuB,CAAA;AAgBrC,eAAO,MAAM,KAAK;;;;aAIP,CAAC,SAAS,MAAM,WAAW,YAAY,CAAC,CAAC,CAAC,EAAE;YACoB,OAAO,UAAU,CAAC,MAAM;CAClG,CAAA;AAeD,eAAO,MAAM,QAAQ;;;;aAjBV,CAAC,SAAS,MAAM,WAAW,YAAY,CAAC,CAAC,CAAC,EAAE;YACoB,OAAO,UAAU,CAAC,MAAM;CAgBtE,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { FormValue } from '../base.js';
2
+ import type { FormPickerMetadata, PickerLoadOptions, SelectOption, SerializedFormValue } from '../types.js';
3
+ export interface PickerConfig {
4
+ loadOptions?: PickerLoadOptions;
5
+ options?: SelectOption[];
6
+ multi?: boolean;
7
+ }
8
+ export declare class FormPicker<V extends string | string[] = string> extends FormValue<V> {
9
+ readonly _metadata: FormPickerMetadata;
10
+ private constructor();
11
+ static create(config: PickerConfig & {
12
+ multi: true;
13
+ }): FormPicker<string[]>;
14
+ static create(config?: PickerConfig): FormPicker<string>;
15
+ static is(value: unknown): value is FormPicker;
16
+ get type(): 'picker';
17
+ optional(): FormPicker<V>;
18
+ placeholder(text: string): FormPicker<V>;
19
+ toJSON(): SerializedFormValue;
20
+ }
21
+ //# sourceMappingURL=picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../../../../src/client/forms/types/picker.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACpB,MAAM,aAAa,CAAA;AAMpB,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAC/B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAcD,qBAAa,UAAU,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAChF,SAAgB,SAAS,EAAE,kBAAkB,CAAA;IAE7C,OAAO;IAKP,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG;QAAE,KAAK,EAAE,IAAI,CAAA;KAAE,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;IAC3E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC;IAYxD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU;IAI9C,IAAI,IAAI,IAAI,QAAQ,CAEnB;IAED,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC;IAIzB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC;IAIxC,MAAM,IAAI,mBAAmB;CAS9B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ // Implementation stripped - provided by runtime
@@ -10,6 +10,9 @@ export type SerializedFormValue = {
10
10
  } | {
11
11
  type: 'select';
12
12
  metadata: FormSelectMetadata;
13
+ } | {
14
+ type: 'picker';
15
+ metadata: FormPickerMetadata;
13
16
  };
14
17
  export interface FormStringMetadata {
15
18
  optional?: boolean;
@@ -61,6 +64,18 @@ export interface FormSelectMetadata<T extends string = string> {
61
64
  required?: string;
62
65
  };
63
66
  }
67
+ export type PickerLoadOptions = (query: string) => Promise<SelectOption[]>;
68
+ export interface FormPickerMetadata {
69
+ loadOptions?: PickerLoadOptions;
70
+ hasLoadOptions?: boolean;
71
+ options?: SelectOption[];
72
+ multi?: boolean;
73
+ optional?: boolean;
74
+ placeholder?: string;
75
+ errorMessages?: {
76
+ required?: string;
77
+ };
78
+ }
64
79
  export type FormSchema = Record<string, FormValue<any>>;
65
80
  export type InferFormValues<S extends FormSchema> = {
66
81
  [K in keyof S]: S[K] extends FormValue<infer T> ? S[K]['_metadata']['optional'] extends true ? T | undefined : T : never;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/forms/types.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,mBAAmB,GAC3B;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,mBAAmB,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,kBAAkB,CAAA;CAAE,CAAA;AAKpD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB,aAAa,CAAC,EAAE;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAA;CACF;AAKD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAKD,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAKD,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACrD,KAAK,EAAE,CAAC,CAAA;IACR,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAKD,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC3D,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,CAAC,CAAA;IAChB,aAAa,CAAC,EAAE;QACd,QAAQ,CAAC,EAAE,MAAM,CAAA;KAClB,CAAA;CACF;AAKD,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;AAKvD,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,UAAU,IAAI;KACjD,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,GAC3C,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,UAAU,CAAC,SAAS,IAAI,GACxC,CAAC,GAAG,SAAS,GACb,CAAC,GACH,KAAK;CACV,CAAA;AAGD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/client/forms/types.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,10 @@ export { type AsyncCacheConfig, type AsyncFunction, useAsyncCache } from './use-
2
2
  export interface AuxxRecord {
3
3
  id: string;
4
4
  type: string;
5
+ displayName?: string;
5
6
  data: Record<string, any>;
6
- createdAt: Date;
7
- updatedAt: Date;
7
+ createdAt?: string | Date;
8
+ updatedAt?: string | Date;
8
9
  }
9
10
  export interface Query {
10
11
  type: string;
@@ -21,7 +22,7 @@ export interface User {
21
22
  export interface AppSettings {
22
23
  [key: string]: any;
23
24
  }
24
- export declare function useRecord(_recordId: string): AuxxRecord;
25
+ export declare function useRecord(recordId: string): AuxxRecord;
25
26
  export declare function useRecords(_query: Query): AuxxRecord[];
26
27
  export declare function useCurrentUser(): User;
27
28
  export declare function useSettings(): AppSettings;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAK/F,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACzB,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;CAChB;AAKD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAKD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAKD,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AAkBD,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAEvD;AAkBD,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,UAAU,EAAE,CAEtD;AAiBD,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAiBD,wBAAgB,WAAW,IAAI,WAAW,CAEzC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/hooks/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAS/F,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAC1B;AAKD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAKD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAKD,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AA4BD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAKtD;AAkBD,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,GAAG,UAAU,EAAE,CAEtD;AAiBD,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAiBD,wBAAgB,WAAW,IAAI,WAAW,CAEzC"}
@@ -1,6 +1,6 @@
1
1
  import chalk from 'chalk';
2
2
  import path from 'path';
3
- import { findToolModules } from '../../build/server/find-tool-server-modules.js';
3
+ import { findDataConnectorModules, findToolModules, } from '../../build/server/find-tool-server-modules.js';
4
4
  import { findWorkflowBlockModules } from '../../build/server/find-workflow-block-server-modules.js';
5
5
  import { combine, combineAsync, complete, isComplete, isErrored, map, } from '../../errors.js';
6
6
  import { ClientBuilder } from './client-builder.js';
@@ -46,11 +46,16 @@ export async function prepareBuildContext(mode) {
46
46
  if (isErrored(toolModulesResult)) {
47
47
  return toolModulesResult;
48
48
  }
49
+ const dataConnectorModulesResult = await findDataConnectorModules(srcDir);
50
+ if (isErrored(dataConnectorModulesResult)) {
51
+ return dataConnectorModulesResult;
52
+ }
49
53
  const { blocks: workflowBlockModules } = workflowBlockModulesResult.value;
50
54
  const toolModules = toolModulesResult.value;
55
+ const dataConnectorModules = dataConnectorModulesResult.value;
51
56
  return combineAsync({
52
57
  client: client.rebuild({ workflowBlockModules }),
53
- server: server.rebuild({ workflowBlockModules, toolModules }),
58
+ server: server.rebuild({ workflowBlockModules, toolModules, dataConnectorModules }),
54
59
  });
55
60
  },
56
61
  dispose: async (timeoutMs) => {
@@ -42,7 +42,7 @@ export class ServerBuilder {
42
42
  });
43
43
  }
44
44
  }
45
- async rebuild({ workflowBlockModules, toolModules, }) {
45
+ async rebuild({ workflowBlockModules, toolModules, dataConnectorModules, }) {
46
46
  const jsResult = await generateServerEntry({
47
47
  appDirAbsolute: path.resolve(this._directories.app),
48
48
  srcDirAbsolute: path.resolve(this._directories.src),
@@ -50,6 +50,7 @@ export class ServerBuilder {
50
50
  eventDirAbsolute: path.resolve(this._directories.events),
51
51
  workflowBlockModules,
52
52
  toolModules: toolModules ?? new Map(),
53
+ dataConnectorModules: dataConnectorModules ?? new Map(),
53
54
  log: console.log,
54
55
  });
55
56
  if (isErrored(jsResult)) {
package/lib/root/app.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { BulkRecordAction, RecordAction, RecordWidget } from '../client/record-actions.js';
2
+ import type { DataConnectorDefinition } from './data-connectors/types.js';
2
3
  import type { AppFieldDefinition } from './fields/index.js';
3
4
  import type { ScopedSettingsSchema } from './settings/settings-schema.js';
4
5
  import type { ToolDefinition, Toolset } from './tools/types.js';
@@ -50,6 +51,7 @@ export interface App {
50
51
  readonly tools?: ReadonlyArray<ToolDefinition>;
51
52
  readonly toolsets?: ReadonlyArray<Toolset>;
52
53
  readonly fields?: ReadonlyArray<AppFieldDefinition>;
54
+ readonly dataConnectors?: ReadonlyArray<DataConnectorDefinition>;
53
55
  readonly settings?: {
54
56
  readonly organization?: ScopedSettingsSchema;
55
57
  };
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/root/app.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC/F,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC/D,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAIjE,MAAM,WAAW,UAAU;IAEzB,QAAQ,EAAE,SAAS,GAAG,WAAW,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAA;IAE/D,OAAO,EAAE,CAAC,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAA;IAExC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAKD,MAAM,WAAW,WAAW;IAE1B,IAAI,EAAE,MAAM,CAAA;IAEZ,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAA;IAE1B,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAuBD,MAAM,CAAC,OAAO,WAAW,GAAG,CAAC;IAC3B,UAAU,MAAM,CAAC;QACf,KAAK,MAAM,GAAG,YAAY,CAAA;QAC1B,KAAK,UAAU,GAAG,gBAAgB,CAAA;QAClC,KAAK,MAAM,GAAG,YAAY,CAAA;KAC3B;IACD,UAAU,QAAQ,CAAC,GAAE;IACrB,UAAU,QAAQ,CAAC,GAAE;CACtB;AAED,MAAM,WAAW,GAAG;IAClB,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC3C,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAA;QACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;KAC5C,CAAA;IAED,QAAQ,CAAC,aAAa,CAAC,EAAE;QACvB,QAAQ,CAAC,OAAO,CAAC,EAAE;YACjB,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;SACpC,CAAA;QACD,QAAQ,CAAC,OAAO,CAAC,EAAE;YACjB,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;SACrC,CAAA;QACD,QAAQ,CAAC,UAAU,CAAC,EAAE;YACpB,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;SACpC,CAAA;KACF,CAAA;IAED,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAElB,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,CAAA;QAEjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;KAC9B,CAAA;IAOD,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IAK9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAA;IAQ1C,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAA;IAEnD,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,YAAY,CAAC,EAAE,oBAAoB,CAAA;KAC7C,CAAA;CAIF"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/root/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { z } from 'zod/v4';
2
+ import type { DataConnectorDefinition } from './types.js';
3
+ export declare function defineDataConnector<TConfigSchema extends z.ZodTypeAny>(connector: DataConnectorDefinition<TConfigSchema>): DataConnectorDefinition<TConfigSchema>;
4
+ //# sourceMappingURL=define-data-connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-data-connector.d.ts","sourceRoot":"","sources":["../../../src/root/data-connectors/define-data-connector.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAwDzD,wBAAgB,mBAAmB,CAAC,aAAa,SAAS,CAAC,CAAC,UAAU,EACpE,SAAS,EAAE,uBAAuB,CAAC,aAAa,CAAC,GAChD,uBAAuB,CAAC,aAAa,CAAC,CA6CxC"}
@@ -0,0 +1,33 @@
1
+ const CONNECTOR_ID_RE = /^[a-z][a-z0-9]*(\.[a-z][a-z0-9]*)*$/;
2
+ export function defineDataConnector(connector) {
3
+ if (!CONNECTOR_ID_RE.test(connector.id)) {
4
+ throw new Error(`defineDataConnector: invalid id "${connector.id}" — must match ${CONNECTOR_ID_RE.source}`);
5
+ }
6
+ if (!connector.streams.length) {
7
+ throw new Error(`defineDataConnector: connector "${connector.id}" declares no streams`);
8
+ }
9
+ const seenStreamKeys = new Set();
10
+ for (const stream of connector.streams) {
11
+ if (!stream.key) {
12
+ throw new Error(`defineDataConnector: connector "${connector.id}" has a stream with no key`);
13
+ }
14
+ if (seenStreamKeys.has(stream.key)) {
15
+ throw new Error(`defineDataConnector: connector "${connector.id}" has duplicate stream key "${stream.key}"`);
16
+ }
17
+ seenStreamKeys.add(stream.key);
18
+ if (!stream.fields[stream.displayFieldKey]) {
19
+ throw new Error(`defineDataConnector: stream "${stream.key}" displayFieldKey "${stream.displayFieldKey}" is not a declared field`);
20
+ }
21
+ if (stream.exampleRecord !== undefined) {
22
+ try {
23
+ if (JSON.stringify(stream.exampleRecord) === undefined) {
24
+ throw new Error('serializes to undefined');
25
+ }
26
+ }
27
+ catch (err) {
28
+ throw new Error(`defineDataConnector: stream "${stream.key}" exampleRecord is not JSON-serializable — ${err instanceof Error ? err.message : String(err)}`);
29
+ }
30
+ }
31
+ }
32
+ return connector;
33
+ }
@@ -0,0 +1,3 @@
1
+ export { defineDataConnector } from './define-data-connector.js';
2
+ export type { ConnectorConnection, ConnectorDefaultMapping, ConnectorEntityDecl, ConnectorExecute, ConnectorExecuteArgs, ConnectorFetchResult, ConnectorFieldCapabilities, ConnectorFieldDecl, ConnectorRecord, ConnectorStreamDecl, ConnectorStreamState, DataConnectorDefinition, } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/root/data-connectors/index.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,YAAY,CAAA"}
@@ -0,0 +1 @@
1
+ export { defineDataConnector } from './define-data-connector.js';
@@ -0,0 +1,80 @@
1
+ import type { z } from 'zod/v4';
2
+ import type { FieldType } from '../fields/field-types.js';
3
+ export interface ConnectorRecord {
4
+ streamKey: string;
5
+ externalId: string;
6
+ displayName: string;
7
+ fields: Record<string, unknown>;
8
+ deleted?: boolean;
9
+ contentHash?: string;
10
+ }
11
+ export interface ConnectorStreamState {
12
+ cursor?: unknown;
13
+ updatedSince?: string;
14
+ backfillComplete?: boolean;
15
+ [key: string]: unknown;
16
+ }
17
+ export interface ConnectorFetchResult {
18
+ records: ConnectorRecord[] | AsyncIterable<ConnectorRecord>;
19
+ nextState: ConnectorStreamState;
20
+ }
21
+ export interface ConnectorFieldCapabilities {
22
+ hidden?: boolean;
23
+ filterable?: boolean;
24
+ }
25
+ export interface ConnectorFieldDecl {
26
+ sourcePath: string;
27
+ type: FieldType;
28
+ name: string;
29
+ pii?: boolean;
30
+ capabilities?: ConnectorFieldCapabilities;
31
+ }
32
+ export interface ConnectorEntityDecl {
33
+ apiSlug: string;
34
+ singular: string;
35
+ plural: string;
36
+ primaryDisplayField?: string;
37
+ }
38
+ export interface ConnectorDefaultMapping {
39
+ rootPath: string;
40
+ linkMode?: 'upsert' | 'reference';
41
+ relationshipFieldKey?: string;
42
+ target: {
43
+ mode: 'owned';
44
+ entity: ConnectorEntityDecl;
45
+ } | {
46
+ mode: 'contributing';
47
+ entityKind: string;
48
+ matchFieldKeys?: string[];
49
+ };
50
+ }
51
+ export interface ConnectorStreamDecl {
52
+ key: string;
53
+ displayFieldKey: string;
54
+ fields: Record<string, ConnectorFieldDecl>;
55
+ defaultMappings?: ConnectorDefaultMapping[];
56
+ exampleRecord?: Record<string, unknown>;
57
+ }
58
+ export interface ConnectorExecuteArgs<TConfig = Record<string, unknown>> {
59
+ streamKey: string;
60
+ mode: 'snapshot' | 'incremental';
61
+ state: ConnectorStreamState;
62
+ connection: ConnectorConnection | null;
63
+ config: TConfig;
64
+ }
65
+ export interface ConnectorConnection {
66
+ value: string;
67
+ fields?: Record<string, string>;
68
+ metadata?: Record<string, unknown>;
69
+ }
70
+ export type ConnectorExecute<TConfig = Record<string, unknown>> = (args: ConnectorExecuteArgs<TConfig>) => Promise<ConnectorFetchResult>;
71
+ export interface DataConnectorDefinition<TConfigSchema extends z.ZodTypeAny = z.ZodTypeAny> {
72
+ id: string;
73
+ label: string;
74
+ requiresConnection: boolean;
75
+ config: TConfigSchema;
76
+ streams: ConnectorStreamDecl[];
77
+ iconKey?: string;
78
+ execute: ConnectorExecute<z.output<TConfigSchema>>;
79
+ }
80
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/root/data-connectors/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -1,6 +1,8 @@
1
1
  export type { BulkRecordAction, RecordAction, RecordActionContext, } from '../client/record-actions.js';
2
2
  export type { TriggerContext, WorkflowContext, WorkflowInput, WorkflowOutput, } from '../server/workflow/index.js';
3
3
  export type { App, AppSettings, Permission } from './app.js';
4
+ export type { ConnectorConnection, ConnectorDefaultMapping, ConnectorEntityDecl, ConnectorExecute, ConnectorExecuteArgs, ConnectorFetchResult, ConnectorFieldCapabilities, ConnectorFieldDecl, ConnectorRecord, ConnectorStreamDecl, ConnectorStreamState, DataConnectorDefinition, } from './data-connectors/index.js';
5
+ export { defineDataConnector } from './data-connectors/index.js';
4
6
  export { type AppFieldDefinition, type AppFieldValues, defineField, defineFields, FIELD_TYPES, type FieldCapabilities, type FieldScope, type FieldSelectOption, type FieldType, type FieldTypeValueMap, type FieldValueType, } from './fields/index.js';
5
7
  export { Settings } from './settings/index.js';
6
8
  export type { BaseSettingOptions, BooleanSettingOptions, NumberSettingOptions, SelectSettingOptions, SettingsBooleanNode, SettingsNode, SettingsNumberNode, SettingsSchema, SettingsSelectNode, SettingsStringNode, SettingsStructNode, StringSettingOptions, StructSettingOptions, } from './settings/settings-schema.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/root/index.ts"],"names":[],"mappings":"AASA,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,GACpB,MAAM,6BAA6B,CAAA;AACpC,YAAY,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,6BAA6B,CAAA;AACpC,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE5D,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,+BAA+B,CAAA;AACtC,YAAY,EACV,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,OAAO,GACR,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AACtD,YAAY,EACV,iBAAiB,EACjB,QAAQ,EACR,wBAAwB,EACxB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EAEZ,kBAAkB,EAClB,kBAAkB,EAClB,OAAO,EACP,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EAEjB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,GACb,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/root/index.ts"],"names":[],"mappings":"AASA,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,GACpB,MAAM,6BAA6B,CAAA;AACpC,YAAY,EACV,cAAc,EACd,eAAe,EACf,aAAa,EACb,cAAc,GACf,MAAM,6BAA6B,CAAA;AACpC,YAAY,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC5D,YAAY,EACV,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,0BAA0B,EAC1B,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,4BAA4B,CAAA;AAEnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAE9C,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,+BAA+B,CAAA;AACtC,YAAY,EACV,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,OAAO,GACR,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AACtD,YAAY,EACV,iBAAiB,EACjB,QAAQ,EACR,wBAAwB,EACxB,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,EAEZ,kBAAkB,EAClB,kBAAkB,EAClB,OAAO,EACP,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EAEjB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,YAAY,GACb,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA"}
package/lib/root/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ export { defineDataConnector } from './data-connectors/index.js';
1
2
  export { defineField, defineFields, FIELD_TYPES, } from './fields/index.js';
2
3
  export { Settings } from './settings/index.js';
3
4
  export { defineTool, refs, z } from './tools/index.js';
@@ -2,6 +2,8 @@ import { BaseTag } from './base-tag.js';
2
2
  export declare class FormTag extends BaseTag {
3
3
  private internalRef;
4
4
  constructor(props: Record<string, any>);
5
+ private pickerResolvers;
6
+ private registerPickerLoadOptions;
5
7
  getTagName(): string;
6
8
  getComponentName(): string;
7
9
  getAttributes(props: Record<string, any>): Record<string, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"form-tag.d.ts","sourceRoot":"","sources":["../../../../src/runtime/reconciler/tags/form-tag.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAMvC,qBAAa,OAAQ,SAAQ,OAAO;IAClC,OAAO,CAAC,WAAW,CAAK;gBAEZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAatC,UAAU,IAAI,MAAM;IAIpB,gBAAgB,IAAI,MAAM;IAI1B,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IA8C9D,mBAAmB;CA8BpB"}
1
+ {"version":3,"file":"form-tag.d.ts","sourceRoot":"","sources":["../../../../src/runtime/reconciler/tags/form-tag.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AASvC,qBAAa,OAAQ,SAAQ,OAAO;IAClC,OAAO,CAAC,WAAW,CAAK;gBAEZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAqBtC,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,yBAAyB;IAsBjC,UAAU,IAAI,MAAM;IAIpB,gBAAgB,IAAI,MAAM;IAI1B,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IA8C9D,mBAAmB;CA8BpB"}
@@ -1,7 +1,10 @@
1
1
  import { serializeSchema } from '../../../client/forms/utils/serialize.js';
2
2
  import { validateFormFields } from '../../../client/forms/utils/validation.js';
3
+ import { eventBus } from '../../event-bus.js';
3
4
  import { registerEventHandler } from '../../register-event-handler.js';
5
+ import { wrapEventHandler } from '../../wrap-event-handler.js';
4
6
  import { BaseTag } from './base-tag.js';
7
+ const LOAD_OPTIONS_PREFIX = 'loadOptions:';
5
8
  export class FormTag extends BaseTag {
6
9
  internalRef;
7
10
  constructor(props) {
@@ -10,8 +13,36 @@ export class FormTag extends BaseTag {
10
13
  registerEventHandler(this, 'onChange');
11
14
  registerEventHandler(this, 'onError');
12
15
  registerEventHandler(this, 'onValidationError');
16
+ this.registerPickerLoadOptions(props.schema);
13
17
  this.internalRef = props.__internalRef;
14
18
  }
19
+ pickerResolvers(schema) {
20
+ if (!schema || typeof schema !== 'object')
21
+ return [];
22
+ const out = [];
23
+ for (const [name, field] of Object.entries(schema)) {
24
+ if (field?.type === 'picker' && typeof field._metadata?.loadOptions === 'function') {
25
+ out.push({ name, loadOptions: field._metadata.loadOptions });
26
+ }
27
+ }
28
+ return out;
29
+ }
30
+ registerPickerLoadOptions(schema) {
31
+ const resolvers = this.pickerResolvers(schema);
32
+ if (resolvers.length === 0)
33
+ return;
34
+ this.mounted.addListener(({ instance }) => {
35
+ for (const { name, loadOptions } of resolvers) {
36
+ const eventName = `${LOAD_OPTIONS_PREFIX}${name}`;
37
+ eventBus.setTagEventListener(eventName, instance.instance_id, wrapEventHandler((query) => loadOptions(query ?? ''), { eventName }));
38
+ }
39
+ });
40
+ this.destroyed.addListener(({ instance }) => {
41
+ for (const { name } of resolvers) {
42
+ eventBus.clearTagEventListener(`${LOAD_OPTIONS_PREFIX}${name}`, instance.instance_id);
43
+ }
44
+ });
45
+ }
15
46
  getTagName() {
16
47
  return 'form';
17
48
  }
@@ -44,6 +44,7 @@ export async function compileAndExtractCatalog() {
44
44
  const SDK_REAL_TOOLS = path.join(SDK_ROOT, 'lib', 'root', 'tools', 'index.js');
45
45
  const SDK_REAL_WORKFLOW = path.join(SDK_ROOT, 'lib', 'root', 'workflow', 'index.js');
46
46
  const SDK_REAL_FIELDS = path.join(SDK_ROOT, 'lib', 'root', 'fields', 'index.js');
47
+ const SDK_REAL_DATA_CONNECTORS = path.join(SDK_ROOT, 'lib', 'root', 'data-connectors', 'index.js');
47
48
  const stubSdkSubpaths = {
48
49
  name: 'auxx-stub-sdk-subpaths',
49
50
  setup(build) {
@@ -56,6 +57,8 @@ export async function compileAndExtractCatalog() {
56
57
  return { path: SDK_REAL_WORKFLOW };
57
58
  if (args.path === '@auxx/sdk/fields')
58
59
  return { path: SDK_REAL_FIELDS };
60
+ if (args.path === '@auxx/sdk/data-connectors')
61
+ return { path: SDK_REAL_DATA_CONNECTORS };
59
62
  return { path: args.path, namespace: 'auxx-sdk-stub' };
60
63
  });
61
64
  build.onLoad({ filter: /.*/, namespace: 'auxx-sdk-stub' }, () => ({
@@ -120,11 +123,13 @@ export async function compileAndExtractCatalog() {
120
123
  const workflowBlocksArr = (app.workflow?.blocks ?? []);
121
124
  const workflowTriggersArr = (app.workflow?.triggers ?? []);
122
125
  const fieldsArr = (app.fields ?? []);
126
+ const dataConnectorsArr = (app.dataConnectors ?? []);
123
127
  if (!toolsArr.length &&
124
128
  !toolsetsArr.length &&
125
129
  !workflowBlocksArr.length &&
126
130
  !workflowTriggersArr.length &&
127
- !fieldsArr.length) {
131
+ !fieldsArr.length &&
132
+ !dataConnectorsArr.length) {
128
133
  return complete(undefined);
129
134
  }
130
135
  const { zodToProviderToolSchema } = await import('../build/server/zod-to-provider-tool-schema.js');
@@ -300,6 +305,48 @@ export async function compileAndExtractCatalog() {
300
305
  capabilities: field.capabilities,
301
306
  });
302
307
  }
308
+ const cataloguedDataConnectors = [];
309
+ const seenConnectorIds = new Set();
310
+ for (const connector of dataConnectorsArr) {
311
+ if (!connector?.id) {
312
+ return errored({
313
+ code: 'CATALOG_VALIDATION_FAILED',
314
+ message: 'Data connector is missing an id',
315
+ });
316
+ }
317
+ if (seenConnectorIds.has(connector.id)) {
318
+ return errored({
319
+ code: 'CATALOG_VALIDATION_FAILED',
320
+ message: `Duplicate data connector id "${connector.id}"`,
321
+ });
322
+ }
323
+ seenConnectorIds.add(connector.id);
324
+ const configJsonSchema = connector.config
325
+ ? zodToProviderToolSchema(connector.config).jsonSchema
326
+ : {};
327
+ const streams = (connector.streams ?? []).map((stream) => ({
328
+ key: stream.key,
329
+ displayFieldKey: stream.displayFieldKey,
330
+ fields: Object.entries(stream.fields ?? {}).map(([fieldKey, decl]) => ({
331
+ fieldKey,
332
+ sourcePath: decl.sourcePath,
333
+ type: decl.type,
334
+ name: decl.name,
335
+ pii: decl.pii,
336
+ capabilities: decl.capabilities,
337
+ })),
338
+ defaultMappings: stream.defaultMappings,
339
+ exampleRecord: stream.exampleRecord,
340
+ }));
341
+ cataloguedDataConnectors.push({
342
+ id: connector.id,
343
+ label: connector.label,
344
+ requiresConnection: Boolean(connector.requiresConnection),
345
+ iconKey: connector.iconKey ?? null,
346
+ configJsonSchema,
347
+ streams,
348
+ });
349
+ }
303
350
  const catalog = {
304
351
  tools: cataloguedTools,
305
352
  triggers: cataloguedTriggers,
@@ -315,6 +362,7 @@ export async function compileAndExtractCatalog() {
315
362
  },
316
363
  actions: cataloguedActions,
317
364
  fields: cataloguedFields,
365
+ dataConnectors: cataloguedDataConnectors,
318
366
  };
319
367
  try {
320
368
  JSON.stringify(catalog);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@auxx/sdk",
3
- "version": "0.0.16",
3
+ "version": "0.0.17",
4
4
  "description": "CLI tool and SDK for creating Auxx apps",
5
5
  "type": "module",
6
6
  "bin": {
@@ -46,6 +46,10 @@
46
46
  "types": "./lib/root/fields/index.d.ts",
47
47
  "import": "./lib/root/fields/index.js"
48
48
  },
49
+ "./data-connectors": {
50
+ "types": "./lib/root/data-connectors/index.d.ts",
51
+ "import": "./lib/root/data-connectors/index.js"
52
+ },
49
53
  "./shared": {
50
54
  "types": "./lib/shared/index.d.ts",
51
55
  "import": "./lib/shared/index.js"