@auxx/sdk 0.0.16 → 0.0.18

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 (37) 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 +113 -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/fields/define-field.d.ts +1 -0
  26. package/lib/root/fields/define-field.d.ts.map +1 -1
  27. package/lib/root/fields/define-field.js +20 -0
  28. package/lib/root/index.d.ts +2 -0
  29. package/lib/root/index.d.ts.map +1 -1
  30. package/lib/root/index.js +1 -0
  31. package/lib/root/tools/types.d.ts +1 -0
  32. package/lib/root/tools/types.d.ts.map +1 -1
  33. package/lib/runtime/reconciler/tags/form-tag.d.ts +2 -0
  34. package/lib/runtime/reconciler/tags/form-tag.d.ts.map +1 -1
  35. package/lib/runtime/reconciler/tags/form-tag.js +31 -0
  36. package/lib/util/compile-and-extract-catalog.js +119 -3
  37. 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, ConnectorRelationshipDecl, ConnectorRelationshipTargetRef, 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,yBAAyB,EACzB,8BAA8B,EAC9B,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,YAAY,CAAA"}
@@ -0,0 +1 @@
1
+ export { defineDataConnector } from './define-data-connector.js';
@@ -0,0 +1,113 @@
1
+ import type { z } from 'zod/v4';
2
+ import type { FieldSelectOption, FieldType } from '../fields/field-types.js';
3
+ import type { ActionInputHint } from '../tools/types.js';
4
+ export interface ConnectorRecord {
5
+ streamKey: string;
6
+ externalId: string;
7
+ displayName: string;
8
+ fields: Record<string, unknown>;
9
+ deleted?: boolean;
10
+ contentHash?: string;
11
+ }
12
+ export interface ConnectorStreamState {
13
+ cursor?: unknown;
14
+ updatedSince?: string;
15
+ backfillComplete?: boolean;
16
+ [key: string]: unknown;
17
+ }
18
+ export interface ConnectorFetchResult {
19
+ records: ConnectorRecord[] | AsyncIterable<ConnectorRecord>;
20
+ nextState: ConnectorStreamState;
21
+ rateLimited?: {
22
+ retryAfterMs?: number;
23
+ };
24
+ }
25
+ export interface ConnectorFieldCapabilities {
26
+ hidden?: boolean;
27
+ filterable?: boolean;
28
+ }
29
+ export interface ConnectorFieldDecl {
30
+ sourcePath: string;
31
+ type: FieldType;
32
+ name: string;
33
+ pii?: boolean;
34
+ capabilities?: ConnectorFieldCapabilities;
35
+ options?: FieldSelectOption[];
36
+ addressComponents?: string[];
37
+ isExternalId?: boolean;
38
+ }
39
+ export interface ConnectorEntityDecl {
40
+ key: string;
41
+ apiSlug: string;
42
+ singular: string;
43
+ plural: string;
44
+ primaryDisplayField?: string;
45
+ avatarField?: string;
46
+ }
47
+ export type ConnectorRelationshipTargetRef = {
48
+ ownedKey: string;
49
+ } | {
50
+ entityKind: string;
51
+ };
52
+ export interface ConnectorRelationshipDecl {
53
+ fieldKey: string;
54
+ name: string;
55
+ cardinality: 'has_many' | 'has_one' | 'belongs_to' | 'many_to_many';
56
+ inverseName: string;
57
+ targetRef?: ConnectorRelationshipTargetRef;
58
+ }
59
+ export interface ConnectorDefaultMapping {
60
+ rootPath: string;
61
+ linkMode?: 'upsert' | 'reference';
62
+ relationshipFieldKey?: string;
63
+ relationship?: ConnectorRelationshipDecl;
64
+ target: {
65
+ mode: 'owned';
66
+ entity: ConnectorEntityDecl;
67
+ } | {
68
+ mode: 'contributing';
69
+ entityKind: string;
70
+ matchFieldKeys?: string[];
71
+ fieldBindings?: {
72
+ sourceFieldKey: string;
73
+ targetKey?: string;
74
+ targetAppField?: string;
75
+ }[];
76
+ connectionAppFields?: {
77
+ appFieldKey: string;
78
+ from: string;
79
+ }[];
80
+ };
81
+ }
82
+ export interface ConnectorStreamDecl {
83
+ key: string;
84
+ displayFieldKey: string;
85
+ syncMode?: 'snapshot' | 'incremental';
86
+ fields: Record<string, ConnectorFieldDecl>;
87
+ defaultMappings?: ConnectorDefaultMapping[];
88
+ exampleRecord?: Record<string, unknown>;
89
+ }
90
+ export interface ConnectorExecuteArgs<TConfig = Record<string, unknown>> {
91
+ streamKey: string;
92
+ mode: 'snapshot' | 'incremental';
93
+ state: ConnectorStreamState;
94
+ connection: ConnectorConnection | null;
95
+ config: TConfig;
96
+ }
97
+ export interface ConnectorConnection {
98
+ value: string;
99
+ fields?: Record<string, string>;
100
+ metadata?: Record<string, unknown>;
101
+ }
102
+ export type ConnectorExecute<TConfig = Record<string, unknown>> = (args: ConnectorExecuteArgs<TConfig>) => Promise<ConnectorFetchResult>;
103
+ export interface DataConnectorDefinition<TConfigSchema extends z.ZodTypeAny = z.ZodTypeAny> {
104
+ id: string;
105
+ label: string;
106
+ requiresConnection: boolean;
107
+ config: TConfigSchema;
108
+ configOptions?: Record<string, ActionInputHint>;
109
+ streams: ConnectorStreamDecl[];
110
+ iconKey?: string;
111
+ execute: ConnectorExecute<z.output<TConfigSchema>>;
112
+ }
113
+ //# 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 {};
@@ -9,6 +9,7 @@ interface BaseAppFieldDefinition {
9
9
  readonly name: string;
10
10
  readonly description?: string;
11
11
  readonly capabilities?: FieldCapabilities;
12
+ readonly identity?: boolean;
12
13
  }
