@cargo-ai/cdk 1.0.6 → 1.0.7

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.
@@ -6,6 +6,23 @@
6
6
  import { register, resourceId, token } from "../core.js";
7
7
  import { refUuid } from "../refs.js";
8
8
  import { normalizeUses } from "./actions.js";
9
+ /**
10
+ * Build a connector trigger with per-integration typed `config`. TypeScript
11
+ * can't type a bare trigger object literal inside the `triggers` array — it
12
+ * can't infer each element's `integration` through the array — so this helper
13
+ * narrows `config` to the integration's schema from the single `integration`
14
+ * argument (the same single-object inference `defineConnector` relies on):
15
+ *
16
+ * connectorTrigger({ integration: "slack", connector: slack,
17
+ * config: { channelIds: ["C0XXXX"] } })
18
+ *
19
+ * A bare `{ type: "connector", … }` object still works too, with `config` left
20
+ * as a loose `Record<string, unknown>`. Config schemas are populated by
21
+ * `cargo-ai cdk types`; an unsynced/custom integration keeps the loose record.
22
+ */
23
+ export function connectorTrigger(spec) {
24
+ return { type: "connector", ...spec };
25
+ }
9
26
  // Lower triggers to their wire form — a connector trigger references its
10
27
  // connector by handle/ref, which becomes `connectorUuid`.
