baselineos 0.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE +17 -0
  2. package/README.md +198 -0
  3. package/dist/__evals__/runner.d.ts +2 -0
  4. package/dist/__evals__/runner.js +14687 -0
  5. package/dist/__evals__/runner.js.map +1 -0
  6. package/dist/api/server.d.ts +21 -0
  7. package/dist/api/server.js +1007 -0
  8. package/dist/api/server.js.map +1 -0
  9. package/dist/cli/bin.d.ts +1 -0
  10. package/dist/cli/bin.js +8427 -0
  11. package/dist/cli/bin.js.map +1 -0
  12. package/dist/core/agent-bus.d.ts +110 -0
  13. package/dist/core/agent-bus.js +242 -0
  14. package/dist/core/agent-bus.js.map +1 -0
  15. package/dist/core/cache.d.ts +66 -0
  16. package/dist/core/cache.js +160 -0
  17. package/dist/core/cache.js.map +1 -0
  18. package/dist/core/config.d.ts +1002 -0
  19. package/dist/core/config.js +429 -0
  20. package/dist/core/config.js.map +1 -0
  21. package/dist/core/indexer.d.ts +152 -0
  22. package/dist/core/indexer.js +481 -0
  23. package/dist/core/indexer.js.map +1 -0
  24. package/dist/core/llm-tracer.d.ts +2 -0
  25. package/dist/core/llm-tracer.js +241 -0
  26. package/dist/core/llm-tracer.js.map +1 -0
  27. package/dist/core/memory.d.ts +86 -0
  28. package/dist/core/memory.js +346 -0
  29. package/dist/core/memory.js.map +1 -0
  30. package/dist/core/opa-client.d.ts +51 -0
  31. package/dist/core/opa-client.js +157 -0
  32. package/dist/core/opa-client.js.map +1 -0
  33. package/dist/core/opa-policy-gate.d.ts +133 -0
  34. package/dist/core/opa-policy-gate.js +454 -0
  35. package/dist/core/opa-policy-gate.js.map +1 -0
  36. package/dist/core/orchestrator.d.ts +14 -0
  37. package/dist/core/orchestrator.js +1297 -0
  38. package/dist/core/orchestrator.js.map +1 -0
  39. package/dist/core/pii-detector.d.ts +82 -0
  40. package/dist/core/pii-detector.js +126 -0
  41. package/dist/core/pii-detector.js.map +1 -0
  42. package/dist/core/rag-engine.d.ts +121 -0
  43. package/dist/core/rag-engine.js +504 -0
  44. package/dist/core/rag-engine.js.map +1 -0
  45. package/dist/core/task-queue.d.ts +69 -0
  46. package/dist/core/task-queue.js +124 -0
  47. package/dist/core/task-queue.js.map +1 -0
  48. package/dist/core/telemetry.d.ts +56 -0
  49. package/dist/core/telemetry.js +94 -0
  50. package/dist/core/telemetry.js.map +1 -0
  51. package/dist/core/types.d.ts +328 -0
  52. package/dist/core/types.js +24 -0
  53. package/dist/core/types.js.map +1 -0
  54. package/dist/index.d.ts +21 -0
  55. package/dist/index.js +12444 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/llm-tracer-CIIujuO-.d.ts +493 -0
  58. package/dist/mcp/server.d.ts +2651 -0
  59. package/dist/mcp/server.js +676 -0
  60. package/dist/mcp/server.js.map +1 -0
  61. package/dist/orchestrator-DF89k_AK.d.ts +506 -0
  62. package/package.json +157 -0
  63. package/templates/README.md +7 -0
  64. package/templates/baseline.config.ts +207 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/telemetry.ts","../../src/core/types.ts","../../src/core/pii-detector.ts","../../src/core/task-queue.ts","../../src/core/orchestrator.ts"],"names":[],"mappings":"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","file":"orchestrator.js","sourcesContent":["/**\n * BaselineOS OpenTelemetry — SIGNAL-012\n *\n * Distributed tracing for the multi-agent orchestration layer.\n * Initializes the OTel Node SDK and exports a shared tracer.\n *\n * Spans emitted:\n * task.execute root span per executeTask() call\n * task.policy.pre OPA pre-execution gate\n * task.policy.post OPA post-execution gate\n * task.perform performExecution() step loop\n * task.self_verify selfVerify() LLM call\n * task.review conductReview() LLM call\n *\n * Trace context is propagated through AgentBus messages via the\n * optional `traceContext` field (W3C traceparent format).\n *\n * Configuration:\n * OTEL_EXPORTER_OTLP_ENDPOINT OTLP HTTP collector (default: http://localhost:4318)\n * OTEL_SERVICE_NAME service name override (default: baselineos)\n * BASELINE_OTEL_DISABLED set to '1' to disable entirely (e.g. in tests)\n *\n * @license Apache-2.0\n */\n\nimport { NodeSDK } from '@opentelemetry/sdk-node';\nimport { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';\nimport { resourceFromAttributes } from '@opentelemetry/resources';\nimport { ATTR_SERVICE_NAME, ATTR_SERVICE_VERSION } from '@opentelemetry/semantic-conventions';\nimport { trace, context, propagation, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport type { Span, Tracer, Context } from '@opentelemetry/api';\n\nexport { SpanStatusCode, SpanKind };\nexport type { Span, Tracer, Context };\n\n// ─── SDK init ────────────────────────────────────────────────────────────────\n\nlet _sdk: NodeSDK | null = null;\n\n/**\n * Initialize the OTel SDK. Safe to call multiple times — subsequent calls\n * are no-ops. Should be called once at process startup before any spans.\n *\n * Silently disabled when BASELINE_OTEL_DISABLED=1.\n */\nexport function initTelemetry(): void {\n if (_sdk || process.env['BASELINE_OTEL_DISABLED'] === '1') return;\n\n const endpoint =\n process.env['OTEL_EXPORTER_OTLP_ENDPOINT'] ?? 'http://localhost:4318';\n\n const exporter = new OTLPTraceExporter({\n url: `${endpoint}/v1/traces`,\n });\n\n _sdk = new NodeSDK({\n resource: resourceFromAttributes({\n [ATTR_SERVICE_NAME]: process.env['OTEL_SERVICE_NAME'] ?? 'baselineos',\n [ATTR_SERVICE_VERSION]: '0.2.0-beta.1',\n }),\n traceExporter: exporter,\n // W3C traceparent propagation is the default — no explicit config needed\n });\n\n _sdk.start();\n\n process.on('SIGTERM', () => { _sdk?.shutdown().catch(() => {}); });\n process.on('SIGINT', () => { _sdk?.shutdown().catch(() => {}); });\n}\n\n/** Gracefully shut down the SDK and flush pending spans. */\nexport async function shutdownTelemetry(): Promise<void> {\n await _sdk?.shutdown();\n _sdk = null;\n}\n\n// ─── Tracer ───────────────────────────────────────────────────────────────────\n\nexport const tracer: Tracer = new Proxy({} as Tracer, {\n get(_target, prop) {\n return trace.getTracer('baselineos', '0.2.0-beta.1')[prop as keyof Tracer];\n },\n});\n\n// ─── Trace context helpers ───────────────────────────────────────────────────\n\n/**\n * Serialize the active W3C trace context to a string for propagation\n * through AgentBus messages.\n * Returns undefined when there is no active span.\n */\nexport function extractTraceContext(): string | undefined {\n const carrier: Record<string, string> = {};\n propagation.inject(context.active(), carrier);\n return carrier['traceparent'];\n}\n\n/**\n * Restore a serialized trace context as the active context.\n * Use as the second argument to `context.with()` before creating child spans.\n */\nexport function injectTraceContext(traceparent: string): Context {\n const carrier: Record<string, string> = { traceparent };\n return propagation.extract(context.active(), carrier);\n}\n\n// ─── Span wrapper ─────────────────────────────────────────────────────────────\n\n/**\n * Run an async function inside a named span.\n * Sets ERROR status and records exception on throw.\n */\nexport async function withSpan<T>(\n name: string,\n attributes: Record<string, string | number | boolean>,\n fn: (span: Span) => Promise<T>,\n): Promise<T> {\n return tracer.startActiveSpan(name, { kind: SpanKind.INTERNAL, attributes }, async (span) => {\n try {\n const result = await fn(span);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (err) {\n span.recordException(err as Error);\n span.setStatus({ code: SpanStatusCode.ERROR, message: (err as Error).message });\n throw err;\n } finally {\n span.end();\n }\n });\n}\n","/**\n * BaselineOS Core Types\n * \n * @license Apache-2.0\n */\n\nimport { z } from 'zod';\n\n// ─── Task Types ──────────────────────────────────────────────────────────────\n\nexport type TaskStatus = \n | 'pending'\n | 'planning'\n | 'executing'\n | 'verifying'\n | 'reviewing'\n | 'correcting'\n | 'completed'\n | 'failed'\n | 'blocked';\n\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\nexport type TaskComplexity = 'trivial' | 'simple' | 'moderate' | 'complex' | 'epic';\n\nexport interface Task {\n id: string;\n parentId?: string;\n title: string;\n description: string;\n status: TaskStatus;\n priority: TaskPriority;\n complexity: TaskComplexity;\n workflowId?: string;\n workflowPlanId?: string;\n subtasks: Task[];\n dependencies: string[];\n assignedAgent?: string;\n requiredCapabilities: string[];\n attempts: number;\n maxAttempts: number;\n currentCheckpoint?: string;\n acceptanceCriteria: AcceptanceCriterion[];\n verificationResults: VerificationResult[];\n createdAt: number;\n updatedAt: number;\n completedAt?: number;\n estimatedTokens?: number;\n actualTokens?: number;\n context: Record<string, unknown>;\n artifacts: Artifact[];\n needsHumanReview?: boolean;\n}\n\nexport interface AcceptanceCriterion {\n id: string;\n description: string;\n type: 'automated' | 'agent-review' | 'human-review';\n checkFunction?: string;\n weight: number;\n}\n\nexport interface VerificationResult {\n criterionId: string;\n passed: boolean;\n confidence: number;\n details: string;\n verifiedBy: string;\n verifiedAt: number;\n}\n\nexport interface Artifact {\n id: string;\n type: 'code' | 'document' | 'config' | 'test' | 'analysis' | 'decision';\n path?: string;\n content?: string;\n checksum?: string;\n createdBy: string;\n createdAt: number;\n}\n\n// ─── Task Input ──────────────────────────────────────────────────────────────\n\nexport const TaskInputSchema = z.object({\n title: z.string().min(1),\n description: z.string().min(1),\n priority: z.enum(['critical', 'high', 'medium', 'low']).default('medium'),\n requiredCapabilities: z.array(z.string()).default([]),\n acceptanceCriteria: z.array(z.object({\n description: z.string(),\n type: z.enum(['automated', 'agent-review', 'human-review']).default('automated'),\n weight: z.number().min(0).max(1).default(1),\n })).default([]),\n context: z.record(z.unknown()).default({}),\n});\n\nexport type TaskInput = z.infer<typeof TaskInputSchema>;\n\n// ─── Agent Types ─────────────────────────────────────────────────────────────\n\nexport type AgentRole = 'planner' | 'executor' | 'verifier' | 'supervisor' | 'quality' | 'specialist';\nexport type AgentStatus = 'idle' | 'busy' | 'blocked' | 'error' | 'offline' | 'suspended';\n\nexport interface Agent {\n id: string;\n name: string;\n role: AgentRole;\n status: AgentStatus;\n capabilities: string[];\n domains: string[];\n /**\n * Semantic version of this agent's prompt/behavior specification.\n * Format: MAJOR.MINOR.PATCH — bump MAJOR on breaking behavior change,\n * MINOR on new capability, PATCH on prompt refinement.\n * Included in eval output and audit trail for regression tracking.\n */\n promptVersion?: string;\n trustScore: number;\n successRate: number;\n averageQuality: number;\n tasksCompleted: number;\n tasksFailed: number;\n currentTask?: string;\n taskQueue: string[];\n supervisorId?: string;\n supervisees: string[];\n maxConcurrentTasks: number;\n autoVerify: boolean;\n escalationThreshold: number;\n createdAt: number;\n lastActiveAt: number;\n}\n\n// ─── Checkpoint Types ────────────────────────────────────────────────────────\n\nexport interface Checkpoint {\n id: string;\n taskId: string;\n stepId?: string;\n state: Record<string, unknown>;\n artifacts: Artifact[];\n decisions: Decision[];\n createdBy: string;\n createdAt: number;\n description: string;\n recoverable: boolean;\n expiresAt?: number;\n}\n\nexport interface Decision {\n id: string;\n description: string;\n options: DecisionOption[];\n selectedOption: string;\n rationale: string;\n madeBy: string;\n madeAt: number;\n reversible: boolean;\n confidence: number;\n}\n\nexport interface DecisionOption {\n id: string;\n description: string;\n pros: string[];\n cons: string[];\n risk: 'low' | 'medium' | 'high';\n}\n\n// ─── Review Types ────────────────────────────────────────────────────────────\n\nexport interface Review {\n id: string;\n taskId: string;\n reviewerId: string;\n revieweeId: string;\n type: 'self' | 'peer' | 'supervisor' | 'quality';\n scope: 'full' | 'partial' | 'spot-check';\n findings: ReviewFinding[];\n overallAssessment: 'approved' | 'needs-work' | 'rejected';\n confidence: number;\n feedback: string;\n suggestions: string[];\n requiredChanges: string[];\n createdAt: number;\n completedAt?: number;\n timeSpent: number;\n}\n\nexport interface ReviewFinding {\n id: string;\n severity: 'critical' | 'major' | 'minor' | 'suggestion';\n category: 'correctness' | 'completeness' | 'quality' | 'consistency' | 'security';\n description: string;\n location?: string;\n suggestion?: string;\n}\n\n// ─── Execution Types ─────────────────────────────────────────────────────────\n\nexport interface ExecutionPlan {\n id: string;\n taskId: string;\n steps: ExecutionStep[];\n estimatedTokens: number;\n estimatedDuration: number;\n riskAssessment: string[];\n createdAt: number;\n}\n\nexport interface ExecutionStep {\n id: string;\n title: string;\n description: string;\n action: StepAction;\n dependencies: string[];\n assignedAgent?: string;\n status: 'pending' | 'executing' | 'completed' | 'failed' | 'skipped';\n result?: StepResult;\n verificationCriteria: string[];\n}\n\nexport interface StepAction {\n type: 'llm' | 'tool' | 'human' | 'composite';\n operation: string;\n parameters: Record<string, unknown>;\n timeout?: number;\n}\n\nexport interface StepResult {\n success: boolean;\n output: unknown;\n artifacts: Artifact[];\n tokensUsed: number;\n duration: number;\n error?: string;\n}\n\n// ─── Workflow Types ──────────────────────────────────────────────────────────\n\nexport interface WorkflowBudget {\n maxTokens?: number;\n maxCostUsd?: number;\n costPer1kTokensUsd?: number;\n maxSteps?: number;\n maxDurationMs?: number;\n maxAttempts?: number;\n /** Optional tenant identifier for per-tenant cost allocation (SIGNAL-052) */\n tenantId?: string;\n}\n\nexport interface WorkflowStepTemplate {\n id: string;\n title: string;\n description: string;\n action: StepAction;\n verificationCriteria?: string[];\n}\n\nexport interface WorkflowDefinition {\n id: string;\n name: string;\n description?: string;\n steps: WorkflowStepTemplate[];\n requiredCapabilities?: string[];\n budget?: WorkflowBudget;\n}\n\n// ─── Event Types ─────────────────────────────────────────────────────────────\n\nexport type OrchestratorEvent =\n | { type: 'task:created'; task: Task }\n | { type: 'task:decomposed'; task: Task; subtasks: Task[] }\n | { type: 'task:assigned'; task: Task; agent: Agent }\n | { type: 'task:started'; task: Task }\n | { type: 'task:checkpoint'; task: Task; checkpoint: Checkpoint }\n | { type: 'task:verified'; task: Task; result: VerificationResult }\n | { type: 'task:review-requested'; task: Task; reviewer: Agent }\n | { type: 'task:reviewed'; task: Task; review: Review }\n | { type: 'task:correction-needed'; task: Task; feedback: string }\n | { type: 'task:corrected'; task: Task }\n | { type: 'task:completed'; task: Task }\n | { type: 'task:failed'; task: Task; error: unknown }\n | { type: 'task:blocked'; task: Task; reason: string; policy: string }\n | { type: 'task:approved'; task: Task; approvedBy: string }\n | { type: 'agent:status-changed'; agent: Agent; previousStatus: AgentStatus }\n | { type: 'agent:trust-updated'; agent: Agent; previousTrust: number }\n | { type: 'agent:suspended'; agent: Agent; reason: string }\n | { type: 'agent:reinstated'; agent: Agent }\n | { type: 'escalation'; task: Task; reason: string; escalatedTo: string };\n","/**\n * PII Detector — SIGNAL-015\n *\n * Scans prompt text for personally identifiable information before it\n * reaches the LLM router. Supports two enforcement modes:\n *\n * redact — replaces detected values with [REDACTED:TYPE] (default)\n * block — throws PiiBlockedError, halting task execution\n *\n * Detected types:\n * email — RFC 5321 address pattern\n * phone — US/international format (10-digit minimum)\n * ssn — US Social Security Number (NNN-NN-NNNN)\n * credit-card — Visa, Mastercard, Amex, Discover\n * api-key — OpenAI sk-, Anthropic sk-ant-, GitHub ghp_, AWS AKIA\n * ip-address — IPv4 addresses\n *\n * Integration:\n * Called by Orchestrator._performExecution() before engine.execute().\n * Publishes 'governance:pii-detected' on the AgentBus when PII is found.\n * Sets pii.detected and pii.types on the active OTel span.\n *\n * @license Apache-2.0\n */\n\nimport { trace } from '@opentelemetry/api';\nimport type { AgentBus } from './agent-bus.js';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type PiiType =\n | 'email'\n | 'phone'\n | 'ssn'\n | 'credit-card'\n | 'api-key'\n | 'ip-address';\n\nexport type PiiMode = 'redact' | 'block';\n\nexport interface PiiMatch {\n type: PiiType;\n start: number;\n end: number;\n}\n\nexport interface PiiScanResult {\n /** true when no PII was detected */\n clean: boolean;\n /** all matches found, sorted by start position */\n matches: PiiMatch[];\n /** unique PII types present */\n types: PiiType[];\n /** input text with all PII replaced by [REDACTED:TYPE]; equals input when clean=true */\n redacted: string;\n}\n\nexport interface PiiDetectorConfig {\n /** Enforcement mode. Default: 'redact' */\n mode?: PiiMode;\n /** PII types to skip. Useful for staged rollouts. */\n disabledTypes?: PiiType[];\n /** AgentBus for publishing governance:pii-detected events. */\n bus?: AgentBus;\n}\n\n// ─── Error ────────────────────────────────────────────────────────────────────\n\nexport class PiiBlockedError extends Error {\n constructor(public readonly types: PiiType[]) {\n super(`PII detected in prompt — blocked: ${types.join(', ')}`);\n this.name = 'PiiBlockedError';\n }\n}\n\n// ─── Patterns ────────────────────────────────────────────────────────────────\n\nconst PATTERNS: Record<PiiType, RegExp> = {\n // API keys before email to avoid partial overlap on sk- prefixes\n 'api-key': /\\b(sk-ant-[A-Za-z0-9-_]{20,}|sk-[A-Za-z0-9]{32,}|(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36}|AKIA[0-9A-Z]{16})\\b/g,\n 'email': /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g,\n 'phone': /\\b(?:\\+?1[\\s.-]?)?\\(?[0-9]{3}\\)?[\\s.-][0-9]{3}[\\s.-][0-9]{4}\\b/g,\n 'ssn': /\\b(?!000|666|9\\d{2})\\d{3}-(?!00)\\d{2}-(?!0000)\\d{4}\\b/g,\n 'credit-card': /\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})\\b/g,\n 'ip-address': /\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b/g,\n};\n\n// ─── PiiDetector ─────────────────────────────────────────────────────────────\n\nexport class PiiDetector {\n readonly mode: PiiMode;\n private readonly disabled: Set<PiiType>;\n private readonly bus?: AgentBus;\n\n constructor(config: PiiDetectorConfig = {}) {\n this.mode = config.mode ?? 'redact';\n this.disabled = new Set(config.disabledTypes ?? []);\n this.bus = config.bus;\n }\n\n /**\n * Scan text for PII without side effects.\n * Safe to call in any context — no bus events, no span mutations.\n */\n scan(text: string): PiiScanResult {\n const matches: PiiMatch[] = [];\n\n for (const [type, pattern] of Object.entries(PATTERNS) as Array<[PiiType, RegExp]>) {\n if (this.disabled.has(type)) continue;\n\n // Reset lastIndex — patterns are defined with /g flag\n pattern.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = pattern.exec(text)) !== null) {\n matches.push({ type, start: m.index, end: m.index + m[0].length });\n }\n }\n\n // Sort by start position, resolve overlaps (keep longest match)\n matches.sort((a, b) => a.start - b.start || b.end - a.end);\n const deduped: PiiMatch[] = [];\n let cursor = 0;\n for (const match of matches) {\n if (match.start >= cursor) {\n deduped.push(match);\n cursor = match.end;\n }\n }\n\n const types = [...new Set(deduped.map((m) => m.type))];\n const clean = deduped.length === 0;\n\n // Build redacted string\n let redacted = '';\n let pos = 0;\n for (const match of deduped) {\n redacted += text.slice(pos, match.start);\n redacted += `[REDACTED:${match.type.toUpperCase()}]`;\n pos = match.end;\n }\n redacted += text.slice(pos);\n\n return { clean, matches: deduped, types, redacted };\n }\n\n /**\n * Process text before LLM routing.\n *\n * - Publishes 'governance:pii-detected' on the bus when PII is found.\n * - Sets pii.detected and pii.types on the active OTel span.\n * - redact mode: returns redacted text.\n * - block mode: throws PiiBlockedError if PII found.\n *\n * @param text Text to scan (typically task.description).\n * @param taskId Used for bus event correlation.\n * @returns Safe text (redacted or original when clean).\n */\n processText(text: string, taskId?: string): string {\n const result = this.scan(text);\n\n if (!result.clean) {\n // Set OTel span attributes on the active span (task.perform)\n const span = trace.getActiveSpan();\n if (span) {\n span.setAttribute('pii.detected', true);\n span.setAttribute('pii.types', result.types.join(','));\n span.setAttribute('pii.count', result.matches.length);\n }\n\n // Publish governance event\n this.bus?.broadcast('system', 'governance:pii-detected', {\n taskId,\n types: result.types,\n count: result.matches.length,\n blocked: this.mode === 'block',\n mode: this.mode,\n }, 'high');\n\n if (this.mode === 'block') {\n throw new PiiBlockedError(result.types);\n }\n }\n\n return result.redacted;\n }\n}\n","/**\n * Task Queue — SIGNAL-018\n *\n * BullMQ-backed durable task queue. Provides:\n * - Priority-ordered execution (critical → high → medium → low)\n * - Automatic retry with exponential backoff on failure\n * - Concurrency limiting (configurable, default 5)\n * - Job deduplication by task ID\n * - Queue observability via Bull Dashboard / BullMQ Board\n *\n * The queue is optional. When not configured, Orchestrator falls back\n * to direct in-process execution (existing behaviour).\n *\n * Configuration:\n * BASELINE_REDIS_URL Redis connection URL (default: redis://localhost:6379)\n *\n * Self-hosted Redis:\n * docker compose -f docker/docker-compose.monitoring.yml up -d\n * → redis://localhost:6379\n *\n * @license Apache-2.0\n */\n\nimport { Queue, Worker, type ConnectionOptions } from 'bullmq';\nimport type { TaskPriority } from './types.js';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface TaskQueueConfig {\n /** Redis URL. Default: BASELINE_REDIS_URL env or redis://localhost:6379 */\n redisUrl?: string;\n /** Queue name (default: 'baseline-tasks') */\n queueName?: string;\n /** Max concurrent jobs processed in parallel (default: 5) */\n concurrency?: number;\n /** Max retry attempts on failure (default: 3) */\n attempts?: number;\n /** Initial backoff delay in ms for exponential retry (default: 2000) */\n backoffDelay?: number;\n}\n\ninterface TaskJobData {\n taskId: string;\n}\n\n/** Maps task priority to BullMQ integer priority (lower = higher priority) */\nconst PRIORITY_MAP: Record<TaskPriority, number> = {\n critical: 1,\n high: 2,\n medium: 5,\n low: 10,\n};\n\n// ─── TaskQueue ────────────────────────────────────────────────────────────────\n\nexport class TaskQueue {\n private readonly queue: Queue<TaskJobData>;\n private readonly worker: Worker<TaskJobData>;\n private readonly queueName: string;\n\n /**\n * @param executor Called by the worker when a job is dequeued.\n * Receives the taskId. Should call Orchestrator.dispatchExecution().\n * @param config Queue configuration.\n */\n constructor(\n executor: (taskId: string) => Promise<void>,\n config: TaskQueueConfig = {},\n ) {\n this.queueName = config.queueName ?? 'baseline-tasks';\n\n const redisUrl = config.redisUrl ?? process.env['BASELINE_REDIS_URL'] ?? 'redis://localhost:6379';\n const connection: ConnectionOptions = this.parseRedisUrl(redisUrl);\n\n const attempts = config.attempts ?? 3;\n const backoffDelay = config.backoffDelay ?? 2_000;\n\n this.queue = new Queue<TaskJobData>(this.queueName, {\n connection,\n defaultJobOptions: {\n attempts,\n backoff: { type: 'exponential', delay: backoffDelay },\n removeOnComplete: { count: 500 },\n removeOnFail: { count: 200 },\n },\n });\n\n this.worker = new Worker<TaskJobData>(\n this.queueName,\n async (job) => { await executor(job.data.taskId); },\n {\n connection,\n concurrency: config.concurrency ?? 5,\n },\n );\n\n this.worker.on('failed', (job, err) => {\n console.warn(`[TaskQueue] Job ${job?.id ?? '?'} (task ${job?.data.taskId ?? '?'}) failed: ${err.message}`);\n });\n }\n\n /**\n * Enqueue a task for execution.\n * Uses taskId as jobId — duplicate enqueues are silently ignored.\n */\n async enqueue(taskId: string, priority: TaskPriority): Promise<void> {\n await this.queue.add(\n 'execute',\n { taskId },\n {\n jobId: taskId,\n priority: PRIORITY_MAP[priority],\n },\n );\n }\n\n /**\n * Queue statistics — useful for health checks and dashboards.\n */\n async getStats(): Promise<{\n waiting: number;\n active: number;\n completed: number;\n failed: number;\n delayed: number;\n }> {\n const [waiting, active, completed, failed, delayed] = await Promise.all([\n this.queue.getWaitingCount(),\n this.queue.getActiveCount(),\n this.queue.getCompletedCount(),\n this.queue.getFailedCount(),\n this.queue.getDelayedCount(),\n ]);\n return { waiting, active, completed, failed, delayed };\n }\n\n /** Gracefully close queue and worker connections. */\n async close(): Promise<void> {\n await this.worker.close();\n await this.queue.close();\n }\n\n // ─── Internal ──────────────────────────────────────────────────────────────\n\n private parseRedisUrl(url: string): ConnectionOptions {\n try {\n const u = new URL(url);\n const config: ConnectionOptions = {\n host: u.hostname || 'localhost',\n port: u.port ? parseInt(u.port, 10) : 6379,\n username: u.username || undefined,\n password: u.password || undefined,\n };\n if (u.pathname && u.pathname !== '/') {\n (config as Record<string, unknown>)['db'] = parseInt(u.pathname.slice(1), 10);\n }\n return config;\n } catch {\n return { host: 'localhost', port: 6379 };\n }\n }\n}\n","/**\n * BaselineOS Orchestrator\n * \n * Autonomous multi-agent task execution with self-supervision.\n * Implements AMP/Ralph patterns for agent-to-agent oversight.\n * \n * Key Innovation: Tasks are decomposed, verified, reviewed, and corrected\n * by agents — not humans. Human intervention only when all autonomous\n * options are exhausted (<5% of tasks).\n * \n * @license Apache-2.0\n */\n\nimport { EventEmitter } from 'eventemitter3';\nimport { randomUUID } from 'crypto';\nimport { mkdirSync, existsSync, readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { metrics } from '@opentelemetry/api';\nimport { withSpan } from './telemetry.js';\nimport { TaskInputSchema } from './types.js';\nimport type {\n Task,\n TaskInput,\n Agent,\n Checkpoint,\n Review,\n VerificationResult,\n OrchestratorEvent,\n ExecutionPlan,\n ExecutionStep,\n WorkflowDefinition,\n WorkflowBudget,\n} from './types.js';\nimport type { MemorySystem } from './memory.js';\nimport type { KnowledgeIndexer } from './indexer.js';\nimport type { SemanticCache } from './cache.js';\nimport type { ExecutionEngine } from './execution-engine.js';\nimport type { AgentBus } from './agent-bus.js';\nimport type { OPAPolicyGate } from './opa-policy-gate.js';\nimport { PiiBlockedError } from './pii-detector.js';\nimport type { PiiDetector } from './pii-detector.js';\nimport { TaskQueue } from './task-queue.js';\nimport type { TaskQueueConfig } from './task-queue.js';\nimport type { AuditLog } from './audit-log.js';\nimport type { LayerSweep, LayerSweepResult } from './layer-sweep.js';\nimport type { BaselinePersonaEngine } from '@baselineos/persona';\n\n// ─── Configuration ───────────────────────────────────────────────────────────\n\nexport interface OrchestratorConfig {\n maxAutonomousComplexity: Task['complexity'];\n selfVerificationRequired: boolean;\n supervisorReviewThreshold: number;\n qualityReviewSampleRate: number;\n defaultTrustScore: number;\n defaultMaxAttempts: number;\n maxTokensPerTask: number;\n maxConcurrentAgents: number;\n trustGrowthRate: number;\n trustDecayRate: number;\n /** Minimum trust score before an agent is auto-suspended */\n trustMinimum: number;\n checkpointsPath?: string;\n workflows?: WorkflowDefinition[];\n memory?: MemorySystem;\n indexer?: KnowledgeIndexer;\n cache?: SemanticCache;\n /** Execution engine for real LLM calls. Falls back to mock if not provided. */\n engine?: ExecutionEngine;\n /** Trust update listener for cross-system synchronization */\n onTrustUpdate?: (agentId: string, trustScore: number, success: boolean) => void;\n /** Agent bus for inter-agent messaging. When provided, key orchestrator events are published. */\n bus?: AgentBus;\n /**\n * Workflow IDs that are disabled (kill switch).\n * Tasks created from disabled workflows are rejected immediately.\n * Update at runtime via disableWorkflow() / enableWorkflow().\n */\n disabledWorkflows?: string[];\n /**\n * OPA policy gate. When provided, pre-execution evaluation runs before\n * every task. Blocked tasks emit 'task:blocked' and fire the escalation\n * webhook if configured (SIGNAL-009).\n */\n policyGate?: OPAPolicyGate;\n /**\n * PII detector. When provided, task.description is scanned before every\n * LLM call. In redact mode the description is sanitised in-place (original\n * preserved in task.context). In block mode a PiiBlockedError fails the\n * task immediately (SIGNAL-015).\n */\n piiDetector?: PiiDetector;\n /**\n * BullMQ task queue configuration (SIGNAL-018).\n * When provided, task execution is routed through a Redis-backed queue\n * with priority ordering, retry+backoff, and concurrency control.\n * Omit to use direct in-process execution (default).\n */\n taskQueueConfig?: TaskQueueConfig;\n /**\n * Immutable append-only audit log (SIGNAL-031).\n * When provided, every orchestrator event is persisted to a SQLite-backed\n * append-only store in addition to the in-memory trail. Entries cannot be\n * updated or deleted — enforced at the database trigger level.\n */\n auditLog?: AuditLog;\n /**\n * Layer sweep (GA-04). When provided, all 7 governance layers are\n * evaluated during task execution. Results are stored in task.context\n * and published on the AgentBus.\n */\n layerSweep?: LayerSweep;\n /**\n * Persona engine. When provided, the active persona is loaded before\n * task execution, shaping agent behavior and workspace configuration.\n */\n personaEngine?: BaselinePersonaEngine;\n}\n\nconst DEFAULT_CONFIG: OrchestratorConfig = {\n maxAutonomousComplexity: 'complex',\n selfVerificationRequired: true,\n supervisorReviewThreshold: 0.7,\n qualityReviewSampleRate: 0.1,\n defaultTrustScore: 70,\n defaultMaxAttempts: 3,\n maxTokensPerTask: 100000,\n maxConcurrentAgents: 10,\n trustGrowthRate: 0.02,\n trustDecayRate: 0.05,\n trustMinimum: 30,\n};\n\n// ─── Complexity Ordering ─────────────────────────────────────────────────────\n\nconst COMPLEXITY_ORDER: Task['complexity'][] = ['trivial', 'simple', 'moderate', 'complex', 'epic'];\ntype FinalApprovalGate = 'pending' | 'approved' | 'blocked';\n\nfunction complexityToNumber(c: Task['complexity']): number {\n return COMPLEXITY_ORDER.indexOf(c);\n}\n\n// ─── Orchestrator ────────────────────────────────────────────────────────────\n\nexport class Orchestrator extends EventEmitter<{\n [K in OrchestratorEvent['type']]: (event: Extract<OrchestratorEvent, { type: K }>) => void;\n}> {\n private config: OrchestratorConfig;\n private tasks: Map<string, Task>;\n private agents: Map<string, Agent>;\n private disabledWorkflows: Set<string>;\n private checkpoints: Map<string, Checkpoint>;\n private reviews: Map<string, Review>;\n private plans: Map<string, ExecutionPlan>;\n private workflows: Map<string, WorkflowDefinition>;\n private auditByTask: Map<string, Array<{ timestamp: number; event: OrchestratorEvent }>>;\n private auditGlobal: Array<{ timestamp: number; event: OrchestratorEvent }>;\n private taskQueue?: TaskQueue;\n private auditLog?: AuditLog;\n\n constructor(config: Partial<OrchestratorConfig> = {}) {\n super();\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.tasks = new Map();\n this.agents = new Map();\n this.checkpoints = new Map();\n this.reviews = new Map();\n this.plans = new Map();\n this.workflows = new Map();\n this.auditByTask = new Map();\n this.auditGlobal = [];\n this.disabledWorkflows = new Set(this.config.disabledWorkflows ?? []);\n\n // BullMQ durable queue (SIGNAL-018) — optional, only when configured\n if (this.config.taskQueueConfig) {\n this.taskQueue = new TaskQueue(\n async (taskId: string) => { await this.dispatchExecution(taskId); },\n this.config.taskQueueConfig,\n );\n }\n\n // Immutable audit log (SIGNAL-031) — optional, persists events to SQLite\n if (this.config.auditLog) {\n this.auditLog = this.config.auditLog;\n }\n\n if (Array.isArray(this.config.workflows)) {\n for (const workflow of this.config.workflows) {\n this.registerWorkflow(workflow);\n }\n }\n\n this.attachAuditListeners();\n }\n\n // ─── Task Management ─────────────────────────────────────────────────────────\n\n async createTask(input: TaskInput): Promise<Task> {\n const validated = TaskInputSchema.parse(input);\n \n const task: Task = {\n id: randomUUID(),\n title: validated.title,\n description: validated.description,\n status: 'pending',\n priority: validated.priority,\n complexity: this.assessComplexity(validated),\n subtasks: [],\n dependencies: [],\n requiredCapabilities: validated.requiredCapabilities,\n attempts: 0,\n maxAttempts: this.config.defaultMaxAttempts,\n acceptanceCriteria: validated.acceptanceCriteria.map((ac, i) => ({\n id: `ac-${i}`,\n description: ac.description,\n type: ac.type,\n weight: ac.weight,\n })),\n verificationResults: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n context: validated.context,\n artifacts: [],\n };\n\n this.tasks.set(task.id, task);\n this.emit('task:created', { type: 'task:created', task });\n\n // Check if requires human approval (epic tasks)\n if (this.requiresHumanApproval(task)) {\n task.status = 'blocked';\n task.needsHumanReview = true;\n return task;\n }\n\n // Auto-decompose if complex\n if (this.shouldDecompose(task)) {\n await this.decomposeTask(task);\n }\n\n return task;\n }\n\n async executeTask(taskId: string): Promise<Task> {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task not found: ${taskId}`);\n }\n\n if (task.status === 'blocked' && task.needsHumanReview) {\n throw new Error(`Task ${taskId} requires human approval before execution`);\n }\n\n // Policy gate pre-execution check (SIGNAL-009)\n if (this.config.policyGate) {\n const bestAgent = this.selectBestAgent(task);\n const agentId = bestAgent?.id ?? 'system';\n const trustScore = bestAgent?.trustScore ?? this.config.defaultTrustScore;\n const gateResult = await this.config.policyGate.preExecution(task, agentId, trustScore);\n if (gateResult.blocked) {\n task.status = 'blocked';\n task.needsHumanReview = true;\n task.updatedAt = Date.now();\n const violation = gateResult.evaluations.find(e => !e.allowed);\n const reason = violation?.reason ?? 'Policy gate denied execution';\n const policy = violation?.policy ?? 'unknown';\n if (gateResult.approvalToken) {\n task.context = {\n ...task.context,\n approvalToken: gateResult.approvalToken,\n approvalTokenExpires: gateResult.approvalTokenExpires,\n };\n }\n this.emit('task:blocked', { type: 'task:blocked', task, reason, policy });\n this.emit('escalation', { type: 'escalation', task, reason, escalatedTo: 'human' });\n metrics.getMeter('baselineos').createCounter('baseline_escalation_total').add(1, {\n reason: reason ?? 'unknown',\n agent_id: task.assignedAgent ?? 'unknown',\n });\n return task;\n }\n }\n\n // Route through BullMQ queue if configured (SIGNAL-018), otherwise execute directly\n if (this.taskQueue) {\n await this.taskQueue.enqueue(taskId, task.priority);\n return task;\n }\n return this.dispatchExecution(taskId);\n }\n\n /**\n * Core execution body — called by the BullMQ worker (or directly when no queue).\n * Runs the full supervision loop: execute → self-verify → review → correct.\n * Not intended to be called externally; exposed for the queue worker closure.\n */\n async dispatchExecution(taskId: string): Promise<Task> {\n const task = this.tasks.get(taskId);\n if (!task) throw new Error(`Task not found: ${taskId}`);\n\n task.status = 'executing';\n task.attempts++;\n this.setFinalApprovalGate(task, 'pending');\n this.emit('task:started', { type: 'task:started', task });\n\n // Persona loading — shape agent behavior based on active persona\n if (this.config.personaEngine) {\n const userId = (task.context?.userId as string) ?? 'system';\n const activePersona = this.config.personaEngine.getActivePersona(userId);\n if (activePersona) {\n task.context = { ...task.context, persona: { id: activePersona.id, name: activePersona.name } };\n }\n // Record behavior for learning\n this.config.personaEngine.learnFromBehavior(userId, {\n type: 'task_execution',\n context: { taskId: task.id, complexity: task.complexity, priority: task.priority },\n timestamp: new Date(),\n });\n }\n\n // Layer sweep — run all 7 governance layers (GA-04)\n if (this.config.layerSweep) {\n const bestAgent = this.selectBestAgent(task);\n const sweepResult: LayerSweepResult = this.config.layerSweep.sweep({\n taskId: task.id,\n title: task.title,\n description: task.description,\n complexity: task.complexity,\n priority: task.priority,\n agent: bestAgent ? { id: bestAgent.id, role: bestAgent.role, trustScore: bestAgent.trustScore } : undefined,\n });\n task.context = { ...task.context, layerSweep: sweepResult };\n\n // Block execution if any layer fails — real enforcement\n if (!sweepResult.overallPassed) {\n const failedLayers = sweepResult.layerResults\n .filter(r => !r.passed)\n .map(r => `${r.layerId}: ${r.checks.filter(c => !c.passed).map(c => c.detail).join('; ')}`)\n .join(' | ');\n task.status = 'blocked';\n task.needsHumanReview = true;\n task.updatedAt = Date.now();\n this.emit('task:blocked', { type: 'task:blocked', task, reason: `Layer sweep failed: ${failedLayers}`, policy: 'layer-sweep' });\n this.emit('escalation', { type: 'escalation', task, reason: `Governance layers failed: ${failedLayers}`, escalatedTo: 'human' });\n return task;\n }\n }\n\n await withSpan('task.execute', {\n 'task.id': task.id,\n 'task.priority': task.priority,\n 'task.complexity': task.complexity,\n 'task.attempt': task.attempts,\n }, async (span) => {\n try {\n await this.executeWithSupervision(task);\n\n const finalApprovalGate = this.getFinalApprovalGate(task);\n if (task.needsHumanReview || finalApprovalGate !== 'approved') {\n const reason = (task.context.finalGateReason as string | undefined) ?? 'Final approval gate unresolved';\n task.status = 'blocked';\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', reason);\n span.setAttribute('task.outcome', 'blocked');\n this.emit('escalation', { type: 'escalation', task, reason, escalatedTo: 'human' });\n metrics.getMeter('baselineos').createCounter('baseline_escalation_total').add(1, {\n reason: reason ?? 'unknown',\n agent_id: task.assignedAgent ?? 'unknown',\n });\n } else {\n task.status = 'completed';\n task.completedAt = Date.now();\n span.setAttribute('task.outcome', 'completed');\n this.emit('task:completed', { type: 'task:completed', task });\n }\n\n if (task.assignedAgent) {\n this.updateAgentTrust(task.assignedAgent, true);\n }\n } catch (error) {\n task.status = 'failed';\n this.setFinalApprovalGate(task, 'blocked', 'Execution failed');\n span.setAttribute('task.outcome', 'failed');\n this.emit('task:failed', { type: 'task:failed', task, error });\n\n if (task.assignedAgent) {\n this.updateAgentTrust(task.assignedAgent, false);\n }\n }\n });\n\n task.updatedAt = Date.now();\n return task;\n }\n\n /**\n * Execute task with autonomous supervision loop.\n * This is where the AMP/Ralph magic happens.\n */\n private async executeWithSupervision(task: Task, startTime: number = Date.now()): Promise<void> {\n const budget = this.getWorkflowBudget(task);\n\n // Step 1: Execute the task\n await this.performExecution(task, budget);\n\n // Step 2: Self-verify if required\n if (this.config.selfVerificationRequired) {\n const selfVerifyResult = await this.selfVerify(task);\n \n if (!selfVerifyResult.passed) {\n // Retry with feedback\n if (task.attempts < task.maxAttempts) {\n task.status = 'correcting';\n this.emit('task:correction-needed', { \n type: 'task:correction-needed', \n task, \n feedback: selfVerifyResult.details \n });\n \n // Re-execute with correction context\n task.context = { \n ...task.context, \n correctionFeedback: selfVerifyResult.details,\n previousAttempt: task.attempts,\n };\n \n task.attempts += 1;\n if (budget?.maxAttempts && task.attempts > budget.maxAttempts) {\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', 'Workflow budget max attempts exceeded');\n return;\n }\n if (budget?.maxDurationMs && Date.now() - startTime > budget.maxDurationMs) {\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', 'Workflow budget max duration exceeded');\n return;\n }\n\n return this.executeWithSupervision(task, startTime);\n }\n\n // Attempts exhausted: force escalation instead of silently continuing.\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', 'Self-verification failed and max attempts exhausted');\n task.context = {\n ...task.context,\n escalationReason: 'Self-verification failed and max attempts exhausted',\n lastVerificationFailure: selfVerifyResult.details,\n };\n return;\n }\n }\n\n // Step 3: Supervisor review if confidence is low or randomly sampled\n const shouldReview = this.shouldTriggerSupervisorReview(task);\n \n if (shouldReview) {\n task.status = 'reviewing';\n const supervisor = this.findSupervisor(task);\n \n if (supervisor) {\n this.emit('task:review-requested', { \n type: 'task:review-requested', \n task, \n reviewer: supervisor \n });\n \n const review = await this.conductReview(task, supervisor);\n this.reviews.set(review.id, review);\n \n this.emit('task:reviewed', { type: 'task:reviewed', task, review });\n \n if (review.overallAssessment === 'needs-work') {\n // Correction loop\n if (task.attempts < task.maxAttempts) {\n task.status = 'correcting';\n task.context = {\n ...task.context,\n reviewFeedback: review.feedback,\n requiredChanges: review.requiredChanges,\n };\n \n this.emit('task:correction-needed', { \n type: 'task:correction-needed', \n task, \n feedback: review.feedback \n });\n \n task.attempts += 1;\n if (budget?.maxAttempts && task.attempts > budget.maxAttempts) {\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', 'Workflow budget max attempts exceeded');\n return;\n }\n if (budget?.maxDurationMs && Date.now() - startTime > budget.maxDurationMs) {\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', 'Workflow budget max duration exceeded');\n return;\n }\n\n return this.executeWithSupervision(task, startTime);\n }\n\n // Attempts exhausted: force escalation instead of silently continuing.\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', 'Supervisor requested changes and max attempts exhausted');\n task.context = {\n ...task.context,\n escalationReason: 'Supervisor requested changes and max attempts exhausted',\n lastReviewFeedback: review.feedback,\n };\n return;\n } else if (review.overallAssessment === 'rejected') {\n // Escalate to quality agent\n const qualityAgent = this.findQualityAgent(task);\n if (qualityAgent) {\n const qualityReview = await this.conductReview(task, qualityAgent);\n \n if (qualityReview.overallAssessment !== 'approved') {\n // Mark for human review\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', 'Quality review failed after supervisor rejection');\n this.emit('escalation', { \n type: 'escalation', \n task, \n reason: 'Quality review failed after supervisor rejection',\n escalatedTo: 'human',\n });\n }\n } else {\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', 'Quality agent unavailable after supervisor rejection');\n }\n }\n }\n }\n\n // Step 4: Quality sampling\n if (Math.random() < this.config.qualityReviewSampleRate) {\n const qualityAgent = this.findQualityAgent(task);\n if (qualityAgent) {\n const qualityReview = await this.conductReview(task, qualityAgent);\n this.reviews.set(qualityReview.id, qualityReview);\n this.emit('task:reviewed', { type: 'task:reviewed', task, review: qualityReview });\n\n if (qualityReview.overallAssessment !== 'approved') {\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', 'Quality sampling review failed');\n task.context = {\n ...task.context,\n escalationReason: 'Quality sampling review failed',\n qualityReviewFeedback: qualityReview.feedback,\n };\n this.emit('escalation', {\n type: 'escalation',\n task,\n reason: 'Quality sampling review failed',\n escalatedTo: 'human',\n });\n return;\n }\n }\n }\n\n this.setFinalApprovalGate(task, 'approved');\n }\n\n private async performExecution(task: Task, budget?: WorkflowBudget): Promise<void> {\n return withSpan('task.perform', {\n 'task.id': task.id,\n 'task.workflow_id': task.workflowId ?? '',\n }, async () => { return this._performExecution(task, budget); });\n }\n\n private async _performExecution(task: Task, budget?: WorkflowBudget): Promise<void> {\n // PII scan before any LLM call (SIGNAL-015)\n if (this.config.piiDetector) {\n try {\n const safeDescription = this.config.piiDetector.processText(task.description, task.id);\n const safeTitle = this.config.piiDetector.processText(task.title, task.id);\n if (safeDescription !== task.description || safeTitle !== task.title) {\n task.context = {\n ...task.context,\n originalDescription: task.description,\n originalTitle: task.title,\n piiRedacted: true,\n };\n task.description = safeDescription;\n task.title = safeTitle;\n }\n } catch (err) {\n if (err instanceof PiiBlockedError) {\n task.status = 'failed';\n task.context = { ...task.context, piiBlocked: true, piiTypes: err.types };\n task.updatedAt = Date.now();\n throw err;\n }\n throw err;\n }\n }\n\n // Create checkpoint before execution\n const checkpoint: Checkpoint = {\n id: randomUUID(),\n taskId: task.id,\n state: { ...task.context },\n artifacts: [...task.artifacts],\n decisions: [],\n createdBy: task.assignedAgent || 'orchestrator',\n createdAt: Date.now(),\n description: `Before attempt ${task.attempts}`,\n recoverable: true,\n };\n\n this.checkpoints.set(checkpoint.id, checkpoint);\n task.currentCheckpoint = checkpoint.id;\n\n this.emit('task:checkpoint', { type: 'task:checkpoint', task, checkpoint });\n this.persistCheckpoint(checkpoint);\n\n const engine = this.config.engine;\n const plan = task.workflowPlanId ? this.plans.get(task.workflowPlanId) : undefined;\n const steps = plan?.steps ?? [];\n const maxSteps = budget?.maxSteps;\n\n if (steps.length > 0) {\n let stepCount = 0;\n for (const step of steps) {\n if (maxSteps && stepCount >= maxSteps) {\n task.needsHumanReview = true;\n this.setFinalApprovalGate(task, 'blocked', 'Workflow budget max steps exceeded');\n break;\n }\n step.status = 'executing';\n\n if (engine) {\n const result = await engine.execute(task, step);\n step.status = 'completed';\n step.result = {\n success: result.compliance.passed,\n output: result.output,\n artifacts: result.artifacts,\n tokensUsed: result.tokensUsed,\n duration: result.duration,\n };\n task.artifacts.push(...result.artifacts);\n task.actualTokens = (task.actualTokens ?? 0) + result.tokensUsed;\n\n // Store output in context for downstream steps and verification\n task.context = {\n ...task.context,\n lastOutput: result.output,\n lastModel: result.model,\n compliancePassed: result.compliance.passed,\n complianceScore: result.compliance.score,\n };\n\n if (!result.compliance.passed) {\n task.context = {\n ...task.context,\n complianceViolations: result.compliance.violations,\n };\n }\n } else {\n // Fallback: mock execution for testing\n await new Promise(resolve => setTimeout(resolve, 150));\n step.status = 'completed';\n step.result = {\n success: true,\n output: { message: `Executed step: ${step.title}` },\n artifacts: [],\n tokensUsed: 0,\n duration: 150,\n };\n }\n stepCount += 1;\n }\n } else {\n // Single-shot execution (no workflow steps)\n if (engine) {\n const result = await engine.execute(task);\n task.artifacts.push(...result.artifacts);\n task.actualTokens = (task.actualTokens ?? 0) + result.tokensUsed;\n task.context = {\n ...task.context,\n lastOutput: result.output,\n lastModel: result.model,\n compliancePassed: result.compliance.passed,\n complianceScore: result.compliance.score,\n };\n\n if (!result.compliance.passed) {\n task.context = {\n ...task.context,\n complianceViolations: result.compliance.violations,\n };\n }\n } else {\n // Fallback: mock execution for testing\n await new Promise(resolve => setTimeout(resolve, 100));\n }\n }\n }\n\n // ─── Workflow Registry ─────────────────────────────────────────────────────\n\n registerWorkflow(definition: WorkflowDefinition): void {\n if (!definition.id) throw new Error('Workflow must have an id');\n this.workflows.set(definition.id, definition);\n }\n\n listWorkflows(): WorkflowDefinition[] {\n return Array.from(this.workflows.values());\n }\n\n getWorkflow(id: string): WorkflowDefinition | undefined {\n return this.workflows.get(id);\n }\n\n /** Disable a workflow type (kill switch). Persists for the lifetime of this Orchestrator instance. */\n disableWorkflow(workflowId: string): void {\n this.disabledWorkflows.add(workflowId);\n this.config.bus?.broadcast('system', 'system:workflow-disabled', { workflowId }, 'high');\n }\n\n /** Re-enable a previously disabled workflow. */\n enableWorkflow(workflowId: string): void {\n this.disabledWorkflows.delete(workflowId);\n this.config.bus?.broadcast('system', 'system:workflow-enabled', { workflowId }, 'normal');\n }\n\n /** Returns the set of currently disabled workflow IDs. */\n getDisabledWorkflows(): string[] {\n return Array.from(this.disabledWorkflows);\n }\n\n async createTaskFromWorkflow(workflowId: string, input: Partial<TaskInput> = {}): Promise<Task> {\n if (this.disabledWorkflows.has(workflowId)) {\n throw new Error(`Workflow '${workflowId}' is disabled (kill switch active). Enable it via orchestrator.enableWorkflow('${workflowId}') before creating tasks.`);\n }\n\n const workflow = this.getWorkflow(workflowId);\n if (!workflow) {\n throw new Error(`Workflow not found: ${workflowId}`);\n }\n\n const task = await this.createTask({\n title: input.title ?? workflow.name,\n description: input.description ?? workflow.description ?? workflow.name,\n priority: input.priority ?? 'medium',\n requiredCapabilities: input.requiredCapabilities ?? workflow.requiredCapabilities ?? [],\n acceptanceCriteria: input.acceptanceCriteria ?? [],\n context: {\n ...(input.context ?? {}),\n workflowId: workflow.id,\n },\n });\n\n task.workflowId = workflow.id;\n const plan = this.createExecutionPlanForWorkflow(task, workflow);\n task.workflowPlanId = plan.id;\n this.plans.set(plan.id, plan);\n\n if (workflow.budget?.maxAttempts) {\n task.maxAttempts = workflow.budget.maxAttempts;\n }\n\n return task;\n }\n\n async executeWorkflow(workflowId: string, input: Partial<TaskInput> = {}): Promise<Task> {\n const task = await this.createTaskFromWorkflow(workflowId, input);\n return this.executeTask(task.id);\n }\n\n private createExecutionPlanForWorkflow(task: Task, workflow: WorkflowDefinition): ExecutionPlan {\n const steps: ExecutionStep[] = workflow.steps.map((step) => ({\n id: step.id,\n title: step.title,\n description: step.description,\n action: step.action,\n dependencies: [],\n status: 'pending',\n verificationCriteria: step.verificationCriteria ?? [],\n }));\n\n return {\n id: `plan-${task.id}`,\n taskId: task.id,\n steps,\n estimatedTokens: 0,\n estimatedDuration: 0,\n riskAssessment: [],\n createdAt: Date.now(),\n };\n }\n\n private getWorkflowBudget(task: Task): WorkflowBudget | undefined {\n if (task.workflowId) {\n return this.workflows.get(task.workflowId)?.budget;\n }\n return undefined;\n }\n\n // ─── Checkpoint Persistence + Recovery ─────────────────────────────────────\n\n private persistCheckpoint(checkpoint: Checkpoint): void {\n const base = this.config.checkpointsPath ?? '.baseline/checkpoints';\n try {\n if (!existsSync(base)) {\n mkdirSync(base, { recursive: true });\n }\n const file = join(base, `${checkpoint.id}.json`);\n writeFileSync(file, JSON.stringify(checkpoint, null, 2));\n } catch (err) {\n process.stderr.write(`[baseline:orchestrator] Checkpoint persist failed: ${(err as Error).message}\\n`);\n }\n }\n\n loadCheckpoint(checkpointId: string): Checkpoint | null {\n const base = this.config.checkpointsPath ?? '.baseline/checkpoints';\n const file = join(base, `${checkpointId}.json`);\n if (!existsSync(file)) return null;\n try {\n const raw = JSON.parse(readFileSync(file, 'utf-8'));\n return raw as Checkpoint;\n } catch (err) {\n process.stderr.write(`[baseline:orchestrator] Checkpoint load failed for ${checkpointId}: ${(err as Error).message}\\n`);\n return null;\n }\n }\n\n recoverTaskFromCheckpoint(checkpointId: string): Task | null {\n const checkpoint = this.loadCheckpoint(checkpointId);\n if (!checkpoint) return null;\n\n const existing = this.tasks.get(checkpoint.taskId);\n if (existing) {\n existing.context = { ...checkpoint.state };\n existing.status = 'pending';\n existing.currentCheckpoint = checkpoint.id;\n this.tasks.set(existing.id, existing);\n return existing;\n }\n\n const recovered: Task = {\n id: checkpoint.taskId,\n title: 'Recovered Task',\n description: checkpoint.description,\n status: 'pending',\n priority: 'medium',\n complexity: 'moderate',\n subtasks: [],\n dependencies: [],\n requiredCapabilities: [],\n attempts: 0,\n maxAttempts: this.config.defaultMaxAttempts,\n acceptanceCriteria: [],\n verificationResults: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n context: { ...checkpoint.state },\n artifacts: checkpoint.artifacts ?? [],\n currentCheckpoint: checkpoint.id,\n };\n\n this.tasks.set(recovered.id, recovered);\n return recovered;\n }\n\n private async selfVerify(task: Task): Promise<VerificationResult> {\n return withSpan('task.self_verify', { 'task.id': task.id }, async () => {\n return this._selfVerify(task);\n });\n }\n\n private async _selfVerify(task: Task): Promise<VerificationResult> {\n const engine = this.config.engine;\n const output = (task.context.lastOutput as string) ?? '';\n\n let result: VerificationResult;\n\n if (engine && output) {\n result = await engine.selfVerify(task, output);\n } else {\n // Fallback: mock verification for testing\n result = {\n criterionId: 'self-verify',\n passed: true,\n confidence: 0.85,\n details: 'Self-verification passed (mock)',\n verifiedBy: task.assignedAgent || 'orchestrator',\n verifiedAt: Date.now(),\n };\n }\n\n task.verificationResults.push(result);\n this.emit('task:verified', { type: 'task:verified', task, result });\n\n return result;\n }\n\n private shouldTriggerSupervisorReview(task: Task): boolean {\n // Get average confidence from verification results\n const avgConfidence = task.verificationResults.length > 0\n ? task.verificationResults.reduce((sum, r) => sum + r.confidence, 0) / task.verificationResults.length\n : 0.5;\n\n // Review if confidence below threshold\n if (avgConfidence < this.config.supervisorReviewThreshold) {\n return true;\n }\n\n // Review if critical priority\n if (task.priority === 'critical') {\n return true;\n }\n\n // Random sampling\n return Math.random() < this.config.qualityReviewSampleRate;\n }\n\n private async conductReview(task: Task, reviewer: Agent): Promise<Review> {\n return withSpan('task.review', {\n 'task.id': task.id,\n 'reviewer.id': reviewer.id,\n 'reviewer.role': reviewer.role,\n }, async () => { return this._conductReview(task, reviewer); });\n }\n\n private async _conductReview(task: Task, reviewer: Agent): Promise<Review> {\n const engine = this.config.engine;\n const output = (task.context.lastOutput as string) ?? '';\n const reviewType = reviewer.role === 'supervisor' ? 'supervisor' as const : 'quality' as const;\n\n if (engine && output) {\n const review = await engine.conductReview(task, output, reviewType);\n // Override reviewer/reviewee with actual agent IDs\n review.reviewerId = reviewer.id;\n review.revieweeId = task.assignedAgent || 'unknown';\n return review;\n }\n\n // Fallback: mock review for testing\n return {\n id: randomUUID(),\n taskId: task.id,\n reviewerId: reviewer.id,\n revieweeId: task.assignedAgent || 'unknown',\n type: reviewType,\n scope: 'full',\n findings: [],\n overallAssessment: 'approved',\n confidence: 0.9,\n feedback: 'Review completed successfully (mock)',\n suggestions: [],\n requiredChanges: [],\n createdAt: Date.now(),\n completedAt: Date.now(),\n timeSpent: 100,\n };\n }\n\n private findSupervisor(_task: Task): Agent | undefined {\n return Array.from(this.agents.values()).find(\n a => a.role === 'supervisor' && a.status === 'idle'\n );\n }\n\n private findQualityAgent(_task: Task): Agent | undefined {\n return Array.from(this.agents.values()).find(\n a => a.role === 'quality' && a.status === 'idle'\n );\n }\n\n getTask(taskId: string): Task | undefined {\n return this.tasks.get(taskId);\n }\n\n /**\n * Approve a blocked task, optionally recording who approved it.\n * When BASELINE_APPROVAL_SECRET is set, approvalToken must match the\n * HMAC token issued when the task was blocked (SIGNAL-017).\n */\n async approveTask(taskId: string, approvedBy: string = 'human', approvalToken?: string): Promise<Task> {\n const task = this.tasks.get(taskId);\n if (!task) {\n throw new Error(`Task not found: ${taskId}`);\n }\n if (task.status !== 'blocked') {\n throw new Error(`Task ${taskId} is not blocked (status: ${task.status})`);\n }\n\n // Token validation (SIGNAL-017)\n const approvalSecret = process.env['BASELINE_APPROVAL_SECRET'];\n if (approvalSecret) {\n const storedToken = task.context.approvalToken as string | undefined;\n const tokenExpires = task.context.approvalTokenExpires as number | undefined;\n\n if (!approvalToken) {\n throw new Error(`Approval token required — set BASELINE_APPROVAL_SECRET is active`);\n }\n if (!storedToken) {\n throw new Error(`No approval token on file for task ${taskId}`);\n }\n if (tokenExpires && Date.now() > tokenExpires) {\n throw new Error(`Approval token expired for task ${taskId}`);\n }\n\n // Constant-time comparison to prevent timing attacks\n const { timingSafeEqual } = await import('crypto');\n const expected = Buffer.from(storedToken);\n const received = Buffer.from(approvalToken);\n if (expected.length !== received.length || !timingSafeEqual(expected, received)) {\n throw new Error(`Invalid approval token for task ${taskId}`);\n }\n }\n\n task.needsHumanReview = false;\n task.status = 'pending';\n task.updatedAt = Date.now();\n task.context = {\n ...task.context,\n approvedBy,\n approvedAt: Date.now(),\n finalApprovalGate: undefined,\n approvalToken: undefined, // one-time use — invalidate after approval\n approvalTokenExpires: undefined,\n };\n\n this.emit('task:approved', { type: 'task:approved', task, approvedBy });\n\n // Re-execute immediately after approval\n return this.executeTask(taskId);\n }\n\n cancelTask(taskId: string, reason: string = 'Cancelled by user'): boolean {\n const task = this.tasks.get(taskId);\n if (!task) return false;\n\n if (task.status === 'completed' || task.status === 'failed') {\n return false;\n }\n\n task.status = 'failed';\n task.updatedAt = Date.now();\n task.context = {\n ...task.context,\n cancelled: true,\n cancelReason: reason,\n };\n\n this.emit('task:failed', { type: 'task:failed', task, error: reason });\n return true;\n }\n\n getAllTasks(): Task[] {\n return Array.from(this.tasks.values());\n }\n\n // ─── Agent Management ──────────────────────────────────────────────────────\n\n registerAgent(agent: Omit<Agent, 'createdAt' | 'lastActiveAt'>): Agent {\n const fullAgent: Agent = {\n ...agent,\n createdAt: Date.now(),\n lastActiveAt: Date.now(),\n };\n this.agents.set(fullAgent.id, fullAgent);\n return fullAgent;\n }\n\n getAllAgents(): Agent[] {\n return Array.from(this.agents.values());\n }\n\n /**\n * Select the best available agent for a task based on trust score and capability match.\n * Agents are ranked by: (capability overlap × trust score). Suspended agents are excluded.\n */\n selectBestAgent(task: Task): Agent | undefined {\n const candidates = Array.from(this.agents.values())\n .filter(a => a.status !== 'suspended' && a.status !== 'offline')\n .filter(a => {\n if (task.requiredCapabilities.length === 0) return true;\n return task.requiredCapabilities.some(cap => a.capabilities.includes(cap));\n });\n\n if (candidates.length === 0) return undefined;\n\n // Score: capability overlap ratio × trust score\n const scored = candidates.map(agent => {\n const capOverlap = task.requiredCapabilities.length > 0\n ? task.requiredCapabilities.filter(cap => agent.capabilities.includes(cap)).length / task.requiredCapabilities.length\n : 1;\n return { agent, score: capOverlap * agent.trustScore };\n });\n\n scored.sort((a, b) => b.score - a.score);\n return scored[0]?.agent;\n }\n\n /**\n * Suspend an agent. Suspended agents are excluded from task selection.\n */\n suspendAgent(agentId: string, reason: string = 'Trust score below minimum'): boolean {\n const agent = this.agents.get(agentId);\n if (!agent || agent.status === 'suspended') return false;\n\n agent.status = 'suspended';\n agent.lastActiveAt = Date.now();\n this.emit('agent:suspended', {\n type: 'agent:suspended',\n agent,\n reason,\n });\n return true;\n }\n\n /**\n * Reinstate a suspended agent.\n */\n reinstateAgent(agentId: string): boolean {\n const agent = this.agents.get(agentId);\n if (!agent || agent.status !== 'suspended') return false;\n\n agent.status = 'idle';\n agent.lastActiveAt = Date.now();\n this.emit('agent:reinstated', {\n type: 'agent:reinstated',\n agent,\n });\n return true;\n }\n\n private updateAgentTrust(agentId: string, success: boolean): void {\n const agent = this.agents.get(agentId);\n if (!agent) return;\n\n const previousTrust = agent.trustScore;\n\n if (success) {\n // Asymptotic growth: trust += growthRate * (100 - trust)\n agent.trustScore += this.config.trustGrowthRate * (100 - agent.trustScore);\n agent.tasksCompleted++;\n } else {\n // Proportional decay: trust -= decayRate * trust\n agent.trustScore -= this.config.trustDecayRate * agent.trustScore;\n agent.tasksFailed++;\n }\n\n agent.lastActiveAt = Date.now();\n\n this.emit('agent:trust-updated', {\n type: 'agent:trust-updated',\n agent,\n previousTrust\n });\n\n // Auto-suspend if trust drops below minimum\n if (agent.trustScore < this.config.trustMinimum && agent.status !== 'suspended') {\n this.suspendAgent(agentId, `Trust score ${agent.trustScore.toFixed(1)} below minimum ${this.config.trustMinimum}`);\n }\n\n // Cross-system trust sync callback\n if (this.config.onTrustUpdate) {\n this.config.onTrustUpdate(agentId, agent.trustScore, success);\n }\n }\n\n // ─── Task Decomposition ────────────────────────────────────────────────────\n\n private async decomposeTask(task: Task): Promise<void> {\n task.status = 'planning';\n\n const engine = this.config.engine;\n let phases: Array<{ title: string; description: string; capabilities: string[] }>;\n\n if (engine) {\n const decomposition = await engine.decompose(task);\n phases = decomposition.phases.length > 0\n ? decomposition.phases\n : [\n { title: 'research', description: `Research: ${task.title}`, capabilities: task.requiredCapabilities },\n { title: 'implement', description: `Implement: ${task.title}`, capabilities: task.requiredCapabilities },\n { title: 'verify', description: `Verify: ${task.title}`, capabilities: task.requiredCapabilities },\n ];\n } else {\n // Fallback: standard phases\n phases = ['research', 'design', 'implement', 'verify', 'document'].map((p) => ({\n title: p,\n description: `${p} phase for: ${task.description}`,\n capabilities: task.requiredCapabilities,\n }));\n }\n\n for (let i = 0; i < phases.length; i++) {\n const phase = phases[i]!;\n const subtask: Task = {\n id: randomUUID(),\n parentId: task.id,\n title: `${phase.title}: ${task.title}`,\n description: phase.description,\n status: 'pending',\n priority: task.priority,\n complexity: 'simple',\n subtasks: [],\n dependencies: i > 0 ? [task.subtasks[i - 1].id] : [],\n requiredCapabilities: phase.capabilities.length > 0 ? phase.capabilities : task.requiredCapabilities,\n attempts: 0,\n maxAttempts: this.config.defaultMaxAttempts,\n acceptanceCriteria: [],\n verificationResults: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n context: { ...task.context, phase: phase.title },\n artifacts: [],\n };\n\n task.subtasks.push(subtask);\n this.tasks.set(subtask.id, subtask);\n }\n\n task.status = 'pending';\n this.emit('task:decomposed', { type: 'task:decomposed', task, subtasks: task.subtasks });\n }\n\n // ─── Helper Methods ────────────────────────────────────────────────────────\n\n private assessComplexity(input: TaskInput): Task['complexity'] {\n const descLength = input.description.length;\n const capCount = input.requiredCapabilities.length;\n const criteriaCount = input.acceptanceCriteria.length;\n \n const score = descLength / 100 + capCount * 2 + criteriaCount * 1.5;\n \n if (score < 5) return 'trivial';\n if (score < 15) return 'simple';\n if (score < 30) return 'moderate';\n if (score < 50) return 'complex';\n return 'epic';\n }\n\n private shouldDecompose(task: Task): boolean {\n return task.complexity === 'complex' || task.complexity === 'epic';\n }\n\n private requiresHumanApproval(task: Task): boolean {\n const maxIndex = complexityToNumber(this.config.maxAutonomousComplexity);\n const taskIndex = complexityToNumber(task.complexity);\n return taskIndex > maxIndex;\n }\n\n // ─── Audit + Evidence ──────────────────────────────────────────────────────\n\n private attachAuditListeners(): void {\n const events: OrchestratorEvent['type'][] = [\n 'task:created',\n 'task:decomposed',\n 'task:assigned',\n 'task:started',\n 'task:checkpoint',\n 'task:verified',\n 'task:review-requested',\n 'task:reviewed',\n 'task:correction-needed',\n 'task:corrected',\n 'task:completed',\n 'task:failed',\n 'task:blocked',\n 'task:approved',\n 'agent:status-changed',\n 'agent:trust-updated',\n 'escalation',\n ];\n\n for (const type of events) {\n this.on(type, (event) => {\n this.recordAudit(event);\n this.publishToBus(event);\n });\n }\n }\n\n private publishToBus(event: OrchestratorEvent): void {\n const bus = this.config.bus;\n if (!bus) return;\n\n const category =\n event.type.startsWith('task:') ? 'task' :\n event.type.startsWith('agent:') ? 'agent' :\n 'system';\n\n const agentId =\n 'agent' in event ? event.agent.id :\n 'task' in event && event.task.assignedAgent ? event.task.assignedAgent :\n undefined;\n\n bus.publish({\n from: agentId ?? 'system',\n topic: event.type,\n category,\n payload: event,\n priority: event.type === 'escalation' || event.type === 'task:failed' ? 'high' : 'normal',\n });\n }\n\n private recordAudit(event: OrchestratorEvent): void {\n const timestamp = Date.now();\n this.auditGlobal.push({ timestamp, event });\n\n const taskId = this.getEventTaskId(event);\n if (taskId) {\n const list = this.auditByTask.get(taskId) ?? [];\n list.push({ timestamp, event });\n this.auditByTask.set(taskId, list);\n }\n\n // Persist to immutable append-only store (SIGNAL-031)\n this.auditLog?.append(event);\n }\n\n private getEventTaskId(event: OrchestratorEvent): string | undefined {\n if ('task' in event) {\n return event.task.id;\n }\n return undefined;\n }\n\n getAuditTrail(taskId?: string): Array<{ timestamp: number; event: OrchestratorEvent }> {\n if (taskId) {\n return this.auditByTask.get(taskId) ?? [];\n }\n return this.auditGlobal;\n }\n\n getEvidenceBundle(taskId: string): {\n task?: Task;\n workflow?: WorkflowDefinition;\n plan?: ExecutionPlan;\n checkpoints: Checkpoint[];\n reviews: Review[];\n verificationResults: VerificationResult[];\n artifacts: Task['artifacts'];\n audit: Array<{ timestamp: number; event: OrchestratorEvent }>;\n } {\n const task = this.tasks.get(taskId);\n const workflow = task?.workflowId ? this.workflows.get(task.workflowId) : undefined;\n const plan = task?.workflowPlanId ? this.plans.get(task.workflowPlanId) : undefined;\n const checkpoints = Array.from(this.checkpoints.values()).filter(c => c.taskId === taskId);\n const reviews = this.getReviews(taskId);\n const verificationResults = task?.verificationResults ?? [];\n const artifacts = task?.artifacts ?? [];\n const audit = this.getAuditTrail(taskId);\n\n return {\n task,\n workflow,\n plan,\n checkpoints,\n reviews,\n verificationResults,\n artifacts,\n audit,\n };\n }\n\n // ─── Statistics ────────────────────────────────────────────────────────────\n\n getStats() {\n const tasksByStatus: Record<string, number> = {};\n for (const task of this.tasks.values()) {\n tasksByStatus[task.status] = (tasksByStatus[task.status] || 0) + 1;\n }\n\n const agentsByRole: Record<string, number> = {};\n for (const agent of this.agents.values()) {\n agentsByRole[agent.role] = (agentsByRole[agent.role] || 0) + 1;\n }\n\n return {\n tasks: { total: this.tasks.size, byStatus: tasksByStatus },\n agents: { total: this.agents.size, byRole: agentsByRole },\n };\n }\n\n // ─── Review Access ─────────────────────────────────────────────────────────\n\n getReviews(taskId?: string): Review[] {\n const reviews = Array.from(this.reviews.values());\n if (taskId) {\n return reviews.filter(r => r.taskId === taskId);\n }\n return reviews;\n }\n\n private setFinalApprovalGate(task: Task, gate: FinalApprovalGate, reason?: string): void {\n task.context = {\n ...task.context,\n finalApprovalGate: gate,\n ...(reason ? { finalGateReason: reason } : {}),\n };\n }\n\n private getFinalApprovalGate(task: Task): FinalApprovalGate | undefined {\n const gate = task.context.finalApprovalGate;\n if (gate === 'pending' || gate === 'approved' || gate === 'blocked') {\n return gate;\n }\n return undefined;\n }\n}\n"]}
@@ -0,0 +1,82 @@
1
+ import { AgentBus } from './agent-bus.js';
2
+
3
+ /**
4
+ * PII Detector — SIGNAL-015
5
+ *
6
+ * Scans prompt text for personally identifiable information before it
7
+ * reaches the LLM router. Supports two enforcement modes:
8
+ *
9
+ * redact — replaces detected values with [REDACTED:TYPE] (default)
10
+ * block — throws PiiBlockedError, halting task execution
11
+ *
12
+ * Detected types:
13
+ * email — RFC 5321 address pattern
14
+ * phone — US/international format (10-digit minimum)
15
+ * ssn — US Social Security Number (NNN-NN-NNNN)
16
+ * credit-card — Visa, Mastercard, Amex, Discover
17
+ * api-key — OpenAI sk-, Anthropic sk-ant-, GitHub ghp_, AWS AKIA
18
+ * ip-address — IPv4 addresses
19
+ *
20
+ * Integration:
21
+ * Called by Orchestrator._performExecution() before engine.execute().
22
+ * Publishes 'governance:pii-detected' on the AgentBus when PII is found.
23
+ * Sets pii.detected and pii.types on the active OTel span.
24
+ *
25
+ * @license Apache-2.0
26
+ */
27
+
28
+ type PiiType = 'email' | 'phone' | 'ssn' | 'credit-card' | 'api-key' | 'ip-address';
29
+ type PiiMode = 'redact' | 'block';
30
+ interface PiiMatch {
31
+ type: PiiType;
32
+ start: number;
33
+ end: number;
34
+ }
35
+ interface PiiScanResult {
36
+ /** true when no PII was detected */
37
+ clean: boolean;
38
+ /** all matches found, sorted by start position */
39
+ matches: PiiMatch[];
40
+ /** unique PII types present */
41
+ types: PiiType[];
42
+ /** input text with all PII replaced by [REDACTED:TYPE]; equals input when clean=true */
43
+ redacted: string;
44
+ }
45
+ interface PiiDetectorConfig {
46
+ /** Enforcement mode. Default: 'redact' */
47
+ mode?: PiiMode;
48
+ /** PII types to skip. Useful for staged rollouts. */
49
+ disabledTypes?: PiiType[];
50
+ /** AgentBus for publishing governance:pii-detected events. */
51
+ bus?: AgentBus;
52
+ }
53
+ declare class PiiBlockedError extends Error {
54
+ readonly types: PiiType[];
55
+ constructor(types: PiiType[]);
56
+ }
57
+ declare class PiiDetector {
58
+ readonly mode: PiiMode;
59
+ private readonly disabled;
60
+ private readonly bus?;
61
+ constructor(config?: PiiDetectorConfig);
62
+ /**
63
+ * Scan text for PII without side effects.
64
+ * Safe to call in any context — no bus events, no span mutations.
65
+ */
66
+ scan(text: string): PiiScanResult;
67
+ /**
68
+ * Process text before LLM routing.
69
+ *
70
+ * - Publishes 'governance:pii-detected' on the bus when PII is found.
71
+ * - Sets pii.detected and pii.types on the active OTel span.
72
+ * - redact mode: returns redacted text.
73
+ * - block mode: throws PiiBlockedError if PII found.
74
+ *
75
+ * @param text Text to scan (typically task.description).
76
+ * @param taskId Used for bus event correlation.
77
+ * @returns Safe text (redacted or original when clean).
78
+ */
79
+ processText(text: string, taskId?: string): string;
80
+ }
81
+
82
+ export { PiiBlockedError, PiiDetector, type PiiDetectorConfig, type PiiMatch, type PiiMode, type PiiScanResult, type PiiType };
@@ -0,0 +1,126 @@
1
+ import { trace } from '@opentelemetry/api';
2
+
3
+ // src/core/pii-detector.ts
4
+ var PiiBlockedError = class extends Error {
5
+ constructor(types) {
6
+ super(`PII detected in prompt \u2014 blocked: ${types.join(", ")}`);
7
+ this.types = types;
8
+ this.name = "PiiBlockedError";
9
+ }
10
+ };
11
+ var PATTERNS = {
12
+ // API keys before email to avoid partial overlap on sk- prefixes
13
+ "api-key": /\b(sk-ant-[A-Za-z0-9-_]{20,}|sk-[A-Za-z0-9]{32,}|(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36}|AKIA[0-9A-Z]{16})\b/g,
14
+ "email": /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g,
15
+ "phone": /\b(?:\+?1[\s.-]?)?\(?[0-9]{3}\)?[\s.-][0-9]{3}[\s.-][0-9]{4}\b/g,
16
+ "ssn": /\b(?!000|666|9\d{2})\d{3}-(?!00)\d{2}-(?!0000)\d{4}\b/g,
17
+ "credit-card": /\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})\b/g,
18
+ "ip-address": /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/g
19
+ };
20
+ var PiiDetector = class {
21
+ mode;
22
+ disabled;
23
+ bus;
24
+ constructor(config = {}) {
25
+ this.mode = config.mode ?? "redact";
26
+ this.disabled = new Set(config.disabledTypes ?? []);
27
+ this.bus = config.bus;
28
+ }
29
+ /**
30
+ * Scan text for PII without side effects.
31
+ * Safe to call in any context — no bus events, no span mutations.
32
+ */
33
+ scan(text) {
34
+ const matches = [];
35
+ for (const [type, pattern] of Object.entries(PATTERNS)) {
36
+ if (this.disabled.has(type)) continue;
37
+ pattern.lastIndex = 0;
38
+ let m;
39
+ while ((m = pattern.exec(text)) !== null) {
40
+ matches.push({ type, start: m.index, end: m.index + m[0].length });
41
+ }
42
+ }
43
+ matches.sort((a, b) => a.start - b.start || b.end - a.end);
44
+ const deduped = [];
45
+ let cursor = 0;
46
+ for (const match of matches) {
47
+ if (match.start >= cursor) {
48
+ deduped.push(match);
49
+ cursor = match.end;
50
+ }
51
+ }
52
+ const types = [...new Set(deduped.map((m) => m.type))];
53
+ const clean = deduped.length === 0;
54
+ let redacted = "";
55
+ let pos = 0;
56
+ for (const match of deduped) {
57
+ redacted += text.slice(pos, match.start);
58
+ redacted += `[REDACTED:${match.type.toUpperCase()}]`;
59
+ pos = match.end;
60
+ }
61
+ redacted += text.slice(pos);
62
+ return { clean, matches: deduped, types, redacted };
63
+ }
64
+ /**
65
+ * Process text before LLM routing.
66
+ *
67
+ * - Publishes 'governance:pii-detected' on the bus when PII is found.
68
+ * - Sets pii.detected and pii.types on the active OTel span.
69
+ * - redact mode: returns redacted text.
70
+ * - block mode: throws PiiBlockedError if PII found.
71
+ *
72
+ * @param text Text to scan (typically task.description).
73
+ * @param taskId Used for bus event correlation.
74
+ * @returns Safe text (redacted or original when clean).
75
+ */
76
+ processText(text, taskId) {
77
+ const result = this.scan(text);
78
+ if (!result.clean) {
79
+ const span = trace.getActiveSpan();
80
+ if (span) {
81
+ span.setAttribute("pii.detected", true);
82
+ span.setAttribute("pii.types", result.types.join(","));
83
+ span.setAttribute("pii.count", result.matches.length);
84
+ }
85
+ this.bus?.broadcast("system", "governance:pii-detected", {
86
+ taskId,
87
+ types: result.types,
88
+ count: result.matches.length,
89
+ blocked: this.mode === "block",
90
+ mode: this.mode
91
+ }, "high");
92
+ if (this.mode === "block") {
93
+ throw new PiiBlockedError(result.types);
94
+ }
95
+ }
96
+ return result.redacted;
97
+ }
98
+ };
99
+ /**
100
+ * PII Detector — SIGNAL-015
101
+ *
102
+ * Scans prompt text for personally identifiable information before it
103
+ * reaches the LLM router. Supports two enforcement modes:
104
+ *
105
+ * redact — replaces detected values with [REDACTED:TYPE] (default)
106
+ * block — throws PiiBlockedError, halting task execution
107
+ *
108
+ * Detected types:
109
+ * email — RFC 5321 address pattern
110
+ * phone — US/international format (10-digit minimum)
111
+ * ssn — US Social Security Number (NNN-NN-NNNN)
112
+ * credit-card — Visa, Mastercard, Amex, Discover
113
+ * api-key — OpenAI sk-, Anthropic sk-ant-, GitHub ghp_, AWS AKIA
114
+ * ip-address — IPv4 addresses
115
+ *
116
+ * Integration:
117
+ * Called by Orchestrator._performExecution() before engine.execute().
118
+ * Publishes 'governance:pii-detected' on the AgentBus when PII is found.
119
+ * Sets pii.detected and pii.types on the active OTel span.
120
+ *
121
+ * @license Apache-2.0
122
+ */
123
+
124
+ export { PiiBlockedError, PiiDetector };
125
+ //# sourceMappingURL=pii-detector.js.map
126
+ //# sourceMappingURL=pii-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/pii-detector.ts"],"names":[],"mappings":"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","file":"pii-detector.js","sourcesContent":["/**\n * PII Detector — SIGNAL-015\n *\n * Scans prompt text for personally identifiable information before it\n * reaches the LLM router. Supports two enforcement modes:\n *\n * redact — replaces detected values with [REDACTED:TYPE] (default)\n * block — throws PiiBlockedError, halting task execution\n *\n * Detected types:\n * email — RFC 5321 address pattern\n * phone — US/international format (10-digit minimum)\n * ssn — US Social Security Number (NNN-NN-NNNN)\n * credit-card — Visa, Mastercard, Amex, Discover\n * api-key — OpenAI sk-, Anthropic sk-ant-, GitHub ghp_, AWS AKIA\n * ip-address — IPv4 addresses\n *\n * Integration:\n * Called by Orchestrator._performExecution() before engine.execute().\n * Publishes 'governance:pii-detected' on the AgentBus when PII is found.\n * Sets pii.detected and pii.types on the active OTel span.\n *\n * @license Apache-2.0\n */\n\nimport { trace } from '@opentelemetry/api';\nimport type { AgentBus } from './agent-bus.js';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type PiiType =\n | 'email'\n | 'phone'\n | 'ssn'\n | 'credit-card'\n | 'api-key'\n | 'ip-address';\n\nexport type PiiMode = 'redact' | 'block';\n\nexport interface PiiMatch {\n type: PiiType;\n start: number;\n end: number;\n}\n\nexport interface PiiScanResult {\n /** true when no PII was detected */\n clean: boolean;\n /** all matches found, sorted by start position */\n matches: PiiMatch[];\n /** unique PII types present */\n types: PiiType[];\n /** input text with all PII replaced by [REDACTED:TYPE]; equals input when clean=true */\n redacted: string;\n}\n\nexport interface PiiDetectorConfig {\n /** Enforcement mode. Default: 'redact' */\n mode?: PiiMode;\n /** PII types to skip. Useful for staged rollouts. */\n disabledTypes?: PiiType[];\n /** AgentBus for publishing governance:pii-detected events. */\n bus?: AgentBus;\n}\n\n// ─── Error ────────────────────────────────────────────────────────────────────\n\nexport class PiiBlockedError extends Error {\n constructor(public readonly types: PiiType[]) {\n super(`PII detected in prompt — blocked: ${types.join(', ')}`);\n this.name = 'PiiBlockedError';\n }\n}\n\n// ─── Patterns ────────────────────────────────────────────────────────────────\n\nconst PATTERNS: Record<PiiType, RegExp> = {\n // API keys before email to avoid partial overlap on sk- prefixes\n 'api-key': /\\b(sk-ant-[A-Za-z0-9-_]{20,}|sk-[A-Za-z0-9]{32,}|(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36}|AKIA[0-9A-Z]{16})\\b/g,\n 'email': /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b/g,\n 'phone': /\\b(?:\\+?1[\\s.-]?)?\\(?[0-9]{3}\\)?[\\s.-][0-9]{3}[\\s.-][0-9]{4}\\b/g,\n 'ssn': /\\b(?!000|666|9\\d{2})\\d{3}-(?!00)\\d{2}-(?!0000)\\d{4}\\b/g,\n 'credit-card': /\\b(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})\\b/g,\n 'ip-address': /\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b/g,\n};\n\n// ─── PiiDetector ─────────────────────────────────────────────────────────────\n\nexport class PiiDetector {\n readonly mode: PiiMode;\n private readonly disabled: Set<PiiType>;\n private readonly bus?: AgentBus;\n\n constructor(config: PiiDetectorConfig = {}) {\n this.mode = config.mode ?? 'redact';\n this.disabled = new Set(config.disabledTypes ?? []);\n this.bus = config.bus;\n }\n\n /**\n * Scan text for PII without side effects.\n * Safe to call in any context — no bus events, no span mutations.\n */\n scan(text: string): PiiScanResult {\n const matches: PiiMatch[] = [];\n\n for (const [type, pattern] of Object.entries(PATTERNS) as Array<[PiiType, RegExp]>) {\n if (this.disabled.has(type)) continue;\n\n // Reset lastIndex — patterns are defined with /g flag\n pattern.lastIndex = 0;\n let m: RegExpExecArray | null;\n while ((m = pattern.exec(text)) !== null) {\n matches.push({ type, start: m.index, end: m.index + m[0].length });\n }\n }\n\n // Sort by start position, resolve overlaps (keep longest match)\n matches.sort((a, b) => a.start - b.start || b.end - a.end);\n const deduped: PiiMatch[] = [];\n let cursor = 0;\n for (const match of matches) {\n if (match.start >= cursor) {\n deduped.push(match);\n cursor = match.end;\n }\n }\n\n const types = [...new Set(deduped.map((m) => m.type))];\n const clean = deduped.length === 0;\n\n // Build redacted string\n let redacted = '';\n let pos = 0;\n for (const match of deduped) {\n redacted += text.slice(pos, match.start);\n redacted += `[REDACTED:${match.type.toUpperCase()}]`;\n pos = match.end;\n }\n redacted += text.slice(pos);\n\n return { clean, matches: deduped, types, redacted };\n }\n\n /**\n * Process text before LLM routing.\n *\n * - Publishes 'governance:pii-detected' on the bus when PII is found.\n * - Sets pii.detected and pii.types on the active OTel span.\n * - redact mode: returns redacted text.\n * - block mode: throws PiiBlockedError if PII found.\n *\n * @param text Text to scan (typically task.description).\n * @param taskId Used for bus event correlation.\n * @returns Safe text (redacted or original when clean).\n */\n processText(text: string, taskId?: string): string {\n const result = this.scan(text);\n\n if (!result.clean) {\n // Set OTel span attributes on the active span (task.perform)\n const span = trace.getActiveSpan();\n if (span) {\n span.setAttribute('pii.detected', true);\n span.setAttribute('pii.types', result.types.join(','));\n span.setAttribute('pii.count', result.matches.length);\n }\n\n // Publish governance event\n this.bus?.broadcast('system', 'governance:pii-detected', {\n taskId,\n types: result.types,\n count: result.matches.length,\n blocked: this.mode === 'block',\n mode: this.mode,\n }, 'high');\n\n if (this.mode === 'block') {\n throw new PiiBlockedError(result.types);\n }\n }\n\n return result.redacted;\n }\n}\n"]}