@cargo-ai/cdk 0.1.1

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 (122) hide show
  1. package/README.md +187 -0
  2. package/build/src/core.d.ts +83 -0
  3. package/build/src/core.d.ts.map +1 -0
  4. package/build/src/core.js +205 -0
  5. package/build/src/deploy/apply.d.ts +55 -0
  6. package/build/src/deploy/apply.d.ts.map +1 -0
  7. package/build/src/deploy/apply.js +219 -0
  8. package/build/src/deploy/audit.d.ts +14 -0
  9. package/build/src/deploy/audit.d.ts.map +1 -0
  10. package/build/src/deploy/audit.js +25 -0
  11. package/build/src/deploy/compile.d.ts +36 -0
  12. package/build/src/deploy/compile.d.ts.map +1 -0
  13. package/build/src/deploy/compile.js +99 -0
  14. package/build/src/deploy/destroy.d.ts +20 -0
  15. package/build/src/deploy/destroy.d.ts.map +1 -0
  16. package/build/src/deploy/destroy.js +153 -0
  17. package/build/src/deploy/executors.live.d.ts +4 -0
  18. package/build/src/deploy/executors.live.d.ts.map +1 -0
  19. package/build/src/deploy/executors.live.js +623 -0
  20. package/build/src/deploy/import.d.ts +13 -0
  21. package/build/src/deploy/import.d.ts.map +1 -0
  22. package/build/src/deploy/import.js +87 -0
  23. package/build/src/deploy/index.d.ts +39 -0
  24. package/build/src/deploy/index.d.ts.map +1 -0
  25. package/build/src/deploy/index.js +51 -0
  26. package/build/src/deploy/load.d.ts +7 -0
  27. package/build/src/deploy/load.d.ts.map +1 -0
  28. package/build/src/deploy/load.js +58 -0
  29. package/build/src/deploy/lock.d.ts +10 -0
  30. package/build/src/deploy/lock.d.ts.map +1 -0
  31. package/build/src/deploy/lock.js +101 -0
  32. package/build/src/deploy/plan.d.ts +3 -0
  33. package/build/src/deploy/plan.d.ts.map +1 -0
  34. package/build/src/deploy/plan.js +39 -0
  35. package/build/src/deploy/readers.live.d.ts +4 -0
  36. package/build/src/deploy/readers.live.d.ts.map +1 -0
  37. package/build/src/deploy/readers.live.js +273 -0
  38. package/build/src/deploy/refresh.d.ts +32 -0
  39. package/build/src/deploy/refresh.d.ts.map +1 -0
  40. package/build/src/deploy/refresh.js +76 -0
  41. package/build/src/deploy/state.d.ts +23 -0
  42. package/build/src/deploy/state.d.ts.map +1 -0
  43. package/build/src/deploy/state.js +107 -0
  44. package/build/src/index.d.ts +30 -0
  45. package/build/src/index.d.ts.map +1 -0
  46. package/build/src/index.js +30 -0
  47. package/build/src/refs.d.ts +28 -0
  48. package/build/src/refs.d.ts.map +1 -0
  49. package/build/src/refs.js +34 -0
  50. package/build/src/resources/actions.d.ts +31 -0
  51. package/build/src/resources/actions.d.ts.map +1 -0
  52. package/build/src/resources/actions.js +44 -0
  53. package/build/src/resources/agent.d.ts +71 -0
  54. package/build/src/resources/agent.d.ts.map +1 -0
  55. package/build/src/resources/agent.js +96 -0
  56. package/build/src/resources/app.d.ts +18 -0
  57. package/build/src/resources/app.d.ts.map +1 -0
  58. package/build/src/resources/app.js +33 -0
  59. package/build/src/resources/bundle.d.ts +15 -0
  60. package/build/src/resources/bundle.d.ts.map +1 -0
  61. package/build/src/resources/bundle.js +61 -0
  62. package/build/src/resources/connector.d.ts +30 -0
  63. package/build/src/resources/connector.d.ts.map +1 -0
  64. package/build/src/resources/connector.js +41 -0
  65. package/build/src/resources/context.d.ts +15 -0
  66. package/build/src/resources/context.d.ts.map +1 -0
  67. package/build/src/resources/context.js +58 -0
  68. package/build/src/resources/file.d.ts +15 -0
  69. package/build/src/resources/file.d.ts.map +1 -0
  70. package/build/src/resources/file.js +35 -0
  71. package/build/src/resources/folder.d.ts +20 -0
  72. package/build/src/resources/folder.d.ts.map +1 -0
  73. package/build/src/resources/folder.js +28 -0
  74. package/build/src/resources/mcpServer.d.ts +25 -0
  75. package/build/src/resources/mcpServer.d.ts.map +1 -0
  76. package/build/src/resources/mcpServer.js +34 -0
  77. package/build/src/resources/model.d.ts +34 -0
  78. package/build/src/resources/model.d.ts.map +1 -0
  79. package/build/src/resources/model.js +43 -0
  80. package/build/src/resources/play.d.ts +35 -0
  81. package/build/src/resources/play.d.ts.map +1 -0
  82. package/build/src/resources/play.js +49 -0
  83. package/build/src/resources/tool.d.ts +40 -0
  84. package/build/src/resources/tool.d.ts.map +1 -0
  85. package/build/src/resources/tool.js +36 -0
  86. package/build/src/resources/worker.d.ts +18 -0
  87. package/build/src/resources/worker.d.ts.map +1 -0
  88. package/build/src/resources/worker.js +40 -0
  89. package/build/tsconfig.tsbuildinfo +1 -0
  90. package/package.json +71 -0
  91. package/templates/blank/README.md +24 -0
  92. package/templates/blank/cargo.ts +44 -0
  93. package/templates/blank/package.json +17 -0
  94. package/templates/blank/tsconfig.json +14 -0
  95. package/templates/full/README.md +69 -0
  96. package/templates/full/agents/enricher.ts +13 -0
  97. package/templates/full/agents/sdr.ts +28 -0
  98. package/templates/full/apps/dashboard/index.html +12 -0
  99. package/templates/full/apps/dashboard/package-lock.json +1080 -0
  100. package/templates/full/apps/dashboard/package.json +15 -0
  101. package/templates/full/apps/dashboard/src/main.tsx +12 -0
  102. package/templates/full/apps/dashboard/tsconfig.json +13 -0
  103. package/templates/full/apps/dashboard.ts +9 -0
  104. package/templates/full/connectors/hubspot.ts +12 -0
  105. package/templates/full/connectors/openai.ts +9 -0
  106. package/templates/full/context/context.ts +7 -0
  107. package/templates/full/context/icp.md +22 -0
  108. package/templates/full/context/personas/head-of-growth.md +26 -0
  109. package/templates/full/files/playbook.md +19 -0
  110. package/templates/full/files/playbook.ts +8 -0
  111. package/templates/full/folders/crm.ts +14 -0
  112. package/templates/full/mcp/crm.ts +15 -0
  113. package/templates/full/models/contacts.ts +15 -0
  114. package/templates/full/package.json +17 -0
  115. package/templates/full/plays/onboarding.ts +41 -0
  116. package/templates/full/tools/enrich.ts +34 -0
  117. package/templates/full/tsconfig.json +17 -0
  118. package/templates/full/workers/webhook/index.js +12 -0
  119. package/templates/full/workers/webhook/manifest.json +1 -0
  120. package/templates/full/workers/webhook/package-lock.json +12 -0
  121. package/templates/full/workers/webhook/package.json +6 -0
  122. package/templates/full/workers/webhook.ts +13 -0
