@probelabs/visor 0.1.153 → 0.1.154-ee

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 (94) hide show
  1. package/dist/index.js +2023 -88
  2. package/dist/providers/mcp-custom-sse-server.d.ts.map +1 -1
  3. package/dist/scheduler/schedule-tool.d.ts.map +1 -1
  4. package/dist/sdk/{check-provider-registry-OEPUY5P6.mjs → check-provider-registry-PK3OTEX6.mjs} +7 -7
  5. package/dist/sdk/{check-provider-registry-ZOGNKTC3.mjs → check-provider-registry-PZ6K7G4G.mjs} +7 -7
  6. package/dist/sdk/{chunk-CPYQDJ27.mjs → chunk-AS6LIEO4.mjs} +3 -3
  7. package/dist/sdk/{chunk-Y3XWPKFP.mjs → chunk-GQ7H7E4Y.mjs} +2 -2
  8. package/dist/sdk/{chunk-Y3XWPKFP.mjs.map → chunk-GQ7H7E4Y.mjs.map} +1 -1
  9. package/dist/sdk/{chunk-KBX4OIXL.mjs → chunk-ILIWDV37.mjs} +2 -2
  10. package/dist/sdk/{chunk-U7KB66AN.mjs → chunk-LIRIQICI.mjs} +56 -36
  11. package/dist/sdk/chunk-LIRIQICI.mjs.map +1 -0
  12. package/dist/sdk/{chunk-DNDS7R3N.mjs → chunk-NZADFXHE.mjs} +7 -1
  13. package/dist/sdk/chunk-NZADFXHE.mjs.map +1 -0
  14. package/dist/sdk/{chunk-ZCUGMT7X.mjs → chunk-SPCGI24K.mjs} +3 -3
  15. package/dist/sdk/{chunk-EYQWEVZF.mjs → chunk-WPF7PJ64.mjs} +55 -35
  16. package/dist/sdk/chunk-WPF7PJ64.mjs.map +1 -0
  17. package/dist/sdk/{config-SW3VO4DQ.mjs → config-CWHZO5AL.mjs} +2 -2
  18. package/dist/sdk/{failure-condition-evaluator-R3UE4PE7.mjs → failure-condition-evaluator-LYFZMQ6Y.mjs} +3 -3
  19. package/dist/sdk/{github-frontend-6KZSVSPC.mjs → github-frontend-XKPAYXOT.mjs} +3 -3
  20. package/dist/sdk/{host-A5HS6F6G.mjs → host-6DJCOUJE.mjs} +2 -2
  21. package/dist/sdk/{host-YBJOWFT4.mjs → host-7Y25DDOR.mjs} +2 -2
  22. package/dist/sdk/knex-store-CRORFJE6.mjs +527 -0
  23. package/dist/sdk/knex-store-CRORFJE6.mjs.map +1 -0
  24. package/dist/sdk/loader-NJCF7DUS.mjs +89 -0
  25. package/dist/sdk/loader-NJCF7DUS.mjs.map +1 -0
  26. package/dist/sdk/opa-policy-engine-S2S2ULEI.mjs +655 -0
  27. package/dist/sdk/opa-policy-engine-S2S2ULEI.mjs.map +1 -0
  28. package/dist/sdk/{routing-MMEOAH34.mjs → routing-L224WQSY.mjs} +4 -4
  29. package/dist/sdk/{schedule-tool-NMCFABHK.mjs → schedule-tool-HRFONU5J.mjs} +7 -7
  30. package/dist/sdk/{schedule-tool-NYRLSV4F.mjs → schedule-tool-KZ36XTW4.mjs} +7 -7
  31. package/dist/sdk/{schedule-tool-handler-2TFSBZ2O.mjs → schedule-tool-handler-2V4EJEQT.mjs} +7 -7
  32. package/dist/sdk/{schedule-tool-handler-DRVRLVGD.mjs → schedule-tool-handler-KXZC4ZOR.mjs} +7 -7
  33. package/dist/sdk/sdk.js +1677 -277
  34. package/dist/sdk/sdk.js.map +1 -1
  35. package/dist/sdk/sdk.mjs +6 -6
  36. package/dist/sdk/{trace-helpers-JJLVZ2RJ.mjs → trace-helpers-AWTAWKRA.mjs} +2 -2
  37. package/dist/sdk/validator-XTZJZZJH.mjs +134 -0
  38. package/dist/sdk/validator-XTZJZZJH.mjs.map +1 -0
  39. package/dist/sdk/{workflow-check-provider-GIW4WECT.mjs → workflow-check-provider-HGFTX64I.mjs} +7 -7
  40. package/dist/sdk/{workflow-check-provider-UQMMFLSK.mjs → workflow-check-provider-TXAEY7OU.mjs} +7 -7
  41. package/dist/sdk/{workflow-registry-MHUSKSD6.mjs → workflow-registry-NGV3SESX.mjs} +2 -2
  42. package/dist/slack/schedule-tool-handler.d.ts.map +1 -1
  43. package/dist/workflow-registry.d.ts.map +1 -1
  44. package/package.json +2 -2
  45. package/dist/output/traces/run-2026-03-04T13-24-27-240Z.ndjson +0 -138
  46. package/dist/output/traces/run-2026-03-04T13-25-12-321Z.ndjson +0 -2197
  47. package/dist/sdk/check-provider-registry-CSIZGIKC.mjs +0 -29
  48. package/dist/sdk/chunk-DNDS7R3N.mjs.map +0 -1
  49. package/dist/sdk/chunk-EYQWEVZF.mjs.map +0 -1
  50. package/dist/sdk/chunk-NYK7WDGH.mjs +0 -43754
  51. package/dist/sdk/chunk-NYK7WDGH.mjs.map +0 -1
  52. package/dist/sdk/chunk-SMR5N5MG.mjs +0 -443
  53. package/dist/sdk/chunk-SMR5N5MG.mjs.map +0 -1
  54. package/dist/sdk/chunk-U7KB66AN.mjs.map +0 -1
  55. package/dist/sdk/chunk-VBN45DBR.mjs +0 -1502
  56. package/dist/sdk/chunk-WG7P66MJ.mjs +0 -739
  57. package/dist/sdk/chunk-WG7P66MJ.mjs.map +0 -1
  58. package/dist/sdk/chunk-ZCUGMT7X.mjs.map +0 -1
  59. package/dist/sdk/failure-condition-evaluator-Y32S6DB2.mjs +0 -17
  60. package/dist/sdk/github-frontend-6SIR7QWX.mjs +0 -1368
  61. package/dist/sdk/github-frontend-6SIR7QWX.mjs.map +0 -1
  62. package/dist/sdk/routing-U63OJMZQ.mjs +0 -25
  63. package/dist/sdk/schedule-tool-74VMD77T.mjs +0 -35
  64. package/dist/sdk/schedule-tool-handler-EOQBRZSD.mjs +0 -39
  65. package/dist/sdk/schedule-tool-handler-EOQBRZSD.mjs.map +0 -1
  66. package/dist/sdk/trace-helpers-2BIVADUK.mjs +0 -25
  67. package/dist/sdk/trace-helpers-2BIVADUK.mjs.map +0 -1
  68. package/dist/sdk/trace-helpers-JJLVZ2RJ.mjs.map +0 -1
  69. package/dist/sdk/workflow-check-provider-4NHVFLMQ.mjs +0 -29
  70. package/dist/sdk/workflow-check-provider-4NHVFLMQ.mjs.map +0 -1
  71. package/dist/sdk/workflow-check-provider-GIW4WECT.mjs.map +0 -1
  72. package/dist/sdk/workflow-check-provider-UQMMFLSK.mjs.map +0 -1
  73. package/dist/sdk/workflow-registry-MHUSKSD6.mjs.map +0 -1
  74. package/dist/traces/run-2026-03-04T13-24-27-240Z.ndjson +0 -138
  75. package/dist/traces/run-2026-03-04T13-25-12-321Z.ndjson +0 -2197
  76. /package/dist/sdk/{check-provider-registry-CSIZGIKC.mjs.map → check-provider-registry-PK3OTEX6.mjs.map} +0 -0
  77. /package/dist/sdk/{check-provider-registry-OEPUY5P6.mjs.map → check-provider-registry-PZ6K7G4G.mjs.map} +0 -0
  78. /package/dist/sdk/{chunk-CPYQDJ27.mjs.map → chunk-AS6LIEO4.mjs.map} +0 -0
  79. /package/dist/sdk/{chunk-KBX4OIXL.mjs.map → chunk-ILIWDV37.mjs.map} +0 -0
  80. /package/dist/sdk/{chunk-VBN45DBR.mjs.map → chunk-SPCGI24K.mjs.map} +0 -0
  81. /package/dist/sdk/{check-provider-registry-ZOGNKTC3.mjs.map → config-CWHZO5AL.mjs.map} +0 -0
  82. /package/dist/sdk/{config-SW3VO4DQ.mjs.map → failure-condition-evaluator-LYFZMQ6Y.mjs.map} +0 -0
  83. /package/dist/sdk/{github-frontend-6KZSVSPC.mjs.map → github-frontend-XKPAYXOT.mjs.map} +0 -0
  84. /package/dist/sdk/{host-A5HS6F6G.mjs.map → host-6DJCOUJE.mjs.map} +0 -0
  85. /package/dist/sdk/{host-YBJOWFT4.mjs.map → host-7Y25DDOR.mjs.map} +0 -0
  86. /package/dist/sdk/{failure-condition-evaluator-R3UE4PE7.mjs.map → routing-L224WQSY.mjs.map} +0 -0
  87. /package/dist/sdk/{failure-condition-evaluator-Y32S6DB2.mjs.map → schedule-tool-HRFONU5J.mjs.map} +0 -0
  88. /package/dist/sdk/{routing-MMEOAH34.mjs.map → schedule-tool-KZ36XTW4.mjs.map} +0 -0
  89. /package/dist/sdk/{routing-U63OJMZQ.mjs.map → schedule-tool-handler-2V4EJEQT.mjs.map} +0 -0
  90. /package/dist/sdk/{schedule-tool-74VMD77T.mjs.map → schedule-tool-handler-KXZC4ZOR.mjs.map} +0 -0
  91. /package/dist/sdk/{schedule-tool-NMCFABHK.mjs.map → trace-helpers-AWTAWKRA.mjs.map} +0 -0
  92. /package/dist/sdk/{schedule-tool-NYRLSV4F.mjs.map → workflow-check-provider-HGFTX64I.mjs.map} +0 -0
  93. /package/dist/sdk/{schedule-tool-handler-2TFSBZ2O.mjs.map → workflow-check-provider-TXAEY7OU.mjs.map} +0 -0
  94. /package/dist/sdk/{schedule-tool-handler-DRVRLVGD.mjs.map → workflow-registry-NGV3SESX.mjs.map} +0 -0
