@probelabs/visor 0.1.130 → 0.1.131
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 +7 -0
- package/defaults/visor.yaml +5 -2
- package/dist/ai-review-service.d.ts +2 -0
- package/dist/ai-review-service.d.ts.map +1 -1
- package/dist/cli-main.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/config/cli-handler.d.ts +5 -0
- package/dist/config/cli-handler.d.ts.map +1 -0
- package/dist/config/config-reloader.d.ts +24 -0
- package/dist/config/config-reloader.d.ts.map +1 -0
- package/dist/config/config-snapshot-store.d.ts +21 -0
- package/dist/config/config-snapshot-store.d.ts.map +1 -0
- package/dist/config/config-watcher.d.ts +19 -0
- package/dist/config/config-watcher.d.ts.map +1 -0
- package/dist/config/types.d.ts +16 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/defaults/visor.yaml +5 -2
- package/dist/docs/ai-configuration.md +139 -0
- package/dist/docs/ai-custom-tools.md +30 -0
- package/dist/docs/capacity-planning.md +359 -0
- package/dist/docs/commands.md +35 -0
- package/dist/docs/database-operations.md +487 -0
- package/dist/docs/index.md +6 -1
- package/dist/docs/licensing.md +372 -0
- package/dist/docs/production-deployment.md +583 -0
- package/dist/examples/ai-with-bash.yaml +17 -0
- package/dist/generated/config-schema.d.ts +4 -0
- package/dist/generated/config-schema.d.ts.map +1 -1
- package/dist/index.js +9945 -10907
- package/dist/liquid-extensions.d.ts +7 -0
- package/dist/liquid-extensions.d.ts.map +1 -1
- package/dist/output/traces/{run-2026-02-11T16-20-59-999Z.ndjson → run-2026-02-15T19-14-20-379Z.ndjson} +84 -84
- package/dist/{traces/run-2026-02-11T16-21-47-711Z.ndjson → output/traces/run-2026-02-15T19-15-09-410Z.ndjson} +1019 -1019
- package/dist/providers/ai-check-provider.d.ts +5 -0
- 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/workflow-check-provider.d.ts.map +1 -1
- package/dist/scheduler/schedule-tool.d.ts.map +1 -1
- package/dist/sdk/{check-provider-registry-PANIXYRB.mjs → check-provider-registry-AAPPJ4CP.mjs} +7 -7
- package/dist/sdk/{check-provider-registry-M3Y6JMTW.mjs → check-provider-registry-S7BMQ2FC.mjs} +7 -7
- package/dist/sdk/check-provider-registry-ZOLEYDKM.mjs +28 -0
- package/dist/sdk/{chunk-VMLORODQ.mjs → chunk-2GCSK3PD.mjs} +4 -4
- package/dist/sdk/{chunk-EUUAQBTW.mjs → chunk-6ZZ4DPAA.mjs} +240 -48
- package/dist/sdk/chunk-6ZZ4DPAA.mjs.map +1 -0
- package/dist/sdk/{chunk-HOKQOO3G.mjs → chunk-EBTD2D4L.mjs} +2 -2
- package/dist/sdk/chunk-LDFUW34H.mjs +39912 -0
- package/dist/sdk/chunk-LDFUW34H.mjs.map +1 -0
- package/dist/sdk/{chunk-UCNT3PDT.mjs → chunk-LQ5B4T6L.mjs} +5 -1
- package/dist/sdk/chunk-LQ5B4T6L.mjs.map +1 -0
- package/dist/sdk/{chunk-S6CD7GFM.mjs → chunk-MQ57AB4U.mjs} +211 -35
- package/dist/sdk/chunk-MQ57AB4U.mjs.map +1 -0
- package/dist/sdk/chunk-N4I6ZDCJ.mjs +436 -0
- package/dist/sdk/chunk-N4I6ZDCJ.mjs.map +1 -0
- package/dist/sdk/chunk-OMFPM576.mjs +739 -0
- package/dist/sdk/chunk-OMFPM576.mjs.map +1 -0
- package/dist/sdk/chunk-RI77TA6V.mjs +436 -0
- package/dist/sdk/chunk-RI77TA6V.mjs.map +1 -0
- package/dist/sdk/chunk-VO4N6TEL.mjs +1502 -0
- package/dist/sdk/chunk-VO4N6TEL.mjs.map +1 -0
- package/dist/sdk/{chunk-V2IV3ILA.mjs → chunk-XJQKTK6V.mjs} +31 -5
- package/dist/sdk/chunk-XJQKTK6V.mjs.map +1 -0
- package/dist/sdk/{config-OGOS4ZU4.mjs → config-4EG7IQIU.mjs} +2 -2
- package/dist/sdk/{failure-condition-evaluator-HC3M5377.mjs → failure-condition-evaluator-GLHZZF47.mjs} +3 -3
- package/dist/sdk/failure-condition-evaluator-KN55WXRO.mjs +17 -0
- package/dist/sdk/{github-frontend-E2KJSC3Y.mjs → github-frontend-F4TE2JY7.mjs} +3 -3
- package/dist/sdk/github-frontend-HCOKL53D.mjs +1356 -0
- package/dist/sdk/github-frontend-HCOKL53D.mjs.map +1 -0
- package/dist/sdk/{host-EE6EJ2FM.mjs → host-SAT6RHDX.mjs} +2 -2
- package/dist/sdk/host-VA3ET7N6.mjs +63 -0
- package/dist/sdk/host-VA3ET7N6.mjs.map +1 -0
- package/dist/sdk/{liquid-extensions-E4EUOCES.mjs → liquid-extensions-YDIIH33Q.mjs} +2 -2
- package/dist/sdk/{routing-OZQWAGAI.mjs → routing-KFYQGOYU.mjs} +5 -5
- package/dist/sdk/routing-OXQKETSA.mjs +25 -0
- package/dist/sdk/{schedule-tool-handler-IEB2VS7O.mjs → schedule-tool-handler-G353DHS6.mjs} +7 -7
- package/dist/sdk/{schedule-tool-handler-B7TMSG6A.mjs → schedule-tool-handler-OQF57URO.mjs} +7 -7
- package/dist/sdk/schedule-tool-handler-PJVKWSYX.mjs +38 -0
- package/dist/sdk/schedule-tool-handler-PJVKWSYX.mjs.map +1 -0
- package/dist/sdk/sdk.d.mts +15 -0
- package/dist/sdk/sdk.d.ts +15 -0
- package/dist/sdk/sdk.js +621 -183
- package/dist/sdk/sdk.js.map +1 -1
- package/dist/sdk/sdk.mjs +6 -6
- package/dist/sdk/{trace-helpers-PP3YHTAM.mjs → trace-helpers-LOPBHYYX.mjs} +4 -2
- package/dist/sdk/trace-helpers-LOPBHYYX.mjs.map +1 -0
- package/dist/sdk/trace-helpers-R2ETIEC2.mjs +25 -0
- package/dist/sdk/trace-helpers-R2ETIEC2.mjs.map +1 -0
- package/dist/sdk/{workflow-check-provider-2ET3SFZH.mjs → workflow-check-provider-57KAR4Y4.mjs} +7 -7
- package/dist/sdk/workflow-check-provider-57KAR4Y4.mjs.map +1 -0
- package/dist/sdk/{workflow-check-provider-HB4XTD4Z.mjs → workflow-check-provider-LRWD52WN.mjs} +7 -7
- package/dist/sdk/workflow-check-provider-LRWD52WN.mjs.map +1 -0
- package/dist/sdk/workflow-check-provider-N2DRFQDB.mjs +28 -0
- package/dist/sdk/workflow-check-provider-N2DRFQDB.mjs.map +1 -0
- package/dist/slack/socket-runner.d.ts.map +1 -1
- package/dist/state-machine/context/build-engine-context.d.ts.map +1 -1
- package/dist/state-machine/runner.d.ts.map +1 -1
- package/dist/state-machine/states/completed.d.ts.map +1 -1
- package/dist/telemetry/trace-helpers.d.ts +5 -0
- package/dist/telemetry/trace-helpers.d.ts.map +1 -1
- package/dist/test-runner/evaluators.d.ts.map +1 -1
- package/dist/test-runner/index.d.ts +7 -0
- 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-02-11T16-20-59-999Z.ndjson → run-2026-02-15T19-14-20-379Z.ndjson} +84 -84
- package/dist/{output/traces/run-2026-02-11T16-21-47-711Z.ndjson → traces/run-2026-02-15T19-15-09-410Z.ndjson} +1019 -1019
- package/dist/tui/chat-runner.d.ts.map +1 -1
- package/dist/types/cli.d.ts +2 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/config.d.ts +15 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/engine.d.ts +2 -0
- package/dist/types/engine.d.ts.map +1 -1
- package/package.json +3 -3
- package/defaults/.visor.yaml +0 -420
- package/dist/sdk/chunk-EUUAQBTW.mjs.map +0 -1
- package/dist/sdk/chunk-S6CD7GFM.mjs.map +0 -1
- package/dist/sdk/chunk-UCNT3PDT.mjs.map +0 -1
- package/dist/sdk/chunk-V2IV3ILA.mjs.map +0 -1
- package/dist/sdk/chunk-YJRBN3XS.mjs +0 -217
- package/dist/sdk/chunk-YJRBN3XS.mjs.map +0 -1
- /package/dist/sdk/{check-provider-registry-M3Y6JMTW.mjs.map → check-provider-registry-AAPPJ4CP.mjs.map} +0 -0
- /package/dist/sdk/{check-provider-registry-PANIXYRB.mjs.map → check-provider-registry-S7BMQ2FC.mjs.map} +0 -0
- /package/dist/sdk/{config-OGOS4ZU4.mjs.map → check-provider-registry-ZOLEYDKM.mjs.map} +0 -0
- /package/dist/sdk/{chunk-VMLORODQ.mjs.map → chunk-2GCSK3PD.mjs.map} +0 -0
- /package/dist/sdk/{chunk-HOKQOO3G.mjs.map → chunk-EBTD2D4L.mjs.map} +0 -0
- /package/dist/sdk/{failure-condition-evaluator-HC3M5377.mjs.map → config-4EG7IQIU.mjs.map} +0 -0
- /package/dist/sdk/{liquid-extensions-E4EUOCES.mjs.map → failure-condition-evaluator-GLHZZF47.mjs.map} +0 -0
- /package/dist/sdk/{routing-OZQWAGAI.mjs.map → failure-condition-evaluator-KN55WXRO.mjs.map} +0 -0
- /package/dist/sdk/{github-frontend-E2KJSC3Y.mjs.map → github-frontend-F4TE2JY7.mjs.map} +0 -0
- /package/dist/sdk/{host-EE6EJ2FM.mjs.map → host-SAT6RHDX.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-B7TMSG6A.mjs.map → liquid-extensions-YDIIH33Q.mjs.map} +0 -0
- /package/dist/sdk/{schedule-tool-handler-IEB2VS7O.mjs.map → routing-KFYQGOYU.mjs.map} +0 -0
- /package/dist/sdk/{trace-helpers-PP3YHTAM.mjs.map → routing-OXQKETSA.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-2ET3SFZH.mjs.map → schedule-tool-handler-G353DHS6.mjs.map} +0 -0
- /package/dist/sdk/{workflow-check-provider-HB4XTD4Z.mjs.map → schedule-tool-handler-OQF57URO.mjs.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/snapshot-store.ts","../../src/state-machine/states/routing.ts"],"sourcesContent":["/*\n * Internal snapshot store for incremental adoption of snapshot+scope execution.\n * Phase 0: journal only — no behavior change, used for future visibility work.\n */\n\nimport type { ReviewSummary } from './reviewer';\nimport type { EventTrigger } from './types/config';\n\nexport type ScopePath = Array<{ check: string; index: number }>;\n\nexport interface JournalEntry {\n commitId: number;\n sessionId: string;\n scope: ScopePath;\n checkId: string;\n event: EventTrigger | undefined;\n result: ReviewSummary & { output?: unknown; content?: string };\n}\n\nexport class ExecutionJournal {\n private commit = 0;\n private entries: JournalEntry[] = [];\n\n beginSnapshot(): number {\n return this.commit;\n }\n\n commitEntry(entry: {\n sessionId: string;\n scope: ScopePath;\n checkId: string;\n result: ReviewSummary & { output?: unknown; content?: string };\n event?: EventTrigger;\n }): JournalEntry {\n const committed: JournalEntry = {\n sessionId: entry.sessionId,\n scope: entry.scope,\n checkId: entry.checkId,\n result: entry.result,\n event: entry.event,\n commitId: ++this.commit,\n };\n this.entries.push(committed);\n return committed;\n }\n\n readVisible(sessionId: string, commitMax: number, event?: EventTrigger): JournalEntry[] {\n return this.entries.filter(\n e =>\n e.sessionId === sessionId && e.commitId <= commitMax && (event ? e.event === event : true)\n );\n }\n\n // Lightweight helpers for debugging/metrics\n size(): number {\n return this.entries.length;\n }\n}\n\nexport class ContextView {\n constructor(\n private journal: ExecutionJournal,\n private sessionId: string,\n private snapshotId: number,\n private scope: ScopePath,\n private event?: EventTrigger\n ) {}\n\n /** Return the nearest result for a check in this scope (exact item → ancestor → latest). */\n get(checkId: string): (ReviewSummary & { output?: unknown; content?: string }) | undefined {\n const visible = this.journal\n .readVisible(this.sessionId, this.snapshotId, this.event)\n .filter(e => e.checkId === checkId);\n if (visible.length === 0) return undefined;\n\n // exact scope match: prefer the most recent commit for this scope\n const exactMatches = visible.filter(e => this.sameScope(e.scope, this.scope));\n if (exactMatches.length > 0) {\n return exactMatches[exactMatches.length - 1].result;\n }\n\n // nearest ancestor (shortest distance)\n let best: { entry: JournalEntry; dist: number } | undefined;\n for (const e of visible) {\n const dist = this.ancestorDistance(e.scope, this.scope);\n if (dist >= 0 && (best === undefined || dist < best.dist)) {\n best = { entry: e, dist };\n }\n }\n if (best) return best.entry.result;\n\n // fallback to latest committed result\n return visible[visible.length - 1]?.result;\n }\n\n /** Return an aggregate (raw) result – the shallowest scope for this check. */\n getRaw(checkId: string): (ReviewSummary & { output?: unknown; content?: string }) | undefined {\n const visible = this.journal\n .readVisible(this.sessionId, this.snapshotId, this.event)\n .filter(e => e.checkId === checkId);\n if (visible.length === 0) return undefined;\n let shallow = visible[0];\n for (const e of visible) {\n if (e.scope.length < shallow.scope.length) shallow = e;\n }\n return shallow.result;\n }\n\n /** All results for a check up to this snapshot. */\n getHistory(checkId: string): Array<ReviewSummary & { output?: unknown; content?: string }> {\n return this.journal\n .readVisible(this.sessionId, this.snapshotId, this.event)\n .filter(e => e.checkId === checkId)\n .map(e => e.result);\n }\n\n private sameScope(a: ScopePath, b: ScopePath): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i].check !== b[i].check || a[i].index !== b[i].index) return false;\n }\n return true;\n }\n\n // distance from ancestor to current; -1 if not ancestor\n private ancestorDistance(ancestor: ScopePath, current: ScopePath): number {\n if (ancestor.length > current.length) return -1;\n // Treat root scope ([]) as non-ancestor for unrelated branches\n if (ancestor.length === 0 && current.length > 0) return -1;\n for (let i = 0; i < ancestor.length; i++) {\n if (ancestor[i].check !== current[i].check || ancestor[i].index !== current[i].index)\n return -1;\n }\n return current.length - ancestor.length;\n }\n}\n","/**\n * Routing State Handler\n *\n * Responsibilities:\n * - Evaluate fail_if conditions after check execution\n * - Process on_success, on_fail, on_finish triggers\n * - Enqueue ForwardRunRequested events for goto\n * - Enqueue WaveRetry events for routing loops\n * - Transition back to WavePlanning or Completed\n *\n * M2: Core routing logic implementation\n */\n\nimport type { EngineContext, RunState, EngineState, EngineEvent } from '../../types/engine';\nimport type { ReviewSummary, ReviewIssue } from '../../reviewer';\nimport type {\n CheckConfig,\n OnFailConfig,\n TransitionRule,\n OnSuccessRunItem,\n OnInitStepInvocation,\n OnInitWorkflowInvocation,\n} from '../../types/config';\nimport { logger } from '../../logger';\nimport { addEvent } from '../../telemetry/trace-helpers';\nimport { FailureConditionEvaluator } from '../../failure-condition-evaluator';\nimport { createSecureSandbox, compileAndRun } from '../../utils/sandbox';\nimport { MemoryStore } from '../../memory-store';\nimport { createExtendedLiquid } from '../../liquid-extensions';\n\n/**\n * Render Liquid template expressions in 'with' arguments for on_success.run.\n * This is called during routing, where we have access to the step's output.\n */\nasync function renderRouteArgs(\n args: Record<string, unknown> | undefined,\n output: unknown,\n dependencyResults: Record<string, unknown>,\n context: EngineContext\n): Promise<Record<string, unknown> | undefined> {\n if (!args || Object.keys(args).length === 0) {\n return args;\n }\n\n const liquid = createExtendedLiquid();\n const renderedArgs: Record<string, unknown> = {};\n\n // Build template context with output (current step) and outputs (all dependencies)\n const templateContext = {\n output: output, // Output of the step that triggered routing\n outputs: dependencyResults, // All dependency outputs\n env: process.env,\n inputs: (context.executionContext as any)?.workflowInputs || {},\n };\n\n for (const [key, value] of Object.entries(args)) {\n if (typeof value === 'string' && value.includes('{{')) {\n try {\n renderedArgs[key] = await liquid.parseAndRender(value, templateContext);\n } catch (error) {\n logger.warn(`[Routing] Failed to render template for arg ${key}: ${error}`);\n renderedArgs[key] = value;\n }\n } else {\n renderedArgs[key] = value;\n }\n }\n\n return renderedArgs;\n}\n\n/**\n * Helper to extract target name and args from an OnSuccessRunItem.\n * OnSuccessRunItem can be:\n * - string: plain step name\n * - OnInitStepInvocation: { step: string, with?: Record<string, unknown> }\n * - OnInitWorkflowInvocation: { workflow: string, with?: Record<string, unknown> }\n */\nfunction parseRunItem(item: OnSuccessRunItem): {\n target: string;\n args?: Record<string, unknown>;\n} {\n if (typeof item === 'string') {\n return { target: item };\n }\n if ('step' in item) {\n const stepItem = item as OnInitStepInvocation;\n return { target: stepItem.step, args: stepItem.with };\n }\n if ('workflow' in item) {\n const workflowItem = item as OnInitWorkflowInvocation;\n return { target: workflowItem.workflow, args: workflowItem.with };\n }\n // Fallback - shouldn't happen with proper typing\n return { target: String(item) };\n}\n\n/**\n * Check if any configured check depends (directly or via OR dependency) on the\n * given `checkId`. Used to decide whether a forEach parent has downstream\n * dependents, in which case its on_finish should defer to the LevelDispatch\n * post-children hook.\n */\n// hasDependents helper removed (unused)\n\n/**\n * Check if any dependent of `checkId` would execute with map fanout.\n * Used to decide whether a forEach parent's on_finish should be deferred to\n * the LevelDispatch post-children hook (only necessary when map-fanout children\n * will run per item).\n */\nfunction hasMapFanoutDependents(context: EngineContext, checkId: string): boolean {\n const checks = context.config.checks || {};\n const reduceProviders = new Set(['log', 'memory', 'script', 'workflow', 'noop']);\n\n for (const [cid, cfg] of Object.entries(checks)) {\n if (cid === checkId) continue;\n const rawDeps = (cfg as any).depends_on || [];\n const depList = Array.isArray(rawDeps) ? rawDeps : [rawDeps];\n // Does this check depend on our target?\n let depends = false;\n for (const dep of depList) {\n if (typeof dep !== 'string') continue;\n if (dep.includes('|')) {\n const opts = dep\n .split('|')\n .map(s => s.trim())\n .filter(Boolean);\n if (opts.includes(checkId)) {\n depends = true;\n break;\n }\n } else if (dep === checkId) {\n depends = true;\n break;\n }\n }\n if (!depends) continue;\n\n // Determine this dependent's fanout mode\n const explicit = (cfg as any).fanout as 'map' | 'reduce' | undefined;\n if (explicit === 'map') return true;\n if (explicit === 'reduce') continue;\n\n // Infer default based on provider type\n const providerType = context.checks[cid]?.providerType || (checks as any)[cid]?.type || '';\n const inferred: 'map' | 'reduce' = reduceProviders.has(providerType) ? 'reduce' : 'map';\n if (inferred === 'map') return true;\n }\n return false;\n}\n\n/** Classify failure type to inform retry policy mapping */\nfunction classifyFailure(result: ReviewSummary): 'none' | 'logical' | 'execution' {\n const issues = result?.issues || [];\n if (!issues || issues.length === 0) return 'none';\n // Heuristics:\n // - logical: fail_if, contract/guarantee_failed, explicit ruleIds ending with _fail_if\n // - execution: provider/command errors, timeouts, forEach/execution_error, sandbox_runner_error\n let hasLogical = false;\n let hasExecution = false;\n for (const iss of issues) {\n const id = String((iss as any).ruleId || '');\n const msg = String((iss as any).message || '');\n const msgLower = msg.toLowerCase();\n if (\n id.endsWith('_fail_if') ||\n id.includes('contract/guarantee_failed') ||\n id.includes('contract/schema_validation_failed')\n )\n hasLogical = true;\n if (\n id.endsWith('/error') ||\n id.includes('/execution_error') ||\n id.includes('timeout') ||\n msgLower.includes('timed out') ||\n msg.includes('Command execution failed')\n )\n hasExecution = true;\n if (id.includes('forEach/execution_error') || msg.includes('sandbox_runner_error'))\n hasExecution = true;\n }\n if (hasLogical && !hasExecution) return 'logical';\n if (hasExecution && !hasLogical) return 'execution';\n // Mixed or unknown: treat as execution to avoid suppressing retries unexpectedly\n return hasExecution ? 'execution' : 'logical';\n}\n\nfunction getCriticality(context: EngineContext, checkId: string): CheckConfig['criticality'] {\n const cfg = context.config.checks?.[checkId];\n return (cfg && (cfg as any).criticality) || 'policy';\n}\n\n/**\n * Context for a check that just completed and needs routing evaluation\n */\ninterface RoutingContext {\n checkId: string;\n scope: Array<{ check: string; index: number }>;\n result: ReviewSummary;\n checkConfig: CheckConfig;\n success: boolean; // true if no fatal issues\n}\n\n/**\n * Create memory helpers for sandbox context\n */\nfunction createMemoryHelpers() {\n const memoryStore = MemoryStore.getInstance();\n return {\n get: (key: string, ns?: string) => memoryStore.get(key, ns),\n has: (key: string, ns?: string) => memoryStore.has(key, ns),\n getAll: (ns?: string) => memoryStore.getAll(ns),\n set: (key: string, value: unknown, ns?: string) => {\n const nsName = ns || memoryStore.getDefaultNamespace();\n const data: Map<string, Map<string, unknown>> = (memoryStore as any)['data'];\n if (!data.has(nsName)) data.set(nsName, new Map());\n data.get(nsName)!.set(key, value);\n },\n clear: (ns?: string) => {\n const data: Map<string, Map<string, unknown>> = (memoryStore as any)['data'];\n if (ns) data.delete(ns);\n else data.clear();\n },\n increment: (key: string, amount = 1, ns?: string) => {\n const nsName = ns || memoryStore.getDefaultNamespace();\n const data: Map<string, Map<string, unknown>> = (memoryStore as any)['data'];\n if (!data.has(nsName)) data.set(nsName, new Map());\n const nsMap = data.get(nsName)!;\n const current = nsMap.get(key);\n const numCurrent = typeof current === 'number' ? current : 0;\n const newValue = numCurrent + amount;\n nsMap.set(key, newValue);\n return newValue;\n },\n };\n}\n\nfunction getHistoryLimit(): number | undefined {\n const raw = process.env.VISOR_TEST_HISTORY_LIMIT || process.env.VISOR_OUTPUT_HISTORY_LIMIT;\n if (!raw) return undefined;\n const n = parseInt(raw, 10);\n return Number.isFinite(n) && n > 0 ? n : undefined;\n}\n\ntype RoutingTrigger = 'on_success' | 'on_fail' | 'on_finish';\ntype RoutingAction = 'run' | 'goto' | 'retry';\ntype RoutingSource = 'run' | 'run_js' | 'goto' | 'goto_js' | 'transitions' | 'retry';\n\nfunction formatScopeLabel(scope: Array<{ check: string; index: number }> | undefined): string {\n if (!scope || scope.length === 0) return '';\n return scope.map(item => `${item.check}:${item.index}`).join('|');\n}\n\nfunction recordRoutingEvent(args: {\n checkId: string;\n trigger: RoutingTrigger;\n action: RoutingAction;\n target?: string;\n source?: RoutingSource;\n scope?: Array<{ check: string; index: number }>;\n gotoEvent?: string;\n}): void {\n const attrs: Record<string, unknown> = {\n check_id: args.checkId,\n trigger: args.trigger,\n action: args.action,\n };\n if (args.target) attrs.target = args.target;\n if (args.source) attrs.source = args.source;\n const scopeLabel = formatScopeLabel(args.scope);\n if (scopeLabel) attrs.scope = scopeLabel;\n if (args.gotoEvent) attrs.goto_event = args.gotoEvent;\n addEvent('visor.routing', attrs);\n}\n\n/**\n * Handle routing state - evaluate conditions and decide next actions\n * @returns true if execution was halted (caller should stop processing)\n */\nexport async function handleRouting(\n context: EngineContext,\n state: RunState,\n transition: (newState: EngineState) => void,\n emitEvent: (event: EngineEvent) => void,\n routingContext: RoutingContext\n): Promise<boolean> {\n const { checkId, scope, result, checkConfig, success } = routingContext;\n\n // Always log routing entry for debugging E2E expectations\n logger.info(`[Routing] Evaluating routing for check: ${checkId}, success: ${success}`);\n\n // Step 1: Evaluate fail_if and failure_conditions\n const failureResult = await evaluateFailIf(checkId, result, checkConfig, context, state);\n\n // Step 1.5: Check if we need to halt execution immediately\n if (failureResult.haltExecution) {\n logger.error(\n `[Routing] HALTING EXECUTION due to critical failure in ${checkId}: ${failureResult.haltMessage}`\n );\n\n // Add halt issue to result for reporting\n const haltIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}_halt_execution`,\n message: `Execution halted: ${failureResult.haltMessage || 'Critical failure condition met'}`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), haltIssue];\n\n // Emit Shutdown event to stop the workflow\n emitEvent({\n type: 'Shutdown',\n error: {\n message: failureResult.haltMessage || `Execution halted by check ${checkId}`,\n name: 'HaltExecution',\n },\n });\n\n // Transition to Error state\n transition('Error');\n return true; // Signal that execution was halted\n }\n\n if (failureResult.failed) {\n if (context.debug) {\n logger.info(`[Routing] fail_if/failure_conditions triggered for ${checkId}`);\n }\n\n // Treat as failure for routing purposes\n await processOnFail(checkId, scope, result, checkConfig, context, state, emitEvent);\n } else if (success) {\n // Step 2: Process on_success routing\n await processOnSuccess(checkId, scope, result, checkConfig, context, state, emitEvent);\n } else {\n // Step 3: Process on_fail routing\n await processOnFail(checkId, scope, result, checkConfig, context, state, emitEvent);\n }\n\n // Step 4: on_finish\n // Process on_finish here for:\n // - non-forEach checks\n // - forEach parents that do NOT have map-fanout dependents\n // (reduce-only dependents don't need the post-children barrier)\n const shouldProcessOnFinishHere =\n !!checkConfig.on_finish &&\n (checkConfig.forEach !== true || !hasMapFanoutDependents(context, checkId));\n if (checkConfig.on_finish) {\n logger.info(\n `[Routing] on_finish decision for ${checkId}: forEach=${!!checkConfig.forEach}, processHere=${shouldProcessOnFinishHere}`\n );\n }\n if (shouldProcessOnFinishHere) {\n await processOnFinish(checkId, scope, result, checkConfig, context, state, emitEvent);\n }\n\n // Transition back to WavePlanning to process queued events\n transition('WavePlanning');\n return false; // Execution continues normally\n}\n\n/**\n * Process on_finish routing\n */\nasync function processOnFinish(\n checkId: string,\n scope: Array<{ check: string; index: number }>,\n result: ReviewSummary,\n checkConfig: CheckConfig,\n context: EngineContext,\n state: RunState,\n emitEvent: (event: EngineEvent) => void\n): Promise<void> {\n const onFinish = checkConfig.on_finish;\n\n if (!onFinish) {\n return; // No on_finish configuration\n }\n\n // Log at info level so it's visible in test output\n logger.info(`Processing on_finish for ${checkId}`);\n let queuedForward = false;\n // Process on_finish.run\n if (onFinish.run && onFinish.run.length > 0) {\n // Check if current check is a forEach parent with items\n const currentCheckIsForEach = checkConfig.forEach === true;\n const forEachItems = currentCheckIsForEach ? (result as any).forEachItems : undefined;\n const hasForEachItems = Array.isArray(forEachItems) && forEachItems.length > 0;\n\n for (const targetCheck of onFinish.run) {\n // Check loop budget before scheduling\n if (checkLoopBudget(context, state, 'on_finish', 'run')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? DEFAULT_MAX_LOOPS}) during on_finish run`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n\n // Handle fanout: check if target has fanout configuration\n const targetConfig = context.config.checks?.[targetCheck];\n const fanoutMode = targetConfig?.fanout || 'reduce'; // default to reduce\n\n if (context.debug) {\n logger.info(\n `[Routing] on_finish.run: scheduling ${targetCheck} with fanout=${fanoutMode}, hasForEachItems=${hasForEachItems}`\n );\n }\n\n // If current check has forEach items and target is map fanout, emit one event per item\n if (fanoutMode === 'map' && hasForEachItems) {\n // Map fanout: emit one ForwardRunRequested per forEach item\n for (let itemIndex = 0; itemIndex < forEachItems!.length; itemIndex++) {\n // Increment loop count for each item\n state.routingLoopCount++;\n\n const itemScope: Array<{ check: string; index: number }> = [\n { check: checkId, index: itemIndex },\n ];\n\n recordRoutingEvent({\n checkId,\n trigger: 'on_finish',\n action: 'run',\n target: targetCheck,\n source: 'run',\n scope: itemScope,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: targetCheck,\n scope: itemScope,\n origin: 'run',\n });\n queuedForward = true;\n }\n } else {\n // Reduce fanout (or no forEach context): emit with empty scope once\n // Increment loop count\n state.routingLoopCount++;\n\n recordRoutingEvent({\n checkId,\n trigger: 'on_finish',\n action: 'run',\n target: targetCheck,\n source: 'run',\n scope: [],\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: targetCheck,\n scope: [],\n origin: 'run',\n });\n queuedForward = true;\n }\n }\n }\n\n // Process on_finish.run_js\n if (onFinish.run_js) {\n const dynamicTargets = await evaluateRunJs(\n onFinish.run_js,\n checkId,\n checkConfig,\n result,\n context,\n state\n );\n\n for (const runItem of dynamicTargets) {\n // Parse the run item to extract target and optional args\n const { target: targetCheck, args: runArgs } = parseRunItem(runItem);\n\n // Check loop budget before scheduling\n if (checkLoopBudget(context, state, 'on_finish', 'run')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? DEFAULT_MAX_LOOPS}) during on_finish run`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n\n if (context.debug) {\n logger.info(\n `[Routing] on_finish.run_js: scheduling ${targetCheck}${runArgs ? ', args=' + JSON.stringify(runArgs) : ''}`\n );\n }\n\n // Increment loop count\n state.routingLoopCount++;\n\n recordRoutingEvent({\n checkId,\n trigger: 'on_finish',\n action: 'run',\n target: targetCheck,\n source: 'run_js',\n scope,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: targetCheck,\n scope,\n origin: 'run_js',\n args: runArgs,\n });\n queuedForward = true;\n }\n }\n\n // Declarative transitions (override goto/goto_js when present)\n const finishTransTarget = await evaluateTransitions(\n onFinish.transitions,\n checkId,\n checkConfig,\n result,\n context,\n state\n );\n if (finishTransTarget !== undefined) {\n if (finishTransTarget) {\n if (checkLoopBudget(context, state, 'on_finish', 'goto')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? DEFAULT_MAX_LOOPS}) during on_finish goto`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n state.routingLoopCount++;\n recordRoutingEvent({\n checkId,\n trigger: 'on_finish',\n action: 'goto',\n target: finishTransTarget.to,\n source: 'transitions',\n scope,\n gotoEvent: finishTransTarget.goto_event,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: finishTransTarget.to,\n scope,\n origin: 'goto_js',\n gotoEvent: finishTransTarget.goto_event,\n });\n }\n return; // transitions override goto/goto_js\n }\n\n // Process on_finish.goto / goto_js\n const gotoTarget = await evaluateGoto(\n onFinish.goto_js,\n onFinish.goto,\n checkId,\n checkConfig,\n result,\n context,\n state\n );\n\n if (gotoTarget) {\n // Check loop budget before scheduling goto\n if (checkLoopBudget(context, state, 'on_finish', 'goto')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? DEFAULT_MAX_LOOPS}) during on_finish goto`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n\n if (context.debug) {\n logger.info(`[Routing] on_finish.goto: ${gotoTarget}`);\n }\n\n // Increment loop count\n state.routingLoopCount++;\n\n recordRoutingEvent({\n checkId,\n trigger: 'on_finish',\n action: 'goto',\n target: gotoTarget,\n source: onFinish.goto_js ? 'goto_js' : 'goto',\n scope,\n });\n // Enqueue forward run event\n emitEvent({\n type: 'ForwardRunRequested',\n target: gotoTarget,\n scope,\n origin: 'goto_js',\n });\n\n // Mark that we've seen a forward run\n state.flags.forwardRunRequested = true;\n }\n\n // If we scheduled any forward-run targets via on_finish, request a wave retry so\n // dependent checks (with if conditions) can re-evaluate after the forward-run completes.\n // Guard: only enqueue once per originating check per wave to avoid loops.\n if (queuedForward) {\n const guardKey = `waveRetry:on_finish:${checkId}:wave:${state.wave}`;\n if (!(state as any).forwardRunGuards?.has(guardKey)) {\n (state as any).forwardRunGuards?.add(guardKey);\n emitEvent({ type: 'WaveRetry', reason: 'on_finish' });\n }\n }\n}\n\n/**\n * Result of evaluating failure conditions\n */\ninterface FailureEvaluationResult {\n /** Whether any failure condition was triggered */\n failed: boolean;\n /** Whether execution should halt immediately */\n haltExecution: boolean;\n /** Message describing the halt reason (if haltExecution is true) */\n haltMessage?: string;\n}\n\n/**\n * Evaluate fail_if and failure_conditions for a check\n */\n// Returns { failed, haltExecution } to indicate if check failed and if execution should halt.\n// Global fail_if records an issue for summary/reporting but MUST NOT gate routing.\n// failure_conditions with halt_execution: true will trigger workflow halt.\nasync function evaluateFailIf(\n checkId: string,\n result: ReviewSummary,\n checkConfig: CheckConfig,\n context: EngineContext,\n state: RunState\n): Promise<FailureEvaluationResult> {\n const config = context.config;\n\n // Check for fail_if at global or check level\n const globalFailIf = config.fail_if;\n const checkFailIf = checkConfig.fail_if;\n const globalFailureConditions = config.failure_conditions;\n const checkFailureConditions = checkConfig.failure_conditions;\n\n if (!globalFailIf && !checkFailIf && !globalFailureConditions && !checkFailureConditions) {\n return { failed: false, haltExecution: false }; // No failure conditions\n }\n\n const evaluator = new FailureConditionEvaluator();\n\n // Build outputs record from state\n const outputsRecord: Record<string, ReviewSummary> = {};\n for (const [key] of state.stats.entries()) {\n // Try to get the actual result from context.journal if available\n try {\n const snapshotId = context.journal.beginSnapshot();\n const contextView = new (require('../../snapshot-store').ContextView)(\n context.journal,\n context.sessionId,\n snapshotId,\n [],\n context.event\n );\n const journalResult = contextView.get(key);\n if (journalResult) {\n outputsRecord[key] = journalResult as ReviewSummary;\n }\n } catch {\n // Fallback to empty result\n outputsRecord[key] = { issues: [] };\n }\n }\n\n const checkSchema = typeof checkConfig.schema === 'object' ? 'custom' : checkConfig.schema || '';\n const checkGroup = checkConfig.group || '';\n\n let anyFailed = false;\n let shouldHalt = false;\n let haltMessage: string | undefined;\n\n // Evaluate global fail_if (non-gating)\n if (globalFailIf) {\n try {\n const failed = await evaluator.evaluateSimpleCondition(\n checkId,\n checkSchema,\n checkGroup,\n result,\n globalFailIf,\n outputsRecord\n );\n\n if (failed) {\n logger.warn(`[Routing] Global fail_if triggered for ${checkId}: ${globalFailIf}`);\n\n // Add fail_if issue to result\n const failIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: 'global_fail_if',\n message: `Global failure condition met: ${globalFailIf}`,\n severity: 'error',\n category: 'logic',\n };\n\n result.issues = [...(result.issues || []), failIssue];\n // IMPORTANT: do not gate routing on global fail_if\n // This condition contributes to overall run status but should not\n // block dependents from executing when the producing check succeeded.\n // Continue evaluating check-level fail_if below.\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(`[Routing] Error evaluating global fail_if: ${msg}`);\n }\n }\n\n // Evaluate check-specific fail_if\n if (checkFailIf) {\n try {\n const failed = await evaluator.evaluateSimpleCondition(\n checkId,\n checkSchema,\n checkGroup,\n result,\n checkFailIf,\n outputsRecord\n );\n\n if (failed) {\n logger.warn(`[Routing] Check fail_if triggered for ${checkId}: ${checkFailIf}`);\n\n // Add fail_if issue to result\n const failIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}_fail_if`,\n message: `Check failure condition met: ${checkFailIf}`,\n severity: 'error',\n category: 'logic',\n };\n\n result.issues = [...(result.issues || []), failIssue];\n anyFailed = true;\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(`[Routing] Error evaluating check fail_if: ${msg}`);\n }\n }\n\n // Evaluate failure_conditions (both global and check-level)\n // These support halt_execution: true\n if (globalFailureConditions || checkFailureConditions) {\n try {\n const conditionResults = await evaluator.evaluateConditions(\n checkId,\n checkSchema,\n checkGroup,\n result,\n globalFailureConditions,\n checkFailureConditions,\n outputsRecord\n );\n\n // Check for triggered conditions\n for (const condResult of conditionResults) {\n if (condResult.failed) {\n logger.warn(\n `[Routing] Failure condition '${condResult.conditionName}' triggered for ${checkId}: ${condResult.expression}`\n );\n\n // Add issue to result\n const failIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}_${condResult.conditionName}`,\n message: condResult.message || `Failure condition met: ${condResult.expression}`,\n severity: condResult.severity || 'error',\n category: 'logic',\n };\n\n result.issues = [...(result.issues || []), failIssue];\n anyFailed = true;\n\n // Check if this condition requires halting execution\n if (condResult.haltExecution) {\n shouldHalt = true;\n haltMessage =\n condResult.message ||\n `Execution halted: condition '${condResult.conditionName}' triggered`;\n logger.error(\n `[Routing] HALT EXECUTION triggered by '${condResult.conditionName}' for ${checkId}`\n );\n }\n }\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(`[Routing] Error evaluating failure_conditions: ${msg}`);\n }\n }\n\n return { failed: anyFailed, haltExecution: shouldHalt, haltMessage };\n}\n\n/**\n * Check if routing loop budget is exceeded\n */\nexport function checkLoopBudget(\n context: EngineContext,\n state: RunState,\n origin: 'on_success' | 'on_fail' | 'on_finish',\n action: 'run' | 'goto'\n): boolean {\n const maxLoops = context.config.routing?.max_loops ?? DEFAULT_MAX_LOOPS;\n\n if (state.routingLoopCount >= maxLoops) {\n const msg = `Routing loop budget exceeded (max_loops=${maxLoops}) during ${origin} ${action}`;\n logger.error(`[Routing] ${msg}`);\n return true; // Budget exceeded\n }\n\n return false; // Budget OK\n}\n\n/**\n * Process on_success routing\n */\nasync function processOnSuccess(\n checkId: string,\n scope: Array<{ check: string; index: number }>,\n result: ReviewSummary,\n checkConfig: CheckConfig,\n context: EngineContext,\n state: RunState,\n emitEvent: (event: EngineEvent) => void\n): Promise<void> {\n const onSuccess = checkConfig.on_success;\n\n if (!onSuccess) {\n return; // No on_success configuration\n }\n\n if (context.debug) {\n logger.info(`[Routing] Processing on_success for ${checkId}`);\n }\n\n // Process on_success.run\n if (onSuccess.run && onSuccess.run.length > 0) {\n // Detect forEach context based on the actual result (aggregated map execution)\n const resForEachItems: any[] | undefined =\n (result && (result as any).forEachItems) || undefined;\n const hasForEachItems = Array.isArray(resForEachItems) && resForEachItems.length > 0;\n\n // Get the step's output for template rendering\n const stepOutput = (result as any)?.output;\n\n // Build dependency results from journal for template context\n const depResults: Record<string, unknown> = {};\n try {\n const snapshotId = context.journal.beginSnapshot();\n const allEntries = context.journal.readVisible(context.sessionId, snapshotId, context.event);\n for (const entry of allEntries) {\n if (entry.checkId && entry.result) {\n const r = entry.result as ReviewSummary & { output?: unknown };\n depResults[entry.checkId] = r.output !== undefined ? r.output : r;\n }\n }\n } catch (e) {\n logger.warn(`[Routing] Failed to build dependency results for template rendering: ${e}`);\n }\n\n for (const runItem of onSuccess.run) {\n // Parse the run item to extract target and optional args\n const { target: targetCheck, args: rawArgs } = parseRunItem(runItem);\n\n // Render Liquid templates in args if present\n const runArgs = rawArgs\n ? await renderRouteArgs(rawArgs, stepOutput, depResults, context)\n : undefined;\n\n // Check loop budget before scheduling\n if (checkLoopBudget(context, state, 'on_success', 'run')) {\n // Add error issue to result\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? DEFAULT_MAX_LOOPS}) during on_success run`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return; // Stop processing\n }\n\n // Handle fanout: check if target has fanout configuration\n const targetConfig = context.config.checks?.[targetCheck];\n const fanoutMode = targetConfig?.fanout || 'reduce'; // default to reduce\n\n if (context.debug) {\n logger.info(\n `[Routing] on_success.run: scheduling ${targetCheck} with fanout=${fanoutMode}, hasForEachItems=${hasForEachItems}${runArgs ? ', args=' + JSON.stringify(runArgs) : ''}`\n );\n }\n\n // If current check has forEach items and target is map fanout, emit one event per item\n if (fanoutMode === 'map' && hasForEachItems) {\n // Map fanout: emit one ForwardRunRequested per forEach item\n for (let itemIndex = 0; itemIndex < resForEachItems!.length; itemIndex++) {\n // Increment loop count for each item\n state.routingLoopCount++;\n\n const itemScope: Array<{ check: string; index: number }> = [\n { check: checkId, index: itemIndex },\n ];\n\n recordRoutingEvent({\n checkId,\n trigger: 'on_success',\n action: 'run',\n target: targetCheck,\n source: 'run',\n scope: itemScope,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: targetCheck,\n scope: itemScope,\n origin: 'run',\n args: runArgs,\n });\n }\n } else {\n // Reduce fanout (or no forEach context): emit with empty scope once\n // Increment loop count\n state.routingLoopCount++;\n\n recordRoutingEvent({\n checkId,\n trigger: 'on_success',\n action: 'run',\n target: targetCheck,\n source: 'run',\n scope,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: targetCheck,\n scope,\n origin: 'run',\n args: runArgs,\n });\n }\n }\n }\n\n // Process on_success.run_js\n if (onSuccess.run_js) {\n const dynamicTargets = await evaluateRunJs(\n onSuccess.run_js,\n checkId,\n checkConfig,\n result,\n context,\n state\n );\n\n for (const runItem of dynamicTargets) {\n // Parse the run item to extract target and optional args\n const { target: targetCheck, args: runArgs } = parseRunItem(runItem);\n\n // Check loop budget before scheduling\n if (checkLoopBudget(context, state, 'on_success', 'run')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? 10}) during on_success run`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n\n if (context.debug) {\n logger.info(\n `[Routing] on_success.run_js: scheduling ${targetCheck}${runArgs ? ', args=' + JSON.stringify(runArgs) : ''}`\n );\n }\n\n // Increment loop count\n state.routingLoopCount++;\n\n recordRoutingEvent({\n checkId,\n trigger: 'on_success',\n action: 'run',\n target: targetCheck,\n source: 'run_js',\n scope,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: targetCheck,\n scope,\n origin: 'run_js',\n args: runArgs,\n });\n }\n }\n\n // Declarative transitions for on_success (override goto/goto_js when present)\n const successTransTarget = await evaluateTransitions(\n onSuccess.transitions,\n checkId,\n checkConfig,\n result,\n context,\n state\n );\n if (successTransTarget !== undefined) {\n if (successTransTarget) {\n if (checkLoopBudget(context, state, 'on_success', 'goto')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? DEFAULT_MAX_LOOPS}) during on_success goto`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n state.routingLoopCount++;\n recordRoutingEvent({\n checkId,\n trigger: 'on_success',\n action: 'goto',\n target: successTransTarget.to,\n source: 'transitions',\n scope,\n gotoEvent: successTransTarget.goto_event,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: successTransTarget.to,\n scope,\n origin: 'goto_js',\n gotoEvent: successTransTarget.goto_event,\n });\n state.flags.forwardRunRequested = true;\n }\n return;\n }\n\n // Process on_success.goto / goto_js\n const gotoTarget = await evaluateGoto(\n onSuccess.goto_js,\n onSuccess.goto,\n checkId,\n checkConfig,\n result,\n context,\n state\n );\n\n if (gotoTarget) {\n // Check loop budget before scheduling goto\n if (checkLoopBudget(context, state, 'on_success', 'goto')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? 10}) during on_success goto`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n\n if (context.debug) {\n logger.info(`[Routing] on_success.goto: ${gotoTarget}`);\n }\n\n // Increment loop count\n state.routingLoopCount++;\n\n recordRoutingEvent({\n checkId,\n trigger: 'on_success',\n action: 'goto',\n target: gotoTarget,\n source: onSuccess.goto_js ? 'goto_js' : 'goto',\n scope,\n gotoEvent: onSuccess.goto_event,\n });\n // Enqueue forward run event with optional event override\n emitEvent({\n type: 'ForwardRunRequested',\n target: gotoTarget,\n gotoEvent: onSuccess.goto_event,\n scope,\n origin: 'goto_js',\n });\n\n // Mark that we've seen a forward run\n state.flags.forwardRunRequested = true;\n }\n}\n\n/**\n * Process on_fail routing\n */\nasync function processOnFail(\n checkId: string,\n scope: Array<{ check: string; index: number }>,\n result: ReviewSummary,\n checkConfig: CheckConfig,\n context: EngineContext,\n state: RunState,\n emitEvent: (event: EngineEvent) => void\n): Promise<void> {\n // Merge defaults with check-specific on_fail\n const defaults = context.config.routing?.defaults?.on_fail || {};\n const onFail: OnFailConfig | undefined = checkConfig.on_fail\n ? { ...defaults, ...checkConfig.on_fail }\n : undefined;\n\n if (!onFail) {\n return; // No on_fail configuration\n }\n\n if (context.debug) {\n logger.info(`[Routing] Processing on_fail for ${checkId}`);\n }\n\n // Process on_fail.run\n if (onFail.run && onFail.run.length > 0) {\n // Detect forEach context based on the actual aggregated result\n const resForEachItems: any[] | undefined =\n (result && (result as any).forEachItems) || undefined;\n const hasForEachItems = Array.isArray(resForEachItems) && resForEachItems.length > 0;\n\n for (const targetCheck of onFail.run) {\n // Check loop budget before scheduling\n if (checkLoopBudget(context, state, 'on_fail', 'run')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? 10}) during on_fail run`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n\n // Handle fanout: check if target has fanout configuration\n const targetConfig = context.config.checks?.[targetCheck];\n const fanoutMode = targetConfig?.fanout || 'reduce'; // default to reduce\n\n if (context.debug) {\n logger.info(\n `[Routing] on_fail.run: scheduling ${targetCheck} with fanout=${fanoutMode}, hasForEachItems=${hasForEachItems}`\n );\n }\n\n // If current check ran in forEach context, schedule remediation per item\n if (hasForEachItems) {\n for (let itemIndex = 0; itemIndex < resForEachItems!.length; itemIndex++) {\n const itemOut = resForEachItems![itemIndex] as any;\n // Only remediate failed iterations if __failed is present; otherwise run for all\n if (\n itemOut &&\n typeof itemOut === 'object' &&\n itemOut.__failed !== true &&\n fanoutMode !== 'map'\n ) {\n // For reduce targets, skip successful iterations to avoid redundant runs\n continue;\n }\n\n state.routingLoopCount++;\n const itemScope: Array<{ check: string; index: number }> = [\n { check: checkId, index: itemIndex },\n ];\n recordRoutingEvent({\n checkId,\n trigger: 'on_fail',\n action: 'run',\n target: targetCheck,\n source: 'run',\n scope: itemScope,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: targetCheck,\n scope: itemScope,\n origin: 'run',\n sourceCheck: checkId, // The failed check that triggered on_fail.run\n });\n }\n } else {\n // No forEach context: preserve current scope (if any)\n state.routingLoopCount++;\n recordRoutingEvent({\n checkId,\n trigger: 'on_fail',\n action: 'run',\n target: targetCheck,\n source: 'run',\n scope,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: targetCheck,\n scope,\n origin: 'run',\n sourceCheck: checkId, // The failed check that triggered on_fail.run\n });\n }\n }\n }\n\n // Process on_fail.run_js\n if (onFail.run_js) {\n const dynamicTargets = await evaluateRunJs(\n onFail.run_js,\n checkId,\n checkConfig,\n result,\n context,\n state\n );\n\n for (const runItem of dynamicTargets) {\n // Parse the run item to extract target and optional args\n const { target: targetCheck, args: runArgs } = parseRunItem(runItem);\n\n // Check loop budget before scheduling\n if (checkLoopBudget(context, state, 'on_fail', 'run')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? 10}) during on_fail run`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n\n if (context.debug) {\n logger.info(\n `[Routing] on_fail.run_js: scheduling ${targetCheck}${runArgs ? ', args=' + JSON.stringify(runArgs) : ''}`\n );\n }\n\n // Increment loop count\n state.routingLoopCount++;\n\n recordRoutingEvent({\n checkId,\n trigger: 'on_fail',\n action: 'run',\n target: targetCheck,\n source: 'run_js',\n scope,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: targetCheck,\n scope,\n origin: 'run_js',\n sourceCheck: checkId, // The failed check that triggered on_fail.run_js\n args: runArgs,\n });\n }\n }\n\n // Process on_fail.retry (schedule retry of the current check)\n if (onFail.retry && typeof onFail.retry.max === 'number' && onFail.retry.max > 0) {\n // Criticality mapping: for 'external' and 'internal', avoid automatic\n // retries for logical failures (fail_if/guarantee violations).\n const crit = getCriticality(context, checkId);\n const failureKind = classifyFailure(result);\n if ((crit === 'external' || crit === 'internal') && failureKind === 'logical') {\n if (context.debug) {\n logger.info(\n `[Routing] on_fail.retry suppressed for ${checkId} (criticality=${crit}, failure=logical)`\n );\n }\n // Skip retry scheduling\n } else {\n const max = Math.max(0, onFail.retry.max || 0);\n // Initialize retry attempt map on state\n if (!(state as any).retryAttempts) (state as any).retryAttempts = new Map<string, number>();\n const attemptsMap: Map<string, number> = (state as any).retryAttempts;\n\n const makeKey = (sc: Array<{ check: string; index: number }> | undefined) => {\n const keyScope = sc && sc.length > 0 ? JSON.stringify(sc) : 'root';\n return `${checkId}::${keyScope}`;\n };\n\n const scheduleRetryForScope = (sc: Array<{ check: string; index: number }> | undefined) => {\n const key = makeKey(sc);\n const used = attemptsMap.get(key) || 0;\n if (used >= max) return; // budget exhausted\n attemptsMap.set(key, used + 1);\n\n // Increment loop count and schedule forward run for the same check\n state.routingLoopCount++;\n recordRoutingEvent({\n checkId,\n trigger: 'on_fail',\n action: 'retry',\n source: 'retry',\n scope: sc || [],\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: checkId,\n scope: sc || [],\n origin: 'run',\n });\n };\n\n const resForEachItems: any[] | undefined =\n (result && (result as any).forEachItems) || undefined;\n const hasForEachItems = Array.isArray(resForEachItems) && resForEachItems.length > 0;\n\n if (hasForEachItems) {\n for (let i = 0; i < resForEachItems!.length; i++) {\n const itemOut = resForEachItems![i] as any;\n // Only retry failed iterations (marked by __failed)\n if (itemOut && typeof itemOut === 'object' && itemOut.__failed === true) {\n const sc: Array<{ check: string; index: number }> = [{ check: checkId, index: i }];\n scheduleRetryForScope(sc);\n }\n }\n } else {\n scheduleRetryForScope(scope);\n }\n\n // Note: backoff.delay_ms and mode are intentionally not awaited here; the\n // state-machine processes retries as subsequent waves. If needed later, we\n // can insert a timed wait in the orchestrator layer.\n }\n }\n\n // Declarative transitions for on_fail (override goto/goto_js when present)\n const failTransTarget = await evaluateTransitions(\n onFail.transitions,\n checkId,\n checkConfig,\n result,\n context,\n state\n );\n if (failTransTarget !== undefined) {\n if (failTransTarget) {\n if (checkLoopBudget(context, state, 'on_fail', 'goto')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? DEFAULT_MAX_LOOPS}) during on_fail goto`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n state.routingLoopCount++;\n recordRoutingEvent({\n checkId,\n trigger: 'on_fail',\n action: 'goto',\n target: failTransTarget.to,\n source: 'transitions',\n scope,\n gotoEvent: failTransTarget.goto_event,\n });\n emitEvent({\n type: 'ForwardRunRequested',\n target: failTransTarget.to,\n scope,\n origin: 'goto_js',\n gotoEvent: failTransTarget.goto_event,\n });\n state.flags.forwardRunRequested = true;\n }\n return;\n }\n\n // Process on_fail.goto / goto_js\n const gotoTarget = await evaluateGoto(\n onFail.goto_js,\n onFail.goto,\n checkId,\n checkConfig,\n result,\n context,\n state\n );\n\n if (gotoTarget) {\n // Check loop budget before scheduling goto\n if (checkLoopBudget(context, state, 'on_fail', 'goto')) {\n const errorIssue: ReviewIssue = {\n file: 'system',\n line: 0,\n ruleId: `${checkId}/routing/loop_budget_exceeded`,\n message: `Routing loop budget exceeded (max_loops=${context.config.routing?.max_loops ?? 10}) during on_fail goto`,\n severity: 'error',\n category: 'logic',\n };\n result.issues = [...(result.issues || []), errorIssue];\n return;\n }\n\n if (context.debug) {\n logger.info(`[Routing] on_fail.goto: ${gotoTarget}`);\n }\n\n // Increment loop count\n state.routingLoopCount++;\n\n recordRoutingEvent({\n checkId,\n trigger: 'on_fail',\n action: 'goto',\n target: gotoTarget,\n source: onFail.goto_js ? 'goto_js' : 'goto',\n scope,\n gotoEvent: onFail.goto_event,\n });\n // Enqueue forward run event with optional event override\n emitEvent({\n type: 'ForwardRunRequested',\n target: gotoTarget,\n gotoEvent: onFail.goto_event,\n scope,\n origin: 'goto_js',\n });\n\n // Mark that we've seen a forward run\n state.flags.forwardRunRequested = true;\n }\n}\n\n/**\n * Evaluate run_js expression to get dynamic check targets\n */\n/**\n * Validate that an item is a valid OnSuccessRunItem (string or object with step/workflow)\n */\nfunction isValidRunItem(item: unknown): item is OnSuccessRunItem {\n if (typeof item === 'string' && item) return true;\n if (typeof item === 'object' && item !== null) {\n const obj = item as Record<string, unknown>;\n if (typeof obj.step === 'string' && obj.step) return true;\n if (typeof obj.workflow === 'string' && obj.workflow) return true;\n }\n return false;\n}\n\nasync function evaluateRunJs(\n runJs: string,\n checkId: string,\n checkConfig: CheckConfig,\n result: ReviewSummary,\n context: EngineContext,\n _state: RunState\n): Promise<OnSuccessRunItem[]> {\n try {\n const sandbox = createSecureSandbox();\n const historyLimit = getHistoryLimit();\n\n // Build outputs record and outputs_history\n const snapshotId = context.journal.beginSnapshot();\n const contextView = new (require('../../snapshot-store').ContextView)(\n context.journal,\n context.sessionId,\n snapshotId,\n [],\n context.event\n );\n\n const outputsRecord: Record<string, any> = {};\n const outputsHistory: Record<string, any[]> = {};\n\n // Get all visible journal entries to build complete history\n const allEntries = context.journal.readVisible(context.sessionId, snapshotId, context.event);\n const uniqueCheckIds = new Set(allEntries.map(e => e.checkId));\n\n for (const checkIdFromJournal of uniqueCheckIds) {\n try {\n // Get current output for this check\n const journalResult = contextView.get(checkIdFromJournal);\n if (journalResult) {\n // Prefer the output field if present, otherwise use the full result\n outputsRecord[checkIdFromJournal] =\n journalResult.output !== undefined ? journalResult.output : journalResult;\n }\n } catch {\n outputsRecord[checkIdFromJournal] = { issues: [] };\n }\n\n // Build history for this check\n try {\n const history = contextView.getHistory(checkIdFromJournal);\n if (history && history.length > 0) {\n const trimmed =\n historyLimit && history.length > historyLimit\n ? history.slice(history.length - historyLimit)\n : history;\n // Extract outputs from history (prefer output field if available)\n outputsHistory[checkIdFromJournal] = trimmed.map((r: any) =>\n r.output !== undefined ? r.output : r\n );\n }\n } catch {\n // Ignore history errors\n }\n }\n\n // Add history as a property on outputs object for convenient access\n outputsRecord.history = outputsHistory;\n\n // Compute minimal forEach metadata for run_js parity\n let forEachMeta: any = undefined;\n try {\n const hist = outputsHistory[checkId] || [];\n const lastArr = (hist as any[])\n .slice()\n .reverse()\n .find((x: any) => Array.isArray(x));\n if (checkConfig.forEach === true && Array.isArray(lastArr)) {\n forEachMeta = {\n is_parent: true,\n last_wave_size: lastArr.length,\n last_items: lastArr,\n };\n }\n } catch {}\n\n const scopeObj: any = {\n step: {\n id: checkId,\n tags: checkConfig.tags || [],\n group: checkConfig.group,\n },\n outputs: outputsRecord,\n outputs_history: outputsHistory,\n output: (result as any)?.output,\n memory: createMemoryHelpers(),\n event: {\n name: context.event || 'manual',\n },\n forEach: forEachMeta,\n };\n\n const code = `\n const step = scope.step;\n const outputs = scope.outputs;\n const outputs_history = scope.outputs_history;\n const output = scope.output;\n const memory = scope.memory;\n const event = scope.event;\n const forEach = scope.forEach;\n const log = (...args) => console.log('🔍 Debug:', ...args);\n const __fn = () => {\n ${runJs}\n };\n const __res = __fn();\n // Return as-is; validation happens after sandbox execution\n return Array.isArray(__res) ? __res : [];\n `;\n\n try {\n const evalResult = compileAndRun<unknown[]>(\n sandbox,\n code,\n { scope: scopeObj },\n { injectLog: false, wrapFunction: false }\n );\n // Filter to valid run items (strings or objects with step/workflow)\n return Array.isArray(evalResult) ? evalResult.filter(isValidRunItem) : [];\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(`[Routing] Error in run_js sandbox evaluation: ${msg}`);\n return [];\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(`[Routing] Error evaluating run_js: ${msg}`);\n return [];\n }\n}\n\n/**\n * Evaluate goto_js or return static goto target\n */\nexport async function evaluateGoto(\n gotoJs: string | undefined,\n gotoStatic: string | undefined,\n checkId: string,\n checkConfig: CheckConfig,\n result: ReviewSummary,\n context: EngineContext,\n _state: RunState\n): Promise<string | null> {\n // Evaluate goto_js first\n if (gotoJs) {\n try {\n const sandbox = createSecureSandbox();\n const historyLimit = getHistoryLimit();\n\n // Build outputs record and outputs_history from the full session snapshot.\n // Do not filter by event here — on_finish (especially forEach post-children) may\n // need to see results committed under different event triggers within the same run.\n const snapshotId = context.journal.beginSnapshot();\n const contextView = new (require('../../snapshot-store').ContextView)(\n context.journal,\n context.sessionId,\n snapshotId,\n [],\n undefined\n );\n\n const outputsRecord: Record<string, any> = {};\n const outputsHistory: Record<string, any[]> = {};\n\n // Get all visible journal entries to build complete history\n const allEntries = context.journal.readVisible(context.sessionId, snapshotId, undefined);\n const uniqueCheckIds = new Set(allEntries.map(e => e.checkId));\n\n for (const checkIdFromJournal of uniqueCheckIds) {\n try {\n // Get current output for this check\n const journalResult = contextView.get(checkIdFromJournal);\n if (journalResult) {\n // Prefer the output field if present, otherwise use the full result\n outputsRecord[checkIdFromJournal] =\n journalResult.output !== undefined ? journalResult.output : journalResult;\n }\n } catch {\n outputsRecord[checkIdFromJournal] = { issues: [] };\n }\n\n // Build history for this check\n try {\n const history = contextView.getHistory(checkIdFromJournal);\n if (history && history.length > 0) {\n const trimmed =\n historyLimit && history.length > historyLimit\n ? history.slice(history.length - historyLimit)\n : history;\n // Extract outputs from history (prefer output field if available)\n outputsHistory[checkIdFromJournal] = trimmed.map((r: any) =>\n r.output !== undefined ? r.output : r\n );\n }\n } catch {\n // Ignore history errors\n }\n }\n\n // Add history as a property on outputs object for convenient access\n outputsRecord.history = outputsHistory;\n\n // Compute minimal forEach metadata for convenience in goto_js\n // - last_wave_size: number of items in the latest root-scope array output\n // - last_items: the latest array output itself (if available)\n let forEachMeta: any = undefined;\n try {\n const hist = outputsHistory[checkId] || [];\n const lastArr = (hist as any[])\n .slice()\n .reverse()\n .find((x: any) => Array.isArray(x));\n if (checkConfig.forEach === true && Array.isArray(lastArr)) {\n forEachMeta = {\n is_parent: true,\n last_wave_size: lastArr.length,\n last_items: lastArr,\n };\n }\n } catch {}\n\n const scopeObj: any = {\n step: {\n id: checkId,\n tags: checkConfig.tags || [],\n group: checkConfig.group,\n },\n outputs: outputsRecord,\n outputs_history: outputsHistory,\n output: (result as any)?.output,\n memory: createMemoryHelpers(),\n event: {\n name: context.event || 'manual',\n },\n forEach: forEachMeta,\n };\n\n // Debug: Log outputs_history\n if (context.debug) {\n logger.info(\n `[Routing] evaluateGoto: checkId=${checkId}, outputs_history keys=${Object.keys(outputsHistory).join(',')}`\n );\n for (const [key, values] of Object.entries(outputsHistory)) {\n logger.info(`[Routing] ${key}: ${values.length} items`);\n }\n }\n\n const code = `\n const step = scope.step;\n const outputs = scope.outputs;\n const outputs_history = scope.outputs_history;\n const output = scope.output;\n const memory = scope.memory;\n const event = scope.event;\n const forEach = scope.forEach;\n const log = (...args) => console.log('🔍 Debug:', ...args);\n ${gotoJs}\n `;\n\n try {\n const evalResult = compileAndRun<string | null>(\n sandbox,\n code,\n { scope: scopeObj },\n { injectLog: false, wrapFunction: true }\n );\n\n if (context.debug) {\n logger.info(`[Routing] evaluateGoto result: ${evalResult}`);\n }\n\n if (typeof evalResult === 'string' && evalResult) {\n return evalResult;\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(`[Routing] Error in goto_js sandbox evaluation: ${msg}`);\n // Fall through to static goto\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.error(`[Routing] Error evaluating goto_js: ${msg}`);\n\n // Fall back to static goto if available\n if (gotoStatic) {\n logger.info(`[Routing] Falling back to static goto: ${gotoStatic}`);\n return gotoStatic;\n }\n }\n }\n\n // Return static goto\n return gotoStatic || null;\n}\n// Default values (used only when config is absent)\nconst DEFAULT_MAX_LOOPS = 10;\n\n/**\n * Evaluate declarative transitions. Returns:\n * - { to, goto_event } when a rule matches,\n * - null (explicit) when a rule matches with to=null,\n * - undefined when no rule matched or transitions is empty.\n */\nexport async function evaluateTransitions(\n transitions: TransitionRule[] | undefined,\n checkId: string,\n checkConfig: CheckConfig,\n result: ReviewSummary,\n context: EngineContext,\n _state: RunState\n): Promise<\n { to: string; goto_event?: import('../../types/config').EventTrigger } | null | undefined\n> {\n if (!transitions || transitions.length === 0) return undefined;\n try {\n const sandbox = createSecureSandbox();\n const historyLimit = getHistoryLimit();\n\n // Build outputs record and outputs_history from the full session snapshot\n const snapshotId = context.journal.beginSnapshot();\n const ContextView = (require('../../snapshot-store') as any).ContextView;\n const view = new ContextView(context.journal, context.sessionId, snapshotId, [], undefined);\n\n const outputsRecord: Record<string, any> = {};\n const outputsHistory: Record<string, any[]> = {};\n const allEntries = context.journal.readVisible(context.sessionId, snapshotId, undefined);\n const uniqueCheckIds = new Set(allEntries.map((e: any) => e.checkId));\n for (const cid of uniqueCheckIds) {\n try {\n const jr = view.get(cid);\n if (jr) outputsRecord[cid] = jr.output !== undefined ? jr.output : jr;\n } catch {}\n try {\n const hist = view.getHistory(cid);\n if (hist && hist.length > 0) {\n const trimmed =\n historyLimit && hist.length > historyLimit\n ? hist.slice(hist.length - historyLimit)\n : hist;\n outputsHistory[cid] = trimmed.map((r: any) => (r.output !== undefined ? r.output : r));\n }\n } catch {}\n }\n outputsRecord.history = outputsHistory;\n\n const scopeObj: any = {\n step: { id: checkId, tags: checkConfig.tags || [], group: checkConfig.group },\n outputs: outputsRecord,\n outputs_history: outputsHistory,\n output: (result as any)?.output,\n memory: createMemoryHelpers(),\n event: { name: context.event || 'manual' },\n };\n\n for (const rule of transitions) {\n const helpers = `\n const any = (arr, pred) => Array.isArray(arr) && arr.some(x => pred(x));\n const all = (arr, pred) => Array.isArray(arr) && arr.every(x => pred(x));\n const none = (arr, pred) => Array.isArray(arr) && !arr.some(x => pred(x));\n const count = (arr, pred) => Array.isArray(arr) ? arr.filter(x => pred(x)).length : 0;\n `;\n // Mirror the variable exposure pattern used in goto_js/run_js so that\n // `when:` expressions can reference `outputs`, `outputs_history`, `event`, etc.\n const code = `\n ${helpers}\n const step = scope.step;\n const outputs = scope.outputs;\n const outputs_history = scope.outputs_history;\n const output = scope.output;\n const memory = scope.memory;\n const event = scope.event;\n const __eval = () => { return (${rule.when}); };\n return __eval();\n `;\n let matched: boolean | undefined;\n try {\n matched = compileAndRun<boolean>(\n sandbox,\n code,\n { scope: scopeObj },\n { injectLog: false, wrapFunction: false }\n );\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n logger.warn(`[Routing] Error evaluating transition 'when' clause: ${msg}`);\n matched = false;\n }\n if (matched) {\n if (rule.to === null) return null;\n if (typeof rule.to === 'string' && rule.to.length > 0) {\n return { to: rule.to, goto_event: (rule as any).goto_event };\n }\n return null;\n }\n }\n return undefined;\n } catch (err) {\n logger.error(\n `[Routing] Error evaluating transitions: ${err instanceof Error ? err.message : String(err)}`\n );\n return undefined;\n }\n}\n"],"mappings":"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","names":["ContextView"]}
|
|
@@ -18,13 +18,13 @@ import {
|
|
|
18
18
|
init_memory_store
|
|
19
19
|
} from "./chunk-VPC3QSPW.mjs";
|
|
20
20
|
import {
|
|
21
|
-
__esm
|
|
21
|
+
__esm,
|
|
22
|
+
__require
|
|
22
23
|
} from "./chunk-J7LXIPZS.mjs";
|
|
23
24
|
|
|
24
25
|
// src/liquid-extensions.ts
|
|
25
26
|
import { Liquid, Tag, Value } from "liquidjs";
|
|
26
27
|
import { AsyncLocalStorage } from "async_hooks";
|
|
27
|
-
import fs from "fs/promises";
|
|
28
28
|
import path from "path";
|
|
29
29
|
function sanitizeLabel(value) {
|
|
30
30
|
if (value == null) return "";
|
|
@@ -390,12 +390,33 @@ var init_liquid_extensions = __esm({
|
|
|
390
390
|
init_sandbox();
|
|
391
391
|
ReadFileTag = class extends Tag {
|
|
392
392
|
filepath;
|
|
393
|
+
indentValue = null;
|
|
393
394
|
constructor(token, remainTokens, liquid) {
|
|
394
395
|
super(token, remainTokens, liquid);
|
|
395
|
-
|
|
396
|
+
const argsStr = token.args.trim();
|
|
397
|
+
const indentMatch = argsStr.match(/^(.+?)\s+indent:\s*(\d+)\s*$/);
|
|
398
|
+
if (indentMatch) {
|
|
399
|
+
this.filepath = new Value(indentMatch[1].trim(), liquid);
|
|
400
|
+
this.indentValue = new Value(indentMatch[2], liquid);
|
|
401
|
+
} else {
|
|
402
|
+
this.filepath = new Value(argsStr, liquid);
|
|
403
|
+
}
|
|
396
404
|
}
|
|
397
405
|
*render(ctx, emitter) {
|
|
398
406
|
const filePath = yield this.filepath.value(ctx, false);
|
|
407
|
+
let indent = 0;
|
|
408
|
+
if (this.indentValue) {
|
|
409
|
+
const indentAmount = yield this.indentValue.value(ctx, false);
|
|
410
|
+
indent = typeof indentAmount === "number" ? indentAmount : parseInt(String(indentAmount), 10) || 0;
|
|
411
|
+
} else {
|
|
412
|
+
const output = emitter.buffer || "";
|
|
413
|
+
const lastNewline = output.lastIndexOf("\n");
|
|
414
|
+
if (lastNewline >= 0) {
|
|
415
|
+
const lineStart = output.substring(lastNewline + 1);
|
|
416
|
+
const match = lineStart.match(/^(\s*)/);
|
|
417
|
+
indent = match ? match[1].length : 0;
|
|
418
|
+
}
|
|
419
|
+
}
|
|
399
420
|
if (!filePath || typeof filePath !== "string") {
|
|
400
421
|
emitter.write("[Error: Invalid file path]");
|
|
401
422
|
return;
|
|
@@ -409,7 +430,12 @@ var init_liquid_extensions = __esm({
|
|
|
409
430
|
return;
|
|
410
431
|
}
|
|
411
432
|
try {
|
|
412
|
-
|
|
433
|
+
let content = __require("fs").readFileSync(resolvedPath, "utf-8");
|
|
434
|
+
if (indent > 0) {
|
|
435
|
+
const indentStr = " ".repeat(indent);
|
|
436
|
+
const lines = content.split("\n");
|
|
437
|
+
content = lines.map((line, i) => i === 0 ? line : indentStr + line).join("\n");
|
|
438
|
+
}
|
|
413
439
|
emitter.write(content);
|
|
414
440
|
} catch (error) {
|
|
415
441
|
const errorMessage = error instanceof Error ? error.message : error?.code || "Unknown error";
|
|
@@ -430,4 +456,4 @@ export {
|
|
|
430
456
|
createExtendedLiquid,
|
|
431
457
|
init_liquid_extensions
|
|
432
458
|
};
|
|
433
|
-
//# sourceMappingURL=chunk-
|
|
459
|
+
//# sourceMappingURL=chunk-XJQKTK6V.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/liquid-extensions.ts"],"sourcesContent":["// eslint-disable-next-line no-restricted-imports -- this is the extensions file that wraps liquidjs\nimport { Liquid, TagToken, Context, TopLevelToken, Tag, Value, Emitter } from 'liquidjs';\nimport { AsyncLocalStorage } from 'async_hooks';\nimport path from 'path';\nimport {\n hasMinPermission,\n isOwner,\n isMember,\n isCollaborator,\n isContributor,\n isFirstTimer,\n detectLocalMode,\n} from './utils/author-permissions';\nimport { MemoryStore } from './memory-store';\nimport { createSecureSandbox, compileAndRun } from './utils/sandbox';\n\n/**\n * Sanitize label strings to only allow [A-Za-z0-9:/\\- ] characters (including spaces and hyphens)\n * @param value - Label value to sanitize\n * @returns Sanitized label string\n */\nexport function sanitizeLabel(value: unknown): string {\n if (value == null) return '';\n const s = String(value);\n // Keep only alphanumerics, colon, slash, hyphen, and space; collapse repeated slashes and trim\n return s\n .replace(/[^A-Za-z0-9:\\/\\- ]/g, '')\n .replace(/\\/{2,}/g, '/')\n .trim();\n}\n\n/**\n * Sanitize an array of labels\n * @param labels - Array of label values\n * @returns Array of sanitized, non-empty label strings\n */\nexport function sanitizeLabelList(labels: unknown): string[] {\n if (!Array.isArray(labels)) return [];\n return (labels as unknown[]).map(v => sanitizeLabel(v)).filter(s => s.length > 0);\n}\n\n/**\n * Custom ReadFile tag for Liquid templates\n * Usage: {% readfile \"path/to/file.txt\" %}\n * or with variable: {% readfile filename %}\n *\n * AUTOMATIC INDENTATION: The tag automatically detects its position in the output\n * and indents subsequent lines to match. This makes it safe to use inside YAML\n * literal blocks (|) without manual indent parameters.\n *\n * Manual override: {% readfile \"path/to/file.txt\" indent: 4 %}\n */\nexport class ReadFileTag extends Tag {\n private filepath: Value;\n private indentValue: Value | null = null;\n\n constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid);\n // Parse args: could be just filepath or filepath with indent: N\n // Format: \"path/to/file\" or \"path/to/file\" indent: 4\n const argsStr = token.args.trim();\n\n // Check if there's an indent parameter\n const indentMatch = argsStr.match(/^(.+?)\\s+indent:\\s*(\\d+)\\s*$/);\n if (indentMatch) {\n this.filepath = new Value(indentMatch[1].trim(), liquid);\n this.indentValue = new Value(indentMatch[2], liquid);\n } else {\n this.filepath = new Value(argsStr, liquid);\n }\n }\n\n *render(ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n const filePath = yield this.filepath.value(ctx, false);\n\n // Determine indentation: manual override or auto-detect from output buffer\n let indent = 0;\n if (this.indentValue) {\n const indentAmount = yield this.indentValue.value(ctx, false);\n indent =\n typeof indentAmount === 'number' ? indentAmount : parseInt(String(indentAmount), 10) || 0;\n } else {\n // Auto-detect indentation by looking at current output position\n // Find the column position by counting characters since the last newline\n const output = (emitter as any).buffer || '';\n const lastNewline = output.lastIndexOf('\\n');\n if (lastNewline >= 0) {\n // Count characters (spaces/tabs) from last newline to current position\n const lineStart = output.substring(lastNewline + 1);\n // Count leading whitespace that will be our indent\n const match = lineStart.match(/^(\\s*)/);\n indent = match ? match[1].length : 0;\n }\n }\n\n // Validate the path\n if (!filePath || typeof filePath !== 'string') {\n emitter.write('[Error: Invalid file path]');\n return;\n }\n\n // Security: Resolve path relative to basePath (from context) or project root\n // basePath can be passed via context globals for loadConfig scenarios\n const basePath = (ctx.globals as Record<string, unknown>)?.basePath;\n const projectRoot = typeof basePath === 'string' ? basePath : process.cwd();\n\n // Normalize paths to prevent traversal attacks (e.g., ../../../etc/passwd)\n const normalizedRoot = path.normalize(projectRoot + path.sep);\n const resolvedPath = path.normalize(path.resolve(projectRoot, filePath.toString()));\n\n // Ensure the resolved path is within the allowed directory\n // Use normalized paths with separator to prevent prefix attacks (e.g., /foo vs /foobar)\n if (!resolvedPath.startsWith(normalizedRoot) && resolvedPath !== path.normalize(projectRoot)) {\n emitter.write('[Error: File path escapes project directory]');\n return;\n }\n\n // Read the file content synchronously to support both parseAndRender and parseAndRenderSync\n // Using readFileSync ensures compatibility with sync rendering (e.g., loadConfig in expressions)\n try {\n let content = require('fs').readFileSync(resolvedPath, 'utf-8');\n\n // Apply indentation to all lines after the first\n // This is needed for YAML literal blocks where continuation lines must be indented\n if (indent > 0) {\n const indentStr = ' '.repeat(indent);\n const lines = content.split('\\n');\n content = lines\n .map((line: string, i: number) => (i === 0 ? line : indentStr + line))\n .join('\\n');\n }\n\n emitter.write(content);\n } catch (error) {\n // Handle file read errors gracefully\n const errorMessage =\n error instanceof Error\n ? error.message\n : (error as NodeJS.ErrnoException)?.code || 'Unknown error';\n emitter.write(`[Error reading file: ${errorMessage}]`);\n }\n }\n}\n\n// Async-local permissions context for filters (per-render)\nconst permissionsALS = new AsyncLocalStorage<{ authorAssociation?: string }>();\n\nexport async function withPermissionsContext<T>(\n ctx: { authorAssociation?: string },\n fn: () => Promise<T>\n): Promise<T> {\n return await permissionsALS.run(ctx, fn as any);\n}\n\n/**\n * Configure a Liquid instance with custom extensions\n */\nexport function configureLiquidWithExtensions(liquid: Liquid): void {\n // Register the readfile tag\n liquid.registerTag('readfile', ReadFileTag);\n\n // Register parse_json filter to parse JSON strings into objects\n liquid.registerFilter('parse_json', (value: string) => {\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(value);\n } catch {\n // Return original value if parsing fails\n return value;\n }\n });\n\n // Register to_json filter as alias for json (for consistency)\n liquid.registerFilter('to_json', (value: unknown) => {\n try {\n return JSON.stringify(value);\n } catch {\n return '[Error: Unable to serialize to JSON]';\n }\n });\n\n // Register base64 filter for encoding strings\n // Usage: {{ \"user:password\" | base64 }}\n liquid.registerFilter('base64', (value: unknown) => {\n if (value == null) return '';\n const str = String(value);\n return Buffer.from(str).toString('base64');\n });\n\n // Register base64_decode filter for decoding base64 strings\n // Usage: {{ encoded_value | base64_decode }}\n liquid.registerFilter('base64_decode', (value: unknown) => {\n if (value == null) return '';\n const str = String(value);\n try {\n return Buffer.from(str, 'base64').toString('utf-8');\n } catch {\n return '[Error: Invalid base64 string]';\n }\n });\n\n // Sanitize a label to allowed characters only: [A-Za-z0-9:/]\n liquid.registerFilter('safe_label', (value: unknown) => sanitizeLabel(value));\n\n // Sanitize an array of labels\n liquid.registerFilter('safe_label_list', (value: unknown) => sanitizeLabelList(value));\n\n // Convert literal escape sequences (e.g., \"\\n\") into actual newlines\n liquid.registerFilter('unescape_newlines', (value: unknown) => {\n if (value == null) return '';\n const s = String(value);\n return s.replace(/\\\\n/g, '\\n').replace(/\\\\r/g, '\\r').replace(/\\\\t/g, '\\t');\n });\n\n // JSON escape filter - escapes a string for use inside a JSON string value\n // This escapes special characters like quotes, backslashes, and control characters\n // Usage: \"jql\": \"{{ myValue | json_escape }}\"\n liquid.registerFilter('json_escape', (value: unknown) => {\n if (value == null) return '';\n const s = String(value);\n // Use JSON.stringify which handles all escaping, then strip the surrounding quotes\n const jsonStr = JSON.stringify(s);\n // Remove the first and last character (the quotes added by JSON.stringify)\n return jsonStr.slice(1, -1);\n });\n\n // Shell escape filter - wraps value in single quotes with proper escaping\n // Usage: {{ value | shell_escape }}\n // Example: \"hello'world\" becomes \"'hello'\\''world'\"\n // This is POSIX-compliant and safe for arbitrary text including mermaid diagrams\n liquid.registerFilter('shell_escape', (value: unknown) => {\n if (value == null) return \"''\";\n const s = String(value);\n // Replace single quotes with: end quote, escaped quote, start quote\n // Then wrap the entire thing in single quotes\n return \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n });\n\n // Alias for shell_escape\n liquid.registerFilter('escape_shell', (value: unknown) => {\n if (value == null) return \"''\";\n const s = String(value);\n return \"'\" + s.replace(/'/g, \"'\\\\''\") + \"'\";\n });\n\n // Shell escape for double quotes (less safe but sometimes needed)\n // Usage: {{ value | shell_escape_double }}\n // Escapes: $, `, \\, \", and !\n liquid.registerFilter('shell_escape_double', (value: unknown) => {\n if (value == null) return '\"\"';\n const s = String(value);\n // Escape characters that have special meaning inside double quotes\n const escaped = s\n .replace(/\\\\/g, '\\\\\\\\') // backslash first\n .replace(/\\$/g, '\\\\$') // dollar sign\n .replace(/`/g, '\\\\`') // backticks\n .replace(/\"/g, '\\\\\"') // double quotes\n .replace(/!/g, '\\\\!'); // history expansion\n return '\"' + escaped + '\"';\n });\n\n // Register author permission filters (from main)\n // These filters check the author's permission level; detect local mode for tests\n const isLocal = detectLocalMode();\n\n const resolveAssoc = (val: unknown): string | undefined => {\n if (typeof val === 'string' && val.length > 0) return val;\n const store = permissionsALS.getStore();\n return store?.authorAssociation;\n };\n\n liquid.registerFilter('has_min_permission', (authorAssociation: unknown, level: string) => {\n return hasMinPermission(resolveAssoc(authorAssociation), level as any, isLocal);\n });\n\n liquid.registerFilter('is_owner', (authorAssociation: unknown) => {\n return isOwner(resolveAssoc(authorAssociation), isLocal);\n });\n\n liquid.registerFilter('is_member', (authorAssociation: unknown) => {\n return isMember(resolveAssoc(authorAssociation), isLocal);\n });\n\n liquid.registerFilter('is_collaborator', (authorAssociation: unknown) => {\n return isCollaborator(resolveAssoc(authorAssociation), isLocal);\n });\n\n liquid.registerFilter('is_contributor', (authorAssociation: unknown) => {\n return isContributor(resolveAssoc(authorAssociation), isLocal);\n });\n\n liquid.registerFilter('is_first_timer', (authorAssociation: unknown) => {\n return isFirstTimer(resolveAssoc(authorAssociation), isLocal);\n });\n\n // Register memory filters for accessing memory store\n const memoryStore = MemoryStore.getInstance();\n\n liquid.registerFilter('memory_get', (key: string, namespace?: string) => {\n if (typeof key !== 'string') {\n return undefined;\n }\n return memoryStore.get(key, namespace);\n });\n\n liquid.registerFilter('memory_has', (key: string, namespace?: string) => {\n if (typeof key !== 'string') {\n return false;\n }\n const has = memoryStore.has(key, namespace);\n try {\n if (process.env.VISOR_DEBUG === 'true' && key === 'fact_validation_issues') {\n console.error(\n `[liquid] memory_has('${key}', ns='${namespace || memoryStore.getDefaultNamespace()}') => ${String(\n has\n )}`\n );\n }\n } catch {}\n return has;\n });\n\n liquid.registerFilter('memory_list', (namespace?: string) => {\n return memoryStore.list(namespace);\n });\n\n // Generic helpers to radically simplify templates\n\n // get: safe nested access using dot-path (e.g., obj | get: 'a.b.c')\n liquid.registerFilter('get', (obj: any, pathExpr: unknown) => {\n if (obj == null) return undefined;\n const path = typeof pathExpr === 'string' ? pathExpr : String(pathExpr || '');\n if (!path) return obj;\n const parts = path.split('.');\n let cur: any = obj;\n for (const p of parts) {\n if (cur == null) return undefined;\n cur = cur[p as keyof typeof cur];\n }\n return cur;\n });\n\n // not_empty: true when value is a non-empty array/string/object with keys\n liquid.registerFilter('not_empty', (v: unknown) => {\n if (Array.isArray(v)) return v.length > 0;\n if (typeof v === 'string') return v.length > 0;\n if (v && typeof v === 'object') return Object.keys(v as object).length > 0;\n return false;\n });\n\n // coalesce: pick first argument (value or candidates) that is a non-empty array/object/string\n // Usage: a | coalesce: b, c, d\n liquid.registerFilter('coalesce', (first: unknown, ...rest: unknown[]) => {\n const all = [first, ...rest];\n for (const v of all) {\n if (Array.isArray(v) && v.length > 0) return v;\n if (typeof v === 'string' && v.length > 0) return v;\n if (v && typeof v === 'object' && Object.keys(v as object).length > 0) return v;\n }\n return Array.isArray(first) ? [] : (first ?? undefined);\n });\n\n // where_exp: generic expression-based filter (Shopify-style)\n // Usage: array | where_exp: 'i', 'i.is_valid != true and i.confidence != \"high\"'\n liquid.registerFilter('where_exp', (items: unknown, varName: string, expr: string) => {\n const arr = Array.isArray(items) ? (items as any[]) : [];\n const name = typeof varName === 'string' && varName.trim() ? varName.trim() : 'i';\n const body = String(expr || '');\n try {\n // Use sandbox for secure evaluation\n const sandbox = createSecureSandbox();\n const out: any[] = [];\n for (let idx = 0; idx < arr.length; idx++) {\n const item = arr[idx];\n let ok = false;\n try {\n const scope: Record<string, unknown> = { [name]: item, idx, arr };\n ok = !!compileAndRun<boolean>(sandbox, body, scope, {\n injectLog: false,\n wrapFunction: true,\n });\n } catch {\n ok = false;\n }\n if (ok) out.push(item);\n }\n return out;\n } catch {\n return [];\n }\n });\n\n // chat_history: merge outputs_history from multiple steps into a normalized,\n // timestamp-sorted chat transcript.\n //\n // Usage:\n // {% assign history = '' | chat_history: 'ask', 'reply' %}\n // {% for m in history %}\n // {{ m.role }}: {{ m.text }}\n // {% endfor %}\n //\n // Advanced usage with options:\n // '' | chat_history: 'ask', 'reply',\n // direction: 'desc',\n // limit: 50,\n // roles: { by_type: { 'human-input': 'user', 'ai': 'assistant' } },\n // text: { default_field: 'text', by_step: { reply: 'text' } }\n liquid.registerFilter(\n 'chat_history',\n function (this: unknown, value: unknown, ...args: unknown[]): unknown {\n try {\n // Access Liquid rendering context to read globals like outputs_history\n const impl = this as { context?: { get: (key: string[] | string) => unknown } } | undefined;\n const ctx = impl?.context;\n\n // Parse arguments: one or more step names, optional options hash as last arg\n const allArgs = Array.isArray(args) ? args : [];\n\n if (allArgs.length === 0) {\n return [];\n }\n\n // Liquid passes keyword arguments as trailing [\"key\", value] pairs.\n // Split positional step names from an optional options hash built from those pairs.\n const positional: unknown[] = [];\n const options: any = {};\n for (const arg of allArgs) {\n if (\n Array.isArray(arg) &&\n arg.length === 2 &&\n typeof arg[0] === 'string' &&\n arg[0].length > 0\n ) {\n options[arg[0]] = arg[1];\n } else {\n positional.push(arg);\n }\n }\n const stepArgs: unknown[] = positional;\n\n const steps = stepArgs.map(s => String(s ?? '').trim()).filter(s => s.length > 0);\n if (steps.length === 0) return [];\n\n // Resolve history source: prefer outputs_history, fall back to outputs.history\n const outputsHistoryVar = (ctx?.get(['outputs_history']) || {}) as Record<\n string,\n unknown[]\n >;\n const outputsVar = (ctx?.get(['outputs']) || {}) as { history?: Record<string, unknown[]> };\n const outputsHistory: Record<string, unknown[]> =\n outputsHistoryVar && Object.keys(outputsHistoryVar).length > 0\n ? outputsHistoryVar\n : outputsVar?.history || {};\n\n // Optional checks metadata: used to infer roles by check type\n const checksMeta =\n (ctx?.get(['checks_meta']) as Record<string, { type?: string; group?: string }>) ||\n ((ctx?.get(['event']) as any)?.payload?.__checksMeta as Record<\n string,\n { type?: string; group?: string }\n >) ||\n undefined;\n\n // Direction and limit\n const directionRaw =\n typeof options.direction === 'string' ? options.direction.toLowerCase() : '';\n const direction: 'asc' | 'desc' = directionRaw === 'desc' ? 'desc' : 'asc';\n const limit =\n typeof options.limit === 'number' && options.limit > 0\n ? Math.floor(options.limit)\n : undefined;\n\n // Text mapping configuration\n const textCfg = options.text && typeof options.text === 'object' ? options.text : {};\n const defaultField =\n typeof textCfg.default_field === 'string' && textCfg.default_field.trim()\n ? textCfg.default_field.trim()\n : 'text';\n const byStepText: Record<string, string> = {};\n if (textCfg.by_step && typeof textCfg.by_step === 'object') {\n for (const [k, v] of Object.entries(textCfg.by_step)) {\n if (typeof v === 'string' && v.trim()) {\n byStepText[k] = v.trim();\n }\n }\n }\n\n // Role mapping configuration\n const rolesCfg = options.roles && typeof options.roles === 'object' ? options.roles : {};\n const byTypeRole: Record<string, string> = {};\n if (rolesCfg.by_type && typeof rolesCfg.by_type === 'object') {\n for (const [k, v] of Object.entries(rolesCfg.by_type)) {\n if (typeof v === 'string' && v.trim()) {\n byTypeRole[k] = v.trim();\n }\n }\n }\n const byStepRole: Record<string, string> = {};\n if (rolesCfg.by_step && typeof rolesCfg.by_step === 'object') {\n for (const [k, v] of Object.entries(rolesCfg.by_step)) {\n if (typeof v === 'string' && v.trim()) {\n byStepRole[k] = v.trim();\n }\n }\n }\n // Optional: step-level role map provided as a compact string, e.g. \"ask=user,reply=assistant\"\n if (typeof options.role_map === 'string' && options.role_map.trim().length > 0) {\n const parts = String(options.role_map)\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n for (const part of parts) {\n const eqIdx = part.indexOf('=');\n if (eqIdx > 0) {\n const k = part.slice(0, eqIdx).trim();\n const v = part.slice(eqIdx + 1).trim();\n if (k && v) {\n byStepRole[k] = v;\n }\n }\n }\n }\n const defaultRole =\n typeof rolesCfg.default === 'string' && rolesCfg.default.trim()\n ? rolesCfg.default.trim()\n : undefined;\n\n const getNested = (obj: any, path: string): unknown => {\n if (!obj || !path) return undefined;\n const parts = path.split('.');\n let cur = obj;\n for (const p of parts) {\n if (cur == null) return undefined;\n cur = cur[p];\n }\n return cur;\n };\n\n const normalizeText = (step: string, raw: any): string => {\n try {\n const overrideField = byStepText[step];\n if (overrideField) {\n const val = getNested(raw, overrideField);\n if (val !== undefined && val !== null) {\n const s = String(val);\n if (s.trim().length > 0) return s;\n }\n }\n\n if (raw && typeof raw === 'object') {\n if (typeof (raw as any).text === 'string' && (raw as any).text.trim().length > 0) {\n return (raw as any).text;\n }\n if (\n typeof (raw as any).content === 'string' &&\n (raw as any).content.trim().length > 0\n ) {\n return (raw as any).content;\n }\n const dfVal = (raw as any)[defaultField];\n if (dfVal !== undefined && dfVal !== null) {\n const s = String(dfVal);\n if (s.trim().length > 0) return s;\n }\n }\n\n if (typeof raw === 'string') return raw;\n if (raw == null) return '';\n try {\n return JSON.stringify(raw);\n } catch {\n return String(raw);\n }\n } catch {\n if (typeof raw === 'string') return raw;\n return '';\n }\n };\n\n const normalizeRole = (step: string): string => {\n try {\n if (byStepRole[step]) return byStepRole[step];\n const meta = checksMeta ? (checksMeta as any)[step] : undefined;\n const type = meta?.type as string | undefined;\n if (type && byTypeRole[type]) return byTypeRole[type];\n if (type === 'human-input') return 'user';\n if (type === 'ai') return 'assistant';\n if (defaultRole) return defaultRole;\n if (type) {\n if (type === 'human-input') return 'user';\n if (type === 'ai') return 'assistant';\n }\n } catch {\n // fall through\n }\n return 'assistant';\n };\n\n type ChatMessage = {\n step: string;\n role: string;\n text: string;\n ts: number;\n raw: unknown;\n };\n\n const messages: ChatMessage[] = [];\n const tsBase = Date.now();\n let counter = 0;\n\n for (const step of steps) {\n const arr = (outputsHistory as any)?.[step] as unknown[];\n if (!Array.isArray(arr)) continue;\n for (const raw of arr) {\n let ts: number | undefined;\n if (raw && typeof raw === 'object' && typeof (raw as any).ts === 'number') {\n ts = (raw as any).ts;\n }\n if (!Number.isFinite(ts as number)) {\n ts = tsBase + counter++;\n }\n const text = normalizeText(step, raw);\n const role = normalizeRole(step);\n messages.push({ step, role, text, ts: ts as number, raw });\n }\n }\n\n // Sort by timestamp and apply direction/limit\n messages.sort((a, b) => a.ts - b.ts);\n if (direction === 'desc') {\n messages.reverse();\n }\n\n if (limit && limit > 0 && messages.length > limit) {\n if (direction === 'asc') {\n return messages.slice(messages.length - limit);\n }\n return messages.slice(0, limit);\n }\n\n return messages;\n } catch {\n return [];\n }\n }\n );\n\n // Removed: merge_sort_by filter (unused)\n}\n\n/**\n * Create a new Liquid instance with custom extensions\n */\nexport function createExtendedLiquid(options: Record<string, unknown> = {}): Liquid {\n const liquid = new Liquid({\n cache: false,\n strictFilters: false,\n strictVariables: false,\n ...options,\n });\n\n configureLiquidWithExtensions(liquid);\n return liquid;\n}\n"],"mappings":"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","names":["path"]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
ConfigManager,
|
|
3
3
|
VALID_EVENT_TRIGGERS,
|
|
4
4
|
init_config
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-LQ5B4T6L.mjs";
|
|
6
6
|
import "./chunk-NCWIZVOT.mjs";
|
|
7
7
|
import "./chunk-VF6XIUE4.mjs";
|
|
8
8
|
import "./chunk-SZXICFQ3.mjs";
|
|
@@ -13,4 +13,4 @@ export {
|
|
|
13
13
|
ConfigManager,
|
|
14
14
|
VALID_EVENT_TRIGGERS
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=config-
|
|
16
|
+
//# sourceMappingURL=config-4EG7IQIU.mjs.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
2
|
FailureConditionEvaluator,
|
|
3
3
|
init_failure_condition_evaluator
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-EBTD2D4L.mjs";
|
|
5
|
+
import "./chunk-N4I6ZDCJ.mjs";
|
|
6
6
|
import "./chunk-JL7JXCET.mjs";
|
|
7
7
|
import "./chunk-25IC7KXZ.mjs";
|
|
8
8
|
import "./chunk-VF6XIUE4.mjs";
|
|
@@ -14,4 +14,4 @@ init_failure_condition_evaluator();
|
|
|
14
14
|
export {
|
|
15
15
|
FailureConditionEvaluator
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=failure-condition-evaluator-
|
|
17
|
+
//# sourceMappingURL=failure-condition-evaluator-GLHZZF47.mjs.map
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FailureConditionEvaluator,
|
|
3
|
+
init_failure_condition_evaluator
|
|
4
|
+
} from "./chunk-OMFPM576.mjs";
|
|
5
|
+
import "./chunk-RI77TA6V.mjs";
|
|
6
|
+
import "./chunk-JL7JXCET.mjs";
|
|
7
|
+
import "./chunk-25IC7KXZ.mjs";
|
|
8
|
+
import "./chunk-VF6XIUE4.mjs";
|
|
9
|
+
import "./chunk-VPC3QSPW.mjs";
|
|
10
|
+
import "./chunk-SZXICFQ3.mjs";
|
|
11
|
+
import "./chunk-UCMJJ3IM.mjs";
|
|
12
|
+
import "./chunk-J7LXIPZS.mjs";
|
|
13
|
+
init_failure_condition_evaluator();
|
|
14
|
+
export {
|
|
15
|
+
FailureConditionEvaluator
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=failure-condition-evaluator-KN55WXRO.mjs.map
|
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
failure_condition_evaluator_exports,
|
|
11
11
|
init_failure_condition_evaluator
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-EBTD2D4L.mjs";
|
|
13
|
+
import "./chunk-N4I6ZDCJ.mjs";
|
|
14
14
|
import "./chunk-JL7JXCET.mjs";
|
|
15
15
|
import "./chunk-25IC7KXZ.mjs";
|
|
16
16
|
import "./chunk-VF6XIUE4.mjs";
|
|
@@ -1353,4 +1353,4 @@ init_github_frontend();
|
|
|
1353
1353
|
export {
|
|
1354
1354
|
GitHubFrontend
|
|
1355
1355
|
};
|
|
1356
|
-
//# sourceMappingURL=github-frontend-
|
|
1356
|
+
//# sourceMappingURL=github-frontend-F4TE2JY7.mjs.map
|