@claypi/cli 0.1.3 → 0.1.5

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.
package/dist/index.js CHANGED
@@ -82972,6 +82972,13 @@ function readJsonFlag(flagName, source) {
82972
82972
  throw new InvalidArgumentError(`${flagName}: not valid JSON (${err.message})`);
82973
82973
  }
82974
82974
  }
82975
+ function readJsonObjectFlag(flagName, source) {
82976
+ const parsed = readJsonFlag(flagName, source);
82977
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
82978
+ throw new InvalidArgumentError(`${flagName}: must be a JSON object`);
82979
+ }
82980
+ return parsed;
82981
+ }
82975
82982
 
82976
82983
  // src/commands/tables/list.ts
82977
82984
  function buildListCommand() {
@@ -92203,6 +92210,7 @@ var BlockSettings = external_exports.discriminatedUnion("blockType", [
92203
92210
  AdSyncBlockSettings
92204
92211
  ]);
92205
92212
  var AutoRunMode = external_exports.enum(["all", "keep_existing"]);
92213
+ var TableColorLabels = external_exports.record(external_exports.nativeEnum(DataTypeColor), external_exports.string());
92206
92214
  var TableSettingsBase = external_exports.object({
92207
92215
  AUTO_RUN_ON: external_exports.boolean().optional(),
92208
92216
  AUTO_RUN_MODE: AutoRunMode.optional(),
@@ -92237,7 +92245,8 @@ var TableSettingsBase = external_exports.object({
92237
92245
  PASS_THROUGH_TABLE_SUCCESS_CRITERIA: GridViewFilterConfigGroup.optional(),
92238
92246
  PASS_THROUGH_TABLE_DELETE_EXCESS_RECORDS_LIMIT: external_exports.number().optional(),
92239
92247
  /** When true, table data is synced for ClayQL queries (cross-table, NL queries). */
92240
- CLAYQL_SYNC_ENABLED: external_exports.boolean().optional()
92248
+ CLAYQL_SYNC_ENABLED: external_exports.boolean().optional(),
92249
+ COLOR_LABELS: TableColorLabels.optional()
92241
92250
  });
92242
92251
  var TableSettings = TableSettingsBase.refine(
92243
92252
  (data) => {
@@ -92288,7 +92297,7 @@ var TableSettingsKeys = Object.freeze(
92288
92297
  );
92289
92298
 
92290
92299
  // ../../libs/shared/src/tools/tool-id.ts
92291
- var ToolType = external_exports.enum(["function", "enrichment"]);
92300
+ var ToolType = external_exports.enum(["function", "enrichment", "workflow"]);
92292
92301
 
92293
92302
  // ../../libs/shared/src/tools/tool-input-schemas.ts
92294
92303
  var ToolSurface = external_exports.enum(["api", "mcp", "claygent"]);
@@ -93722,6 +93731,235 @@ Examples:
93722
93731
  });
93723
93732
  }
93724
93733
 
93734
+ // ../../libs/shared/src/billing/CreditUsage.ts
93735
+ var CreditUsageBreakdownSchema = zod_default.object({
93736
+ basicCreditsUsed: zod_default.number(),
93737
+ longExpiryCreditsUsed: zod_default.number(),
93738
+ totalCost: zod_default.number(),
93739
+ workbookId: zod_default.string().optional(),
93740
+ workbookCreditsUsed: zod_default.number().optional(),
93741
+ workspacePlatformId: zod_default.union([zod_default.string(), zod_default.number()]).optional().transform((val) => val),
93742
+ workspacePlatformCreditsUsed: zod_default.number().optional(),
93743
+ workspaceSalesRepId: zod_default.string().optional().transform((val) => val),
93744
+ workspaceSalesRepCreditsUsed: zod_default.number().optional(),
93745
+ signalId: zod_default.string().optional().transform((val) => val),
93746
+ signalCreditsUsed: zod_default.number().optional(),
93747
+ audienceBulkEnrichmentTableId: zod_default.string().optional().transform((val) => val),
93748
+ audienceBulkEnrichmentTableCreditsUsed: zod_default.number().optional(),
93749
+ actionExecutionsUsed: zod_default.number().optional(),
93750
+ budgetId: zod_default.string().optional(),
93751
+ budgetCreditsUsed: zod_default.number().optional()
93752
+ });
93753
+
93754
+ // ../../libs/shared/src/signals/signal-type.ts
93755
+ var SignalType = /* @__PURE__ */ ((SignalType2) => {
93756
+ SignalType2["FakeSignal"] = "FakeSignal";
93757
+ SignalType2["JobChange"] = "JobChange";
93758
+ SignalType2["JobPost"] = "JobPost";
93759
+ SignalType2["WebsiteVisitorTracking"] = "WebsiteVisitorTracking";
93760
+ SignalType2["NewHire"] = "NewHire";
93761
+ SignalType2["Promotion"] = "Promotion";
93762
+ SignalType2["News"] = "News";
93763
+ SignalType2["Custom"] = "Custom";
93764
+ SignalType2["LinkedinPostMentions"] = "LinkedinPostMentions";
93765
+ return SignalType2;
93766
+ })(SignalType || {});
93767
+
93768
+ // ../../libs/shared/src/ActionInvocationTypes.ts
93769
+ var MCPServiceCallbackInfo = external_exports.object({
93770
+ caller: external_exports.literal("MCPService" /* MCPService */),
93771
+ actionInfo: MCPServiceActionInfo
93772
+ });
93773
+ var ToolServiceCallbackInfo = external_exports.discriminatedUnion("surface", [
93774
+ external_exports.object({
93775
+ caller: external_exports.literal("ToolService" /* ToolService */),
93776
+ surface: external_exports.literal("claygent"),
93777
+ callbackUrl: external_exports.string().url(),
93778
+ jobId: external_exports.string(),
93779
+ toolCallId: external_exports.string(),
93780
+ toolId: external_exports.string()
93781
+ }),
93782
+ external_exports.object({
93783
+ caller: external_exports.literal("ToolService" /* ToolService */),
93784
+ surface: external_exports.literal("api")
93785
+ })
93786
+ ]);
93787
+ var ActionJobCallbackInfo = external_exports.union([
93788
+ external_exports.object({
93789
+ caller: external_exports.literal("SchedulerService" /* SchedulerService */)
93790
+ }),
93791
+ external_exports.object({
93792
+ caller: external_exports.literal("WebsiteSessionMonitorService" /* WebsiteSessionMonitorService */),
93793
+ signalId: external_exports.string(),
93794
+ signalType: external_exports.nativeEnum(SignalType)
93795
+ }),
93796
+ external_exports.object({
93797
+ caller: external_exports.literal("AudiencesService" /* AudiencesService */)
93798
+ }),
93799
+ external_exports.object({
93800
+ caller: external_exports.literal("CampaignsService" /* CampaignsService */),
93801
+ campaignId: external_exports.string(),
93802
+ leadId: external_exports.number(),
93803
+ launchBatchId: external_exports.string()
93804
+ }),
93805
+ external_exports.object({
93806
+ caller: external_exports.literal("WebhookDestination" /* WebhookDestination */),
93807
+ webhookUrl: external_exports.string().url(),
93808
+ responseFormat: external_exports.literal("exportly").optional()
93809
+ }),
93810
+ MCPServiceCallbackInfo,
93811
+ external_exports.object({
93812
+ caller: external_exports.literal("AgentRunService" /* AgentRunService */),
93813
+ agentRunId: external_exports.string()
93814
+ }),
93815
+ external_exports.object({
93816
+ caller: external_exports.literal("TerracottaWorkflowService" /* TerracottaWorkflowService */),
93817
+ stepId: external_exports.string(),
93818
+ workflowId: external_exports.string(),
93819
+ workflowRunId: external_exports.string(),
93820
+ nodeId: external_exports.string(),
93821
+ nodeName: external_exports.string()
93822
+ }),
93823
+ ...ToolServiceCallbackInfo.options,
93824
+ external_exports.object({
93825
+ caller: external_exports.literal("BigSourceSyncService" /* BigSourceSyncService */)
93826
+ })
93827
+ ]);
93828
+ var CoreActionOutputMetadata = external_exports.object({
93829
+ status: RunnerStatus,
93830
+ textPreview: external_exports.string().nullable(),
93831
+ imagePreview: external_exports.string().nullable(),
93832
+ message: external_exports.string().optional(),
93833
+ additionalCreditCost: external_exports.number().optional(),
93834
+ confidence: external_exports.string().optional(),
93835
+ creditCostAdditionalInfo: external_exports.string().optional()
93836
+ });
93837
+ var DestinationEnrichmentMetadata = external_exports.object({
93838
+ logInfo: ActionLogInfo.nullable(),
93839
+ inputsHash: external_exports.string().nullable(),
93840
+ runId: external_exports.string().nullable()
93841
+ });
93842
+ var CreditProcessingMetadata = external_exports.object({
93843
+ upfrontCreditUsage: CreditUsageBreakdownSchema.optional(),
93844
+ additionalCreditUsage: CreditUsageBreakdownSchema.optional(),
93845
+ isRefunded: external_exports.boolean().optional(),
93846
+ isPrivateKey: external_exports.boolean().optional()
93847
+ });
93848
+ var SourceExecutionMetadata = external_exports.object({
93849
+ nextPageCursor: external_exports.string().optional(),
93850
+ cumulativeCreditCost: external_exports.number().optional(),
93851
+ mostRecentResultCreditCost: external_exports.number().optional()
93852
+ });
93853
+ var StreamingProgressMetadata = external_exports.object({
93854
+ isStreamingProgress: external_exports.boolean().optional(),
93855
+ streamingProgressKey: external_exports.string().optional()
93856
+ });
93857
+ var ActionInvocationOutputMetadata = CoreActionOutputMetadata.merge(DestinationEnrichmentMetadata).merge(CreditProcessingMetadata).merge(SourceExecutionMetadata).merge(StreamingProgressMetadata);
93858
+ var ActionInvocationOutput = external_exports.object({
93859
+ data: external_exports.unknown(),
93860
+ retryPartialData: external_exports.unknown().optional(),
93861
+ retryCustomInputs: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
93862
+ retryDelayInSeconds: external_exports.number().optional(),
93863
+ hiddenData: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
93864
+ metadata: ActionInvocationOutputMetadata
93865
+ });
93866
+ var ActionTaskStatusEnum = /* @__PURE__ */ ((ActionTaskStatusEnum2) => {
93867
+ ActionTaskStatusEnum2["PROCESSING"] = "PROCESSING";
93868
+ ActionTaskStatusEnum2["COMPLETE"] = "COMPLETE";
93869
+ return ActionTaskStatusEnum2;
93870
+ })(ActionTaskStatusEnum || {});
93871
+ var ActionTaskData = external_exports.object({
93872
+ output: ActionInvocationOutput,
93873
+ status: external_exports.nativeEnum(ActionTaskStatusEnum)
93874
+ });
93875
+ var ActionInvocationInfo = external_exports.object({
93876
+ needsRetry: external_exports.boolean(),
93877
+ retryCount: external_exports.number(),
93878
+ isPartialOutput: external_exports.boolean()
93879
+ });
93880
+
93881
+ // ../../libs/shared/src/actions/action-enrichment-types.ts
93882
+ var ActionRunEnrichmentType = /* @__PURE__ */ ((ActionRunEnrichmentType2) => {
93883
+ ActionRunEnrichmentType2["FIND_AND_ENRICH_PERSONAL_LINKEDIN"] = "find-and-enrich-personal-linkedin";
93884
+ ActionRunEnrichmentType2["ENRICH_PERSONAL_LINKEDIN_URL"] = "enrich-personal-linkedin-url";
93885
+ ActionRunEnrichmentType2["ENRICH_COMPANY"] = "enrich-company";
93886
+ ActionRunEnrichmentType2["CLAYGENT"] = "claygent";
93887
+ ActionRunEnrichmentType2["FIND_EMPLOYEE_HEADCOUNT"] = "find-employee-headcount";
93888
+ ActionRunEnrichmentType2["FIND_LISTS_OF_PEOPLE_WITH_MIXRANK_SOURCE_PREVIEW"] = "find-lists-of-people-with-mixrank-source-preview";
93889
+ ActionRunEnrichmentType2["FIND_LISTS_OF_COMPANIES_WITH_MIXRANK_SOURCE_PREVIEW"] = "find-lists-of-companies-with-mixrank-source-preview";
93890
+ ActionRunEnrichmentType2["FIND_COMPANY_LOOKALIKES_CLUSTERED_PREVIEW"] = "find-company-lookalikes-clustered-preview";
93891
+ ActionRunEnrichmentType2["FIND_LISTS_OF_JOBS_WITH_MIXRANK_SOURCE_PREVIEW"] = "find-lists-of-jobs-with-mixrank-source-preview";
93892
+ ActionRunEnrichmentType2["SEARCH_COMPANIES_FROM_TABLE"] = "search-companies-from-table";
93893
+ return ActionRunEnrichmentType2;
93894
+ })(ActionRunEnrichmentType || {});
93895
+ var CPJ_PREVIEWS_ENRICHMENTS = [
93896
+ "find-lists-of-companies-with-mixrank-source-preview" /* FIND_LISTS_OF_COMPANIES_WITH_MIXRANK_SOURCE_PREVIEW */,
93897
+ "find-company-lookalikes-clustered-preview" /* FIND_COMPANY_LOOKALIKES_CLUSTERED_PREVIEW */,
93898
+ "find-lists-of-people-with-mixrank-source-preview" /* FIND_LISTS_OF_PEOPLE_WITH_MIXRANK_SOURCE_PREVIEW */,
93899
+ "find-lists-of-jobs-with-mixrank-source-preview" /* FIND_LISTS_OF_JOBS_WITH_MIXRANK_SOURCE_PREVIEW */
93900
+ ];
93901
+ function isCPJPreviewEnrichmentType(enrichmentType) {
93902
+ return CPJ_PREVIEWS_ENRICHMENTS.some((type) => type === enrichmentType);
93903
+ }
93904
+ var CPJPreviewEnrichmentTypeSchema = external_exports.nativeEnum(ActionRunEnrichmentType).refine((v) => isCPJPreviewEnrichmentType(v), {
93905
+ message: "Must be a CPJ preview enrichment type"
93906
+ });
93907
+
93908
+ // ../../libs/api-contract/src/tables/action/interfaces.ts
93909
+ var CreateActionTaskBody = external_exports.object({
93910
+ workspaceId: external_exports.string(),
93911
+ tableId: external_exports.string().optional(),
93912
+ runType: external_exports.nativeEnum(ActionTaskRunType).optional(),
93913
+ actionTaskParams: external_exports.object({
93914
+ actionPreviewing: external_exports.string().optional(),
93915
+ actionKey: ActionKeySchema,
93916
+ actionPackageId: ActionPackageIdSchema,
93917
+ authAccountId: external_exports.string().optional(),
93918
+ inputs: external_exports.record(external_exports.string(), external_exports.any()),
93919
+ isPreviewRun: external_exports.boolean().optional(),
93920
+ callbackInfo: ActionJobCallbackInfo.optional()
93921
+ })
93922
+ });
93923
+ var DynamicFieldRequestItem = external_exports.object({
93924
+ actionPackageId: external_exports.string(),
93925
+ actionKey: external_exports.string(),
93926
+ authAccountId: external_exports.string().optional(),
93927
+ parameterPath: external_exports.string(),
93928
+ inputs: external_exports.any().optional(),
93929
+ context: external_exports.any().optional(),
93930
+ tableId: external_exports.string().optional(),
93931
+ type: external_exports.enum(["select", "input"])
93932
+ });
93933
+ var DynamicFieldsRequestBody = external_exports.object({
93934
+ dynamicRequests: external_exports.array(DynamicFieldRequestItem)
93935
+ });
93936
+ var DynamicFieldError = external_exports.object({
93937
+ errorMessage: external_exports.string(),
93938
+ errorDetails: external_exports.string().optional(),
93939
+ errorStatus: external_exports.string(),
93940
+ isBlocking: external_exports.boolean()
93941
+ });
93942
+ var DynamicFieldResponseItem = external_exports.object({
93943
+ parameterPath: external_exports.string(),
93944
+ dynamicData: external_exports.array(external_exports.any()).optional(),
93945
+ errors: external_exports.array(DynamicFieldError).optional(),
93946
+ logUrl: external_exports.string().optional()
93947
+ });
93948
+ var RunCPJPreviewEnrichmentBody = external_exports.object({
93949
+ workspaceId: external_exports.string(),
93950
+ enrichmentType: CPJPreviewEnrichmentTypeSchema,
93951
+ options: external_exports.object({
93952
+ returnTaskId: external_exports.boolean().optional(),
93953
+ returnActionMetadata: external_exports.boolean().optional()
93954
+ }).strict().optional(),
93955
+ inputs: external_exports.record(external_exports.string(), external_exports.unknown())
93956
+ });
93957
+ var RunCPJPreviewEnrichmentResponse = external_exports.object({
93958
+ result: external_exports.unknown(),
93959
+ metadata: ActionInvocationOutputMetadata.optional(),
93960
+ taskId: external_exports.string().optional()
93961
+ });
93962
+
93725
93963
  // ../../libs/api-contract/src/terracotta/clay-actions/contract.ts
93726
93964
  var terracottaClayActionsContract = {
93727
93965
  getClayActions: {
@@ -93752,9 +93990,106 @@ var terracottaClayActionsContract = {
93752
93990
  },
93753
93991
  summary: "Get input schema for a specific Clay action by packageId and actionKey",
93754
93992
  metadata: { team: "workflows" /* Workflows */ }
93993
+ },
93994
+ getClayActionDynamicFields: {
93995
+ method: "POST",
93996
+ path: "/workspaces/:workspaceId/tc-clay-action-dynamic-fields",
93997
+ pathParams: external_exports.object({
93998
+ workspaceId: external_exports.string()
93999
+ }),
94000
+ body: DynamicFieldsRequestBody,
94001
+ responses: {
94002
+ 200: external_exports.array(DynamicFieldResponseItem),
94003
+ 404: external_exports.object({ error: external_exports.string() })
94004
+ },
94005
+ summary: "Resolve dynamic select options / fields for Clay action parameters given chosen inputs",
94006
+ metadata: { team: "workflows" /* Workflows */ }
93755
94007
  }
93756
94008
  };
93757
94009
 
94010
+ // src/commands/workflows/actions/dynamic-fields.ts
94011
+ function prefixRevealedFieldNames(responses, parameterPath) {
94012
+ const prefix = parameterPath.split(".").pop() ?? parameterPath;
94013
+ return responses.map((response) => ({
94014
+ ...response,
94015
+ dynamicData: (response.dynamicData ?? []).map((field) => {
94016
+ if (typeof field === "object" && field !== null && "name" in field) {
94017
+ const named = field;
94018
+ if (typeof named.name === "string") {
94019
+ return { ...field, name: `${prefix}|${named.name}` };
94020
+ }
94021
+ }
94022
+ return field;
94023
+ })
94024
+ }));
94025
+ }
94026
+ function buildDynamicFieldsCommand() {
94027
+ const cmd = new Command("dynamic-fields");
94028
+ cmd.description("Resolve an action parameter whose options or fields depend on other inputs.").argument("<packageId>", "Action package id, from `workflows actions list`").argument("<actionKey>", "Action key, from `workflows actions list`").argument("<parameterPath>", "Parameter name; dot-notation for grouped params (e.g. objectSchema.stage)").addOption(
94029
+ new Option(
94030
+ "--type <type>",
94031
+ "select = resolve a dependent dropdown\u2019s values; input = resolve a revealed field set."
94032
+ ).choices(["select", "input"]).default("select")
94033
+ ).option("--account <id>", "Connected account id (authAccountId) for actions that need auth.").option(
94034
+ "--inputs <json|file|->",
94035
+ "Already-chosen input values as a JSON object keyed by parameter name: inline JSON, a file path, or - for stdin."
94036
+ ).addHelpText(
94037
+ "after",
94038
+ `
94039
+ Output (success, exit 0):
94040
+ [ { "parameterPath": <string>,
94041
+ "dynamicData": [ ... ], // shape depends on --type, see below
94042
+ "errors": [ { "errorMessage": <string>, "errorDetails": <string>?,
94043
+ "errorStatus": <string>, "isBlocking": <boolean> } ]?,
94044
+ "logUrl": <string>? } ]
94045
+
94046
+ --type select dynamicData: [ { "value": <string>, "displayName": <string> } ]
94047
+ \u2014 "value" is what you pass back in a later --inputs call.
94048
+ --type input dynamicData: revealed input-parameter schema objects forwarded from the
94049
+ server; each "name" is prefixed to pipe notation (<parameterPath>|<field>)
94050
+ so it can be bound directly \u2014 the bare name drops the value at run time.
94051
+
94052
+ "errors[].isBlocking" is load-bearing: when true, abort cascading input resolution.
94053
+
94054
+ Configuring cascading inputs is iterative: resolve and fill one input, then re-run
94055
+ with it in --inputs to resolve the next dependent parameter.
94056
+
94057
+ Common errors:
94058
+ validation_error (exit 2) Required arguments missing, or --inputs is unreadable, not valid JSON, or not a JSON object.
94059
+ auth_forbidden (exit 3) API key lacks permission for this command (insufficient scope).
94060
+
94061
+ Examples:
94062
+ $ clay workflows actions dynamic-fields <packageId> create-object objectType --account acc_123 | jq '.[0].dynamicData'
94063
+ $ clay workflows actions dynamic-fields <packageId> create-object property --account acc_123 --inputs '{"objectType":"companies"}' | jq -r '.[0].dynamicData[].value'
94064
+ `
94065
+ ).action(
94066
+ async (packageId, actionKey, parameterPath, opts) => {
94067
+ const inputs = opts.inputs === void 0 ? {} : readJsonObjectFlag("--inputs", opts.inputs);
94068
+ const workspaceId = await currentWorkspaceId();
94069
+ const client = await v3Client(terracottaClayActionsContract);
94070
+ const result = await unwrap(
94071
+ client.getClayActionDynamicFields({
94072
+ params: { workspaceId },
94073
+ body: {
94074
+ dynamicRequests: [
94075
+ {
94076
+ actionPackageId: packageId,
94077
+ actionKey,
94078
+ parameterPath,
94079
+ type: opts.type,
94080
+ authAccountId: opts.account,
94081
+ inputs
94082
+ }
94083
+ ]
94084
+ }
94085
+ })
94086
+ );
94087
+ writeJson(opts.type === "input" ? prefixRevealedFieldNames(result, parameterPath) : result);
94088
+ }
94089
+ );
94090
+ return cmd;
94091
+ }
94092
+
93758
94093
  // src/commands/workflows/actions/projection.ts
93759
94094
  var ACTION_FIELDS = [
93760
94095
  "type",
@@ -93906,8 +94241,9 @@ function buildActionsCommand() {
93906
94241
  "after",
93907
94242
  `
93908
94243
  Subcommands:
93909
- list Dump the full action catalog (greppable JSON).
93910
- schema Fetch one action\u2019s input schema by packageId + actionKey.
94244
+ list Dump the full action catalog (greppable JSON).
94245
+ schema Fetch one action\u2019s input schema by packageId + actionKey.
94246
+ dynamic-fields Resolve a parameter whose options/fields depend on other inputs.
93911
94247
 
93912
94248
  These are workflow building blocks (actions you add to a node\u2019s "tools"). For
93913
94249
  workspace *function tools*, a different concept, see \`clay tools\`.
@@ -93915,10 +94251,12 @@ workspace *function tools*, a different concept, see \`clay tools\`.
93915
94251
  Examples:
93916
94252
  $ clay workflows actions list > catalog.json
93917
94253
  $ clay workflows actions schema <packageId> <actionKey> | jq '.inputParameters'
94254
+ $ clay workflows actions dynamic-fields <packageId> <actionKey> <param> --inputs '{"objectType":"companies"}'
93918
94255
  `
93919
94256
  );
93920
94257
  cmd.addCommand(applyClaySettings(buildListCommand5()));
93921
94258
  cmd.addCommand(applyClaySettings(buildSchemaCommand()));
94259
+ cmd.addCommand(applyClaySettings(buildDynamicFieldsCommand()));
93922
94260
  return cmd;
93923
94261
  }
93924
94262
 
@@ -94108,26 +94446,6 @@ var UpdateTriggerRequest = external_exports.object({
94108
94446
  status: TriggerStatus.optional()
94109
94447
  });
94110
94448
 
94111
- // ../../libs/shared/src/billing/CreditUsage.ts
94112
- var CreditUsageBreakdownSchema = zod_default.object({
94113
- basicCreditsUsed: zod_default.number(),
94114
- longExpiryCreditsUsed: zod_default.number(),
94115
- totalCost: zod_default.number(),
94116
- workbookId: zod_default.string().optional(),
94117
- workbookCreditsUsed: zod_default.number().optional(),
94118
- workspacePlatformId: zod_default.union([zod_default.string(), zod_default.number()]).optional().transform((val) => val),
94119
- workspacePlatformCreditsUsed: zod_default.number().optional(),
94120
- workspaceSalesRepId: zod_default.string().optional().transform((val) => val),
94121
- workspaceSalesRepCreditsUsed: zod_default.number().optional(),
94122
- signalId: zod_default.string().optional().transform((val) => val),
94123
- signalCreditsUsed: zod_default.number().optional(),
94124
- audienceBulkEnrichmentTableId: zod_default.string().optional().transform((val) => val),
94125
- audienceBulkEnrichmentTableCreditsUsed: zod_default.number().optional(),
94126
- actionExecutionsUsed: zod_default.number().optional(),
94127
- budgetId: zod_default.string().optional(),
94128
- budgetCreditsUsed: zod_default.number().optional()
94129
- });
94130
-
94131
94449
  // ../../libs/shared/src/agents/task-node.ts
94132
94450
  var TCForkNodeConfig = external_exports.object({
94133
94451
  joinNodeId: external_exports.string().optional(),
@@ -94791,7 +95109,10 @@ var ActionToolParameters = external_exports.record(
94791
95109
  type: external_exports.string(),
94792
95110
  description: external_exports.string(),
94793
95111
  required: external_exports.boolean(),
94794
- displayName: external_exports.string()
95112
+ // Optional: it's a human label that static action params carry, but fields resolved
95113
+ // dynamically and merged into the snapshot (parent|child) have none; consumers fall
95114
+ // back to the param name. Required here rejected those runs with contract_mismatch.
95115
+ displayName: external_exports.string().optional()
94795
95116
  })
94796
95117
  );
94797
95118
  var ActionToolData = external_exports.object({
@@ -95056,10 +95377,7 @@ var TCWorkflowRunStateBase = external_exports.object({
95056
95377
  globalContext: external_exports.record(external_exports.unknown()).optional(),
95057
95378
  startedAt: external_exports.string().datetime(),
95058
95379
  standaloneActions: TerminalNodeActionsMapping.optional(),
95059
- terminalNodeActionResults: TerminalNodeActionResultsMapping.optional(),
95060
- // Daytona sandbox API key credentials (persisted for reconnection and cleanup)
95061
- sandboxApiKeyId: external_exports.string().optional(),
95062
- sandboxApiKey: external_exports.string().optional()
95380
+ terminalNodeActionResults: TerminalNodeActionResultsMapping.optional()
95063
95381
  });
95064
95382
  var TCWorkflowRunState = external_exports.discriminatedUnion("status", [
95065
95383
  TCWorkflowRunStateBase.extend({
@@ -95854,130 +96172,6 @@ Examples:
95854
96172
  return cmd;
95855
96173
  }
95856
96174
 
95857
- // src/commands/workflows/runs/download-file.ts
95858
- var import_node_fs11 = require("fs");
95859
- var import_node_path7 = require("path");
95860
-
95861
- // ../../libs/api-contract/src/terracotta/code-tool/interfaces.ts
95862
- var ToolExecutionRequest = external_exports.object({
95863
- toolId: external_exports.string().describe('Tool ID in format "actionPackageId:actionKey"'),
95864
- inputs: external_exports.record(external_exports.unknown()).describe("Tool input parameters")
95865
- });
95866
- var ToolExecutionResponse = external_exports.object({
95867
- success: external_exports.boolean(),
95868
- result: external_exports.unknown().optional(),
95869
- error: external_exports.string().optional()
95870
- });
95871
- var ToolExecutionErrorResponse = external_exports.object({
95872
- error: external_exports.string()
95873
- });
95874
- var SandboxFileDownloadRequest = external_exports.object({
95875
- filePath: external_exports.string().describe("Path to the file in the sandbox filesystem")
95876
- });
95877
- var SandboxFileDownloadErrorResponse = external_exports.object({
95878
- error: external_exports.string()
95879
- });
95880
-
95881
- // ../../libs/api-contract/src/terracotta/code-tool/contract.ts
95882
- var terracottaCodeToolContract = {
95883
- executeToolFromCode: {
95884
- method: "POST",
95885
- path: "/terracotta/internal/workflow-run/:workflowRunId/step/:stepId/execute-tool",
95886
- pathParams: external_exports.object({
95887
- workflowRunId: external_exports.string(),
95888
- stepId: external_exports.string()
95889
- }),
95890
- responses: {
95891
- 200: ToolExecutionResponse,
95892
- 401: ToolExecutionErrorResponse,
95893
- 403: ToolExecutionErrorResponse,
95894
- 422: ToolExecutionErrorResponse,
95895
- 500: ToolExecutionErrorResponse
95896
- },
95897
- body: ToolExecutionRequest,
95898
- summary: "Execute a tool from code node",
95899
- description: "Internal endpoint for executing Clay actions from Python code running in Daytona sandboxes",
95900
- metadata: { team: "workflows" /* Workflows */ }
95901
- },
95902
- downloadFileFromSandbox: {
95903
- method: "POST",
95904
- path: "/terracotta/internal/workflow-run/:workflowRunId/download-file",
95905
- pathParams: external_exports.object({
95906
- workflowRunId: external_exports.string()
95907
- }),
95908
- responses: {
95909
- 200: external_exports.object({
95910
- success: external_exports.literal(true),
95911
- fileData: external_exports.string().describe("Base64-encoded file contents"),
95912
- filename: external_exports.string().describe("Basename of the file")
95913
- }),
95914
- 401: SandboxFileDownloadErrorResponse,
95915
- 403: SandboxFileDownloadErrorResponse,
95916
- 404: SandboxFileDownloadErrorResponse,
95917
- 500: SandboxFileDownloadErrorResponse
95918
- },
95919
- body: SandboxFileDownloadRequest,
95920
- summary: "Download a file from a workflow run sandbox",
95921
- description: "Downloads a file from the Daytona sandbox associated with a workflow run. Returns the raw file contents as a binary response.",
95922
- metadata: { team: "workflows" /* Workflows */ }
95923
- }
95924
- };
95925
-
95926
- // src/commands/workflows/runs/download-file.ts
95927
- function buildDownloadFileCommand() {
95928
- const cmd = new Command("download-file");
95929
- cmd.description("Download a file written by a code node from a workflow run sandbox onto local disk.").argument("<workflowId>", "Workflow id, e.g. wf_abc123").argument("<runId>", "Run id, e.g. wfr_xyz789").requiredOption(
95930
- "--path <sandbox-path>",
95931
- "Absolute path of the file inside the run sandbox, e.g. /home/daytona/report.csv"
95932
- ).option(
95933
- "--output <local>",
95934
- "Local path to write the file to. Defaults to the basename of --path in the current directory."
95935
- ).addHelpText(
95936
- "after",
95937
- `
95938
- Output (success, exit 0):
95939
- { "path": <string>, "size": <number> }
95940
-
95941
- "path" is the local path the file was written to; "size" is its size in bytes.
95942
- The file contents are written to disk only \u2014 never to stdout \u2014 so the JSON
95943
- envelope stays clean for piping. Code nodes run in an ephemeral per-run sandbox
95944
- (cwd /home/daytona) that is torn down after the run, so download artifacts
95945
- before the run is archived.
95946
-
95947
- The run is resolved by runId alone \u2014 workflowId is positional only for parity
95948
- with the other "runs" subcommands and is NOT validated against the run. Passing
95949
- a runId that belongs to a different workflow still downloads from that run, so
95950
- make sure the runId is correct (e.g. from "runs get"/"runs start" output).
95951
-
95952
- Common errors:
95953
- validation_error (exit 2) workflowId, runId, or --path is missing, or --output could not be written.
95954
- not_found (exit 6) No run with that runId, or no file at --path in its sandbox.
95955
- auth_forbidden (exit 3) API key lacks permission for this command (insufficient scope).
95956
-
95957
- Examples:
95958
- $ clay workflows runs download-file wf_abc123 wfr_xyz789 --path /home/daytona/report.csv
95959
- $ clay workflows runs download-file wf_abc123 wfr_xyz789 --path /home/daytona/out.json --output ./out.json
95960
- $ clay workflows runs download-file wf_abc123 wfr_xyz789 --path /home/daytona/report.csv | jq -r '.size'
95961
- `
95962
- ).action(async (_workflowId, runId, opts) => {
95963
- const client = await v3Client(terracottaCodeToolContract, { timeout: "large-transfer" });
95964
- const result = await unwrap(
95965
- client.downloadFileFromSandbox({ params: { workflowRunId: runId }, body: { filePath: opts.path } })
95966
- );
95967
- const outputPath = opts.output ?? (0, import_node_path7.basename)(opts.path);
95968
- const bytes = Buffer.from(result.fileData, "base64");
95969
- try {
95970
- (0, import_node_fs11.writeFileSync)(outputPath, bytes);
95971
- } catch (err) {
95972
- throw new FileWriteError(
95973
- `Could not write to ${outputPath}: ${err instanceof Error ? err.message : String(err)}`
95974
- );
95975
- }
95976
- writeJson({ path: outputPath, size: bytes.length });
95977
- });
95978
- return cmd;
95979
- }
95980
-
95981
96175
  // ../../libs/shared/src/agents/human-feedback.ts
95982
96176
  var ApproveContinuation = external_exports.object({
95983
96177
  type: external_exports.literal("ApproveContinuation")
@@ -96586,11 +96780,7 @@ Examples:
96586
96780
 
96587
96781
  // src/commands/workflows/runs/input.ts
96588
96782
  function readRunInputs(source) {
96589
- const parsed = readJsonFlag("--input", source);
96590
- if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
96591
- throw new InvalidArgumentError("--input: must be a JSON object of workflow inputs");
96592
- }
96593
- return parsed;
96783
+ return readJsonObjectFlag("--input", source);
96594
96784
  }
96595
96785
 
96596
96786
  // src/commands/workflows/runs/start.ts
@@ -96735,7 +96925,6 @@ Subcommands:
96735
96925
  steps List the individual execution steps of a run, with filters.
96736
96926
  pause Pause an active run.
96737
96927
  resume Resume a paused run.
96738
- download-file Download a file written by a code node from a run sandbox.
96739
96928
 
96740
96929
  Examples:
96741
96930
  $ clay workflows runs start wf_abc123 | jq -r '.runId'
@@ -96748,7 +96937,6 @@ Examples:
96748
96937
  cmd.addCommand(applyClaySettings(buildStepsCommand()));
96749
96938
  cmd.addCommand(applyClaySettings(buildPauseCommand()));
96750
96939
  cmd.addCommand(applyClaySettings(buildResumeCommand()));
96751
- cmd.addCommand(applyClaySettings(buildDownloadFileCommand()));
96752
96940
  return cmd;
96753
96941
  }
96754
96942