@probelabs/visor 0.1.125 → 0.1.127
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/ai-review-service.d.ts +1 -0
- package/dist/ai-review-service.d.ts.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/docs/ai-configuration.md +23 -0
- package/dist/docs/slack-integration.md +6 -0
- package/dist/docs/workflows.md +30 -1
- package/dist/failure-condition-evaluator.d.ts.map +1 -1
- package/dist/frontends/slack-frontend.d.ts +2 -0
- package/dist/frontends/slack-frontend.d.ts.map +1 -1
- package/dist/generated/config-schema.d.ts +18 -6
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/generated/config-schema.json +18 -6
- package/dist/index.js +7138 -7865
- package/dist/liquid-extensions.d.ts.map +1 -1
- package/dist/output/traces/{run-2026-01-30T09-25-36-981Z.ndjson → run-2026-02-01T09-59-08-165Z.ndjson} +84 -84
- package/dist/output/traces/{run-2026-01-30T09-26-20-969Z.ndjson → run-2026-02-01T09-59-52-595Z.ndjson} +1015 -1015
- package/dist/providers/ai-check-provider.d.ts.map +1 -1
- package/dist/providers/command-check-provider.d.ts.map +1 -1
- package/dist/providers/custom-tool-executor.d.ts.map +1 -1
- package/dist/providers/http-client-provider.d.ts.map +1 -1
- package/dist/providers/mcp-check-provider.d.ts.map +1 -1
- package/dist/providers/memory-check-provider.d.ts.map +1 -1
- package/dist/providers/workflow-check-provider.d.ts.map +1 -1
- package/dist/sdk/{check-provider-registry-3KI5RKXT.mjs → check-provider-registry-CVUONJ5A.mjs} +8 -8
- package/dist/sdk/{chunk-7GUAFV6L.mjs → chunk-BHOKBQPB.mjs} +15 -10
- package/dist/sdk/chunk-BHOKBQPB.mjs.map +1 -0
- package/dist/sdk/{chunk-PXFIALUH.mjs → chunk-EORMDOZU.mjs} +19 -62
- package/dist/sdk/chunk-EORMDOZU.mjs.map +1 -0
- package/dist/sdk/{chunk-SWEEZ5D5.mjs → chunk-MPS4HVQI.mjs} +11 -77
- package/dist/sdk/chunk-MPS4HVQI.mjs.map +1 -0
- package/dist/sdk/{chunk-A4PGHURG.mjs → chunk-TS6BUNAI.mjs} +130 -75
- package/dist/sdk/chunk-TS6BUNAI.mjs.map +1 -0
- package/dist/sdk/{chunk-J6EVEXC2.mjs → chunk-VW2GBXQT.mjs} +56 -8
- package/dist/sdk/chunk-VW2GBXQT.mjs.map +1 -0
- package/dist/sdk/{chunk-RTKJXNZS.mjs → chunk-XWJPT5KQ.mjs} +26 -9
- package/dist/sdk/chunk-XWJPT5KQ.mjs.map +1 -0
- package/dist/sdk/{config-6CUVEH7H.mjs → config-DXX64GD3.mjs} +2 -2
- package/dist/sdk/{failure-condition-evaluator-HB35XRLZ.mjs → failure-condition-evaluator-G4HMJPXF.mjs} +3 -3
- package/dist/sdk/{github-frontend-BZ4N3BFZ.mjs → github-frontend-5PCKKHVC.mjs} +3 -3
- package/dist/sdk/{host-NYWXLIFC.mjs → host-H3AWNZ2F.mjs} +3 -3
- package/dist/sdk/{liquid-extensions-DFDEBMUI.mjs → liquid-extensions-I7O7KMHF.mjs} +3 -2
- package/dist/sdk/{routing-7FXPULTO.mjs → routing-QHTGDIXF.mjs} +4 -4
- package/dist/sdk/sdk.d.mts +6 -0
- package/dist/sdk/sdk.d.ts +6 -0
- package/dist/sdk/sdk.js +255 -214
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +11 -11
- package/dist/sdk/{slack-frontend-J442FJWZ.mjs → slack-frontend-JUT3TYVC.mjs} +34 -6
- package/dist/sdk/slack-frontend-JUT3TYVC.mjs.map +1 -0
- package/dist/sdk/{workflow-check-provider-YUNNF4KC.mjs → workflow-check-provider-3IWBAZP7.mjs} +8 -8
- package/dist/sdk/{workflow-registry-6LZKCWHP.mjs → workflow-registry-KFWSDSLM.mjs} +2 -2
- package/dist/slack/socket-runner.d.ts +2 -0
- package/dist/slack/socket-runner.d.ts.map +1 -1
- package/dist/state-machine/dispatch/stats-manager.d.ts.map +1 -1
- package/dist/state-machine/states/routing.d.ts.map +1 -1
- package/dist/test-runner/index.d.ts.map +1 -1
- package/dist/test-runner/validator.d.ts.map +1 -1
- package/dist/traces/{run-2026-01-30T09-25-36-981Z.ndjson → run-2026-02-01T09-59-08-165Z.ndjson} +84 -84
- package/dist/traces/{run-2026-01-30T09-26-20-969Z.ndjson → run-2026-02-01T09-59-52-595Z.ndjson} +1015 -1015
- package/dist/types/config.d.ts +6 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/worktree-manager.d.ts.map +1 -1
- package/dist/workflow-executor.d.ts.map +1 -1
- package/dist/workflow-registry.d.ts +1 -0
- package/dist/workflow-registry.d.ts.map +1 -1
- package/package.json +5 -6
- package/dist/sdk/chunk-7GUAFV6L.mjs.map +0 -1
- package/dist/sdk/chunk-A4PGHURG.mjs.map +0 -1
- package/dist/sdk/chunk-J6EVEXC2.mjs.map +0 -1
- package/dist/sdk/chunk-PXFIALUH.mjs.map +0 -1
- package/dist/sdk/chunk-RTKJXNZS.mjs.map +0 -1
- package/dist/sdk/chunk-SWEEZ5D5.mjs.map +0 -1
- package/dist/sdk/slack-frontend-J442FJWZ.mjs.map +0 -1
- /package/dist/sdk/{check-provider-registry-3KI5RKXT.mjs.map → check-provider-registry-CVUONJ5A.mjs.map} +0 -0
- /package/dist/sdk/{config-6CUVEH7H.mjs.map → config-DXX64GD3.mjs.map} +0 -0
- /package/dist/sdk/{failure-condition-evaluator-HB35XRLZ.mjs.map → failure-condition-evaluator-G4HMJPXF.mjs.map} +0 -0
- /package/dist/sdk/{github-frontend-BZ4N3BFZ.mjs.map → github-frontend-5PCKKHVC.mjs.map} +0 -0
- /package/dist/sdk/{host-NYWXLIFC.mjs.map → host-H3AWNZ2F.mjs.map} +0 -0
- /package/dist/sdk/{liquid-extensions-DFDEBMUI.mjs.map → liquid-extensions-I7O7KMHF.mjs.map} +0 -0
- /package/dist/sdk/{routing-7FXPULTO.mjs.map → routing-QHTGDIXF.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-YUNNF4KC.mjs.map → workflow-check-provider-3IWBAZP7.mjs.map} +0 -0
- /package/dist/sdk/{workflow-registry-6LZKCWHP.mjs.map → workflow-registry-KFWSDSLM.mjs.map} +0 -0
|
@@ -302,12 +302,45 @@ var init_workflow_registry = __esm({
|
|
|
302
302
|
* Import workflows from a file or URL
|
|
303
303
|
*/
|
|
304
304
|
async import(source, options) {
|
|
305
|
+
return this.importInternal(source, options, /* @__PURE__ */ new Set());
|
|
306
|
+
}
|
|
307
|
+
async importInternal(source, options, visited) {
|
|
305
308
|
const results = [];
|
|
306
309
|
try {
|
|
307
|
-
const content = await this.loadWorkflowContent(
|
|
308
|
-
|
|
310
|
+
const { content, resolvedSource, importBasePath } = await this.loadWorkflowContent(
|
|
311
|
+
source,
|
|
312
|
+
options?.basePath
|
|
313
|
+
);
|
|
314
|
+
const visitKey = resolvedSource || source;
|
|
315
|
+
if (visited.has(visitKey)) {
|
|
316
|
+
return results;
|
|
317
|
+
}
|
|
318
|
+
visited.add(visitKey);
|
|
319
|
+
const data = this.parseWorkflowContent(content, resolvedSource || source);
|
|
320
|
+
const topImports = !Array.isArray(data) ? data?.imports : void 0;
|
|
321
|
+
if (Array.isArray(topImports)) {
|
|
322
|
+
for (const childSource of topImports) {
|
|
323
|
+
const childResults = await this.importInternal(
|
|
324
|
+
childSource,
|
|
325
|
+
{ ...options, basePath: importBasePath },
|
|
326
|
+
visited
|
|
327
|
+
);
|
|
328
|
+
results.push(...childResults);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
309
331
|
const workflows = Array.isArray(data) ? data : [data];
|
|
310
332
|
for (const workflow of workflows) {
|
|
333
|
+
const workflowImports = workflow?.imports;
|
|
334
|
+
if (Array.isArray(workflowImports)) {
|
|
335
|
+
for (const childSource of workflowImports) {
|
|
336
|
+
const childResults = await this.importInternal(
|
|
337
|
+
childSource,
|
|
338
|
+
{ ...options, basePath: importBasePath },
|
|
339
|
+
visited
|
|
340
|
+
);
|
|
341
|
+
results.push(...childResults);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
311
344
|
if (options?.validate !== false) {
|
|
312
345
|
const validation = this.validateWorkflow(workflow);
|
|
313
346
|
if (!validation.valid) {
|
|
@@ -324,9 +357,12 @@ var init_workflow_registry = __esm({
|
|
|
324
357
|
}
|
|
325
358
|
}
|
|
326
359
|
}
|
|
327
|
-
const
|
|
328
|
-
delete
|
|
329
|
-
|
|
360
|
+
const workflowWithoutExtras = { ...workflow };
|
|
361
|
+
delete workflowWithoutExtras.tests;
|
|
362
|
+
delete workflowWithoutExtras.imports;
|
|
363
|
+
const result = this.register(workflowWithoutExtras, source, {
|
|
364
|
+
override: options?.override
|
|
365
|
+
});
|
|
330
366
|
results.push(result);
|
|
331
367
|
}
|
|
332
368
|
} catch (error) {
|
|
@@ -484,15 +520,27 @@ var init_workflow_registry = __esm({
|
|
|
484
520
|
* Load workflow content from file or URL
|
|
485
521
|
*/
|
|
486
522
|
async loadWorkflowContent(source, basePath) {
|
|
523
|
+
const baseIsUrl = basePath?.startsWith("http://") || basePath?.startsWith("https://");
|
|
487
524
|
if (source.startsWith("http://") || source.startsWith("https://")) {
|
|
488
525
|
const response = await fetch(source);
|
|
489
526
|
if (!response.ok) {
|
|
490
527
|
throw new Error(`Failed to fetch workflow from ${source}: ${response.statusText}`);
|
|
491
528
|
}
|
|
492
|
-
|
|
529
|
+
const importBasePath = new URL(".", source).toString();
|
|
530
|
+
return { content: await response.text(), resolvedSource: source, importBasePath };
|
|
531
|
+
}
|
|
532
|
+
if (baseIsUrl) {
|
|
533
|
+
const resolvedUrl = new URL(source, basePath).toString();
|
|
534
|
+
const response = await fetch(resolvedUrl);
|
|
535
|
+
if (!response.ok) {
|
|
536
|
+
throw new Error(`Failed to fetch workflow from ${resolvedUrl}: ${response.statusText}`);
|
|
537
|
+
}
|
|
538
|
+
const importBasePath = new URL(".", resolvedUrl).toString();
|
|
539
|
+
return { content: await response.text(), resolvedSource: resolvedUrl, importBasePath };
|
|
493
540
|
}
|
|
494
541
|
const filePath = path.isAbsolute(source) ? source : path.resolve(basePath || process.cwd(), source);
|
|
495
|
-
|
|
542
|
+
const content = await fs.readFile(filePath, "utf-8");
|
|
543
|
+
return { content, resolvedSource: filePath, importBasePath: path.dirname(filePath) };
|
|
496
544
|
}
|
|
497
545
|
/**
|
|
498
546
|
* Parse workflow content (YAML or JSON)
|
|
@@ -555,4 +603,4 @@ export {
|
|
|
555
603
|
WorkflowRegistry,
|
|
556
604
|
init_workflow_registry
|
|
557
605
|
};
|
|
558
|
-
//# sourceMappingURL=chunk-
|
|
606
|
+
//# sourceMappingURL=chunk-VW2GBXQT.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 }\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 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":[]}
|
|
@@ -833,6 +833,10 @@ var init_config_schema = __esm({
|
|
|
833
833
|
type: "string",
|
|
834
834
|
description: "Probe promptType for this check (underscore style)"
|
|
835
835
|
},
|
|
836
|
+
ai_max_iterations: {
|
|
837
|
+
type: "number",
|
|
838
|
+
description: "Maximum tool iterations for ProbeAgent (underscore style)"
|
|
839
|
+
},
|
|
836
840
|
ai_system_prompt: {
|
|
837
841
|
type: "string",
|
|
838
842
|
description: "System prompt for this check (underscore style)"
|
|
@@ -1116,7 +1120,7 @@ var init_config_schema = __esm({
|
|
|
1116
1120
|
description: "Arguments/inputs for the workflow"
|
|
1117
1121
|
},
|
|
1118
1122
|
overrides: {
|
|
1119
|
-
$ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-
|
|
1123
|
+
$ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E%3E",
|
|
1120
1124
|
description: "Override specific step configurations in the workflow"
|
|
1121
1125
|
},
|
|
1122
1126
|
output_mapping: {
|
|
@@ -1132,7 +1136,7 @@ var init_config_schema = __esm({
|
|
|
1132
1136
|
description: "Config file path - alternative to workflow ID (loads a Visor config file as workflow)"
|
|
1133
1137
|
},
|
|
1134
1138
|
workflow_overrides: {
|
|
1135
|
-
$ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-
|
|
1139
|
+
$ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E%3E",
|
|
1136
1140
|
description: "Alias for overrides - workflow step overrides (backward compatibility)"
|
|
1137
1141
|
},
|
|
1138
1142
|
ref: {
|
|
@@ -1264,6 +1268,10 @@ var init_config_schema = __esm({
|
|
|
1264
1268
|
type: "number",
|
|
1265
1269
|
description: "Request timeout in milliseconds"
|
|
1266
1270
|
},
|
|
1271
|
+
max_iterations: {
|
|
1272
|
+
type: "number",
|
|
1273
|
+
description: "Maximum tool iterations for ProbeAgent"
|
|
1274
|
+
},
|
|
1267
1275
|
debug: {
|
|
1268
1276
|
type: "boolean",
|
|
1269
1277
|
description: "Enable debug mode"
|
|
@@ -1762,7 +1770,7 @@ var init_config_schema = __esm({
|
|
|
1762
1770
|
description: "Custom output name (defaults to workflow name)"
|
|
1763
1771
|
},
|
|
1764
1772
|
overrides: {
|
|
1765
|
-
$ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-
|
|
1773
|
+
$ref: "#/definitions/Record%3Cstring%2CPartial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E%3E",
|
|
1766
1774
|
description: "Step overrides"
|
|
1767
1775
|
},
|
|
1768
1776
|
output_mapping: {
|
|
@@ -1777,13 +1785,13 @@ var init_config_schema = __esm({
|
|
|
1777
1785
|
"^x-": {}
|
|
1778
1786
|
}
|
|
1779
1787
|
},
|
|
1780
|
-
"Record<string,Partial<interface-src_types_config.ts-
|
|
1788
|
+
"Record<string,Partial<interface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453>>": {
|
|
1781
1789
|
type: "object",
|
|
1782
1790
|
additionalProperties: {
|
|
1783
|
-
$ref: "#/definitions/Partial%3Cinterface-src_types_config.ts-
|
|
1791
|
+
$ref: "#/definitions/Partial%3Cinterface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453%3E"
|
|
1784
1792
|
}
|
|
1785
1793
|
},
|
|
1786
|
-
"Partial<interface-src_types_config.ts-
|
|
1794
|
+
"Partial<interface-src_types_config.ts-11434-23754-src_types_config.ts-0-41453>": {
|
|
1787
1795
|
type: "object",
|
|
1788
1796
|
additionalProperties: false
|
|
1789
1797
|
},
|
|
@@ -2392,6 +2400,10 @@ var init_config_schema = __esm({
|
|
|
2392
2400
|
type: "string",
|
|
2393
2401
|
description: "Thread handling: 'required', 'optional', etc."
|
|
2394
2402
|
},
|
|
2403
|
+
allow_bot_messages: {
|
|
2404
|
+
type: "boolean",
|
|
2405
|
+
description: "Allow bot_message events to trigger runs (default: false)"
|
|
2406
|
+
},
|
|
2395
2407
|
show_raw_output: {
|
|
2396
2408
|
type: "boolean",
|
|
2397
2409
|
description: "Show raw output in Slack responses"
|
|
@@ -2769,7 +2781,7 @@ var init_config = __esm({
|
|
|
2769
2781
|
* When a workflow YAML is run standalone, register the workflow and use its tests as checks
|
|
2770
2782
|
*/
|
|
2771
2783
|
async convertWorkflowToConfig(workflowData, basePath) {
|
|
2772
|
-
const { WorkflowRegistry } = await import("./workflow-registry-
|
|
2784
|
+
const { WorkflowRegistry } = await import("./workflow-registry-KFWSDSLM.mjs");
|
|
2773
2785
|
const registry = WorkflowRegistry.getInstance();
|
|
2774
2786
|
const workflowId = workflowData.id;
|
|
2775
2787
|
logger.info(`Detected standalone workflow file: ${workflowId}`);
|
|
@@ -2834,12 +2846,17 @@ ${errors}`);
|
|
|
2834
2846
|
if (!config.imports || config.imports.length === 0) {
|
|
2835
2847
|
return;
|
|
2836
2848
|
}
|
|
2837
|
-
const { WorkflowRegistry } = await import("./workflow-registry-
|
|
2849
|
+
const { WorkflowRegistry } = await import("./workflow-registry-KFWSDSLM.mjs");
|
|
2838
2850
|
const registry = WorkflowRegistry.getInstance();
|
|
2839
2851
|
for (const source of config.imports) {
|
|
2840
2852
|
const results = await registry.import(source, { basePath, validate: true });
|
|
2841
2853
|
for (const result of results) {
|
|
2842
2854
|
if (!result.valid && result.errors) {
|
|
2855
|
+
const isAlreadyExists = result.errors.every((e) => e.message.includes("already exists"));
|
|
2856
|
+
if (isAlreadyExists) {
|
|
2857
|
+
logger.debug(`Workflow from '${source}' already imported, skipping`);
|
|
2858
|
+
continue;
|
|
2859
|
+
}
|
|
2843
2860
|
const errors = result.errors.map((e) => ` ${e.path}: ${e.message}`).join("\n");
|
|
2844
2861
|
throw new Error(`Failed to import workflow from '${source}':
|
|
2845
2862
|
${errors}`);
|
|
@@ -3588,4 +3605,4 @@ export {
|
|
|
3588
3605
|
config_exports,
|
|
3589
3606
|
init_config
|
|
3590
3607
|
};
|
|
3591
|
-
//# sourceMappingURL=chunk-
|
|
3608
|
+
//# sourceMappingURL=chunk-XWJPT5KQ.mjs.map
|