@@ -417,6 +417,12 @@ var init_workflow_registry = __esm({
417
417
  message: "Input parameter schema is recommended"
418
418
  });
419
419
  }
420
+ if (input.schema?.type === "array" && !input.schema.items) {
421
+ warnings.push({
422
+ path: `inputs[${i}].schema`,
423
+ message: 'Array schema should define "items" (e.g. items: { type: string }). Some LLM providers (Gemini) reject array schemas without items.'
424
+ });
425
+ }
420
426
  }
421
427
  }
422
428
  if (workflow.outputs) {
@@ -613,4 +619,4 @@ export {
613
619
  WorkflowRegistry,
614
620
  init_workflow_registry
615
621
  };
616
- //# sourceMappingURL=chunk-DNDS7R3N.mjs.map
622
+ //# sourceMappingURL=chunk-NZADFXHE.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/dependency-resolver.ts","../../src/workflow-registry.ts"],"sourcesContent":["/**\n * Dependency resolution and execution ordering for checks\n */\n\nexport interface CheckNode {\n id: string;\n dependencies: string[];\n dependents: string[];\n depth: number;\n}\n\nexport interface ExecutionGroup {\n /** Checks that can run in parallel */\n parallel: string[];\n /** Execution level/wave (0 = no dependencies, 1 = depends on level 0, etc.) */\n level: number;\n}\n\nexport interface DependencyGraph {\n nodes: Map<string, CheckNode>;\n executionOrder: ExecutionGroup[];\n hasCycles: boolean;\n cycleNodes?: string[];\n}\n\nexport class DependencyResolver {\n /**\n * Build dependency graph from check dependencies\n */\n static buildDependencyGraph(checkDependencies: Record<string, string[]>): DependencyGraph {\n const nodes = new Map<string, CheckNode>();\n\n // Initialize all nodes\n for (const checkId of Object.keys(checkDependencies)) {\n nodes.set(checkId, {\n id: checkId,\n dependencies: checkDependencies[checkId] || [],\n dependents: [],\n depth: 0,\n });\n }\n\n // Build bidirectional relationships\n for (const [checkId, dependencies] of Object.entries(checkDependencies)) {\n for (const depId of dependencies || []) {\n if (!nodes.has(depId)) {\n throw new Error(`Check \"${checkId}\" depends on \"${depId}\" but \"${depId}\" is not defined`);\n }\n\n const depNode = nodes.get(depId)!;\n depNode.dependents.push(checkId);\n }\n }\n\n // Detect cycles using DFS\n const cycleDetection = this.detectCycles(nodes);\n if (cycleDetection.hasCycles) {\n return {\n nodes,\n executionOrder: [],\n hasCycles: true,\n cycleNodes: cycleDetection.cycleNodes,\n };\n }\n\n // Calculate execution order using topological sort\n const executionOrder = this.topologicalSort(nodes);\n\n return {\n nodes,\n executionOrder,\n hasCycles: false,\n };\n }\n\n /**\n * Detect cycles in the dependency graph using DFS\n */\n private static detectCycles(nodes: Map<string, CheckNode>): {\n hasCycles: boolean;\n cycleNodes?: string[];\n } {\n const visited = new Set<string>();\n const recursionStack = new Set<string>();\n const cycleNodes: string[] = [];\n\n const dfs = (nodeId: string): boolean => {\n if (recursionStack.has(nodeId)) {\n cycleNodes.push(nodeId);\n return true;\n }\n if (visited.has(nodeId)) {\n return false;\n }\n\n visited.add(nodeId);\n recursionStack.add(nodeId);\n\n const node = nodes.get(nodeId);\n if (node) {\n for (const depId of node.dependencies) {\n if (dfs(depId)) {\n cycleNodes.push(nodeId);\n return true;\n }\n }\n }\n\n recursionStack.delete(nodeId);\n return false;\n };\n\n for (const nodeId of nodes.keys()) {\n if (!visited.has(nodeId)) {\n if (dfs(nodeId)) {\n return { hasCycles: true, cycleNodes: [...new Set(cycleNodes)] };\n }\n }\n }\n\n return { hasCycles: false };\n }\n\n /**\n * Perform topological sort to determine execution order\n * Groups checks that can run in parallel at each level\n */\n private static topologicalSort(nodes: Map<string, CheckNode>): ExecutionGroup[] {\n const remainingNodes = new Map(nodes);\n const executionGroups: ExecutionGroup[] = [];\n let level = 0;\n\n while (remainingNodes.size > 0) {\n // Find nodes with no remaining dependencies\n const readyNodes: string[] = [];\n\n for (const [nodeId, node] of remainingNodes.entries()) {\n const unmetDependencies = node.dependencies.filter(depId => remainingNodes.has(depId));\n if (unmetDependencies.length === 0) {\n readyNodes.push(nodeId);\n }\n }\n\n if (readyNodes.length === 0) {\n // This shouldn't happen if cycle detection worked correctly\n throw new Error('Unable to resolve dependencies - possible circular dependency detected');\n }\n\n // Add this group to execution order\n executionGroups.push({\n parallel: readyNodes,\n level,\n });\n\n // Remove processed nodes\n for (const nodeId of readyNodes) {\n remainingNodes.delete(nodeId);\n }\n\n level++;\n }\n\n return executionGroups;\n }\n\n /**\n * Validate that all dependencies exist\n */\n static validateDependencies(\n checkIds: string[],\n dependencies: Record<string, string[]>\n ): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n const checkIdSet = new Set(checkIds);\n\n for (const [checkId, deps] of Object.entries(dependencies)) {\n if (!checkIdSet.has(checkId)) {\n errors.push(`Check \"${checkId}\" is not in the list of available checks`);\n continue;\n }\n\n for (const depId of deps || []) {\n if (!checkIdSet.has(depId)) {\n errors.push(`Check \"${checkId}\" depends on \"${depId}\" which is not available`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n }\n\n /**\n * Get all transitive dependencies (ancestors) for a given check\n * This returns all checks that must complete before the given check can run,\n * not just the direct dependencies.\n *\n * For example, if A -> B -> C, then:\n * - getAllDependencies(C) returns [A, B]\n * - getAllDependencies(B) returns [A]\n * - getAllDependencies(A) returns []\n *\n * @param checkId The check to find dependencies for\n * @param nodes The dependency graph nodes\n * @returns Array of all transitive dependency IDs\n */\n static getAllDependencies(checkId: string, nodes: Map<string, CheckNode>): string[] {\n const allDeps = new Set<string>();\n const visited = new Set<string>();\n\n const collectDependencies = (currentId: string) => {\n if (visited.has(currentId)) {\n return;\n }\n visited.add(currentId);\n\n const node = nodes.get(currentId);\n if (!node) {\n return;\n }\n\n // Add direct dependencies and recurse\n for (const depId of node.dependencies) {\n allDeps.add(depId);\n collectDependencies(depId);\n }\n };\n\n collectDependencies(checkId);\n return Array.from(allDeps);\n }\n\n /**\n * Get execution statistics for debugging\n */\n static getExecutionStats(graph: DependencyGraph): {\n totalChecks: number;\n parallelLevels: number;\n maxParallelism: number;\n averageParallelism: number;\n checksWithDependencies: number;\n } {\n const totalChecks = graph.nodes.size;\n const parallelLevels = graph.executionOrder.length;\n const maxParallelism = Math.max(...graph.executionOrder.map(group => group.parallel.length));\n const averageParallelism = totalChecks / parallelLevels;\n const checksWithDependencies = Array.from(graph.nodes.values()).filter(\n node => node.dependencies.length > 0\n ).length;\n\n return {\n totalChecks,\n parallelLevels,\n maxParallelism,\n averageParallelism,\n checksWithDependencies,\n };\n }\n}\n","/**\n * Workflow registry for managing reusable workflow definitions\n */\n\nimport {\n WorkflowDefinition,\n WorkflowRegistryEntry,\n WorkflowValidationResult,\n WorkflowImportOptions,\n JsonSchema,\n} from './types/workflow';\nimport { promises as fs } from 'fs';\nimport * as path from 'path';\nimport * as yaml from 'js-yaml';\nimport { logger } from './logger';\nimport { DependencyResolver } from './dependency-resolver';\nimport Ajv from 'ajv';\nimport addFormats from 'ajv-formats';\n\n/**\n * Registry for managing workflow definitions\n */\nexport class WorkflowRegistry {\n private static instance: WorkflowRegistry;\n private workflows: Map<string, WorkflowRegistryEntry> = new Map();\n private ajv: Ajv;\n\n private constructor() {\n this.ajv = new Ajv({ allErrors: true, strict: false });\n addFormats(this.ajv);\n }\n\n /**\n * Get the singleton instance of the workflow registry\n */\n public static getInstance(): WorkflowRegistry {\n if (!WorkflowRegistry.instance) {\n WorkflowRegistry.instance = new WorkflowRegistry();\n }\n return WorkflowRegistry.instance;\n }\n\n /**\n * Register a workflow definition\n */\n public register(\n workflow: WorkflowDefinition,\n source: string = 'inline',\n options?: { override?: boolean }\n ): WorkflowValidationResult {\n // Validate the workflow\n const validation = this.validateWorkflow(workflow);\n if (!validation.valid) {\n return validation;\n }\n\n // Check if workflow already exists\n if (this.workflows.has(workflow.id) && !options?.override) {\n return {\n valid: false,\n errors: [\n {\n path: 'id',\n message: `Workflow with ID '${workflow.id}' already exists`,\n value: workflow.id,\n },\n ],\n };\n }\n\n // Register the workflow\n this.workflows.set(workflow.id, {\n definition: workflow,\n source,\n registeredAt: new Date(),\n usage: {\n count: 0,\n },\n });\n\n logger.debug(`Registered workflow '${workflow.id}' from ${source}`);\n return { valid: true };\n }\n\n /**\n * Get a workflow by ID\n */\n public get(id: string): WorkflowDefinition | undefined {\n const entry = this.workflows.get(id);\n if (entry) {\n // Update usage statistics\n entry.usage = entry.usage || { count: 0 };\n entry.usage.count++;\n entry.usage.lastUsed = new Date();\n }\n return entry?.definition;\n }\n\n /**\n * Check if a workflow exists\n */\n public has(id: string): boolean {\n return this.workflows.has(id);\n }\n\n /**\n * List all registered workflows\n */\n public list(): WorkflowDefinition[] {\n return Array.from(this.workflows.values()).map(entry => entry.definition);\n }\n\n /**\n * Get workflow metadata\n */\n public getMetadata(id: string): WorkflowRegistryEntry | undefined {\n return this.workflows.get(id);\n }\n\n /**\n * Remove a workflow from the registry\n */\n public unregister(id: string): boolean {\n return this.workflows.delete(id);\n }\n\n /**\n * Clear all workflows\n */\n public clear(): void {\n this.workflows.clear();\n }\n\n /**\n * Import workflows from a file or URL\n */\n public async import(\n source: string,\n options?: WorkflowImportOptions\n ): Promise<WorkflowValidationResult[]> {\n return this.importInternal(source, options, new Set<string>());\n }\n\n private async importInternal(\n source: string,\n options: WorkflowImportOptions | undefined,\n visited: Set<string>\n ): Promise<WorkflowValidationResult[]> {\n const results: WorkflowValidationResult[] = [];\n\n try {\n // Load the workflow file\n const { content, resolvedSource, importBasePath } = await this.loadWorkflowContent(\n source,\n options?.basePath\n );\n const visitKey = resolvedSource || source;\n if (visited.has(visitKey)) {\n return results;\n }\n visited.add(visitKey);\n\n const data = this.parseWorkflowContent(content, resolvedSource || source);\n\n // Process top-level imports if present\n const topImports = !Array.isArray(data) ? (data as any)?.imports : undefined;\n if (Array.isArray(topImports)) {\n for (const childSource of topImports) {\n const childResults = await this.importInternal(\n childSource,\n { ...options, basePath: importBasePath },\n visited\n );\n results.push(...childResults);\n }\n }\n\n // Handle both single workflow and multiple workflows\n const workflows: WorkflowDefinition[] = Array.isArray(data) ? data : [data];\n\n for (const workflow of workflows) {\n const workflowImports = (workflow as any)?.imports;\n if (Array.isArray(workflowImports)) {\n for (const childSource of workflowImports) {\n const childResults = await this.importInternal(\n childSource,\n { ...options, basePath: importBasePath },\n visited\n );\n results.push(...childResults);\n }\n }\n\n // Validate if requested\n if (options?.validate !== false) {\n const validation = this.validateWorkflow(workflow);\n if (!validation.valid) {\n results.push(validation);\n continue;\n }\n\n // Run custom validators if provided\n if (options?.validators) {\n for (const validator of options.validators) {\n const customValidation = validator(workflow);\n if (!customValidation.valid) {\n results.push(customValidation);\n continue;\n }\n }\n }\n }\n\n // Strip out fields before registering\n const workflowWithoutExtras = { ...workflow };\n delete (workflowWithoutExtras as any).tests;\n delete (workflowWithoutExtras as any).imports;\n\n // Register the workflow (without tests/imports)\n const result = this.register(workflowWithoutExtras, source, {\n override: options?.override,\n });\n results.push(result);\n }\n } catch (error) {\n results.push({\n valid: false,\n errors: [\n {\n path: 'source',\n message: `Failed to import workflows from '${source}': ${error instanceof Error ? error.message : String(error)}`,\n value: source,\n },\n ],\n });\n }\n\n return results;\n }\n\n /**\n * Import multiple workflow sources\n */\n public async importMany(\n sources: string[],\n options?: WorkflowImportOptions\n ): Promise<Map<string, WorkflowValidationResult[]>> {\n const results = new Map<string, WorkflowValidationResult[]>();\n\n for (const source of sources) {\n const importResults = await this.import(source, options);\n results.set(source, importResults);\n }\n\n return results;\n }\n\n /**\n * Validate a workflow definition\n */\n public validateWorkflow(workflow: WorkflowDefinition): WorkflowValidationResult {\n const errors: Array<{ path: string; message: string; value?: unknown }> = [];\n const warnings: Array<{ path: string; message: string }> = [];\n\n // Validate required fields\n if (!workflow.id) {\n errors.push({ path: 'id', message: 'Workflow ID is required' });\n }\n\n if (!workflow.name) {\n errors.push({ path: 'name', message: 'Workflow name is required' });\n }\n\n if (!workflow.steps || Object.keys(workflow.steps).length === 0) {\n errors.push({ path: 'steps', message: 'Workflow must have at least one step' });\n }\n\n // Validate input parameters\n if (workflow.inputs) {\n for (let i = 0; i < workflow.inputs.length; i++) {\n const input = workflow.inputs[i];\n if (!input.name) {\n errors.push({ path: `inputs[${i}].name`, message: 'Input parameter name is required' });\n }\n if (!input.schema) {\n warnings.push({\n path: `inputs[${i}].schema`,\n message: 'Input parameter schema is recommended',\n });\n }\n if (input.schema?.type === 'array' && !input.schema.items) {\n warnings.push({\n path: `inputs[${i}].schema`,\n message:\n 'Array schema should define \"items\" (e.g. items: { type: string }). Some LLM providers (Gemini) reject array schemas without items.',\n });\n }\n }\n }\n\n // Validate output parameters\n if (workflow.outputs) {\n for (let i = 0; i < workflow.outputs.length; i++) {\n const output = workflow.outputs[i];\n if (!output.name) {\n errors.push({ path: `outputs[${i}].name`, message: 'Output parameter name is required' });\n }\n if (!output.value && !output.value_js) {\n errors.push({\n path: `outputs[${i}]`,\n message: 'Output parameter must have either value or value_js',\n });\n }\n }\n }\n\n // Validate steps\n for (const [stepId, step] of Object.entries(workflow.steps || {})) {\n // Validate step dependencies\n if (step.depends_on) {\n for (const dep of step.depends_on) {\n if (!workflow.steps[dep]) {\n errors.push({\n path: `steps.${stepId}.depends_on`,\n message: `Step '${stepId}' depends on non-existent step '${dep}'`,\n value: dep,\n });\n }\n }\n }\n\n // Validate input mappings\n if (step.inputs) {\n for (const [inputName, mapping] of Object.entries(step.inputs)) {\n if (typeof mapping === 'object' && mapping !== null && 'source' in mapping) {\n const typedMapping = mapping as any;\n if (typedMapping.source === 'step' && !typedMapping.stepId) {\n errors.push({\n path: `steps.${stepId}.inputs.${inputName}`,\n message: 'Step input mapping with source \"step\" must have stepId',\n });\n }\n if (typedMapping.source === 'param') {\n // Validate that the parameter exists\n const paramExists = workflow.inputs?.some(p => p.name === typedMapping.value);\n if (!paramExists) {\n errors.push({\n path: `steps.${stepId}.inputs.${inputName}`,\n message: `Step input references non-existent parameter '${typedMapping.value}'`,\n value: typedMapping.value,\n });\n }\n }\n }\n }\n }\n }\n\n // Check for circular dependencies\n const circularDeps = this.detectCircularDependencies(workflow);\n if (circularDeps.length > 0) {\n errors.push({\n path: 'steps',\n message: `Circular dependencies detected: ${circularDeps.join(' -> ')}`,\n });\n }\n\n return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n }\n\n /**\n * Validate input values against workflow input schema\n */\n public validateInputs(\n workflow: WorkflowDefinition,\n inputs: Record<string, unknown>\n ): WorkflowValidationResult {\n const errors: Array<{ path: string; message: string; value?: unknown }> = [];\n\n if (!workflow.inputs) {\n return { valid: true };\n }\n\n // Check required inputs\n for (const param of workflow.inputs) {\n if (param.required !== false && !(param.name in inputs) && param.default === undefined) {\n errors.push({\n path: `inputs.${param.name}`,\n message: `Required input '${param.name}' is missing`,\n });\n }\n }\n\n // Validate input schemas\n for (const param of workflow.inputs) {\n if (param.name in inputs && param.schema) {\n const value = inputs[param.name];\n const valid = this.validateAgainstSchema(value, param.schema);\n if (!valid.valid) {\n errors.push({\n path: `inputs.${param.name}`,\n message: valid.error || 'Invalid input value',\n value,\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors: errors.length > 0 ? errors : undefined,\n };\n }\n\n /**\n * Load workflow content from file or URL\n */\n private async loadWorkflowContent(\n source: string,\n basePath?: string\n ): Promise<{ content: string; resolvedSource: string; importBasePath?: string }> {\n const baseIsUrl = basePath?.startsWith('http://') || basePath?.startsWith('https://');\n\n // Handle visor:// and visor-ee:// built-in workflow URLs\n // Resolves to the defaults/ directory shipped with the package\n if (source.startsWith('visor://') || source.startsWith('visor-ee://')) {\n const relativePath = source.replace(/^visor(?:-ee)?:\\/\\//, '');\n const defaultsDir = path.resolve(__dirname, '..', 'defaults');\n const filePath = path.resolve(defaultsDir, relativePath);\n // Prevent path traversal outside defaults directory\n if (!filePath.startsWith(defaultsDir + path.sep)) {\n throw new Error(`Invalid visor:// path: resolved path escapes defaults directory`);\n }\n const content = await fs.readFile(filePath, 'utf-8');\n return { content, resolvedSource: filePath, importBasePath: path.dirname(filePath) };\n }\n\n // Handle URLs\n if (source.startsWith('http://') || source.startsWith('https://')) {\n const response = await fetch(source);\n if (!response.ok) {\n throw new Error(`Failed to fetch workflow from ${source}: ${response.statusText}`);\n }\n const importBasePath = new URL('.', source).toString();\n return { content: await response.text(), resolvedSource: source, importBasePath };\n }\n\n // Handle relative URLs when basePath is a URL\n if (baseIsUrl) {\n const resolvedUrl = new URL(source, basePath).toString();\n const response = await fetch(resolvedUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch workflow from ${resolvedUrl}: ${response.statusText}`);\n }\n const importBasePath = new URL('.', resolvedUrl).toString();\n return { content: await response.text(), resolvedSource: resolvedUrl, importBasePath };\n }\n\n // Handle file paths\n const filePath = path.isAbsolute(source)\n ? source\n : path.resolve(basePath || process.cwd(), source);\n const content = await fs.readFile(filePath, 'utf-8');\n return { content, resolvedSource: filePath, importBasePath: path.dirname(filePath) };\n }\n\n /**\n * Parse workflow content (YAML or JSON)\n */\n private parseWorkflowContent(content: string, source: string): any {\n // Try JSON first\n try {\n return JSON.parse(content);\n } catch {\n // Try YAML\n try {\n return yaml.load(content);\n } catch (error) {\n throw new Error(\n `Failed to parse workflow file ${source}: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n }\n\n /**\n * Detect circular dependencies in workflow steps using DependencyResolver\n */\n private detectCircularDependencies(workflow: WorkflowDefinition): string[] {\n // Build dependency map\n const dependencies: Record<string, string[]> = {};\n for (const [stepId, step] of Object.entries(workflow.steps || {})) {\n // Normalize depends_on to array (supports string | string[])\n const rawDeps = step.depends_on;\n dependencies[stepId] = Array.isArray(rawDeps) ? rawDeps : rawDeps ? [rawDeps] : [];\n }\n\n try {\n // Use DependencyResolver to check for cycles\n const graph = DependencyResolver.buildDependencyGraph(dependencies);\n\n if (graph.hasCycles && graph.cycleNodes) {\n return graph.cycleNodes;\n }\n\n return [];\n } catch {\n // DependencyResolver throws error for non-existent dependencies\n // This should be caught by the dependency validation in validateWorkflow\n // Return empty array here and let the validation handle it\n return [];\n }\n }\n\n /**\n * Validate a value against a JSON schema\n */\n private validateAgainstSchema(\n value: unknown,\n schema: JsonSchema\n ): { valid: boolean; error?: string } {\n try {\n const validate = this.ajv.compile(schema as any);\n const valid = validate(value);\n if (!valid) {\n const errors = validate.errors\n ?.map(e => `${e.instancePath || '/'}: ${e.message}`)\n .join(', ');\n return { valid: false, error: errors };\n }\n return { valid: true };\n } catch (error) {\n return { valid: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n}\n"],"mappings":"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","names":["filePath","content"]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  FailureConditionEvaluator,
3
3
  init_failure_condition_evaluator
4
- } from "./chunk-WG7P66MJ.mjs";
4
+ } from "./chunk-ILIWDV37.mjs";
5
5
  import {
6
6
  addEvent,
7
7
  init_trace_helpers
8
- } from "./chunk-Y3XWPKFP.mjs";
8
+ } from "./chunk-GQ7H7E4Y.mjs";
9
9
  import {
10
10
  createExtendedLiquid,
11
11
  init_liquid_extensions
@@ -1499,4 +1499,4 @@ export {
1499
1499
  evaluateTransitions,
1500
1500
  init_routing
1501
1501
  };
1502
- //# sourceMappingURL=chunk-ZCUGMT7X.mjs.map
1502
+ //# sourceMappingURL=chunk-SPCGI24K.mjs.map
@@ -29,11 +29,11 @@ import {
29
29
  WorkflowRegistry,
30
30
  init_dependency_resolver,
31
31
  init_workflow_registry
32
- } from "./chunk-DNDS7R3N.mjs";
32
+ } from "./chunk-NZADFXHE.mjs";
33
33
  import {
34
34
  config_exports,
35
35
  init_config
36
- } from "./chunk-CPYQDJ27.mjs";
36
+ } from "./chunk-AS6LIEO4.mjs";
37
37
  import {
38
38
  ExecutionJournal,
39
39
  checkLoopBudget,
@@ -42,11 +42,11 @@ import {
42
42
  init_routing,
43
43
  init_snapshot_store,
44
44
  snapshot_store_exports
45
- } from "./chunk-ZCUGMT7X.mjs";
45
+ } from "./chunk-SPCGI24K.mjs";
46
46
  import {
47
47
  FailureConditionEvaluator,
48
48
  init_failure_condition_evaluator
49
- } from "./chunk-WG7P66MJ.mjs";
49
+ } from "./chunk-ILIWDV37.mjs";
50
50
  import {
51
51
  addEvent,
52
52
  emitNdjsonFallback,
@@ -57,7 +57,7 @@ import {
57
57
  setSpanAttributes,
58
58
  trace_helpers_exports,
59
59
  withActiveSpan
60
- } from "./chunk-Y3XWPKFP.mjs";
60
+ } from "./chunk-GQ7H7E4Y.mjs";
61
61
  import {
62
62
  addDiagramBlock,
63
63
  init_metrics
@@ -3959,7 +3959,7 @@ async function executeWorkflowAsTool(workflowId, args, context2, argsOverrides)
3959
3959
  ...args,
3960
3960
  ...argsOverrides
3961
3961
  };