@@ -0,0 +1,28 @@
1
+ // defineFolder — a Cargo folder for organizing resources. Cargo folders are
2
+ // per-kind (a folder has a `kind` of model/agent/play/tool/worker/app/file/…),
3
+ // so a folder declares its kind and only same-kind resources can live in it.
4
+ // Returns a handle whose `uuid` token feeds other resources' `folder` param.
5
+ import { register, resourceId, token } from "../core.js";
6
+ import { refUuid } from "../refs.js";
7
+ export function defineFolder(slug, spec) {
8
+ const id = resourceId("folder", slug);
9
+ register({
10
+ id,
11
+ kind: "folder",
12
+ slug,
13
+ spec: {
14
+ slug,
15
+ name: spec.name === undefined ? toTitle(slug) : spec.name,
16
+ emojiSlug: spec.emojiSlug === undefined ? "open_file_folder" : spec.emojiSlug,
17
+ folderKind: spec.kind,
18
+ parentUuid: spec.parent === undefined ? undefined : refUuid(spec.parent),
19
+ },
20
+ });
21
+ return { slug, uuid: token(id, "uuid"), kind: spec.kind, resource: "folder" };
22
+ }
23
+ function toTitle(slug) {
24
+ return slug
25
+ .split(/[-_]/)
26
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
27
+ .join(" ");
28
+ }
@@ -0,0 +1,25 @@
1
+ import { type Token } from "../core.js";
2
+ import { type FolderRef } from "../refs.js";
3
+ import { type AgentUse, type ConnectorActionSpec, type ToolUse } from "./actions.js";
4
+ import { type ModelUse } from "./agent.js";
5
+ import type { FolderHandle } from "./folder.js";
6
+ export type McpServerSpec = {
7
+ name?: string;
8
+ description?: string;
9
+ /** Tools the server exposes (become tool actions). */
10
+ tools?: ToolUse[];
11
+ /** Agents the server exposes (become agent actions). */
12
+ agents?: AgentUse[];
13
+ /** Connector actions the server exposes. */
14
+ connectorActions?: ConnectorActionSpec[];
15
+ /** Data models the server serves. */
16
+ models?: ModelUse[];
17
+ folder?: FolderHandle | FolderRef;
18
+ };
19
+ export type McpServerHandle = {
20
+ readonly slug: string;
21
+ readonly uuid: Token;
22
+ readonly resource: "mcpServer";
23
+ };
24
+ export declare function defineMcpServer(slug: string, spec: McpServerSpec): McpServerHandle;
25
+ //# sourceMappingURL=mcpServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpServer.d.ts","sourceRoot":"","sources":["../../../src/resources/mcpServer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,YAAY,CAAC;AACrD,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,mBAAmB,EAIxB,KAAK,OAAO,EACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,QAAQ,EAAmB,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;IAClB,wDAAwD;IACxD,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACzC,qCAAqC;IACrC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC,CAAC;AAEF,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,GAClB,eAAe,CAmBjB"}
@@ -0,0 +1,34 @@
1
+ // defineMcpServer — a Cargo MCP server: a named bundle of actions (tools,
2
+ // agents, connector actions) and data-model resources, exposed as an MCP
3
+ // endpoint. References everything by uuid token. Compiles to the ai
4
+ // `CreateMcpServerPayload`. Uuid-only identity (no slug) — state-tracked.
5
+ import { register, resourceId, token } from "../core.js";
6
+ import { refUuid } from "../refs.js";
7
+ import { normalizeConnectorActions, normalizeSubAgents, normalizeTools, } from "./actions.js";
8
+ import { normalizeModels } from "./agent.js";
9
+ export function defineMcpServer(slug, spec) {
10
+ const id = resourceId("mcpServer", slug);
11
+ register({
12
+ id,
13
+ kind: "mcpServer",
14
+ slug,
15
+ spec: {
16
+ slug,
17
+ name: spec.name === undefined ? toTitle(slug) : spec.name,
18
+ description: spec.description === undefined ? null : spec.description,
19
+ folderUuid: spec.folder === undefined ? undefined : refUuid(spec.folder),
20
+ // resolved → AiTypes.Action[] / Resource[] by the apply executor
21
+ tools: normalizeTools(spec.tools),
22
+ subAgents: normalizeSubAgents(spec.agents),
23
+ connectorActions: normalizeConnectorActions(spec.connectorActions),
24
+ models: normalizeModels(spec.models, true),
25
+ },
26
+ });
27
+ return { slug, uuid: token(id, "uuid"), resource: "mcpServer" };
28
+ }
29
+ function toTitle(slug) {
30
+ return slug
31
+ .split(/[-_]/)
32
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
33
+ .join(" ");
34
+ }
@@ -0,0 +1,34 @@
1
+ import { type Token } from "../core.js";
2
+ import { type DatasetRef, type FolderRef } from "../refs.js";
3
+ import type { ConnectorHandle } from "./connector.js";
4
+ import type { FolderHandle } from "./folder.js";
5
+ export type ScheduleSpec = {
6
+ type: "cron";
7
+ cron: string;
8
+ } | {
9
+ type: "dbt";
10
+ jobId: string;
11
+ };
12
+ export interface ExtractorConfigs {
13
+ }
14
+ 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>;
15
+ export type ModelSpec<S extends string = string, E extends string = string> = {
16
+ name?: string;
17
+ description?: string;
18
+ /** Source dataset — a connector handle (its dataset) or a `datasetRef(uuid)`. */
19
+ dataset: ConnectorHandle<S> | DatasetRef;
20
+ /** An extractor the source's integration exposes, e.g. "fetchRecords". */
21
+ extractSlug: E;
22
+ /** Extractor config — validated against the extractor's schema on apply. */
23
+ config?: ExtractorConfigFor<S, E>;
24
+ schedule?: ScheduleSpec;
25
+ folder?: FolderHandle | FolderRef;
26
+ };
27
+ export type ModelHandle = {
28
+ readonly slug: string;
29
+ readonly uuid: Token;
30
+ readonly resource: "model";
31
+ };
32
+ export declare function defineModel<S extends string, E extends string>(slug: string, spec: ModelSpec<S, E>): ModelHandle;
33
+ export {};
34
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/resources/model.ts"],"names":[],"mappings":"AAYA,OAAO,EAAwB,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAW,MAAM,YAAY,CAAC;AACtE,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;AAUnC,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;AAE5B,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IACzC,0EAA0E;IAC1E,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;CACnC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,CAAC;AAQF,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EAC5D,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GACpB,WAAW,CAkBb"}
@@ -0,0 +1,43 @@
1
+ // defineModel — a data model (a `StorageTypes.Model`: a table sourced from a
2
+ // dataset by an extractor). Returns a handle whose `uuid` is a deferred token.
3
+ // It sources from a connector's dataset and lives in an optional folder:
4
+ //
5
+ // const hubspot = defineConnector("hubspot", { integration: "hubspot" });
6
+ // const contacts = defineModel("contacts", {
7
+ // dataset: hubspot,
8
+ // extractSlug: "fetchRecords",
9
+ // });
10
+ //
11
+ // Compiles to the storage `CreateModelPayload` once tokens are resolved.
12
+ import { register, resourceId, token } from "../core.js";
13
+ import { refUuid } from "../refs.js";
14
+ // A connector handle references its auto-created dataset (`.datasetUuid`); a
15
+ // `datasetRef` references the dataset directly (`.uuid`).
16
+ function datasetUuidOf(dataset) {
17
+ return dataset.resource === "connector" ? dataset.datasetUuid : dataset.uuid;
18
+ }
19
+ export function defineModel(slug, spec) {
20
+ const id = resourceId("model", slug);
21
+ register({
22
+ id,
23
+ kind: "model",
24
+ slug,
25
+ spec: {
26
+ slug,
27
+ name: spec.name === undefined ? toTitle(slug) : spec.name,
28
+ description: spec.description === undefined ? null : spec.description,
29
+ datasetUuid: datasetUuidOf(spec.dataset),
30
+ extractorSlug: spec.extractSlug,
31
+ config: spec.config === undefined ? {} : spec.config,
32
+ schedule: spec.schedule,
33
+ folderUuid: spec.folder === undefined ? undefined : refUuid(spec.folder),
34
+ },
35
+ });
36
+ return { slug, uuid: token(id, "uuid"), resource: "model" };
37
+ }
38
+ function toTitle(slug) {
39
+ return slug
40
+ .split(/[-_]/)
41
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
42
+ .join(" ");
43
+ }
@@ -0,0 +1,35 @@
1
+ import type { OrchestrationTypes, SegmentationTypes } from "@cargo-ai/types";
2
+ import { type Token } from "../core.js";
3
+ import { type FolderRef, type ModelRef, type PlayRef } from "../refs.js";
4
+ import type { FolderHandle } from "./folder.js";
5
+ import type { ModelHandle } from "./model.js";
6
+ import type { WorkflowDefinition } from "./tool.js";
7
+ export type PlayScheduleSpec = Omit<OrchestrationTypes.PlayScheduleCron, "temporalScheduleWorkflowId"> | OrchestrationTypes.PlayScheduleDbt | OrchestrationTypes.PlayScheduleRealtime | (Omit<OrchestrationTypes.PlayScheduleDependency, "playUuid"> & {
8
+ /** The upstream play — a play handle or a `playRef(uuid)`. */
9
+ play: PlayHandle | PlayRef;
10
+ }) | Omit<OrchestrationTypes.PlayScheduleWatch, "temporalScheduleWorkflowId" | "meta">;
11
+ export type PlaySpec = {
12
+ name?: string;
13
+ description?: string;
14
+ /** The data model this play runs over — a model handle or `modelRef(uuid)`. */
15
+ model: ModelHandle | ModelRef;
16
+ /** Optional per-row automation — a `defineWorkflow(...)` result. */
17
+ workflow?: WorkflowDefinition;
18
+ /** Which row changes trigger a run. Defaults to `["added"]`. */
19
+ changeKinds?: SegmentationTypes.ChangeKind[];
20
+ /** How runs are created on change. Defaults to `"always"`. */
21
+ runCreationRule?: OrchestrationTypes.PlayRunCreationRule;
22
+ filter?: SegmentationTypes.Filter;
23
+ sort?: SegmentationTypes.Sort;
24
+ limit?: number;
25
+ trackingColumnSlugs?: string[];
26
+ schedule?: PlayScheduleSpec;
27
+ folder?: FolderHandle | FolderRef;
28
+ };
29
+ export type PlayHandle = {
30
+ readonly slug: string;
31
+ readonly uuid: Token;
32
+ readonly resource: "play";
33
+ };
34
+ export declare function definePlay(slug: string, spec: PlaySpec): PlayHandle;
35
+ //# sourceMappingURL=play.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../../src/resources/play.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,OAAO,EAAwB,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AACrE,OAAO,EACL,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,OAAO,EAEb,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAYpD,MAAM,MAAM,gBAAgB,GACxB,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,4BAA4B,CAAC,GACvE,kBAAkB,CAAC,eAAe,GAClC,kBAAkB,CAAC,oBAAoB,GACvC,CAAC,IAAI,CAAC,kBAAkB,CAAC,sBAAsB,EAAE,UAAU,CAAC,GAAG;IAC7D,8DAA8D;IAC9D,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;CAC5B,CAAC,GACF,IAAI,CACF,kBAAkB,CAAC,iBAAiB,EACpC,4BAA4B,GAAG,MAAM,CACtC,CAAC;AAEN,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+EAA+E;IAC/E,KAAK,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,gEAAgE;IAChE,WAAW,CAAC,EAAE,iBAAiB,CAAC,UAAU,EAAE,CAAC;IAC7C,8DAA8D;IAC9D,eAAe,CAAC,EAAE,kBAAkB,CAAC,mBAAmB,CAAC;IACzD,MAAM,CAAC,EAAE,iBAAiB,CAAC,MAAM,CAAC;IAClC,IAAI,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAcF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,UAAU,CA4BnE"}
@@ -0,0 +1,49 @@
1
+ // definePlay — an automation over a data model that emits runs as the model's
2
+ // rows change. References its `model` (and optional `folder`) by handle, and may
3
+ // carry a backing workflow (a `defineWorkflow(...)` result) deployed as its
4
+ // release. Compiles to the orchestration `CreatePlayPayload`.
5
+ import { register, resourceId, token } from "../core.js";
6
+ import { refUuid, } from "../refs.js";
7
+ // Lower a schedule to its wire form — the `dependency` variant references an
8
+ // upstream play by handle/ref, which becomes `playUuid`.
9
+ function toWireSchedule(schedule) {
10
+ if (schedule === undefined)
11
+ return undefined;
12
+ if (schedule.type === "dependency") {
13
+ return { type: "dependency", playUuid: refUuid(schedule.play) };
14
+ }
15
+ return schedule;
16
+ }
17
+ export function definePlay(slug, spec) {
18
+ const id = resourceId("play", slug);
19
+ const workflow = spec.workflow;
20
+ register({
21
+ id,
22
+ kind: "play",
23
+ slug,
24
+ spec: {
25
+ slug,
26
+ name: spec.name === undefined ? toTitle(slug) : spec.name,
27
+ description: spec.description === undefined ? null : spec.description,
28
+ modelUuid: refUuid(spec.model),
29
+ changeKinds: spec.changeKinds === undefined ? ["added"] : spec.changeKinds,
30
+ runCreationRule: spec.runCreationRule === undefined ? "always" : spec.runCreationRule,
31
+ filter: spec.filter,
32
+ sort: spec.sort,
33
+ limit: spec.limit,
34
+ trackingColumnSlugs: spec.trackingColumnSlugs,
35
+ schedule: toWireSchedule(spec.schedule),
36
+ folderUuid: spec.folder === undefined ? undefined : refUuid(spec.folder),
37
+ // the play's backing workflow graph (deployed as its release)
38
+ nodes: workflow === undefined ? undefined : workflow.nodes,
39
+ formFields: workflow === undefined ? undefined : workflow.formFields,
40
+ },
41
+ });
42
+ return { slug, uuid: token(id, "uuid"), resource: "play" };
43
+ }
44
+ function toTitle(slug) {
45
+ return slug
46
+ .split(/[-_]/)
47
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
48
+ .join(" ");
49
+ }
@@ -0,0 +1,40 @@
1
+ import type { OrchestrationTypes } from "@cargo-ai/types";
2
+ import { type Token } from "../core.js";
3
+ import { type FolderRef } from "../refs.js";
4
+ import type { FolderHandle } from "./folder.js";
5
+ /** A cron trigger for the tool (the only trigger kind tools support). */
6
+ export type ToolTriggerSpec = {
7
+ cron: string;
8
+ name?: string;
9
+ description?: string;
10
+ data?: Record<string, unknown>;
11
+ };
12
+ export type WorkflowDefinition<I = unknown, O = unknown> = {
13
+ readonly nodes: unknown[];
14
+ readonly formFields: unknown[];
15
+ readonly __input?: I;
16
+ readonly __output?: O;
17
+ };
18
+ export type ToolSpec<I = unknown, O = unknown> = {
19
+ /** The workflow that backs this tool — a `defineWorkflow(...)` result. */
20
+ workflow: WorkflowDefinition<I, O>;
21
+ name?: string;
22
+ description?: string;
23
+ /** Emoji slug for the tool's icon (e.g. "wrench", "mag"). */
24
+ emojiSlug?: string;
25
+ folder?: FolderHandle | FolderRef;
26
+ /** Cron triggers (applied via tool update — create doesn't take them). */
27
+ triggers?: ToolTriggerSpec[];
28
+ /** Public form config (applied via tool update). */
29
+ publicForm?: OrchestrationTypes.ToolPublicForm;
30
+ };
31
+ export type ToolHandle<I = unknown, O = unknown> = {
32
+ readonly slug: string;
33
+ readonly uuid: Token;
34
+ /** Discriminator so a tool handle can be passed to a workflow's `uses`. */
35
+ readonly resource: "tool";
36
+ readonly __input?: I;
37
+ readonly __output?: O;
38
+ };
39
+ export declare function defineTool<I = unknown, O = unknown>(slug: string, spec: ToolSpec<I, O>): ToolHandle<I, O>;
40
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/resources/tool.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAwB,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,yEAAyE;AACzE,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAKF,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI;IACzD,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI;IAC/C,0EAA0E;IAC1E,QAAQ,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B,oDAAoD;IACpD,UAAU,CAAC,EAAE,kBAAkB,CAAC,cAAc,CAAC;CAChD,CAAC;AAIF,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrB,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;CACvB,CAAC;AAEF,wBAAgB,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EACjD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GACnB,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAuBlB"}
@@ -0,0 +1,36 @@
1
+ // defineTool — an AI tool, backed by a workflow. A tool's logic IS a workflow:
2
+ // `defineTool({ workflow: defineWorkflow(...) })`. On deploy the reconciler
3
+ // creates the tool (which creates its backing workflow) and then deploys the
4
+ // workflow release to the returned workflowUuid.
5
+ import { register, resourceId, token } from "../core.js";
6
+ import { refUuid } from "../refs.js";
7
+ export function defineTool(slug, spec) {
8
+ const id = resourceId("tool", slug);
9
+ register({
10
+ id,
11
+ kind: "tool",
12
+ slug,
13
+ spec: {
14
+ slug,
15
+ name: spec.name === undefined ? toTitle(slug) : spec.name,
16
+ description: spec.description === undefined ? null : spec.description,
17
+ icon: {
18
+ kind: "emoji",
19
+ emojiSlug: spec.emojiSlug === undefined ? "wrench" : spec.emojiSlug,
20
+ },
21
+ // the backing workflow's compiled graph — deployed as the tool's release
22
+ nodes: spec.workflow.nodes,
23
+ formFields: spec.workflow.formFields,
24
+ folderUuid: spec.folder === undefined ? undefined : refUuid(spec.folder),
25
+ triggers: spec.triggers === undefined ? [] : spec.triggers,
26
+ publicForm: spec.publicForm === undefined ? null : spec.publicForm,
27
+ },
28
+ });
29
+ return { slug, uuid: token(id, "uuid"), resource: "tool" };
30
+ }
31
+ function toTitle(slug) {
32
+ return slug
33
+ .split(/[-_]/)
34
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
35
+ .join(" ");
36
+ }
@@ -0,0 +1,18 @@
1
+ import { type Token } from "../core.js";
2
+ import { type FolderRef } from "../refs.js";
3
+ import type { FolderHandle } from "./folder.js";
4
+ export type WorkerSpec = {
5
+ /** Path to the worker's code directory (uploaded + built on deploy). */
6
+ path: string;
7
+ name?: string;
8
+ description?: string;
9
+ folder?: FolderHandle | FolderRef;
10
+ };
11
+ export type WorkerHandle = {
12
+ readonly slug: string;
13
+ readonly uuid: Token;
14
+ /** The live worker URL (deferred — known after deploy). */
15
+ readonly url: Token;
16
+ };
17
+ export declare function defineWorker(slug: string, spec: WorkerSpec): WorkerHandle;
18
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/resources/worker.ts"],"names":[],"mappings":"AAKA,OAAO,EAAwB,KAAK,KAAK,EAAS,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,KAAK,SAAS,EAAW,MAAM,YAAY,CAAC;AAErD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAWhD,MAAM,MAAM,UAAU,GAAG;IACvB,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,2DAA2D;IAC3D,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;CACrB,CAAC;AAEF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,YAAY,CAkBzE"}
@@ -0,0 +1,40 @@
1
+ // defineWorker — a hosted Cargo worker (the resource), deployed from a code
2
+ // directory. Distinct from @cargo-ai/worker-sdk's `createWorker`, which is the
3
+ // worker's *runtime code* (the Hono app at <path>/src/index.ts). On deploy the
4
+ // reconciler creates the worker slot, uploads the bundle, and promotes it.
5
+ import { register, resourceId, token } from "../core.js";
6
+ import { refUuid } from "../refs.js";
7
+ import { assertBundleFiles, bundleHash } from "./bundle.js";
8
+ // Files the hosting worker build requires at the bundle root: a built entry
9
+ // (esbuild bundles it — no TS transpile), a manifest, and an npm-ci'able project.
10
+ const WORKER_REQUIRED = [
11
+ "index.js",
12
+ "manifest.json",
13
+ "package.json",
14
+ "package-lock.json",
15
+ ];
16
+ export function defineWorker(slug, spec) {
17
+ const id = resourceId("worker", slug);
18
+ assertBundleFiles(spec.path, "worker", WORKER_REQUIRED);
19
+ register({
20
+ id,
21
+ kind: "worker",
22
+ slug,
23
+ spec: {
24
+ slug,
25
+ name: spec.name === undefined ? toTitle(slug) : spec.name,
26
+ description: spec.description === undefined ? null : spec.description,
27
+ path: spec.path,
28
+ // hash the code now so editing it shows as drift on the next deploy
29
+ contentHash: bundleHash(spec.path),
30
+ folderUuid: spec.folder === undefined ? undefined : refUuid(spec.folder),
31
+ },
32
+ });
33
+ return { slug, uuid: token(id, "uuid"), url: token(id, "url") };
34
+ }
35
+ function toTitle(slug) {
36
+ return slug
37
+ .split(/[-_]/)
38
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
39
+ .join(" ");
40
+ }