@mindstudio-ai/agent 0.0.19 → 0.1.0
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/README.md +123 -102
- package/dist/cli.js +161 -11
- package/dist/index.d.ts +378 -17
- package/dist/index.js +74 -3
- package/dist/index.js.map +1 -1
- package/llms.txt +129 -15
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -215,9 +215,21 @@ function applyStepMethods(AgentClass) {
|
|
|
215
215
|
proto.deleteGoogleSheetRows = function(step, options) {
|
|
216
216
|
return this.executeStep("deleteGoogleSheetRows", step, options);
|
|
217
217
|
};
|
|
218
|
+
proto.detectChanges = function(step, options) {
|
|
219
|
+
return this.executeStep("detectChanges", step, options);
|
|
220
|
+
};
|
|
218
221
|
proto.detectPII = function(step, options) {
|
|
219
222
|
return this.executeStep("detectPII", step, options);
|
|
220
223
|
};
|
|
224
|
+
proto.discordEditMessage = function(step, options) {
|
|
225
|
+
return this.executeStep("discordEditMessage", step, options);
|
|
226
|
+
};
|
|
227
|
+
proto.discordSendFollowUp = function(step, options) {
|
|
228
|
+
return this.executeStep("discordSendFollowUp", step, options);
|
|
229
|
+
};
|
|
230
|
+
proto.discordSendMessage = function(step, options) {
|
|
231
|
+
return this.executeStep("discordSendMessage", step, options);
|
|
232
|
+
};
|
|
221
233
|
proto.downloadVideo = function(step, options) {
|
|
222
234
|
return this.executeStep("downloadVideo", step, options);
|
|
223
235
|
};
|
|
@@ -410,6 +422,9 @@ function applyStepMethods(AgentClass) {
|
|
|
410
422
|
proto.resizeVideo = function(step, options) {
|
|
411
423
|
return this.executeStep("resizeVideo", step, options);
|
|
412
424
|
};
|
|
425
|
+
proto.runFromConnectorRegistry = function(step, options) {
|
|
426
|
+
return this.executeStep("runFromConnectorRegistry", step, options);
|
|
427
|
+
};
|
|
413
428
|
proto.runPackagedWorkflow = function(step, options) {
|
|
414
429
|
return this.executeStep("runPackagedWorkflow", step, options);
|
|
415
430
|
};
|
|
@@ -574,12 +589,24 @@ function applyHelperMethods(AgentClass) {
|
|
|
574
589
|
proto.listModelsByType = function(modelType) {
|
|
575
590
|
return this._request("GET", `/helpers/models/${modelType}`).then((r) => r.data);
|
|
576
591
|
};
|
|
592
|
+
proto.listModelsSummary = function() {
|
|
593
|
+
return this._request("GET", "/helpers/models-summary").then((r) => r.data);
|
|
594
|
+
};
|
|
595
|
+
proto.listModelsSummaryByType = function(modelType) {
|
|
596
|
+
return this._request("GET", `/helpers/models-summary/${modelType}`).then((r) => r.data);
|
|
597
|
+
};
|
|
577
598
|
proto.listConnectors = function() {
|
|
578
599
|
return this._request("GET", "/helpers/connectors").then((r) => r.data);
|
|
579
600
|
};
|
|
580
601
|
proto.getConnector = function(serviceId) {
|
|
581
602
|
return this._request("GET", `/helpers/connectors/${serviceId}`).then((r) => r.data);
|
|
582
603
|
};
|
|
604
|
+
proto.getConnectorAction = function(serviceId, actionId) {
|
|
605
|
+
return this._request("GET", `/helpers/connectors/${serviceId}/${actionId}`).then((r) => r.data);
|
|
606
|
+
};
|
|
607
|
+
proto.listConnections = function() {
|
|
608
|
+
return this._request("GET", "/helpers/connections").then((r) => r.data);
|
|
609
|
+
};
|
|
583
610
|
}
|
|
584
611
|
|
|
585
612
|
// src/client.ts
|
|
@@ -781,7 +808,11 @@ var monacoSnippets = {
|
|
|
781
808
|
"deleteGmailEmail": { fields: [["messageId", "string"]], outputKeys: [] },
|
|
782
809
|
"deleteGoogleCalendarEvent": { fields: [["eventId", "string"]], outputKeys: [] },
|
|
783
810
|
"deleteGoogleSheetRows": { fields: [["documentId", "string"], ["startRow", "string"], ["endRow", "string"]], outputKeys: [] },
|
|
811
|
+
"detectChanges": { fields: [["mode", ["ai", "comparison"]], ["input", "string"]], outputKeys: ["hasChanged", "currentValue", "previousValue", "isFirstRun"] },
|
|
784
812
|
"detectPII": { fields: [["input", "string"], ["language", "string"], ["entities", "array"]], outputKeys: ["detected", "detections"] },
|
|
813
|
+
"discordEditMessage": { fields: [["botToken", "string"], ["channelId", "string"], ["messageId", "string"], ["text", "string"]], outputKeys: [] },
|
|
814
|
+
"discordSendFollowUp": { fields: [["applicationId", "string"], ["interactionToken", "string"], ["text", "string"]], outputKeys: ["messageId"] },
|
|
815
|
+
"discordSendMessage": { fields: [["mode", ["edit", "send"]], ["text", "string"]], outputKeys: [] },
|
|
785
816
|
"downloadVideo": { fields: [["videoUrl", "string"], ["format", ["mp4", "mp3"]]], outputKeys: ["videoUrl"] },
|
|
786
817
|
"enhanceImageGenerationPrompt": { fields: [["initialPrompt", "string"], ["includeNegativePrompt", "boolean"], ["systemPrompt", "string"]], outputKeys: ["prompt"] },
|
|
787
818
|
"enhanceVideoGenerationPrompt": { fields: [["initialPrompt", "string"], ["includeNegativePrompt", "boolean"], ["systemPrompt", "string"]], outputKeys: ["prompt"] },
|
|
@@ -848,6 +879,7 @@ var monacoSnippets = {
|
|
|
848
879
|
"removeBackgroundFromImage": { fields: [["imageUrl", "string"]], outputKeys: ["imageUrl"] },
|
|
849
880
|
"replyToGmailEmail": { fields: [["messageId", "string"], ["message", "string"], ["messageType", ["plain", "html", "markdown"]]], outputKeys: ["messageId"] },
|
|
850
881
|
"resizeVideo": { fields: [["videoUrl", "string"], ["mode", ["fit", "exact"]]], outputKeys: ["videoUrl"] },
|
|
882
|
+
"runFromConnectorRegistry": { fields: [["actionId", "string"], ["displayName", "string"], ["icon", "string"], ["configurationValues", "object"]], outputKeys: ["data"] },
|
|
851
883
|
"runPackagedWorkflow": { fields: [["appId", "string"], ["workflowId", "string"], ["inputVariables", "object"], ["outputVariables", "object"], ["name", "string"]], outputKeys: ["data"] },
|
|
852
884
|
"scrapeFacebookPage": { fields: [["pageUrl", "string"]], outputKeys: ["data"] },
|
|
853
885
|
"scrapeFacebookPosts": { fields: [["pageUrl", "string"]], outputKeys: ["data"] },
|
|
@@ -1082,6 +1114,13 @@ var stepMetadata = {
|
|
|
1082
1114
|
inputSchema: { "type": "object", "properties": { "documentId": { "type": "string", "description": "Google Spreadsheet ID or URL" }, "sheetName": { "type": "string", "description": "Sheet/tab name (defaults to first sheet)" }, "startRow": { "type": "string", "description": "First row to delete (1-based, inclusive)" }, "endRow": { "type": "string", "description": "Last row to delete (1-based, inclusive)" }, "connectionId": { "type": "string", "description": "Google OAuth connection ID" } }, "required": ["documentId", "startRow", "endRow"] },
|
|
1083
1115
|
outputSchema: { "description": "This step does not produce output data." }
|
|
1084
1116
|
},
|
|
1117
|
+
"detectChanges": {
|
|
1118
|
+
stepType: "detectChanges",
|
|
1119
|
+
description: "Detect changes between runs by comparing current input against previously stored state. Routes execution based on whether a change occurred.",
|
|
1120
|
+
usageNotes: '- Persists state across runs using a global variable keyed to the step ID.\n- Two modes: "comparison" (default) uses strict string inequality; "ai" uses an LLM to determine if a meaningful change occurred.\n- First run always treats the value as "changed" since there is no previous state.\n- Each mode supports transitions to different steps/workflows for the "changed" and "unchanged" paths.\n- AI mode bills normally for the LLM call.',
|
|
1121
|
+
inputSchema: { "type": "object", "properties": { "mode": { "enum": ["ai", "comparison"], "type": "string", "description": "Detection mode: 'comparison' for strict string inequality, 'ai' for LLM-based. Default: 'comparison'" }, "input": { "type": "string", "description": "Current value to check (variable template)" }, "prompt": { "type": "string", "description": "AI mode: what constitutes a meaningful change" }, "modelOverride": { "type": "object", "properties": { "model": { "type": "string", "description": 'Model identifier (e.g. "gpt-4", "claude-3-opus")' }, "temperature": { "type": "number", "description": "Sampling temperature for the model (0-2)" }, "maxResponseTokens": { "type": "number", "description": "Maximum number of tokens in the model's response" }, "ignorePreamble": { "type": "boolean", "description": "Whether to skip the system preamble/instructions" }, "userMessagePreprocessor": { "type": "object", "properties": { "dataSource": { "type": "string", "description": "Data source identifier for the preprocessor" }, "messageTemplate": { "type": "string", "description": "Template string applied to user messages before sending to the model" }, "maxResults": { "type": "number", "description": "Maximum number of results to include from the data source" }, "enabled": { "type": "boolean", "description": "Whether the preprocessor is active" }, "shouldInherit": { "type": "boolean", "description": "Whether child steps should inherit this preprocessor configuration" } }, "description": "Preprocessor applied to user messages before sending to the model" }, "preamble": { "type": "string", "description": "System preamble/instructions for the model" }, "multiModelEnabled": { "type": "boolean", "description": "Whether multi-model candidate generation is enabled" }, "editResponseEnabled": { "type": "boolean", "description": "Whether the user can edit the model's response" }, "config": { "type": "object", "description": "Additional model-specific configuration" } }, "required": ["model", "temperature", "maxResponseTokens"], "description": "AI mode: model settings override" }, "previousValueVariable": { "type": "string", "description": "Optional variable name to store the previous value into for downstream access" }, "changedStepId": { "type": "string", "description": "Step to transition to if changed (same workflow)" }, "changedWorkflowId": { "type": "string", "description": "Workflow to jump to if changed (cross workflow)" }, "unchangedStepId": { "type": "string", "description": "Step to transition to if unchanged (same workflow)" }, "unchangedWorkflowId": { "type": "string", "description": "Workflow to jump to if unchanged (cross workflow)" } }, "required": ["mode", "input"], "description": "Configuration for the detect changes step" },
|
|
1122
|
+
outputSchema: { "type": "object", "properties": { "hasChanged": { "type": "boolean", "description": "Whether a change was detected" }, "currentValue": { "type": "string", "description": "The resolved input value" }, "previousValue": { "type": "string", "description": "The stored value from last run (empty string on first run)" }, "isFirstRun": { "type": "boolean", "description": "True when no previous state exists" } }, "required": ["hasChanged", "currentValue", "previousValue", "isFirstRun"] }
|
|
1123
|
+
},
|
|
1085
1124
|
"detectPII": {
|
|
1086
1125
|
stepType: "detectPII",
|
|
1087
1126
|
description: "Scan text for personally identifiable information using Microsoft Presidio.",
|
|
@@ -1089,6 +1128,27 @@ var stepMetadata = {
|
|
|
1089
1128
|
inputSchema: { "type": "object", "properties": { "input": { "type": "string", "description": "Text to scan for personally identifiable information" }, "language": { "type": "string", "description": 'Language code of the input text (e.g. "en")' }, "entities": { "type": "array", "items": { "type": "string" }, "description": 'PII entity types to scan for (e.g. ["PHONE_NUMBER", "EMAIL_ADDRESS"]). Empty array means nothing is scanned.' }, "detectedStepId": { "type": "string", "description": "Step to transition to if PII is detected (workflow mode)" }, "notDetectedStepId": { "type": "string", "description": "Step to transition to if no PII is detected (workflow mode)" }, "outputLogVariable": { "type": "string", "description": "Variable name to store the raw detection results" } }, "required": ["input", "language", "entities"] },
|
|
1090
1129
|
outputSchema: { "type": "object", "properties": { "detected": { "type": "boolean", "description": "Whether any PII was found in the input text" }, "detections": { "type": "array", "items": { "type": "object", "properties": { "entity_type": { "type": "string", "description": 'PII entity type (e.g. "PHONE_NUMBER", "EMAIL_ADDRESS", "PERSON")' }, "start": { "type": "number", "description": "Start character index in the input text" }, "end": { "type": "number", "description": "End character index in the input text" }, "score": { "type": "number", "description": "Confidence score between 0 and 1" } }, "required": ["entity_type", "start", "end", "score"] }, "description": "List of detected PII entities with type, location, and confidence" } }, "required": ["detected", "detections"] }
|
|
1091
1130
|
},
|
|
1131
|
+
"discordEditMessage": {
|
|
1132
|
+
stepType: "discordEditMessage",
|
|
1133
|
+
description: "Edit a previously sent Discord channel message. Use with the message ID returned by Send Discord Message.",
|
|
1134
|
+
usageNotes: "- Only messages sent by the bot can be edited.\n- The messageId is returned by the Send Discord Message step.\n- Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\n- When editing with an attachment, the new attachment replaces any previous attachments on the message.\n- URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).",
|
|
1135
|
+
inputSchema: { "type": "object", "properties": { "botToken": { "type": "string", "description": "Discord bot token for authentication" }, "channelId": { "type": "string", "description": "Discord channel ID containing the message" }, "messageId": { "type": "string", "description": "ID of the message to edit (returned by Send Discord Message)" }, "text": { "type": "string", "description": "New message text to replace the existing content" }, "attachmentUrl": { "type": "string", "description": "URL of a file to download and attach to the message (replaces any previous attachments)" } }, "required": ["botToken", "channelId", "messageId", "text"] },
|
|
1136
|
+
outputSchema: { "description": "This step does not produce output data." }
|
|
1137
|
+
},
|
|
1138
|
+
"discordSendFollowUp": {
|
|
1139
|
+
stepType: "discordSendFollowUp",
|
|
1140
|
+
description: "Send a follow-up message to a Discord slash command interaction.",
|
|
1141
|
+
usageNotes: "- Requires the applicationId and interactionToken from the Discord trigger variables.\n- Follow-up messages appear as new messages in the channel after the initial response.\n- Returns the sent message ID.\n- Interaction tokens expire after 15 minutes.\n- Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\n- URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).",
|
|
1142
|
+
inputSchema: { "type": "object", "properties": { "applicationId": { "type": "string", "description": "Discord application ID from the bot registration" }, "interactionToken": { "type": "string", "description": "Interaction token provided by the Discord trigger \u2014 expires after 15 minutes" }, "text": { "type": "string", "description": "Message text to send as a follow-up" }, "attachmentUrl": { "type": "string", "description": "URL of a file to download and attach to the message" } }, "required": ["applicationId", "interactionToken", "text"] },
|
|
1143
|
+
outputSchema: { "type": "object", "properties": { "messageId": { "type": "string", "description": "ID of the sent follow-up message" } }, "required": ["messageId"] }
|
|
1144
|
+
},
|
|
1145
|
+
"discordSendMessage": {
|
|
1146
|
+
stepType: "discordSendMessage",
|
|
1147
|
+
description: "Send a message to Discord \u2014 either edit the loading message or send a new channel message.",
|
|
1148
|
+
usageNotes: '- mode "edit" replaces the loading message (interaction response) with the final result. Uses applicationId and interactionToken from trigger variables. No bot permissions required.\n- mode "send" sends a new message to a channel. Uses botToken and channelId from trigger variables. Returns a messageId that can be used with Edit Discord Message.\n- Optionally attach a file by providing a URL to attachmentUrl. The file is downloaded and uploaded to Discord.\n- URLs in the text are automatically embedded by Discord (link previews for images, videos, etc.).\n- Interaction tokens expire after 15 minutes.',
|
|
1149
|
+
inputSchema: { "type": "object", "properties": { "mode": { "enum": ["edit", "send"], "type": "string", "description": '"edit" replaces the loading message, "send" sends a new channel message' }, "text": { "type": "string", "description": "Message text to send" }, "applicationId": { "type": "string", "description": 'Discord application ID from the bot registration (required for "reply" mode)' }, "interactionToken": { "type": "string", "description": 'Interaction token provided by the Discord trigger \u2014 expires after 15 minutes (required for "reply" mode)' }, "botToken": { "type": "string", "description": 'Discord bot token for authentication (required for "send" mode)' }, "channelId": { "type": "string", "description": 'Discord channel ID to send the message to (required for "send" mode)' }, "attachmentUrl": { "type": "string", "description": "URL of a file to download and attach to the message" } }, "required": ["mode", "text"] },
|
|
1150
|
+
outputSchema: { "type": "object", "properties": { "messageId": { "type": "string", "description": 'ID of the sent Discord message, only present in "send" mode (use with Edit Discord Message)' } } }
|
|
1151
|
+
},
|
|
1092
1152
|
"downloadVideo": {
|
|
1093
1153
|
stepType: "downloadVideo",
|
|
1094
1154
|
description: "Download a video file",
|
|
@@ -1416,9 +1476,13 @@ var stepMetadata = {
|
|
|
1416
1476
|
},
|
|
1417
1477
|
"logic": {
|
|
1418
1478
|
stepType: "logic",
|
|
1419
|
-
description: "
|
|
1420
|
-
usageNotes:
|
|
1421
|
-
|
|
1479
|
+
description: "Route execution to different branches based on AI evaluation, comparison operators, or workflow jumps.",
|
|
1480
|
+
usageNotes: `- Supports two modes: "ai" (default) uses an AI model to pick the most accurate statement; "comparison" uses operator-based checks.
|
|
1481
|
+
- In AI mode, the model picks the most accurate statement from the list. All possible cases must be specified.
|
|
1482
|
+
- In comparison mode, the context is the left operand and each case's condition is the right operand. First matching case wins. Use operator "default" as a fallback.
|
|
1483
|
+
- Requires at least two cases.
|
|
1484
|
+
- Each case can transition to a step in the current workflow (destinationStepId) or jump to another workflow (destinationWorkflowId).`,
|
|
1485
|
+
inputSchema: { "type": "object", "properties": { "mode": { "enum": ["ai", "comparison"], "type": "string", "description": "Evaluation mode: 'ai' for LLM-based, 'comparison' for operator-based. Default: 'ai'" }, "context": { "type": "string", "description": "AI mode: prompt context. Comparison mode: left operand (resolved via variables)." }, "cases": { "type": "array", "items": { "anyOf": [{ "type": "object", "properties": { "id": { "type": "string", "description": "Unique case identifier" }, "condition": { "type": "string", "description": "AI mode: statement to evaluate. Comparison mode: right operand value." }, "operator": { "enum": ["eq", "neq", "gt", "lt", "gte", "lte", "exists", "not_exists", "contains", "not_contains", "default"], "type": "string", "description": "Comparison operator (comparison mode only)" }, "destinationStepId": { "type": "string", "description": "Step to transition to if this case wins (workflow mode only)" }, "destinationWorkflowId": { "type": "string", "description": "Workflow to jump to if this case wins (uses that workflow's initial step)" } }, "required": ["id", "condition"] }, { "type": "string" }] }, "description": "List of conditions to evaluate (objects for managed UIs, strings for code)" }, "modelOverride": { "type": "object", "properties": { "model": { "type": "string", "description": 'Model identifier (e.g. "gpt-4", "claude-3-opus")' }, "temperature": { "type": "number", "description": "Sampling temperature for the model (0-2)" }, "maxResponseTokens": { "type": "number", "description": "Maximum number of tokens in the model's response" }, "ignorePreamble": { "type": "boolean", "description": "Whether to skip the system preamble/instructions" }, "userMessagePreprocessor": { "type": "object", "properties": { "dataSource": { "type": "string", "description": "Data source identifier for the preprocessor" }, "messageTemplate": { "type": "string", "description": "Template string applied to user messages before sending to the model" }, "maxResults": { "type": "number", "description": "Maximum number of results to include from the data source" }, "enabled": { "type": "boolean", "description": "Whether the preprocessor is active" }, "shouldInherit": { "type": "boolean", "description": "Whether child steps should inherit this preprocessor configuration" } }, "description": "Preprocessor applied to user messages before sending to the model" }, "preamble": { "type": "string", "description": "System preamble/instructions for the model" }, "multiModelEnabled": { "type": "boolean", "description": "Whether multi-model candidate generation is enabled" }, "editResponseEnabled": { "type": "boolean", "description": "Whether the user can edit the model's response" }, "config": { "type": "object", "description": "Additional model-specific configuration" } }, "required": ["model", "temperature", "maxResponseTokens"], "description": "Optional model settings override; uses the organization default if not specified (AI mode only)" } }, "required": ["context", "cases"], "description": "Configuration for the router step" },
|
|
1422
1486
|
outputSchema: { "type": "object", "properties": { "selectedCase": { "type": "number", "description": "The index of the winning case" } }, "required": ["selectedCase"] }
|
|
1423
1487
|
},
|
|
1424
1488
|
"makeDotComRunScenario": {
|
|
@@ -1554,6 +1618,13 @@ var stepMetadata = {
|
|
|
1554
1618
|
inputSchema: { "type": "object", "properties": { "videoUrl": { "type": "string", "description": "URL of the source video to resize" }, "mode": { "enum": ["fit", "exact"], "type": "string", "description": "Resize mode: 'fit' scales within max dimensions, 'exact' forces exact dimensions" }, "maxWidth": { "type": "number", "description": "Maximum width in pixels (used with 'fit' mode)" }, "maxHeight": { "type": "number", "description": "Maximum height in pixels (used with 'fit' mode)" }, "width": { "type": "number", "description": "Exact width in pixels (used with 'exact' mode)" }, "height": { "type": "number", "description": "Exact height in pixels (used with 'exact' mode)" }, "strategy": { "enum": ["pad", "crop"], "type": "string", "description": "Strategy for handling aspect ratio mismatch in 'exact' mode" }, "skipAssetCreation": { "type": "boolean", "description": "When true, the result will not appear in the user's asset history. Useful for intermediate compositing steps." } }, "required": ["videoUrl", "mode"] },
|
|
1555
1619
|
outputSchema: { "type": "object", "properties": { "videoUrl": { "type": "string", "description": "URL of the resized video" } }, "required": ["videoUrl"] }
|
|
1556
1620
|
},
|
|
1621
|
+
"runFromConnectorRegistry": {
|
|
1622
|
+
stepType: "runFromConnectorRegistry",
|
|
1623
|
+
description: "Run a raw API connector to a third-party service",
|
|
1624
|
+
usageNotes: '- Use the /developer/v2/helpers/connectors endpoint to list available services and actions.\n- Use /developer/v2/helpers/connectors/{serviceId}/{actionId} to get the full input configuration for an action.\n- Use /developer/v2/helpers/connections to list your available OAuth connections.\n- The actionId format is "serviceId/actionId" (e.g., "slack/send-message").\n- Pass a __connectionId to authenticate the request with a specific OAuth connection, otherwise the default will be used (if configured).',
|
|
1625
|
+
inputSchema: { "type": "object", "properties": { "actionId": { "type": "string", "description": "The connector action identifier in the format serviceId/actionId" }, "displayName": { "type": "string", "description": "Human-readable name of the connector action" }, "icon": { "type": "string", "description": "Icon URL for the connector" }, "configurationValues": { "type": "object", "description": "Key-value configuration parameters for the connector action" }, "__connectionId": { "type": "string", "description": "OAuth connection ID used to authenticate the connector request" } }, "required": ["actionId", "displayName", "icon", "configurationValues"], "description": "Configuration for the connector registry step" },
|
|
1626
|
+
outputSchema: { "type": "object", "properties": { "data": { "type": "object", "description": "Key-value map of output variables set by the connector" } }, "required": ["data"] }
|
|
1627
|
+
},
|
|
1557
1628
|
"runPackagedWorkflow": {
|
|
1558
1629
|
stepType: "runPackagedWorkflow",
|
|
1559
1630
|
description: 'Run a packaged workflow ("custom block")',
|