3962
- const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-GIW4WECT.mjs");
3962
+ const { WorkflowCheckProvider: WorkflowCheckProvider2 } = await import("./workflow-check-provider-HGFTX64I.mjs");
3963
3963
  const provider = new WorkflowCheckProvider2();
3964
3964
  const checkConfig = {
3965
3965
  type: "workflow",
@@ -9255,7 +9255,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9255
9255
  }
9256
9256
  }
9257
9257
  try {
9258
- const { evaluateTransitions } = await import("./routing-MMEOAH34.mjs");
9258
+ const { evaluateTransitions } = await import("./routing-L224WQSY.mjs");
9259
9259
  const transTarget = await evaluateTransitions(
9260
9260
  onFinish.transitions,
9261
9261
  forEachParent,
@@ -9315,7 +9315,7 @@ async function executeCheckWithForEachItems2(checkId, forEachParent, forEachItem
9315
9315
  `[LevelDispatch] Error evaluating on_finish transitions for ${forEachParent}: ${e instanceof Error ? e.message : String(e)}`
9316
9316
  );
9317
9317
  }
9318
- const { evaluateGoto: evaluateGoto2 } = await import("./routing-MMEOAH34.mjs");
9318
+ const { evaluateGoto: evaluateGoto2 } = await import("./routing-L224WQSY.mjs");
9319
9319
  if (context2.debug) {
9320
9320
  logger.info(
9321
9321
  `[LevelDispatch] Evaluating on_finish.goto_js for forEach parent: ${forEachParent}`
@@ -13027,7 +13027,7 @@ var init_state_machine_execution_engine = __esm({
13027
13027
  try {
13028
13028
  const map = options?.webhookContext?.webhookData;
13029
13029
  if (map) {
13030
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-ZOGNKTC3.mjs");
13030
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-PK3OTEX6.mjs");
13031
13031
  const reg = CheckProviderRegistry2.getInstance();
13032
13032
  const p = reg.getProvider("http_input");
13033
13033
  if (p && typeof p.setWebhookContext === "function") p.setWebhookContext(map);
@@ -13140,7 +13140,7 @@ var init_state_machine_execution_engine = __esm({
13140
13140
  logger.info("[StateMachine] Using state machine engine");
13141
13141
  }
13142
13142
  if (!config) {
13143
- const { ConfigManager } = await import("./config-SW3VO4DQ.mjs");
13143
+ const { ConfigManager } = await import("./config-CWHZO5AL.mjs");
13144
13144
  const configManager = new ConfigManager();
13145
13145
  config = await configManager.getDefaultConfig();
13146
13146
  logger.debug("[StateMachine] Using default configuration (no config provided)");
@@ -13150,7 +13150,7 @@ var init_state_machine_execution_engine = __esm({
13150
13150
  tag_filter: tagFilter
13151
13151
  } : config;
13152
13152
  try {
13153
- const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-ZOGNKTC3.mjs");
13153
+ const { CheckProviderRegistry: CheckProviderRegistry2 } = await import("./check-provider-registry-PK3OTEX6.mjs");
13154
13154
  const registry = CheckProviderRegistry2.getInstance();
13155
13155
  registry.setCustomTools(configWithTagFilter.tools || {});
13156
13156
  } catch (error) {
@@ -13214,7 +13214,7 @@ var init_state_machine_execution_engine = __esm({
13214
13214
  try {
13215
13215
  const webhookData = this.executionContext?.webhookContext?.webhookData;
13216
13216
  if (webhookData instanceof Map) {
13217
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-EOQBRZSD.mjs");
13217
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-KXZC4ZOR.mjs");
13218
13218
  const slackCtx = extractSlackContext2(webhookData);
13219
13219
  if (slackCtx) {
13220
13220
  const payload = Array.from(webhookData.values())[0];
@@ -13243,7 +13243,7 @@ var init_state_machine_execution_engine = __esm({
13243
13243
  if (Array.isArray(configWithTagFilter.frontends) && configWithTagFilter.frontends.length > 0) {
13244
13244
  try {
13245
13245
  const { EventBus } = await import("./event-bus-5K3Y2FCS.mjs");
13246
- const { FrontendsHost } = await import("./host-A5HS6F6G.mjs");
13246
+ const { FrontendsHost } = await import("./host-6DJCOUJE.mjs");
13247
13247
  const bus = new EventBus();
13248
13248
  context2.eventBus = bus;
13249
13249
  frontendsHost = new FrontendsHost(bus, logger);
@@ -13593,9 +13593,9 @@ var init_state_machine_execution_engine = __esm({
13593
13593
  * @returns Array of failure condition evaluation results
13594
13594
  */
13595
13595
  async evaluateFailureConditions(checkName, reviewSummary, config, previousOutputs, authorAssociation) {
13596
- const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-R3UE4PE7.mjs");
13596
+ const { FailureConditionEvaluator: FailureConditionEvaluator2 } = await import("./failure-condition-evaluator-LYFZMQ6Y.mjs");
13597
13597
  const evaluator = new FailureConditionEvaluator2();
13598
- const { addEvent: addEvent3 } = await import("./trace-helpers-JJLVZ2RJ.mjs");
13598
+ const { addEvent: addEvent3 } = await import("./trace-helpers-AWTAWKRA.mjs");
13599
13599
  const { addFailIfTriggered } = await import("./metrics-I6A7IHG4.mjs");
13600
13600
  const checkConfig = config.checks?.[checkName];
13601
13601
  if (!checkConfig) {
@@ -15034,17 +15034,11 @@ function formatTrigger(trigger) {
15034
15034
  return `\`${trigger.id.substring(0, 8)}\` - channels: ${channels} \u2192 workflow: "${trigger.workflow}"${filterStr}${status}`;
15035
15035
  }
15036
15036
  async function handleCreateTrigger(args, context2, store) {
15037
- if (!args.workflow) {
15037
+ const workflow = args.workflow || "default";
15038
+ if (context2.availableWorkflows && !context2.availableWorkflows.includes(workflow)) {
15038
15039
  return {
15039
15040
  success: false,
15040
- message: "Missing workflow",
15041
- error: "Please specify the workflow to run when the trigger fires."
15042
- };
15043
- }
15044
- if (context2.availableWorkflows && !context2.availableWorkflows.includes(args.workflow)) {
15045
- return {
15046
- success: false,
15047
- message: `Workflow "${args.workflow}" not found`,
15041
+ message: `Workflow "${workflow}" not found`,
15048
15042
  error: `Available workflows: ${context2.availableWorkflows.slice(0, 5).join(", ")}${context2.availableWorkflows.length > 5 ? "..." : ""}`
15049
15043
  };
15050
15044
  }
@@ -15055,7 +15049,7 @@ async function handleCreateTrigger(args, context2, store) {
15055
15049
  error: "Please specify at least one filter: trigger_channels, trigger_from, trigger_contains, or trigger_match."
15056
15050
  };
15057
15051
  }
15058
- const permissionCheck = checkSchedulePermissions(context2, args.workflow);
15052
+ const permissionCheck = checkSchedulePermissions(context2, workflow);
15059
15053
  if (!permissionCheck.allowed) {
15060
15054
  return {
15061
15055
  success: false,
@@ -15075,13 +15069,13 @@ async function handleCreateTrigger(args, context2, store) {
15075
15069
  contains: args.trigger_contains,
15076
15070
  matchPattern: args.trigger_match,
15077
15071
  threads: args.trigger_threads ?? "any",
15078
- workflow: args.workflow,
15072
+ workflow,
15079
15073
  inputs: args.workflow_inputs,
15080
15074
  status: "active",
15081
15075
  enabled: true
15082
15076
  });
15083
15077
  logger.info(
15084
- `[ScheduleTool] Created message trigger ${trigger.id} for user ${context2.userId}: workflow="${args.workflow}"`
15078
+ `[ScheduleTool] Created message trigger ${trigger.id} for user ${context2.userId}: workflow="${workflow}"`
15085
15079
  );
15086
15080
  return {
15087
15081
  success: true,
@@ -15198,12 +15192,17 @@ function getScheduleToolDefinition() {
15198
15192
 
15199
15193
  YOU (the AI) must extract and structure all scheduling parameters. Do NOT pass natural language time expressions - convert them to cron or ISO timestamps.
15200
15194
 
15201
- CRITICAL WORKFLOW RULE:
15195
+ CRITICAL WORKFLOW RULE (for 'create' action only):
15202
15196
  - To schedule a WORKFLOW, the user MUST use a '%' prefix (e.g., "schedule %my-workflow daily").
15203
15197
  - If the '%' prefix is present, extract the word following it as the 'workflow' parameter (without the '%').
15204
15198
  - If the '%' prefix is NOT present, the request is a simple text reminder. The ENTIRE user request (excluding the schedule expression) MUST be placed in the 'reminder_text' parameter.
15205
15199
  - DO NOT guess or infer a workflow name from a user's request without the '%' prefix.
15206
15200
 
15201
+ WORKFLOW RULE FOR TRIGGERS (create_trigger action):
15202
+ - Triggers ALWAYS require a workflow. The '%' prefix rule does NOT apply to triggers.
15203
+ - If the user specifies a workflow name (with or without '%'), use it directly.
15204
+ - If the user does NOT specify a workflow name, use "default" as the workflow name.
15205
+
15207
15206
  ACTIONS:
15208
15207
  - create: Schedule a new reminder or workflow
15209
15208
  - list: Show user's active schedules
@@ -15216,7 +15215,7 @@ Slack messages in specific channels. Use the create_trigger, list_triggers, dele
15216
15215
  actions for this. Message triggers fire workflows based on message content, channel, sender, and thread scope.
15217
15216
 
15218
15217
  TRIGGER ACTIONS:
15219
- - create_trigger: Create a new message trigger (requires workflow + at least one filter). Supports filtering by user IDs (trigger_from), channels, keywords, regex, and thread scope.
15218
+ - create_trigger: Create a new message trigger (requires at least one filter; workflow defaults to "default" if not specified). Supports filtering by user IDs (trigger_from), channels, keywords, regex, and thread scope.
15220
15219
  - list_triggers: Show user's message triggers
15221
15220
  - delete_trigger: Remove a trigger by ID
15222
15221
  - update_trigger: Enable/disable a trigger by ID
@@ -15316,6 +15315,9 @@ User: "watch #cicd for messages containing 'failed' and run %handle-cicd"
15316
15315
  User: "trigger on each of my messages in this channel and run %auto-reply" (user ID is U3P2L4XNE)
15317
15316
  \u2192 { "action": "create_trigger", "trigger_channels": ["C09V810NY6R"], "trigger_from": ["U3P2L4XNE"], "workflow": "auto-reply" }
15318
15317
 
15318
+ User: "trigger on each message in this channel" (no workflow specified \u2014 use "default")
15319
+ \u2192 { "action": "create_trigger", "trigger_channels": ["C09V810NY6R"], "workflow": "default" }
15320
+
15319
15321
  User: "list my message triggers"
15320
15322
  \u2192 { "action": "list_triggers" }
15321
15323
 
@@ -15349,7 +15351,7 @@ User: "disable trigger abc123"
15349
15351
  },
15350
15352
  workflow: {
15351
15353
  type: "string",
15352
- description: 'For create: workflow ID to run. ONLY populate this if the user used the % prefix (e.g., "%my-workflow"). Extract the name without the % symbol. If no % prefix, use reminder_text instead.'
15354
+ description: 'For create: workflow ID to run. ONLY populate this if the user used the % prefix (e.g., "%my-workflow"). Extract the name without the % symbol. If no % prefix, use reminder_text instead. For create_trigger: workflow is REQUIRED \u2014 use the workflow name the user specified (% prefix optional), or "default" if not specified.'
15353
15355
  },
15354
15356
  workflow_inputs: {
15355
15357
  type: "object",
@@ -15643,7 +15645,16 @@ async function executeScheduleTool(args, slackContext, slackClient, availableWor
15643
15645
  run_at: args.run_at,
15644
15646
  original_expression: args.original_expression,
15645
15647
  // For cancel/pause/resume
15646
- schedule_id: args.schedule_id
15648
+ schedule_id: args.schedule_id,
15649
+ // For trigger actions
15650
+ trigger_channels: args.trigger_channels,
15651
+ trigger_from: args.trigger_from,
15652
+ trigger_from_bots: args.trigger_from_bots,
15653
+ trigger_contains: args.trigger_contains,
15654
+ trigger_match: args.trigger_match,
15655
+ trigger_threads: args.trigger_threads,
15656
+ trigger_description: args.trigger_description,
15657
+ trigger_id: args.trigger_id
15647
15658
  };
15648
15659
  if (!toolArgs.target_type && slackContext.channel) {
15649
15660
  if (slackContext.threadTs) {
@@ -16282,7 +16293,16 @@ var init_mcp_custom_sse_server = __esm({
16282
16293
  run_at: args.run_at,
16283
16294
  original_expression: args.original_expression,
16284
16295
  // For cancel/pause/resume
16285
- schedule_id: args.schedule_id
16296
+ schedule_id: args.schedule_id,
16297
+ // For trigger actions
16298
+ trigger_channels: args.trigger_channels,
16299
+ trigger_from: args.trigger_from,
16300
+ trigger_from_bots: args.trigger_from_bots,
16301
+ trigger_contains: args.trigger_contains,
16302
+ trigger_match: args.trigger_match,
16303
+ trigger_threads: args.trigger_threads,
16304
+ trigger_description: args.trigger_description,
16305
+ trigger_id: args.trigger_id
16286
16306
  };
16287
16307
  const scheduleResult = await handleScheduleAction(scheduleArgs, scheduleContext);
16288
16308
  result = scheduleResult.success ? scheduleResult.message : `Error: ${scheduleResult.error}`;
@@ -40702,8 +40722,8 @@ function buildBuiltinGlobals(opts) {
40702
40722
  const asyncFunctionNames = /* @__PURE__ */ new Set();
40703
40723
  const scheduleFn = async (args = {}) => {
40704
40724
  try {
40705
- const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-74VMD77T.mjs");
40706
- const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-EOQBRZSD.mjs");
40725
+ const { handleScheduleAction: handleScheduleAction2, buildScheduleToolContext: buildScheduleToolContext2 } = await import("./schedule-tool-HRFONU5J.mjs");
40726
+ const { extractSlackContext: extractSlackContext2 } = await import("./schedule-tool-handler-KXZC4ZOR.mjs");
40707
40727
  const parentCtx = opts.sessionInfo?._parentContext;
40708
40728
  const webhookData = parentCtx?.prInfo?.eventContext?.webhookData;
40709
40729
  const visorCfg = parentCtx?.config;
@@ -43751,4 +43771,4 @@ undici/lib/fetch/body.js:
43751
43771
  undici/lib/websocket/frame.js:
43752
43772
  (*! ws. MIT License. Einar Otto Stangvik <einaros@gmail.com> *)
43753
43773
  */
43754
- //# sourceMappingURL=chunk-EYQWEVZF.mjs.map
43774
+ //# sourceMappingURL=chunk-WPF7PJ64.mjs.map