@cargo-ai/cdk 1.0.8 → 1.0.10

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.
@@ -15,6 +15,14 @@ export declare function printJsonSchemaInput(schema: unknown): string;
15
15
  * workflow builder Refs). Used by `cargo-ai cdk types`.
16
16
  */
17
17
  export declare function printJsonSchemaType(schema: unknown): string;
18
+ /**
19
+ * Print an integration action's static output JSON Schema as a plain TS type —
20
+ * no `Ref<T> | T` widening and no `EncryptionRef`. Returns `undefined` when
21
+ * the schema is missing or too loose to be useful; the caller falls back to
22
+ * `any`, which stays usable everywhere a nested `Ref<Record<string, unknown>>`
23
+ * would not.
24
+ */
25
+ export declare function printJsonSchemaOutput(schema: unknown): string | undefined;
18
26
  /**
19
27
  * Print a tool release's `formFields` as a TS input type. Returns
20
28
  * `undefined` when the fields can't be interpreted (caller falls back to
@@ -1 +1 @@
1
- {"version":3,"file":"inputTypes.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/inputTypes.ts"],"names":[],"mappings":"AAmCA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAE+D,CAAC;AAEjG;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAM5D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAQ3D;AAmTD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAU5E"}
1
+ {"version":3,"file":"inputTypes.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/inputTypes.ts"],"names":[],"mappings":"AAqCA;;;GAGG;AACH,eAAO,MAAM,oBAAoB,QAE+D,CAAC;AAEjG;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAM5D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAQ3D;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQzE;AAmUD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAU5E"}
@@ -1,17 +1,19 @@
1
- // TypeScript input-type printers for `cargo-ai workflow sync` codegen.
1
+ // TypeScript type printers for `cargo-ai workflow sync` codegen.
2
2
  //
3
- // Three sources of truth, three printers:
3
+ // Sources of truth:
4
4
  // - Integration actions expose their config as JSON Schema on
5
- // `connection.integration.list` (`action.config.schema`).
5
+ // `connection.integration.list` (`action.config.schema`), and — for
6
+ // actions with a static output — their output as `action.output.schema`.
6
7
  // - Workspace tools expose their input as `formFields` on the tool
7
8
  // workflow's deployed release (`orchestration.release.getDeployed`).
8
9
  // - Agent nodes accept a single global shape (`{ prompt, output? }`) —
9
10
  // the engine validates every agent node against `AiUtils.agentConfig`.
10
11
  //
11
- // All printers run in "input mode": each top-level property is widened to
12
- // `Ref<T> | T` so callers can pass either a builder Ref or a literal.
13
- // Anything unrecognized falls back to `unknown` codegen must never abort
14
- // on a schema edge case.
12
+ // Input printers run in "input mode": each top-level property is widened to
13
+ // `Ref<T> | T` so callers can pass either a builder Ref or a literal. The
14
+ // output printer emits plain types (outputs come back as a `Ref` the caller
15
+ // dot-accesses). Anything unrecognized falls back to `unknown` — codegen must
16
+ // never abort on a schema edge case.
15
17
  //
16
18
  // Mirrors `packages/workflow-sdk/scripts/lib/jsonSchemaToTs.ts` (which is a
17
19
  // build-time-only script the CLI can't import).
@@ -47,6 +49,22 @@ export function printJsonSchemaType(schema) {
47
49
  const printed = printSchema(schema, false, true);
48
50
  return printed === "unknown" ? "Record<string, unknown>" : printed;
49
51
  }
52
+ /**
53
+ * Print an integration action's static output JSON Schema as a plain TS type —
54
+ * no `Ref<T> | T` widening and no `EncryptionRef`. Returns `undefined` when
55
+ * the schema is missing or too loose to be useful; the caller falls back to
56
+ * `any`, which stays usable everywhere a nested `Ref<Record<string, unknown>>`
57
+ * would not.
58
+ */
59
+ export function printJsonSchemaOutput(schema) {
60
+ if (schema === null || typeof schema !== "object") {
61
+ return undefined;
62
+ }
63
+ const printed = printSchema(schema, false, false);
64
+ return printed === "unknown" || printed === "Record<string, unknown>"
65
+ ? undefined
66
+ : printed;
67
+ }
50
68
  // The platform's shared `encryption` schema definition: an object with a `type`