13
14
  interface ScalarAppFieldDefinition extends BaseAppFieldDefinition {
14
15
  readonly type: ScalarFieldType;
@@ -1 +1 @@
1
- {"version":3,"file":"define-field.d.ts","sourceRoot":"","sources":["../../../src/root/fields/define-field.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"define-field.d.ts","sourceRoot":"","sources":["../../../src/root/fields/define-field.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,27 @@
1
1
  const APP_FIELD_KEY_RE = /^[a-zA-Z][a-zA-Z0-9_]{0,63}$/;
2
+ const NON_IDENTITY_FIELD_TYPES = new Set([
3
+ 'RELATIONSHIP',
4
+ 'CALC',
5
+ 'SINGLE_SELECT',
6
+ 'MULTI_SELECT',
7
+ 'TAGS',
8
+ 'FILE',
9
+ 'JSON',
10
+ 'ACTOR',
11
+ ]);
12
+ function assertValidIdentityField(field) {
13
+ if (!field.identity)
14
+ return;
15
+ if (NON_IDENTITY_FIELD_TYPES.has(field.type)) {
16
+ throw new Error(`defineField: "${field.appFieldKey}" cannot be identity: true with type "${field.type}" — ` +
17
+ 'identity fields must be a scalar single-value type (TEXT unless another scalar is needed)');
18
+ }
19
+ }
2
20
  export function defineField(field) {
3
21
  if (!APP_FIELD_KEY_RE.test(field.appFieldKey)) {
4
22
  throw new Error(`defineField: invalid appFieldKey "${field.appFieldKey}" — must match ${APP_FIELD_KEY_RE.source}`);
5
23
  }
24
+ assertValidIdentityField(field);
6
25
  return field;
7
26
  }
8
27
  export function defineFields(fields) {
@@ -16,6 +35,7 @@ export function defineFields(fields) {
16
35
  throw new Error(`defineFields: duplicate appFieldKey "${field.appFieldKey}" on entity "${field.targetEntity}"`);
17
36
  }
18
37
  seen.add(dedupeKey);
38
+ assertValidIdentityField(field);
19
39
  }
20
40
  return fields;
21
41
  }
@@ -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, ConnectorRelationshipDecl, ConnectorRelationshipTargetRef, 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,yBAAyB,EACzB,8BAA8B,EAC9B,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';
@@ -73,6 +73,7 @@ export interface DynamicSelectHint {
73
73
  readonly labelTemplate: string;
74
74
  readonly sublabelTemplate?: string;
75
75
  readonly emptyHint?: string;
76
+ readonly allowCustom?: boolean;
76
77
  }
77
78
  export interface ToolDefinition<TInput extends z.ZodTypeAny = z.ZodTypeAny, TOutput extends z.ZodTypeAny = z.ZodTypeAny> {
78
79
  readonly id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/root/tools/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/root/tools/types.ts"],"names":[],"mappings":"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"}
@@ -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');
@@ -225,6 +230,7 @@ export async function compileAndExtractCatalog() {
225
230
  return errored({ code: 'CATALOG_VALIDATION_FAILED', message: 'Trigger is missing an id' });
226
231
  }
227
232
  const triggerInputs = serializeWorkflowSchemaInputs(trigger.schema);
233
+ const triggerOutputs = serializeWorkflowSchemaOutputs(trigger.schema);
228
234
  cataloguedTriggers.push({
229
235
  id: trigger.id,
230
236
  label: trigger.label,
@@ -232,6 +238,7 @@ export async function compileAndExtractCatalog() {
232
238
  iconKey: null,
233
239
  color: trigger.color,
234
240
  inputsJsonSchema: triggerInputs,
241
+ outputsJsonSchema: triggerOutputs,
235
242
  refs: [],
236
243
  });
237
244
  if (trigger.workflow) {
@@ -242,6 +249,7 @@ export async function compileAndExtractCatalog() {
242
249
  iconKey: null,
243
250
  color: trigger.color,
244
251
  inputsJsonSchema: triggerInputs,
252
+ outputsJsonSchema: triggerOutputs,
245
253
  refs: [],
246
254
  });
247
255
  }
@@ -253,6 +261,7 @@ export async function compileAndExtractCatalog() {
253
261
  iconKey: null,
254
262
  color: trigger.color,
255
263
  inputsJsonSchema: triggerInputs,
264
+ outputsJsonSchema: triggerOutputs,
256
265
  refs: [],
257
266
  });
258
267
  }
@@ -298,6 +307,106 @@ export async function compileAndExtractCatalog() {
298
307
  relationship: field.relationship,
299
308
  calc: field.calc,
300
309
  capabilities: field.capabilities,
310
+ identity: field.identity,
311
+ });
312
+ }
313
+ const cataloguedDataConnectors = [];
314
+ const seenConnectorIds = new Set();
315
+ for (const connector of dataConnectorsArr) {
316
+ if (!connector?.id) {
317
+ return errored({
318
+ code: 'CATALOG_VALIDATION_FAILED',
319
+ message: 'Data connector is missing an id',
320
+ });
321
+ }
322
+ if (seenConnectorIds.has(connector.id)) {
323
+ return errored({
324
+ code: 'CATALOG_VALIDATION_FAILED',
325
+ message: `Duplicate data connector id "${connector.id}"`,
326
+ });
327
+ }
328
+ seenConnectorIds.add(connector.id);
329
+ const configJsonSchema = connector.config
330
+ ? zodToProviderToolSchema(connector.config).jsonSchema
331
+ : {};
332
+ for (const [fieldKey, hint] of Object.entries(connector.configOptions ?? {})) {
333
+ if (hint.kind !== 'dynamic-select')
334
+ continue;
335
+ const ds = hint.dynamicSelect;
336
+ if (!toolIds.has(ds.optionsFrom)) {
337
+ return errored({
338
+ code: 'CATALOG_VALIDATION_FAILED',
339
+ message: `Connector "${connector.id}" config "${fieldKey}": optionsFrom "${ds.optionsFrom}" is not a tool in this app`,
340
+ });
341
+ }
342
+ if (!ds.valuePath || !ds.labelTemplate) {
343
+ return errored({
344
+ code: 'CATALOG_VALIDATION_FAILED',
345
+ message: `Connector "${connector.id}" config "${fieldKey}": dynamic-select requires valuePath and labelTemplate`,
346
+ });
347
+ }
348
+ }
349
+ for (const stream of connector.streams ?? []) {
350
+ for (const mapping of stream.defaultMappings ?? []) {
351
+ if (mapping.target.mode !== 'contributing')
352
+ continue;
353
+ const { entityKind, fieldBindings, connectionAppFields } = mapping.target;
354
+ const fieldByKey = new Map(cataloguedFields
355
+ .filter((f) => f.targetEntity === entityKind)
356
+ .map((f) => [f.appFieldKey, f]));
357
+ for (const binding of fieldBindings ?? []) {
358
+ if (!binding.targetAppField)
359
+ continue;
360
+ if (!fieldByKey.has(binding.targetAppField)) {
361
+ return errored({
362
+ code: 'CATALOG_VALIDATION_FAILED',
363
+ message: `Connector "${connector.id}" stream "${stream.key}": targetAppField "${binding.targetAppField}" is not a declared field on "${entityKind}"`,
364
+ });
365
+ }
366
+ }
367
+ for (const conn of connectionAppFields ?? []) {
368
+ const field = fieldByKey.get(conn.appFieldKey);
369
+ if (!field) {
370
+ return errored({
371
+ code: 'CATALOG_VALIDATION_FAILED',
372
+ message: `Connector "${connector.id}" stream "${stream.key}": connectionAppFields "${conn.appFieldKey}" is not a declared field on "${entityKind}"`,
373
+ });
374
+ }
375
+ if (field.identity) {
376
+ return errored({
377
+ code: 'CATALOG_VALIDATION_FAILED',
378
+ message: `Connector "${connector.id}" stream "${stream.key}": connectionAppFields "${conn.appFieldKey}" targets an identity field — connection metadata cannot fill an identity field`,
379
+ });
380
+ }
381
+ }
382
+ }
383
+ }
384
+ const streams = (connector.streams ?? []).map((stream) => ({
385
+ key: stream.key,
386
+ displayFieldKey: stream.displayFieldKey,
387
+ syncMode: stream.syncMode,
388
+ fields: Object.entries(stream.fields ?? {}).map(([fieldKey, decl]) => ({
389
+ fieldKey,
390
+ sourcePath: decl.sourcePath,
391
+ type: decl.type,
392
+ name: decl.name,
393
+ pii: decl.pii,
394
+ capabilities: decl.capabilities,
395
+ options: decl.options,
396
+ addressComponents: decl.addressComponents,
397
+ isExternalId: decl.isExternalId,
398
+ })),
399
+ defaultMappings: stream.defaultMappings,
400
+ exampleRecord: stream.exampleRecord,
401
+ }));
402
+ cataloguedDataConnectors.push({
403
+ id: connector.id,
404
+ label: connector.label,
405
+ requiresConnection: Boolean(connector.requiresConnection),
406
+ iconKey: connector.iconKey ?? null,
407
+ configJsonSchema,
408
+ ...(connector.configOptions ? { configOptionHints: connector.configOptions } : {}),
409
+ streams,
301
410
  });
302
411
  }