11
28
  function normalizeTriggers(triggers) {
@@ -1,6 +1,7 @@
1
1
  import type { RevenueOrganizationTypes, SegmentationTypes } from "@cargo-ai/types";
2
2
  import { type Token } from "../core.js";
3
3
  import { type ModelRef } from "../refs.js";
4
+ import type { ConnectorHandle } from "./connector.js";
4
5
  import type { ModelHandle } from "./model.js";
5
6
  export type CapacityColor = RevenueOrganizationTypes.CapacityColor;
6
7
  export type AllocationExpirationPolicy = RevenueOrganizationTypes.AllocationExpirationPolicy;
@@ -27,5 +28,15 @@ export type CapacityHandle = {
27
28
  readonly uuid: Token;
28
29
  readonly resource: "capacity";
29
30
  };
31
+ /**
32
+ * The `{{member.ids.<connector_slug>}}` expression for a capacity filter —
33
+ * resolved by the backend at allocation time to the members' user ids in that
34
+ * connector. Use it as the `values` of a `kind: "string"`, `operator: "is"`
35
+ * condition on the column holding each record's owner id. Pass a connector
36
+ * handle, or a raw workspace connector slug for a connector not defined in
37
+ * code (e.g. an adopted OAuth connector whose actual slug differs from the
38
+ * CDK slug).
39
+ */
40
+ export declare function memberIds(connector: ConnectorHandle | string): string;
30
41
  export declare function defineCapacity(slug: string, spec: CapacitySpec): CapacityHandle;
31
42
  //# sourceMappingURL=capacity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"capacity.d.ts","sourceRoot":"","sources":["../../../src/resources/capacity.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAwB,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,KAAK,QAAQ,EAAW,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG,wBAAwB,CAAC,aAAa,CAAC;AACnE,MAAM,MAAM,0BAA0B,GACpC,wBAAwB,CAAC,0BAA0B,CAAC;AAEtD,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,KAAK,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,kCAAkC;IAClC,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;CAC/B,CAAC;AAEF,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,GACjB,cAAc,CAyBhB"}
1
+ {"version":3,"file":"capacity.d.ts","sourceRoot":"","sources":["../../../src/resources/capacity.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAwB,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,KAAK,QAAQ,EAAW,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,MAAM,aAAa,GAAG,wBAAwB,CAAC,aAAa,CAAC;AACnE,MAAM,MAAM,0BAA0B,GACpC,wBAAwB,CAAC,0BAA0B,CAAC;AAEtD,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kFAAkF;IAClF,KAAK,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,0BAA0B,CAAC,EAAE,0BAA0B,CAAC;IACxD,kCAAkC;IAClC,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;CAC/B,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,SAAS,EAAE,eAAe,GAAG,MAAM,GAAG,MAAM,CAGrE;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,GACjB,cAAc,CA0BhB"}
@@ -5,8 +5,22 @@
5
5
  // revenue-organization `CreateCapacityPayload`.
6
6
  import { register, resourceId, token } from "../core.js";
7
7
  import { refUuid } from "../refs.js";
8
+ /**
9
+ * The `{{member.ids.<connector_slug>}}` expression for a capacity filter —
10
+ * resolved by the backend at allocation time to the members' user ids in that
11
+ * connector. Use it as the `values` of a `kind: "string"`, `operator: "is"`
12
+ * condition on the column holding each record's owner id. Pass a connector
13
+ * handle, or a raw workspace connector slug for a connector not defined in
14
+ * code (e.g. an adopted OAuth connector whose actual slug differs from the
15
+ * CDK slug).
16
+ */
17
+ export function memberIds(connector) {
18
+ const slug = typeof connector === "string" ? connector : connector.slug;
19
+ return `{{member.ids.${slug}}}`;
20
+ }
8
21
  export function defineCapacity(slug, spec) {
9
22
  const id = resourceId("capacity", slug);
23
+ validateCapacityFilter(slug, spec);
10
24
  register({
11
25
  id,
12
26
  kind: "capacity",
@@ -28,6 +42,73 @@ export function defineCapacity(slug, spec) {
28
42
  });
29
43
  return { slug, uuid: token(id, "uuid"), resource: "capacity" };
30
44
  }
45
+ // Mirrors the backend's capacity-filter rules (create/update reject the payload
46
+ // otherwise): a model-mapped capacity needs id/time columns and a filter with at
47
+ // least one member-ids condition, and every member-ids condition must be a
48
+ // single-valued `is` on a string column of the capacity's own model.
49
+ const MEMBER_IDS = /{{\s*member\.ids\.[a-z0-9_-]+\s*}}/;
50
+ const MEMBERS_IDS_TYPO = /{{\s*members\.ids\./;
51
+ function fail(slug, message) {
52
+ throw new Error(`capacity "${slug}" — ${message}`);
53
+ }
54
+ function validateCapacityFilter(slug, spec) {
55
+ const conditions = spec.filter === undefined
56
+ ? []
57
+ : spec.filter.groups.flatMap((group) => group.conditions);
58
+ const memberIdsConditions = conditions.filter((condition) => {
59
+ const strings = stringsIn(condition);
60
+ if (strings.some((value) => MEMBERS_IDS_TYPO.test(value))) {
61
+ fail(slug, 'filter references "{{members.ids.…}}" — the expression root is singular; use memberIds(connector) → "{{member.ids.<connector_slug>}}".');
62
+ }
63
+ return strings.some((value) => MEMBER_IDS.test(value));
64
+ });
65
+ for (const condition of memberIdsConditions) {
66
+ if (condition.kind !== "string") {
67
+ fail(slug, `a member-ids expression must live on a { kind: "string" } condition, got kind "${condition.kind}".`);
68
+ }
69
+ if (condition.operator !== "is") {
70
+ fail(slug, `member-ids conditions only support the "is" operator, got "${condition.operator}".`);
71
+ }
72
+ if (Array.isArray(condition.values)) {
73
+ fail(slug, "member-ids conditions take a single value — pass values: memberIds(connector), not an array.");
74
+ }
75
+ if (condition.relatedModelUuid !== undefined) {
76
+ fail(slug, "member-ids conditions on a related model are not supported — reference a column of the capacity's own model.");
77
+ }
78
+ }
79
+ if (spec.model === undefined)
80
+ return;
81
+ if (spec.filter === undefined) {
82
+ fail(slug, "a capacity with a model needs a filter mapping records to members — add a condition with values: memberIds(connector).");
83
+ }
84
+ if (spec.idColumnSlug === undefined) {
85
+ fail(slug, "idColumnSlug is required when model is set.");
86
+ }
87
+ if (spec.timeColumnSlug === undefined) {
88
+ fail(slug, "timeColumnSlug is required when model is set.");
89
+ }
90
+ if (memberIdsConditions.length === 0) {
91
+ fail(slug, 'the filter must map records to members — add { kind: "string", columnSlug: "<owner column>", operator: "is", values: memberIds(connector) }.');
92
+ }
93
+ }
94
+ /** Every string reachable in a condition (values live at different keys per kind). */
95
+ function stringsIn(value, acc = []) {
96
+ if (typeof value === "string") {
97
+ acc.push(value);
98
+ return acc;
99
+ }
100
+ if (Array.isArray(value)) {
101
+ for (const item of value)
102
+ stringsIn(item, acc);
103
+ return acc;
104
+ }
105
+ if (value !== null && typeof value === "object") {
106
+ for (const item of Object.values(value))
107
+ stringsIn(item, acc);
108
+ return acc;
109
+ }
110
+ return acc;
111
+ }
31
112
  function toTitle(slug) {
32
113
  return slug
33
114
  .split(/[-_]/)
@@ -40,12 +40,20 @@ export type UnificationSpec = {
40
40
  export interface ExtractorConfigs {
41
41
  }
42
42
  type ExtractorConfigFor<S extends string, E extends string> = S extends keyof ExtractorConfigs ? E extends keyof ExtractorConfigs[S] ? ExtractorConfigs[S][E] : Record<string, unknown> : Record<string, unknown>;
43
- export type ModelSpec<S extends string = string, E extends string = string> = {
43
+ export interface ExtractorSlugs {
44
+ }
45
+ type ExtractorSlugFor<S extends string> = S extends keyof ExtractorSlugs ? ExtractorSlugs[S] & string : string;
46
+ type LiteralUnion<T extends string> = T | (string & {});
47
+ export type ModelSpec<S extends string = string, E extends LiteralUnion<ExtractorSlugFor<S>> = LiteralUnion<ExtractorSlugFor<S>>> = {
44
48
  name?: string;
45
49
  description?: string;
46
50
  /** Source dataset — a connector handle (its dataset) or a `datasetRef(uuid)`. */
47
51
  dataset: ConnectorHandle<S> | DatasetRef;
48
- /** An extractor the source's integration exposes, e.g. "fetchRecords". */
52
+ /**
53
+ * An extractor the source's integration exposes, e.g. "fetchRecords". After
54
+ * `cargo-ai cdk types`, editors autocomplete the connector's known extractors;
55
+ * an unsynced/newer slug is still accepted.
56
+ */
49
57
  extractSlug: E;
50
58
  /** Extractor config — validated against the extractor's schema on apply. */
51
59
  config?: ExtractorConfigFor<S, E>;
@@ -64,6 +72,6 @@ export type ModelHandle = {
64
72
  readonly uuid: Token;
65
73
  readonly resource: "model";
66
74
  };
67
- export declare function defineModel<S extends string, E extends string>(slug: string, spec: ModelSpec<S, E>): ModelHandle;
75
+ export declare function defineModel<S extends string, E extends LiteralUnion<ExtractorSlugFor<S>>>(slug: string, spec: ModelSpec<S, E>): ModelHandle;
68
76
  export {};
69
77
  //# 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":"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"}