51
69
  // const/enum of "encryption" plus `isEncrypted` and `value`. In CDK config types
52
70
  // these positions become `EncryptionRef` (see printObject).
@@ -65,6 +83,10 @@ function isEncryptionSchema(schema) {
65
83
  }
66
84
  function printSchema(schema, topLevel, encRef) {
67
85
  if (Array.isArray(schema.type)) {
86
+ // zod's `z.any()` lowers to the full list of JSON types; print `unknown`
87
+ // instead of a noisy 7-member union.
88
+ if (isAnyTypeList(schema.type))
89
+ return "unknown";
68
90
  return uniqueUnion(schema.type.map((t) => printPrimitive(t, schema, false, encRef)));
69
91
  }
70
92
  if (schema.enum !== undefined && schema.enum.length > 0) {
@@ -103,6 +125,17 @@ function printSchema(schema, topLevel, encRef) {
103
125
  return "unknown";
104
126
  return printPrimitive(schema.type, schema, topLevel, encRef);
105
127
  }
128
+ const ANY_TYPE_LIST = [
129
+ "string",
130
+ "number",
131
+ "boolean",
132
+ "object",
133
+ "array",
134
+ "null",
135
+ ];
136
+ function isAnyTypeList(types) {
137
+ return ANY_TYPE_LIST.every((t) => types.includes(t));
138
+ }
106
139
  function printPrimitive(type, schema, topLevel, encRef) {
107
140
  switch (type) {
108
141
  case "string":
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiHzC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,CAgE7E"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/types.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsIzC,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,IAAI,CAkE7E"}
@@ -1,7 +1,7 @@
1
1
  import { mkdirSync, writeFileSync } from "node:fs";
2
2
  import { resolve } from "node:path";
3
3
  import { handleApiCall, info, success } from "../io.js";
4
- import { printJsonSchemaInput, printJsonSchemaType } from "./inputTypes.js";
4
+ import { printJsonSchemaInput, printJsonSchemaOutput, printJsonSchemaType, } from "./inputTypes.js";
5
5
  // Composite natives surfaced via dedicated SDK syntax / scope helpers —
6
6
  // excluded so we don't double-register them. Mirrors the codegen exclusion
7
7
  // list in `packages/workflow-sdk/scripts/generateNativeIntegration.ts`
@@ -37,7 +37,7 @@ const BUNDLED_NATIVE = new Set([
37
37
  export function registerTypesCommand(parent, getApi) {
38
38
  parent
39
39
  .command("types")
40
- .description("Generate per-workspace TypeScript types for the Cargo CDK — typed defineConnector/defineModel config + integration actions in workflow bodies")
40
+ .description("Generate per-workspace TypeScript types for the Cargo CDK — typed defineConnector/defineModel config, model columns + integration actions in workflow bodies")
41
41
  .option("--dir <path>", "Repo root the generated files are written into (default: cwd)")
42
42
  .option("--out <dir>", "Output subdirectory for generated files (default: .cargo-ai)", ".cargo-ai")
43
43
  .action(async (opts) => {
@@ -69,12 +69,13 @@ export function registerTypesCommand(parent, getApi) {
69
69
  ].join("\n"));
70
70
  info(``);
71
71
  const extractorCount = payload.extractorConfigs.reduce((n, e) => n + e.extractors.length, 0);
72
- info(`Typed ${String(payload.connectorConfigs.length)} connector config(s), ${String(extractorCount)} extractor config(s), ${String(payload.agentTriggerConfigs.length)} agent trigger config(s), ${String(payload.integrations.length)} integration(s), ${String(payload.native.length)} native action(s).`);
72
+ info(`Typed ${String(payload.connectorConfigs.length)} connector config(s), ${String(extractorCount)} extractor config(s), ${String(payload.agentTriggerConfigs.length)} agent trigger config(s), ${String(payload.modelColumns.length)} model column set(s), ${String(payload.integrations.length)} integration(s), ${String(payload.native.length)} native action(s).`);
73
73
  });
74
74
  }
75
75
  async function fetchWorkspaceSurface(api) {
76
76
  const integrationsResult = await handleApiCall(() => api.connection.integration.list({}));
77
77
  const nativeIntegrationResult = await handleApiCall(() => api.connection.nativeIntegration.get());
78
+ const modelsResult = await handleApiCall(() => api.storage.model.all());
78
79
  const rawIntegrations = integrationsResult.integrations;
79
80
  const integrations = collectIntegrations(rawIntegrations);
80
81
  const native = collectNative(nativeIntegrationResult.nativeIntegration.actions);
@@ -82,6 +83,7 @@ async function fetchWorkspaceSurface(api) {
82
83
  const extractorConfigs = collectExtractorConfigs(rawIntegrations);
83
84
  const extractorSlugs = collectExtractorSlugs(rawIntegrations);
84
85
  const agentTriggerConfigs = collectAgentTriggerConfigs(rawIntegrations);
86
+ const modelColumns = collectModelColumns(modelsResult.models);
85
87
  return {
86
88
  integrations,
87
89
  native,
@@ -89,6 +91,7 @@ async function fetchWorkspaceSurface(api) {
89
91
  extractorConfigs,
90
92
  extractorSlugs,
91
93
  agentTriggerConfigs,
94
+ modelColumns,
92
95
  };
93
96
  }
94
97
  // integrationSlug → connector config type. Skips integrations whose schema
@@ -177,6 +180,30 @@ function collectExtractorSlugs(integrations) {
177
180
  out.sort((a, b) => a.integrationSlug.localeCompare(b.integrationSlug));
178
181
  return out;
179
182
  }
183
+ // modelSlug → every column slug it exposes. Additional columns are addressed
184
+ // with their kind as a storage prefix (`computed__score`, `custom__notes`, …) —
185
+ // the same slugs `/storage/columns/list` returns — while original columns stay
186
+ // bare. Models whose columns haven't been inferred yet are skipped; two models
187
+ // sharing a slug (across datasets) merge their column sets so the generated
188
+ // union accepts either.
189
+ function collectModelColumns(models) {
190
+ const bySlug = new Map();
191
+ for (const model of models) {
192
+ const previous = bySlug.get(model.slug);
193
+ bySlug.set(model.slug, [
194
+ ...(previous === undefined ? [] : previous),
195
+ ...model.columns.map((column) => column.slug),
196
+ ...model.additionalColumns.map((column) => `${column.kind}__${column.slug}`),
197
+ ]);
198
+ }
199
+ return [...bySlug]
200
+ .filter(([, slugs]) => slugs.length > 0)
201
+ .map(([modelSlug, slugs]) => ({
202
+ modelSlug,
203
+ columns: [...new Set(slugs)].sort((a, b) => a.localeCompare(b)),
204
+ }))
205
+ .sort((a, b) => a.modelSlug.localeCompare(b.modelSlug));
206
+ }
180
207
  function collectIntegrations(integrations) {
181
208
  const out = [];
182
209
  for (const integration of integrations) {
@@ -186,12 +213,13 @@ function collectIntegrations(integrations) {
186
213
  continue;
187
214
  const actions = actionEntries.map(([slug, raw]) => {
188
215
  const meta = raw;
189
- const { config } = meta;
216
+ const { config, output } = meta;
190
217
  return {
191
218
  slug,
192
219
  name: trimOrUndefined(meta.name),
193
220
  description: trimOrUndefined(meta.description),
194
221
  inputTypeSrc: printJsonSchemaInput(config !== undefined ? config.schema : undefined),
222
+ outputTypeSrc: printJsonSchemaOutput(output !== undefined ? output.schema : undefined),
195
223
  };
196
224
  });
197
225
  out.push({
@@ -270,6 +298,14 @@ function renderTypes(payload) {
270
298
  }
271
299
  cdkLines.push(` }`);
272
300
  }
301
+ if (payload.modelColumns.length > 0) {
302
+ cdkLines.push(` interface ModelColumns {`);
303
+ for (const m of payload.modelColumns) {
304
+ const union = m.columns.map((c) => JSON.stringify(c)).join(" | ");
305
+ cdkLines.push(` ${jsonKey(m.modelSlug)}: ${union};`);
306
+ }
307
+ cdkLines.push(` }`);
308
+ }
273
309
  if (payload.agentTriggerConfigs.length > 0) {
274
310
  cdkLines.push(` interface AgentTriggerConfigs {`);
275
311
  for (const t of payload.agentTriggerConfigs) {
@@ -308,10 +344,12 @@ function renderTypes(payload) {
308
344
  }, " ");
309
345
  if (actionDoc !== "")
310
346
  wfLines.push(actionDoc.trimEnd());
311
- // Action outputs aren't schema-typed, so `any` (not `Record<string,
347
+ // Actions with a static output schema get a real output type; the rest
348
+ // (dynamic or absent outputs) fall back to `any` (not `Record<string,
312
349
  // unknown>`, which lowers to an unusable nested `Ref`) — the result is
313
350
  // then usable as a string, an object, or in any typed slot.
314
- wfLines.push(` ${jsonKey(action.slug)}: IntegrationAction<${action.inputTypeSrc}, any>;`);
351
+ const outputSrc = action.outputTypeSrc !== undefined ? action.outputTypeSrc : "any";
352
+ wfLines.push(` ${jsonKey(action.slug)}: IntegrationAction<${action.inputTypeSrc}, ${outputSrc}>;`);
315
353
  }
316
354
  wfLines.push(` };`);
317
355
  }
@@ -16,7 +16,7 @@ export type { FolderHandle, FolderKind, FolderSpec, } from "./resources/folder.j
16
16
  export { defineFolder } from "./resources/folder.js";
17
17
  export type { McpServerHandle, McpServerSpec } from "./resources/mcpServer.js";
18
18
  export { defineMcpServer } from "./resources/mcpServer.js";
19
- export type { ExtractorConfigs, ExtractorSlugs, ModelHandle, ModelSpec, UnificationColumnSpec, UnificationParentSpec, UnificationSpec, } from "./resources/model.js";
19
+ export type { ExtractorConfigs, ExtractorSlugs, ModelColumns, ModelHandle, ModelSpec, UnificationColumnSpec, UnificationParentSpec, UnificationSpec, } from "./resources/model.js";
20
20
  export { defineModel } from "./resources/model.js";
21
21
  export type { PlayHandle, PlaySpec } from "./resources/play.js";
22
22
  export { definePlay } from "./resources/play.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -43,6 +43,15 @@ type ExtractorConfigFor<S extends string, E extends string> = S extends keyof Ex
43
43
  export interface ExtractorSlugs {
44
44
  }
45
45
  type ExtractorSlugFor<S extends string> = S extends keyof ExtractorSlugs ? ExtractorSlugs[S] & string : string;
46
+ export interface ModelColumns {
47
+ }
48
+ type ModelColumnsAccessor<Slug extends string> = Slug extends keyof ModelColumns ? {
49
+ readonly [C in ModelColumns[Slug] & string]: C;
50
+ } & {
51
+ readonly [columnSlug: string]: string;
52
+ } : {
53
+ readonly [columnSlug: string]: string;
54
+ };
46
55
  type LiteralUnion<T extends string> = T | (string & {});
47
56
  export type ModelSpec<S extends string = string, E extends LiteralUnion<ExtractorSlugFor<S>> = LiteralUnion<ExtractorSlugFor<S>>> = {
48
57
  name?: string;
@@ -67,11 +76,14 @@ export type ModelSpec<S extends string = string, E extends LiteralUnion<Extracto
67
76
  */
68
77
  unification?: UnificationSpec;
69
78
  };
70
- export type ModelHandle = {
79
+ export type ModelHandle<Slug extends string = string> = {
71
80
  readonly slug: string;
72
81
  readonly uuid: Token;
73
82
  readonly resource: "model";
83
+ /** This model's columns — `model.columns.<columnSlug>` yields the slug
84
+ * string, for relationships, unification, and segment column lists. */
85
+ readonly columns: ModelColumnsAccessor<Slug>;
74
86
  };
75
- export declare function defineModel<S extends string, E extends LiteralUnion<ExtractorSlugFor<S>>>(slug: string, spec: ModelSpec<S, E>): ModelHandle;
87
+ export declare function defineModel<Slug extends string, S extends string, E extends LiteralUnion<ExtractorSlugFor<S>>>(slug: Slug, spec: ModelSpec<S, E>): ModelHandle<Slug>;
76
88
  export {};
77
89
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/resources/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/resources/model.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAwB,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AACrE,OAAO,EACL,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,QAAQ,EAEd,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAKnC,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAKF,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAA;CAAE,GACrE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAOjE,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,aAAa,CAAA;CAAE,GACzB;IACE,MAAM,EAAE,QAAQ,CAAC;IACjB,IAAI,EAAE,YAAY,CAAC,oBAAoB,CAAC;IACxC,aAAa,EAAE,qBAAqB,EAAE,CAAC;IACvC,8DAA8D;IAC9D,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,0EAA0E;IAC1E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC;CACnC,CAAC;AAUN,MAAM,WAAW,gBAAgB;CAAG;AAEpC,KAAK,kBAAkB,CACrB,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,MAAM,IACd,CAAC,SAAS,MAAM,gBAAgB,GAChC,CAAC,SAAS,MAAM,gBAAgB,CAAC,CAAC,CAAC,GACjC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAS5B,MAAM,WAAW,cAAc;CAAG;AAElC,KAAK,gBAAgB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,MAAM,cAAc,GACpE,cAAc,CAAC,CAAC,CAAC,GAAG,MAAM,GAC1B,MAAM,CAAC;AAUX,MAAM,WAAW,YAAY;CAAG;AAOhC,KAAK,oBAAoB,CAAC,IAAI,SAAS,MAAM,IAAI,IAAI,SAAS,MAAM,YAAY,GAC5E;IAAE,QAAQ,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC;CAAE,GAAG;IACnD,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CACvC,GACD;IAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,CAAC;AAI9C,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAExD,MAAM,MAAM,SAAS,CACnB,CAAC,SAAS,MAAM,GAAG,MAAM,EACzB,CAAC,SAAS,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CACxD,gBAAgB,CAAC,CAAC,CAAC,CACpB,IACC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IACzC;;;;OAIG;IACH,WAAW,EAAE,CAAC,CAAC;IACf,4EAA4E;IAC5E,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAClC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,IAAI,SAAS,MAAM,GAAG,MAAM,IAAI;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B;4EACwE;IACxE,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC;CAC9C,CAAC;AAQF,wBAAgB,WAAW,CACzB,IAAI,SAAS,MAAM,EACnB,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAC3C,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAgCtD"}
@@ -36,7 +36,18 @@ export function defineModel(slug, spec) {
36
36
  : compileUnification(spec.unification),
37
37
  },
38
38
  });
39
- return { slug, uuid: token(id, "uuid"), resource: "model" };
39
+ // A small Proxy mirroring `connector.actions`: `model.columns.<columnSlug>`
40
+ // echoes the slug back as a plain string. No server knowledge is needed —
41
+ // columns are slug-addressed, so the accessor works before the model exists
42
+ // (symbols and `then` pass through as undefined).
43
+ const columns = new Proxy({}, {
44
+ get(_target, prop) {
45
+ if (typeof prop !== "string" || prop === "then")
46
+ return undefined;
47
+ return prop;
48
+ },
49
+ });
50
+ return { slug, uuid: token(id, "uuid"), resource: "model", columns };
40
51
  }
41
52
  // Lower a `UnificationSpec` to the wire shape `StorageTypes.ModelUnification`.
42
53
  // The only reshaping is the parent link: a `model` parent carries a handle/ref