303
412
  const catalog = {
@@ -315,6 +424,7 @@ export async function compileAndExtractCatalog() {
315
424
  },
316
425
  actions: cataloguedActions,
317
426
  fields: cataloguedFields,
427
+ dataConnectors: cataloguedDataConnectors,
318
428
  };
319
429
  try {
320
430
  JSON.stringify(catalog);
@@ -328,10 +438,16 @@ export async function compileAndExtractCatalog() {
328
438
  return complete(catalog);
329
439
  }
330
440
  function serializeWorkflowSchemaInputs(schema) {
331
- if (!schema || typeof schema !== 'object' || !schema.inputs)
441
+ return serializeWorkflowSchemaFields(schema?.inputs);
442
+ }
443
+ function serializeWorkflowSchemaOutputs(schema) {
444
+ return serializeWorkflowSchemaFields(schema?.outputs);
445
+ }
446
+ function serializeWorkflowSchemaFields(fields) {
447
+ if (!fields || typeof fields !== 'object')
332
448
  return {};
333
449
  const out = {};
334
- for (const [key, field] of Object.entries(schema.inputs)) {
450
+ for (const [key, field] of Object.entries(fields)) {
335
451
  const fieldNode = field;
336
452
  out[key] = typeof fieldNode?.toJSON === 'function' ? fieldNode.toJSON() : field;
337
453
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@auxx/sdk",
3
- "version": "0.0.16",
3
+ "version": "0.0.18",
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"