@hilbras/omninode 0.9.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/version.ts","../../src/errors/index.ts","../../src/cli/commands/init.ts","../../src/config/schema.ts","../../src/config/loader.ts","../../src/config/default.ts","../../src/cli/commands/project.ts","../../src/providers/auth.ts","../../src/providers/http.ts","../../src/logger/index.ts","../../src/providers/openai-compatible/index.ts","../../src/providers/omnihilbras/index.ts","../../src/providers/factory.ts","../../src/registry/index.ts","../../src/cli/commands/shared.ts","../../src/cli/commands/providers.ts","../../src/cli/commands/models.ts","../../src/agents/process/index.ts","../../src/agents/registry.ts","../../src/agents/factory.ts","../../src/cli/commands/agents.ts","../../src/cli/commands/roles.ts","../../src/tasks/store.ts","../../src/tasks/engine.ts","../../src/memory/local.ts","../../src/memory/remembera.ts","../../src/memory/factory.ts","../../src/memory/service.ts","../../src/roles/index.ts","../../src/tasks/engine-factory.ts","../../src/cli/commands/tasks.ts","../../src/reports/aggregate.ts","../../src/reports/extract.ts","../../src/reports/service.ts","../../src/reports/store.ts","../../src/cli/commands/reports.ts","../../src/pipelines/engine.ts","../../src/planner/heuristic.ts","../../src/planner/model.ts","../../src/planner/context.ts","../../src/pipelines/store.ts","../../src/planner/store.ts","../../src/planner/factory.ts","../../src/pipelines/engine-factory.ts","../../src/cli/commands/pipelines.ts","../../src/cli/commands/memory.ts","../../src/cli/commands/plan.ts"],"sourcesContent":["import { pathToFileURL } from \"node:url\";\nimport { realpathSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport { OMNINODE_VERSION } from \"../version.js\";\nimport { isOmniNodeError } from \"../errors/index.js\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerProjectCommands } from \"./commands/project.js\";\nimport { registerProviderCommands } from \"./commands/providers.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { registerAgentCommands } from \"./commands/agents.js\";\nimport { registerRoleCommands } from \"./commands/roles.js\";\nimport { registerTaskCommands } from \"./commands/tasks.js\";\nimport { registerReportCommands } from \"./commands/reports.js\";\nimport { registerPipelineCommands } from \"./commands/pipelines.js\";\nimport { registerMemoryCommands } from \"./commands/memory.js\";\nimport { registerPlanCommands } from \"./commands/plan.js\";\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"omninode\")\n .description(\n \"Provider-agnostic multi-AI orchestration platform: coordinate CLI agents, \" +\n \"AI providers, memory, roles, reports and planning in one execution system.\",\n )\n .version(OMNINODE_VERSION, \"-v, --version\", \"Print the OmniNode version.\");\n\n registerInitCommand(program);\n registerProjectCommands(program);\n registerProviderCommands(program);\n registerAgentCommands(program);\n registerRoleCommands(program);\n registerTaskCommands(program);\n registerReportCommands(program);\n registerModelsCommand(program);\n registerPipelineCommands(program);\n registerMemoryCommands(program);\n registerPlanCommands(program);\n\n return program;\n}\n\nexport async function run(argv: string[]): Promise<void> {\n const program = createProgram();\n try {\n await program.parseAsync(argv);\n } catch (error) {\n handleError(error);\n }\n}\n\nexport function handleError(error: unknown): never {\n if (isOmniNodeError(error)) {\n console.error(`error: [${error.code}] ${error.message}`);\n if (error.details !== undefined) {\n console.error(JSON.stringify(error.details, null, 2));\n }\n process.exit(1);\n }\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n}\n\nconst entry = process.argv[1]\n ? pathToFileURL(realpathSync(process.argv[1])).href\n : \"\";\nif (import.meta.url === entry) {\n run(process.argv).catch((error) => handleError(error));\n}\n","export const OMNINODE_VERSION = \"0.9.0\";\n","/** Typed error hierarchy shared across the whole codebase (§4.1 — error model). */\n\nexport type OmniNodeErrorCode =\n | \"CONFIG_NOT_FOUND\"\n | \"CONFIG_INVALID\"\n | \"PROVIDER_NOT_FOUND\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\"\n | \"AGENT_NOT_FOUND\"\n | \"AGENT_FAILED\"\n | \"AGENT_TIMEOUT\"\n | \"TASK_INVALID\"\n | \"TASK_NOT_FOUND\"\n | \"TASK_FAILED\"\n | \"PIPELINE_NOT_FOUND\"\n | \"PIPELINE_INVALID\"\n | \"PIPELINE_FAILED\"\n | \"PLANNER_FAILED\"\n | \"PLAN_INVALID\"\n | \"PROTOCOL_VIOLATION\"\n | \"MEMORY_UNAVAILABLE\"\n | \"REPORT_NOT_FOUND\"\n | \"NOT_IMPLEMENTED\"\n | \"CLI_USAGE\"\n | \"INTERNAL\";\n\nexport interface OmniNodeErrorOptions {\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class OmniNodeError extends Error {\n readonly code: OmniNodeErrorCode;\n readonly details?: Record<string, unknown>;\n\n constructor(code: OmniNodeErrorCode, message: string, options: OmniNodeErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = code;\n this.details = options.details;\n }\n}\n\nexport class ConfigError extends OmniNodeError {\n constructor(\n code: \"CONFIG_NOT_FOUND\" | \"CONFIG_INVALID\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class ProviderError extends OmniNodeError {\n constructor(\n code:\n | \"PROVIDER_NOT_FOUND\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class AgentError extends OmniNodeError {\n constructor(\n code: \"AGENT_NOT_FOUND\" | \"AGENT_FAILED\" | \"AGENT_TIMEOUT\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class TaskError extends OmniNodeError {\n constructor(\n code: \"TASK_INVALID\" | \"TASK_NOT_FOUND\" | \"TASK_FAILED\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class PipelineError extends OmniNodeError {\n constructor(\n code: \"PIPELINE_NOT_FOUND\" | \"PIPELINE_INVALID\" | \"PIPELINE_FAILED\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class ProtocolError extends OmniNodeError {\n constructor(message: string, options: OmniNodeErrorOptions = {}) {\n super(\"PROTOCOL_VIOLATION\", message, options);\n }\n}\n\nexport class PlannerError extends OmniNodeError {\n constructor(\n code: \"PLANNER_FAILED\" | \"PLAN_INVALID\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class MemoryError extends OmniNodeError {\n constructor(message: string, options: OmniNodeErrorOptions = {}) {\n super(\"MEMORY_UNAVAILABLE\", message, options);\n }\n}\n\nexport function isOmniNodeError(value: unknown): value is OmniNodeError {\n return value instanceof OmniNodeError;\n}\n","import { existsSync, writeFileSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { OmniNodeError } from \"../../errors/index.js\";\nimport { defaultProjectConfigYaml } from \"../../config/index.js\";\n\nexport async function runInit(options: { force?: boolean; name?: string }): Promise<void> {\n const target = `${process.cwd()}/omninode.yaml`;\n if (!options.force && existsSync(target)) {\n throw new OmniNodeError(\n \"CLI_USAGE\",\n `${target} already exists. Use --force to overwrite it.`,\n );\n }\n writeFileSync(target, defaultProjectConfigYaml(options.name), \"utf8\");\n console.log(`Created ${target}`);\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Add a provider under `project.providers` (see omninode.yaml.example).\");\n console.log(\" 2. Register CLI agents under `project.agents`.\");\n console.log(\" 3. Run `omninode provider list` to validate the configuration.\");\n}\n\nexport function registerInitCommand(program: Command): void {\n program\n .command(\"init\")\n .description(\"Create an omninode.yaml project configuration in the current directory.\")\n .option(\"-f, --force\", \"Overwrite an existing omninode.yaml.\")\n .option(\"-n, --name <name>\", \"Project name to write into the configuration.\", \"My Project\")\n .action(async (options: { force?: boolean; name: string }) => runInit(options));\n}\n","/**\n * Configuration schema. The project file (omninode.yaml) uses snake_case keys\n * as shown in DEVELOPMENT_PLAN.md §7 and §23; the loader maps them onto the\n * camelCase TypeScript contracts in src/types.\n */\nimport { z } from \"zod\";\n\nexport const providerConfigSchema = z\n .object({\n name: z.string().min(1),\n type: z.enum([\"openai-compatible\", \"omnihilbras\", \"openrouter\", \"local\", \"custom\"]),\n base_url: z.string().url(),\n api_key_env_var: z.string().min(1).optional(),\n headers: z.record(z.string()).optional(),\n enabled: z.boolean().optional(),\n metadata: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const agentConfigSchema = z\n .object({\n name: z.string().min(1),\n /** \"cli\" agents communicate over stdin/stdout (process adapter). */\n type: z.enum([\"cli\", \"native\", \"process\"]).default(\"cli\"),\n command: z.string().min(1).optional(),\n args: z.array(z.string()).optional(),\n cwd: z.string().optional(),\n env: z.record(z.string()).optional(),\n input_mode: z.enum([\"stdin\", \"arg\", \"protocol\"]).default(\"stdin\"),\n timeout_ms: z.number().int().positive().optional(),\n metadata: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const roleConfigSchema = z\n .object({\n id: z\n .string()\n .min(1)\n .regex(/^[a-z0-9][a-z0-9-]*$/, \"role id must be kebab-case\"),\n name: z.string().min(1),\n description: z.string().optional(),\n responsibilities: z.array(z.string()).default([]),\n expected_outputs: z.array(z.string()).default([]),\n preferred_agents: z.array(z.string()).optional(),\n system_prompt: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const pipelineStepConfigSchema = z\n .object({\n id: z.string().min(1),\n kind: z.enum([\"research\", \"collect\", \"analyze\", \"plan\", \"execute\", \"custom\"]),\n agents: z.array(z.string()).optional(),\n agent: z.string().optional(),\n model: z.string().optional(),\n depends_on: z.array(z.string()).optional(),\n retries: z.number().int().min(0).max(10).optional(),\n condition: z.enum([\"always\", \"on-success\", \"on-failure\"]).optional(),\n })\n .strict();\n\nexport const pipelineConfigSchema = z\n .object({\n id: z\n .string()\n .min(1)\n .regex(/^[a-z0-9][a-z0-9-]*$/, \"pipeline id must be kebab-case\"),\n name: z.string().optional(),\n objective: z.string().optional(),\n role: z.string().optional(),\n steps: z.array(pipelineStepConfigSchema).min(1),\n })\n .strict();\n\nexport const plannerConfigSchema = z\n .object({\n kind: z.enum([\"model\", \"heuristic\"]).default(\"model\"),\n model: z.string().optional(),\n instruction: z.string().optional(),\n })\n .strict();\n\nexport const projectConfigSchema = z\n .object({\n name: z.string().min(1),\n providers: z.array(providerConfigSchema).default([]),\n agents: z.array(agentConfigSchema).default([]),\n roles: z.array(roleConfigSchema).default([]),\n pipelines: z.array(pipelineConfigSchema).default([]),\n planner: plannerConfigSchema.optional(),\n memory: z\n .object({\n provider: z.string().min(1).default(\"local\"),\n base_url: z.string().url().optional(),\n api_key_env_var: z.string().min(1).optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nexport const appConfigSchema = z\n .object({\n project: projectConfigSchema,\n logging: z\n .object({ level: z.enum([\"debug\", \"info\", \"warn\", \"error\"]) })\n .strict()\n .optional(),\n })\n .strict();\n\nexport type ProviderConfigYaml = z.infer<typeof providerConfigSchema>;\nexport type AgentConfigYaml = z.infer<typeof agentConfigSchema>;\nexport type RoleConfigYaml = z.infer<typeof roleConfigSchema>;\nexport type PipelineConfigYaml = z.infer<typeof pipelineConfigSchema>;\nexport type PipelineStepConfigYaml = z.infer<typeof pipelineStepConfigSchema>;\nexport type PlannerConfigYaml = z.infer<typeof plannerConfigSchema>;\nexport type ProjectConfigYaml = z.infer<typeof projectConfigSchema>;\nexport type AppConfigYaml = z.infer<typeof appConfigSchema>;\n","/**\n * Configuration loader: discovers omninode.yaml, expands ${ENV_VAR}\n * references (so credentials never live in project files, §24), validates it\n * and maps it onto the core TypeScript contracts.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport { ConfigError } from \"../errors/index.js\";\nimport type { AgentConfig, AgentIntegrationType } from \"../types/agent.js\";\nimport type { ProviderConfig } from \"../types/provider.js\";\nimport type { RoleDefinition } from \"../types/role.js\";\nimport type { LogLevel } from \"../logger/index.js\";\nimport { appConfigSchema } from \"./schema.js\";\nimport type { AgentConfigYaml, PipelineConfigYaml, ProviderConfigYaml, RoleConfigYaml } from \"./schema.js\";\nimport type { PipelineDefinition } from \"../types/pipeline.js\";\n\nconst CONFIG_FILENAMES = [\"omninode.yaml\", \"omninode.yml\", \"omninode.json\"];\n\nexport interface AppConfig {\n project: {\n name: string;\n providers: ProviderConfig[];\n agents: AgentConfig[];\n roles: RoleDefinition[];\n pipelines: PipelineDefinition[];\n planner?: {\n kind: \"model\" | \"heuristic\";\n model?: string;\n instruction?: string;\n };\n memory?: {\n provider: string;\n baseUrl?: string;\n apiKeyEnvVar?: string;\n };\n };\n logging?: {\n level: LogLevel;\n };\n}\n\nexport interface LoadConfigOptions {\n /** Explicit path; otherwise omninode.yaml/yml/json is looked up in the given directory. */\n path?: string;\n directory?: string;\n /** Environment used for ${VAR} expansion; defaults to process.env. */\n env?: Record<string, string | undefined>;\n}\n\nexport function findConfigFile(directory = process.cwd()): string | undefined {\n for (const filename of CONFIG_FILENAMES) {\n const candidate = `${directory}/${filename}`;\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\n/**\n * Replaces ${VAR} and ${VAR:-fallback} references. Unset variables without a\n * fallback abort loading: a half-resolved config could silently misroute\n * authentication.\n */\nexport function expandEnvRefs(\n text: string,\n env: Record<string, string | undefined>,\n source = \"config\",\n): string {\n return text.replace(\n /\\$\\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\\}/g,\n (_match, name: string, fallback?: string) => {\n const value = env[name] ?? fallback;\n if (value === undefined) {\n throw new ConfigError(\n \"CONFIG_INVALID\",\n `Environment variable \"${name}\" is referenced in ${source} but is not set and has no default.`,\n );\n }\n return value;\n },\n );\n}\n\nexport function loadConfig(options: LoadConfigOptions = {}): AppConfig {\n const env = options.env ?? process.env;\n const path = options.path ?? (options.directory ? findConfigFile(options.directory) : findConfigFile());\n if (!path) {\n throw new ConfigError(\n \"CONFIG_NOT_FOUND\",\n \"No omninode.yaml found. Run `omninode init` to create one, or pass an explicit path.\",\n );\n }\n\n const raw = readFileSync(path, \"utf8\");\n const expanded = expandEnvRefs(raw, env, path);\n\n let data: unknown;\n try {\n data = parseYaml(expanded);\n } catch (error) {\n throw new ConfigError(\"CONFIG_INVALID\", `Failed to parse ${path}.`, { cause: error });\n }\n\n const parsed = appConfigSchema.safeParse(data);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((issue) => {\n const location = issue.path.length > 0 ? issue.path.join(\".\") : \"(root)\";\n return `${location}: ${issue.message}`;\n });\n throw new ConfigError(\"CONFIG_INVALID\", `Invalid configuration in ${path}.`, {\n details: { issues },\n });\n }\n\n return toAppConfig(parsed.data);\n}\n\nfunction toAppConfig(yaml: ReturnType<typeof appConfigSchema.parse>): AppConfig {\n return {\n project: {\n name: yaml.project.name,\n providers: yaml.project.providers.map(toProviderConfig),\n agents: yaml.project.agents.map(toAgentConfig),\n roles: yaml.project.roles.map(toRoleDefinition),\n pipelines: yaml.project.pipelines.map(toPipelineDefinition),\n ...(yaml.project.planner !== undefined\n ? {\n planner: {\n kind: yaml.project.planner.kind,\n model: yaml.project.planner.model,\n instruction: yaml.project.planner.instruction,\n },\n }\n : {}),\n ...(yaml.project.memory !== undefined\n ? {\n memory: {\n provider: yaml.project.memory.provider,\n baseUrl: yaml.project.memory.base_url,\n apiKeyEnvVar: yaml.project.memory.api_key_env_var,\n },\n }\n : {}),\n },\n ...(yaml.logging !== undefined ? { logging: yaml.logging } : {}),\n };\n}\n\nfunction toPipelineDefinition(raw: PipelineConfigYaml): PipelineDefinition {\n return {\n id: raw.id,\n name: raw.name,\n objective: raw.objective,\n role: raw.role,\n steps: raw.steps.map((step) => ({\n id: step.id,\n kind: step.kind,\n agents: step.agents,\n agent: step.agent,\n model: step.model,\n dependsOn: step.depends_on,\n retries: step.retries,\n condition: step.condition,\n })),\n };\n}\n\nfunction toProviderConfig(raw: ProviderConfigYaml): ProviderConfig {\n return {\n name: raw.name,\n type: raw.type,\n baseUrl: raw.base_url,\n apiKeyEnvVar: raw.api_key_env_var,\n headers: raw.headers,\n enabled: raw.enabled,\n metadata: raw.metadata,\n };\n}\n\nfunction toAgentConfig(raw: AgentConfigYaml): AgentConfig {\n const integration: AgentIntegrationType =\n raw.type === \"native\" ? \"native\" : \"process\";\n return {\n name: raw.name,\n integration,\n command: raw.command,\n args: raw.args,\n cwd: raw.cwd,\n env: raw.env,\n inputMode: raw.input_mode,\n timeoutMs: raw.timeout_ms,\n metadata: raw.metadata,\n };\n}\n\nfunction toRoleDefinition(raw: RoleConfigYaml): RoleDefinition {\n return {\n id: raw.id,\n name: raw.name,\n description: raw.description,\n responsibilities: raw.responsibilities,\n expectedOutputs: raw.expected_outputs,\n preferredAgents: raw.preferred_agents,\n systemPrompt: raw.system_prompt,\n metadata: raw.metadata,\n };\n}\n\n","/** Template written by `omninode init` (§22, §23). */\n\nexport function defaultProjectConfigYaml(projectName = \"My Project\"): string {\n return `project:\n name: ${projectName}\n\n # Providers connect OmniNode to AI model gateways (Phase 1+).\n # Credentials are referenced by environment variable, never stored in this file.\n providers: []\n # - name: my-gateway\n # type: openai-compatible\n # base_url: https://example.com/v1\n # api_key_env_var: MY_API_KEY\n\n # CLI agents registered with OmniNode (Phase 3 wires them up).\n agents: []\n # - name: opencode\n # type: cli\n # command: opencode\n\n # Roles describe what an AI is supposed to do (Phase 4).\n roles: []\n # - id: architecture-reviewer\n # name: Architecture Reviewer\n # responsibilities:\n # - architecture analysis\n # expected_outputs:\n # - findings\n # - recommendations\n\n # Memory is optional; Remembera is the preferred integration (Phase 7).\n # memory:\n # provider: remembera\n`;\n}\n","import type { Command } from \"commander\";\nimport { runInit } from \"./init.js\";\n\nexport function registerProjectCommands(program: Command): void {\n const project = program\n .command(\"project\")\n .description(\"Project-level operations.\");\n\n project\n .command(\"init\")\n .description(\"Alias of `omninode init`.\")\n .option(\"-f, --force\", \"Overwrite an existing omninode.yaml.\")\n .option(\"-n, --name <name>\", \"Project name to write into the configuration.\", \"My Project\")\n .action(async (options: { force?: boolean; name: string }) => runInit(options));\n}\n","/**\n * Authentication resolution (§24): API keys live in the environment and are\n * referenced from configuration by variable name — never stored in files.\n */\nimport { ProviderError } from \"../errors/index.js\";\n// AuthRef is structurally satisfied by ProviderConfig.\n\n/** Minimal provider identity — any config object with a name and optional env var reference. */\nexport interface AuthRef {\n name: string;\n apiKeyEnvVar?: string;\n headers?: Record<string, string>;\n}\n\nexport function resolveApiKey(\n config: AuthRef,\n env: Record<string, string | undefined> = process.env,\n): string | undefined {\n if (!config.apiKeyEnvVar) return undefined;\n const value = env[config.apiKeyEnvVar];\n if (!value) {\n throw new ProviderError(\n \"PROVIDER_AUTH_FAILED\",\n `Environment variable \"${config.apiKeyEnvVar}\" (referenced by provider \"${config.name}\") is not set.`,\n );\n }\n return value;\n}\n\nexport function authHeaders(\n config: AuthRef,\n env: Record<string, string | undefined> = process.env,\n): Record<string, string> {\n const key = resolveApiKey(config, env);\n const base = { ...(config.headers ?? {}) };\n return key ? { ...base, authorization: `Bearer ${key}` } : base;\n}\n","/**\n * Thin JSON HTTP layer over global fetch. HTTP error statuses are returned to\n * the caller, not thrown — provider methods interpret them; only transport\n * failures (network, timeout, unparseable body) throw.\n */\nimport { ProviderError } from \"../errors/index.js\";\n\nexport interface HttpRequestOptions {\n method?: \"GET\" | \"POST\";\n headers?: Record<string, string>;\n body?: unknown;\n timeoutMs?: number;\n}\n\nexport interface HttpResponse {\n status: number;\n body: unknown;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport async function requestJson(\n url: string,\n options: HttpRequestOptions = {},\n): Promise<HttpResponse> {\n const { method = \"GET\", headers = {}, body, timeoutMs = DEFAULT_TIMEOUT_MS } = options;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers: {\n accept: \"application/json\",\n ...(body !== undefined ? { \"content-type\": \"application/json\" } : {}),\n ...headers,\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n const reason =\n error instanceof Error && error.name === \"TimeoutError\"\n ? `timed out after ${timeoutMs}ms`\n : error instanceof Error\n ? error.message\n : String(error);\n throw new ProviderError(\"PROVIDER_UNAVAILABLE\", `Request to ${url} failed: ${reason}.`, {\n cause: error,\n });\n }\n\n let parsed: unknown;\n try {\n parsed = await response.json();\n } catch (error) {\n throw new ProviderError(\"PROVIDER_UNAVAILABLE\", `Response from ${url} was not valid JSON.`, {\n cause: error,\n details: { status: response.status },\n });\n }\n\n return { status: response.status, body: parsed };\n}\n","/** Leveled logger with a pluggable sink and child loggers (§4.1 — logging). */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LogSink {\n write(level: LogLevel, line: string): void;\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\nexport interface WritableLike {\n write(chunk: string): unknown;\n}\n\nexport class ConsoleLogSink implements LogSink {\n constructor(private readonly stream: WritableLike = process.stderr) {}\n\n write(_level: LogLevel, line: string): void {\n this.stream.write(line + \"\\n\");\n }\n}\n\nexport interface LoggerOptions {\n level?: LogLevel;\n sink?: LogSink;\n /** Structured fields attached to every line, e.g. { component: \"config\" }. */\n context?: Record<string, unknown>;\n}\n\nexport class Logger {\n private readonly level: LogLevel;\n private readonly sink: LogSink;\n private readonly context: Record<string, unknown>;\n\n constructor(options: LoggerOptions = {}) {\n this.level = options.level ?? \"info\";\n this.sink = options.sink ?? new ConsoleLogSink();\n this.context = options.context ?? {};\n }\n\n child(context: Record<string, unknown>): Logger {\n return new Logger({\n level: this.level,\n sink: this.sink,\n context: { ...this.context, ...context },\n });\n }\n\n debug(message: string, data?: Record<string, unknown>): void {\n this.log(\"debug\", message, data);\n }\n\n info(message: string, data?: Record<string, unknown>): void {\n this.log(\"info\", message, data);\n }\n\n warn(message: string, data?: Record<string, unknown>): void {\n this.log(\"warn\", message, data);\n }\n\n error(message: string, data?: Record<string, unknown>): void {\n this.log(\"error\", message, data);\n }\n\n private log(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n if (LEVEL_ORDER[level] < LEVEL_ORDER[this.level]) return;\n const parts = [new Date().toISOString(), level.toUpperCase(), message];\n const merged = { ...this.context, ...data };\n if (Object.keys(merged).length > 0) {\n parts.push(JSON.stringify(merged));\n }\n this.sink.write(level, parts.join(\" \"));\n }\n}\n\n/** Default application logger. Writes to stderr so stdout stays clean for CLI output. */\nexport const logger = new Logger();\n","/**\n * OpenAI-compatible provider adapter (§5, §7): works with OpenAI, OpenRouter,\n * local runtimes (Ollama/LM Studio/vLLM) and custom gateways that expose the\n * /models and /chat/completions endpoints.\n */\nimport { ProviderError } from \"../../errors/index.js\";\nimport { logger, type Logger } from \"../../logger/index.js\";\nimport type { ChatRequest, ChatResponse } from \"../../types/chat.js\";\nimport type { ModelInfo } from \"../../types/model.js\";\nimport type { IChatProvider, ProviderConfig, ProviderStatus } from \"../../types/provider.js\";\nimport { authHeaders } from \"../auth.js\";\nimport { requestJson } from \"../http.js\";\n\ninterface OpenAIModelEntry {\n id?: unknown;\n owned_by?: unknown;\n created?: unknown;\n}\n\ninterface OpenAIChatResponse {\n model?: unknown;\n choices?: unknown;\n usage?: unknown;\n}\n\nexport class OpenAICompatibleProvider implements IChatProvider {\n readonly config: ProviderConfig;\n private readonly log: Logger;\n\n constructor(config: ProviderConfig, log: Logger = logger) {\n this.config = { ...config, baseUrl: normalizeBaseUrl(config.baseUrl) };\n this.log = log.child({ provider: config.name });\n }\n\n async listModels(): Promise<ModelInfo[]> {\n const { status, body } = await requestJson(`${this.config.baseUrl}/models`, {\n headers: authHeaders(this.config),\n });\n if (status === 401 || status === 403) {\n throw authFailed(this.config, status);\n }\n if (status !== 200) {\n throw unavailable(this.config, `Model discovery returned HTTP ${status}.`, status);\n }\n\n const entries = extractModelEntries(body, this.config);\n const models: ModelInfo[] = [];\n let skipped = 0;\n for (const entry of entries) {\n if (typeof entry.id !== \"string\" || entry.id.length === 0) {\n skipped += 1;\n continue;\n }\n models.push({\n provider: this.config.name,\n id: entry.id,\n displayName: entry.id,\n status: \"available\",\n metadata: {\n ...(typeof entry.owned_by === \"string\" ? { ownedBy: entry.owned_by } : {}),\n ...(typeof entry.created === \"number\" ? { createdAt: entry.created } : {}),\n },\n });\n }\n if (skipped > 0) {\n this.log.warn(`Skipped ${skipped} model entr(y/ies) without a valid id.`);\n }\n return models;\n }\n\n async healthCheck(): Promise<ProviderStatus> {\n const lastCheckedAt = new Date().toISOString();\n try {\n const started = Date.now();\n const models = await this.listModels();\n return {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: \"healthy\",\n connected: true,\n modelCount: models.length,\n lastCheckedAt,\n message: `Discovered ${models.length} model(s) in ${Date.now() - started}ms.`,\n };\n } catch (error) {\n return {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: inferHealth(error),\n connected: false,\n modelCount: 0,\n lastCheckedAt,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const { status, body } = await requestJson(`${this.config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: authHeaders(this.config),\n body: {\n model: request.model,\n messages: request.messages,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n ...(request.maxTokens !== undefined ? { max_tokens: request.maxTokens } : {}),\n ...(request.stop !== undefined ? { stop: request.stop } : {}),\n },\n });\n\n if (status === 401 || status === 403) throw authFailed(this.config, status);\n if (status === 404) {\n throw new ProviderError(\n \"MODEL_NOT_FOUND\",\n `Model \"${request.model}\" or the chat endpoint was not found on provider \"${this.config.name}\" (HTTP 404).`,\n { details: { status } },\n );\n }\n if (status !== 200) {\n throw unavailable(this.config, `Chat completion returned HTTP ${status}.`, status);\n }\n\n const payload = body as OpenAIChatResponse;\n const choices = Array.isArray(payload.choices) ? payload.choices : [];\n const first = choices[0] as { message?: { content?: unknown }; finish_reason?: unknown } | undefined;\n if (!first || typeof first.message?.content !== \"string\") {\n throw unavailable(this.config, \"Chat completion response had no message content.\", status);\n }\n\n const usage = (payload.usage ?? {}) as {\n prompt_tokens?: unknown;\n completion_tokens?: unknown;\n total_tokens?: unknown;\n };\n\n return {\n model: typeof payload.model === \"string\" ? payload.model : request.model,\n content: first.message.content,\n finishReason: typeof first.finish_reason === \"string\" ? first.finish_reason : undefined,\n usage: {\n promptTokens: typeof usage.prompt_tokens === \"number\" ? usage.prompt_tokens : undefined,\n completionTokens:\n typeof usage.completion_tokens === \"number\" ? usage.completion_tokens : undefined,\n totalTokens: typeof usage.total_tokens === \"number\" ? usage.total_tokens : undefined,\n },\n raw: body,\n };\n }\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nfunction extractModelEntries(body: unknown, config: ProviderConfig): OpenAIModelEntry[] {\n if (Array.isArray(body)) return body as OpenAIModelEntry[];\n if (body !== null && typeof body === \"object\" && Array.isArray((body as { data?: unknown }).data)) {\n return (body as { data: OpenAIModelEntry[] }).data;\n }\n throw new ProviderError(\n \"PROVIDER_UNAVAILABLE\",\n `Provider \"${config.name}\" returned an unrecognized model list shape.`,\n { details: { endpoint: \"models\" } },\n );\n}\n\nfunction authFailed(config: ProviderConfig, status: number): ProviderError {\n const envHint = config.apiKeyEnvVar\n ? ` Check that $${config.apiKeyEnvVar} is set and valid.`\n : \" The provider requires authentication; configure api_key_env_var for it.\";\n return new ProviderError(\n \"PROVIDER_AUTH_FAILED\",\n `Authentication with provider \"${config.name}\" failed (HTTP ${status}).${envHint}`,\n { details: { status } },\n );\n}\n\nfunction unavailable(config: ProviderConfig, message: string, status: number): ProviderError {\n return new ProviderError(\"PROVIDER_UNAVAILABLE\", `Provider \"${config.name}\": ${message}`, {\n details: { status },\n });\n}\n\nfunction inferHealth(error: unknown): \"degraded\" | \"unreachable\" {\n const status =\n error instanceof ProviderError && typeof error.details?.status === \"number\"\n ? error.details.status\n : undefined;\n return status !== undefined && status >= 500 ? \"degraded\" : \"unreachable\";\n}\n","/**\n * OmniHilbras provider adapter (§6, Phase 2).\n *\n * OmniHilbras is one provider source among many — always optional (§2: the\n * core runs with zero Hilbras dependencies). The gateway exposes an\n * OpenAI-compatible API surface, so this adapter rides the OpenAI-compatible\n * transport and implements the plan's connect flow on top of it:\n *\n * Connect → Authenticate → Fetch Models → Validate Models → Register\n */\nimport { resolveApiKey } from \"../auth.js\";\nimport { OpenAICompatibleProvider } from \"../openai-compatible/index.js\";\nimport type { ModelRegistry } from \"../../registry/index.js\";\nimport type { ModelInfo } from \"../../types/model.js\";\nimport type { ProviderStatus } from \"../../types/provider.js\";\n\nexport interface OmniHilbrasConnectionResult {\n status: ProviderStatus;\n /** Validated, deduplicated models — registered when a registry was given. */\n models: ModelInfo[];\n /** Model ids that appeared more than once in the gateway's list. */\n duplicates: string[];\n /** Number of models written into the registry (0 when no registry given). */\n registered: number;\n}\n\nexport class OmniHilbrasProvider extends OpenAICompatibleProvider {\n /**\n * Run the full connect flow. Throws on authentication or transport failure\n * (use healthCheck() for a non-throwing probe).\n */\n async connect(registry?: ModelRegistry): Promise<OmniHilbrasConnectionResult> {\n // Authenticate — throws PROVIDER_AUTH_FAILED when the referenced env var is unset.\n const apiKey = resolveApiKey(this.config);\n\n // Fetch models — throws on transport errors and non-2xx responses.\n const discovered = await this.listModels();\n\n // Validate — deduplicate ids, annotate gateway metadata, force availability.\n const seen = new Set<string>();\n const models: ModelInfo[] = [];\n const duplicates: string[] = [];\n for (const model of discovered) {\n if (seen.has(model.id)) {\n duplicates.push(model.id);\n continue;\n }\n seen.add(model.id);\n models.push({\n ...model,\n provider: this.config.name,\n status: \"available\",\n metadata: { ...model.metadata, gateway: \"omnihilbras\" },\n });\n }\n\n // Register.\n if (registry) {\n for (const model of models) registry.register(model);\n }\n\n const message =\n `Authenticated${apiKey ? \" with API key\" : \" (no API key configured)\"}; ` +\n `validated ${models.length} unique model(s)` +\n (duplicates.length > 0 ? `, skipped ${duplicates.length} duplicate(s)` : \"\") +\n \".\";\n\n const status: ProviderStatus = {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: \"healthy\",\n connected: true,\n modelCount: models.length,\n lastCheckedAt: new Date().toISOString(),\n message,\n };\n\n return { status, models, duplicates, registered: registry ? models.length : 0 };\n }\n}\n","/**\n * Provider factory: builds adapter instances from configuration (§5, §7).\n * Custom and local gateways ride the OpenAI-compatible adapter unless a\n * dedicated one exists.\n */\nimport { OmniNodeError } from \"../errors/index.js\";\nimport type { IChatProvider, ProviderConfig, ProviderType } from \"../types/provider.js\";\nimport { OmniHilbrasProvider } from \"./omnihilbras/index.js\";\nimport { OpenAICompatibleProvider } from \"./openai-compatible/index.js\";\n\n/** Provider types served by the OpenAI-compatible adapter. */\nexport const OPENAI_COMPATIBLE_TYPES: readonly ProviderType[] = [\n \"openai-compatible\",\n \"openrouter\",\n \"local\",\n \"custom\",\n];\n\nexport function createProvider(config: ProviderConfig): IChatProvider {\n if (config.type === \"omnihilbras\") {\n return new OmniHilbrasProvider(config);\n }\n if (OPENAI_COMPATIBLE_TYPES.includes(config.type)) {\n return new OpenAICompatibleProvider(config);\n }\n throw new OmniNodeError(\"NOT_IMPLEMENTED\", `Provider type \"${config.type}\" has no adapter yet.`);\n}\n","/**\n * Normalized model registry (§8): aggregates models discovered from all\n * configured providers under \"provider:model\" keys.\n */\nimport type { ModelCapabilities, ModelInfo } from \"../types/model.js\";\nimport type { IProvider } from \"../types/provider.js\";\n\nexport interface ModelFilter {\n provider?: string;\n capability?: keyof ModelCapabilities;\n}\n\nexport interface DiscoveryResult {\n provider: string;\n models: ModelInfo[];\n error?: Error;\n}\n\nexport function registryKey(provider: string, id: string): string {\n return `${provider}:${id}`;\n}\n\nexport class ModelRegistry {\n private readonly models = new Map<string, ModelInfo>();\n\n register(model: ModelInfo): void {\n this.models.set(registryKey(model.provider, model.id), model);\n }\n\n get(provider: string, id: string): ModelInfo | undefined {\n return this.models.get(registryKey(provider, id));\n }\n\n list(filter: ModelFilter = {}): ModelInfo[] {\n return [...this.models.values()]\n .filter((model) => (filter.provider ? model.provider === filter.provider : true))\n .filter((model) =>\n filter.capability ? model.capabilities?.[filter.capability] === true : true,\n )\n .sort((a, b) => a.provider.localeCompare(b.provider) || a.id.localeCompare(b.id));\n }\n\n /** Availability validation (§27 Phase 1): present in the registry and not retired. */\n isAvailable(provider: string, id: string): boolean {\n const model = this.get(provider, id);\n return model !== undefined && (model.status ?? \"available\") === \"available\";\n }\n\n /** Discover models from one provider and register them. */\n async discoverFrom(provider: IProvider): Promise<ModelInfo[]> {\n const discovered = await provider.listModels();\n for (const model of discovered) this.register(model);\n return discovered;\n }\n\n /** Discover from many providers; a failing provider does not abort the rest. */\n async discoverAll(providers: IProvider[]): Promise<DiscoveryResult[]> {\n return Promise.all(\n providers.map(async (provider) => {\n try {\n return {\n provider: provider.config.name,\n models: await this.discoverFrom(provider),\n };\n } catch (error) {\n return {\n provider: provider.config.name,\n models: [],\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }),\n );\n }\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { parseDocument } from \"yaml\";\nimport { appConfigSchema, findConfigFile } from \"../../config/index.js\";\nimport { ConfigError, OmniNodeError } from \"../../errors/index.js\";\n\n/** Shared helper for commands whose phase has not landed yet. */\nexport function notImplemented(command: string, when: string): OmniNodeError {\n return new OmniNodeError(\n \"NOT_IMPLEMENTED\",\n `${command} is planned for ${when}. Edit omninode.yaml directly for now.`,\n );\n}\n\nexport function truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\n/**\n * Appends an item to a list in omninode.yaml, preserving comments and\n * formatting, and validates the resulting document before writing.\n * Returns the config path that was edited.\n */\nexport function appendToConfigList(listKey: \"providers\" | \"agents\", item: unknown): string {\n const configPath = findConfigFile();\n if (!configPath) {\n throw new OmniNodeError(\"CONFIG_NOT_FOUND\", \"No omninode.yaml found. Run `omninode init` first.\");\n }\n\n // Edit as a YAML document so existing comments and formatting survive.\n const doc = parseDocument(readFileSync(configPath, \"utf8\"));\n if (doc.getIn([\"project\", listKey]) === undefined) {\n doc.setIn([\"project\", listKey], [item]);\n } else {\n doc.addIn([\"project\", listKey], item);\n }\n\n const validated = appConfigSchema.safeParse(doc.toJS());\n if (!validated.success) {\n const issues = validated.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n throw new ConfigError(\n \"CONFIG_INVALID\",\n `Editing ${configPath} would produce an invalid configuration: ${issues}`,\n );\n }\n\n writeFileSync(configPath, doc.toString(), \"utf8\");\n return configPath;\n}\n","import type { Command } from \"commander\";\nimport { findConfigFile, loadConfig, providerConfigSchema } from \"../../config/index.js\";\nimport { OmniNodeError, ProviderError } from \"../../errors/index.js\";\nimport { createProvider, OmniHilbrasProvider } from \"../../providers/index.js\";\nimport { ModelRegistry } from \"../../registry/index.js\";\nimport type { ProviderStatus } from \"../../types/provider.js\";\nimport { appendToConfigList, notImplemented } from \"./shared.js\";\n\ninterface AddProviderOptions {\n name: string;\n baseUrl: string;\n type: string;\n apiKeyEnvVar?: string;\n}\n\nexport function registerProviderCommands(program: Command): void {\n const provider = program\n .command(\"provider\")\n .description(\"Manage AI providers configured in omninode.yaml.\");\n\n provider\n .command(\"list\")\n .description(\"List configured providers.\")\n .action(async () => {\n const config = loadConfig();\n const providers = config.project.providers;\n if (providers.length === 0) {\n console.log(\n \"No providers configured. Add one with `omninode provider add` or edit omninode.yaml.\",\n );\n return;\n }\n for (const provider of providers) {\n const key = provider.apiKeyEnvVar ? `$${provider.apiKeyEnvVar}` : \"none\";\n const enabled = provider.enabled === false ? \" (disabled)\" : \"\";\n console.log(\n `${provider.name} type=${provider.type} base_url=${provider.baseUrl} key=${key}${enabled}`,\n );\n }\n });\n\n provider\n .command(\"add\")\n .description(\n \"Add a provider to omninode.yaml. OpenAI-compatible gateways (including OpenRouter \" +\n \"and local runtimes) are supported today; OmniHilbras gets its own adapter in Phase 2.\",\n )\n .requiredOption(\"--name <name>\", \"Unique provider name used in configuration and the model registry.\")\n .requiredOption(\"--base-url <url>\", \"Provider base URL, e.g. https://example.com/v1\")\n .option(\n \"--type <type>\",\n \"Provider type: openai-compatible, omnihilbras, openrouter, local or custom.\",\n \"openai-compatible\",\n )\n .option(\n \"--api-key-env-var <envVar>\",\n \"Environment variable holding the API key. Keys are never written to the config file.\",\n )\n .action(async (options: AddProviderOptions) => addProvider(options));\n\n provider\n .command(\"test <name>\")\n .description(\"Test connectivity, authentication and model discovery for a configured provider.\")\n .option(\n \"--connect\",\n \"Run the full provider connect flow (authenticate, fetch, validate, register) where the adapter supports it.\",\n )\n .action(async (name: string, options: { connect?: boolean }) => testProvider(name, options));\n\n provider\n .command(\"remove <name>\")\n .description(\"Remove a provider (planned for Phase 1 follow-up).\")\n .action(() => {\n throw notImplemented(\"omninode provider remove\", \"a Phase 1 follow-up\");\n });\n}\n\nexport async function addProvider(options: AddProviderOptions): Promise<void> {\n const configPath = findConfigFile();\n if (!configPath) {\n throw new OmniNodeError(\"CONFIG_NOT_FOUND\", \"No omninode.yaml found. Run `omninode init` first.\");\n }\n\n const candidate = providerConfigSchema.safeParse({\n name: options.name,\n type: options.type,\n base_url: options.baseUrl,\n ...(options.apiKeyEnvVar !== undefined ? { api_key_env_var: options.apiKeyEnvVar } : {}),\n });\n if (!candidate.success) {\n const issues = candidate.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n throw new OmniNodeError(\"CLI_USAGE\", `Invalid provider options: ${issues}`);\n }\n const newProvider = candidate.data;\n\n // Existing name check happens before the document is edited.\n const existing = loadConfig();\n if (existing.project.providers.some((p) => p.name === newProvider.name)) {\n throw new OmniNodeError(\n \"CLI_USAGE\",\n `Provider \"${newProvider.name}\" already exists in ${findConfigFile() ?? \"omninode.yaml\"}.`,\n );\n }\n\n const writtenPath = appendToConfigList(\"providers\", newProvider);\n console.log(`Added provider \"${newProvider.name}\" (${newProvider.type}) to ${writtenPath}.`);\n if (newProvider.api_key_env_var) {\n console.log(\n `Set $${newProvider.api_key_env_var} in your environment, then run: omninode provider test ${newProvider.name}`,\n );\n } else {\n console.log(`Run \\`omninode provider test ${newProvider.name}\\` to verify connectivity.`);\n }\n}\n\nexport async function testProvider(\n name: string,\n options: { connect?: boolean } = {},\n): Promise<void> {\n const config = loadConfig();\n const providerConfig = config.project.providers.find((p) => p.name === name);\n if (!providerConfig) {\n const available = config.project.providers.map((p) => p.name).join(\", \") || \"(none)\";\n throw new ProviderError(\n \"PROVIDER_NOT_FOUND\",\n `Provider \"${name}\" is not configured. Configured providers: ${available}.`,\n );\n }\n\n const provider = createProvider(providerConfig);\n console.log(`Testing provider \"${name}\" (${providerConfig.type}) at ${provider.config.baseUrl}`);\n\n if (options.connect && provider instanceof OmniHilbrasProvider) {\n const registry = new ModelRegistry();\n try {\n const result = await provider.connect(registry);\n printProviderStatus(result.status);\n console.log(` registered: ${result.registered}`);\n } catch (error) {\n console.log(` connect failed: ${error instanceof Error ? error.message : String(error)}`);\n process.exitCode = 1;\n }\n return;\n }\n\n const health = await provider.healthCheck();\n printProviderStatus(health);\n if (!health.connected) process.exitCode = 1;\n}\n\nfunction printProviderStatus(status: ProviderStatus): void {\n console.log(` health: ${status.health}`);\n console.log(` connected: ${status.connected}`);\n console.log(` models: ${status.modelCount}`);\n if (status.message) console.log(` detail: ${status.message}`);\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { OmniNodeError } from \"../../errors/index.js\";\nimport { createProvider } from \"../../providers/index.js\";\nimport { ModelRegistry } from \"../../registry/index.js\";\nimport type { ModelCapabilities } from \"../../types/model.js\";\n\nconst CAPABILITIES: readonly (keyof ModelCapabilities)[] = [\n \"chat\",\n \"coding\",\n \"tools\",\n \"vision\",\n \"embeddings\",\n];\n\nexport function registerModelsCommand(program: Command): void {\n program\n .command(\"models\")\n .description(\"Discover and list models from configured providers (model registry, §8).\")\n .argument(\"[provider]\", \"Only discover from this provider.\")\n .option(\"-c, --capability <capability>\", `Filter by capability: ${CAPABILITIES.join(\", \")}.`)\n .action(async (providerName: string | undefined, options: { capability?: string }) => {\n const capability = options.capability as keyof ModelCapabilities | undefined;\n if (capability !== undefined && !CAPABILITIES.includes(capability)) {\n throw new OmniNodeError(\n \"CLI_USAGE\",\n `Unknown capability \"${options.capability}\". Valid capabilities: ${CAPABILITIES.join(\", \")}.`,\n );\n }\n\n const config = loadConfig();\n const selected = config.project.providers.filter((p) =>\n providerName ? p.name === providerName : true,\n );\n if (selected.length === 0) {\n throw new OmniNodeError(\n \"PROVIDER_NOT_FOUND\",\n providerName\n ? `Provider \"${providerName}\" is not configured.`\n : \"No providers configured. Add one with `omninode provider add`.\",\n );\n }\n\n const registry = new ModelRegistry();\n for (const providerConfig of selected) {\n try {\n const provider = createProvider(providerConfig);\n const discovered = await registry.discoverFrom(provider);\n console.log(`${providerConfig.name}: ${discovered.length} model(s)`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(`${providerConfig.name}: discovery failed — ${message}`);\n }\n }\n\n const models = registry.list({\n ...(providerName !== undefined ? { provider: providerName } : {}),\n ...(capability !== undefined ? { capability } : {}),\n });\n if (models.length === 0) {\n console.log(\"No models found.\");\n return;\n }\n console.log(\"\");\n for (const model of models) {\n console.log(`${model.provider}:${model.id}`);\n }\n });\n}\n","/**\n * Process adapter (§9): runs CLI agents as child processes and communicates\n * over stdin/stdout, managing the process lifecycle, working directory,\n * environment, exit codes, logs and timeouts.\n *\n * Three input modes (§9, §21):\n * - \"stdin\": the composed task text is written to the agent's stdin.\n * - \"arg\": the composed task text is appended as the last command argument.\n * - \"protocol\": NodeToAgentMessage envelopes as JSON lines on stdin; the\n * agent answers with AgentToNodeMessage JSON lines (REPORT,\n * COMPLETION, ERROR, ...) whose structured payloads are parsed\n * into reports.\n */\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { AgentError, ProtocolError } from \"../../errors/index.js\";\nimport { logger, type Logger } from \"../../logger/index.js\";\nimport type {\n AgentConfig,\n AgentInfo,\n AgentTaskInput,\n AgentTaskOutput,\n IAgent,\n} from \"../../types/agent.js\";\nimport type { EnvelopeMeta, NodeToAgentMessage } from \"../../types/protocol.js\";\nimport type { Report } from \"../../types/report.js\";\n\nconst DEFAULT_TIMEOUT_MS = 600_000;\nconst KILL_GRACE_MS = 5_000;\n\nexport function composeTaskText(input: AgentTaskInput): string {\n const sections: string[] = [`# Objective\\n${input.objective}`];\n if (input.role) {\n const lines = [\"# Role\", `${input.role.name} (${input.role.id})`];\n if (input.role.responsibilities.length > 0) {\n lines.push(\"\", \"Responsibilities:\", ...input.role.responsibilities.map((r) => `- ${r}`));\n }\n if (input.role.expectedOutputs.length > 0) {\n lines.push(\"\", \"Expected outputs:\", ...input.role.expectedOutputs.map((o) => `- ${o}`));\n }\n sections.push(lines.join(\"\\n\"));\n }\n if (input.context) sections.push(`# Context\\n${input.context}`);\n if (input.instruction) sections.push(`# Instruction\\n${input.instruction}`);\n return sections.join(\"\\n\\n\");\n}\n\nfunction buildProtocolMessages(input: AgentTaskInput, agentName: string): string[] {\n const meta: EnvelopeMeta = {\n taskId: input.taskId,\n agent: agentName,\n timestamp: new Date().toISOString(),\n };\n const messages: NodeToAgentMessage[] = [\n { type: \"TASK\", payload: { taskId: input.taskId, objective: input.objective } },\n ];\n if (input.role) messages.push({ type: \"ROLE\", payload: input.role });\n if (input.context) messages.push({ type: \"CONTEXT\", payload: { body: input.context } });\n if (input.instruction) messages.push({ type: \"INSTRUCTION\", payload: { text: input.instruction } });\n return messages.map((message) => JSON.stringify({ meta, message }));\n}\n\nexport class ProcessAgent implements IAgent {\n readonly config: AgentConfig;\n readonly info: AgentInfo;\n private readonly log: Logger;\n private readonly running = new Map<string, ChildProcess>();\n\n constructor(config: AgentConfig, log: Logger = logger) {\n if (!config.command) {\n throw new AgentError(\"AGENT_NOT_FOUND\", `Agent \"${config.name}\" has no command configured.`);\n }\n this.config = config;\n this.log = log.child({ agent: config.name });\n this.info = {\n name: config.name,\n integration: \"process\",\n command: config.command,\n cwd: config.cwd,\n status: \"ready\",\n capabilities: [config.inputMode ?? \"stdin\"],\n };\n }\n\n async run(input: AgentTaskInput): Promise<AgentTaskOutput> {\n const command = this.config.command;\n if (!command) {\n throw new AgentError(\"AGENT_NOT_FOUND\", `Agent \"${this.config.name}\" has no command configured.`);\n }\n const mode = this.config.inputMode ?? \"stdin\";\n const timeoutMs = this.config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise<AgentTaskOutput>((resolve, reject) => {\n const child = spawn(\n command,\n [...(this.config.args ?? []), ...(mode === \"arg\" ? [composeTaskText(input)] : [])],\n {\n cwd: this.config.cwd,\n env: { ...process.env, ...this.config.env },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n },\n );\n this.running.set(input.taskId, child);\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n this.log.warn(`Task ${input.taskId} exceeded ${timeoutMs}ms — killing process.`);\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), KILL_GRACE_MS).unref();\n }, timeoutMs);\n\n const settle = (finish: () => void): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n this.running.delete(input.taskId);\n finish();\n };\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n\n // Agents that exit without reading stdin raise EPIPE on write — that is\n // not an agent failure, so the stream error is ignored.\n child.stdin?.on(\"error\", () => {});\n if (mode !== \"arg\") {\n const payload =\n mode === \"protocol\"\n ? buildProtocolMessages(input, this.config.name).join(\"\\n\") + \"\\n\"\n : composeTaskText(input) + \"\\n\";\n child.stdin?.write(payload);\n child.stdin?.end();\n }\n\n child.on(\"error\", (error) => {\n settle(() => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n reject(\n new AgentError(\n \"AGENT_NOT_FOUND\",\n `Agent \"${this.config.name}\": command \"${command}\" was not found. Is it installed and on PATH?`,\n { cause: error },\n ),\n );\n return;\n }\n reject(\n new AgentError(\"AGENT_FAILED\", `Agent \"${this.config.name}\" failed to start: ${error.message}.`, {\n cause: error,\n }),\n );\n });\n });\n\n child.on(\"close\", (code, signal) => {\n settle(() => {\n if (timedOut) {\n reject(\n new AgentError(\n \"AGENT_TIMEOUT\",\n `Agent \"${this.config.name}\" timed out after ${timeoutMs}ms and was killed.`,\n { details: { taskId: input.taskId, stdout: stdout.slice(0, 4000), stderr: stderr.slice(0, 2000) } },\n ),\n );\n return;\n }\n\n const logs = stderr.trim().length > 0 ? stderr.split(\"\\n\") : undefined;\n if (mode === \"protocol\") {\n // interpretProtocolRun can reject (e.g. protocol violations); throwing\n // inside this event callback would escape the promise entirely.\n try {\n resolve(\n interpretProtocolRun({\n input,\n agentName: this.config.name,\n stdout,\n exitCode: code,\n logs,\n }),\n );\n } catch (error) {\n reject(error);\n }\n return;\n }\n\n const trimmed = stdout.trim();\n resolve({\n taskId: input.taskId,\n status: code === 0 ? \"completed\" : \"failed\",\n summary: trimmed.length > 0 ? firstLine(trimmed) : undefined,\n rawOutput: trimmed.length > 0 ? trimmed : undefined,\n exitCode: code ?? undefined,\n logs,\n error:\n code === 0\n ? undefined\n : `Process exited with code ${code ?? \"unknown\"}${signal ? ` (signal: ${signal})` : \"\"}`,\n });\n });\n });\n });\n }\n\n /** Ask the agent to stop current work (SIGTERM). */\n async cancel(taskId: string): Promise<void> {\n const child = this.running.get(taskId);\n if (child) child.kill(\"SIGTERM\");\n }\n\n runningTaskIds(): string[] {\n return [...this.running.keys()];\n }\n}\n\ninterface ProtocolRunInput {\n input: AgentTaskInput;\n agentName: string;\n stdout: string;\n exitCode: number | null;\n logs?: string[];\n}\n\nfunction interpretProtocolRun({ input, agentName, stdout, exitCode, logs }: ProtocolRunInput): AgentTaskOutput {\n const reports: Report[] = [];\n let summary: string | undefined;\n let error: string | undefined;\n let sawProtocolMessage = false;\n\n for (const line of stdout.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n const message = parseAgentMessage(trimmed);\n if (!message) continue;\n sawProtocolMessage = true;\n\n if (message.type === \"REPORT\") {\n const report = normalizeReport(message.payload, input.taskId, agentName, reports.length);\n if (report) reports.push(report);\n } else if (message.type === \"COMPLETION\") {\n const payload = message.payload as { summary?: unknown } | undefined;\n if (typeof payload?.summary === \"string\") summary = payload.summary;\n } else if (message.type === \"ERROR\") {\n const payload = message.payload as { code?: unknown; message?: unknown } | undefined;\n const detail = typeof payload?.message === \"string\" ? payload.message : \"unknown error\";\n const code = typeof payload?.code === \"string\" ? ` [${payload.code}]` : \"\";\n error = `Agent error${code}: ${detail}`;\n }\n // STATUS / QUESTION / ARTIFACT are informational in v0.4 (§21 backlog).\n }\n\n if (!sawProtocolMessage && exitCode === 0) {\n throw new ProtocolError(\n `Agent \"${agentName}\" produced no protocol messages on stdout (input mode \"protocol\").`,\n { details: { taskId: input.taskId, stdout: stdout.slice(0, 2000) } },\n );\n }\n\n const trimmed = stdout.trim();\n return {\n taskId: input.taskId,\n status: error !== undefined || exitCode !== 0 ? \"failed\" : \"completed\",\n summary: summary ?? reports[0]?.summary,\n rawOutput: trimmed.length > 0 ? trimmed : undefined,\n exitCode: exitCode ?? undefined,\n logs,\n reports: reports.length > 0 ? reports : undefined,\n error:\n error ??\n (exitCode !== 0 ? `Process exited with code ${exitCode ?? \"unknown\"}` : undefined),\n };\n}\n\n/** Accepts both bare `{ type, payload }` and enveloped `{ meta, message }` lines. */\nfunction parseAgentMessage(line: string): { type: string; payload: unknown } | undefined {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n if (typeof parsed.type === \"string\") {\n return { type: parsed.type, payload: parsed.payload };\n }\n const inner = parsed.message as Record<string, unknown> | undefined;\n if (inner && typeof inner.type === \"string\") {\n return { type: inner.type, payload: inner.payload };\n }\n } catch {\n // Non-JSON chatter is tolerated; protocol compliance is judged overall.\n }\n return undefined;\n}\n\nfunction normalizeReport(\n payload: unknown,\n taskId: string,\n agentName: string,\n index: number,\n): Report | undefined {\n if (payload === null || typeof payload !== \"object\") return undefined;\n const raw = payload as Record<string, unknown>;\n if (typeof raw.summary !== \"string\") return undefined;\n return {\n id: typeof raw.id === \"string\" ? raw.id : `${taskId}-report-${index}`,\n taskId: typeof raw.taskId === \"string\" ? raw.taskId : taskId,\n agent: typeof raw.agent === \"string\" ? raw.agent : agentName,\n summary: raw.summary,\n findings: Array.isArray(raw.findings) ? (raw.findings as Report[\"findings\"]) : [],\n recommendations: Array.isArray(raw.recommendations) ? (raw.recommendations as string[]) : [],\n createdAt: typeof raw.createdAt === \"string\" ? raw.createdAt : new Date().toISOString(),\n };\n}\n\nfunction firstLine(text: string, maxLength = 200): string {\n const line = text.split(\"\\n\", 1)[0] ?? text;\n return line.length > maxLength ? `${line.slice(0, maxLength)}…` : line;\n}\n","/** Agent registry (§10): the set of agents connected to OmniNode. */\nimport type { IAgent } from \"../types/agent.js\";\n\nexport class AgentRegistry {\n private readonly agents = new Map<string, IAgent>();\n\n register(agent: IAgent): void {\n this.agents.set(agent.info.name, agent);\n }\n\n get(name: string): IAgent | undefined {\n return this.agents.get(name);\n }\n\n list(): IAgent[] {\n return [...this.agents.values()].sort((a, b) => a.info.name.localeCompare(b.info.name));\n }\n}\n","/**\n * Agent factory (§9–§10): builds adapter instances from configuration.\n * \"cli\" agent configs are mapped to the process integration by the loader.\n */\nimport type { AppConfig } from \"../config/index.js\";\nimport { OmniNodeError } from \"../errors/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport type { AgentConfig, IAgent } from \"../types/agent.js\";\nimport { ProcessAgent } from \"./process/index.js\";\nimport { AgentRegistry } from \"./registry.js\";\n\nexport function createAgent(config: AgentConfig): IAgent {\n if (config.integration === \"process\") {\n return new ProcessAgent(config);\n }\n if (config.integration === \"native\") {\n throw new OmniNodeError(\n \"NOT_IMPLEMENTED\",\n `Native agent adapters are planned for a later phase. Use input over stdin/stdout (type \"cli\") for \"${config.name}\" for now.`,\n );\n }\n throw new OmniNodeError(\"NOT_IMPLEMENTED\", `Agent integration \"${config.integration}\" has no adapter yet.`);\n}\n\n/** Builds an agent registry from the project configuration, skipping agents that fail to construct. */\nexport function buildAgentRegistry(config: AppConfig, log: Logger = logger): AgentRegistry {\n const registry = new AgentRegistry();\n for (const agentConfig of config.project.agents) {\n try {\n registry.register(createAgent(agentConfig));\n } catch (error) {\n log.warn(\n `Skipping agent \"${agentConfig.name}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return registry;\n}\n","import type { Command } from \"commander\";\nimport { agentConfigSchema, loadConfig } from \"../../config/index.js\";\nimport { AgentError, OmniNodeError } from \"../../errors/index.js\";\nimport { createAgent } from \"../../agents/index.js\";\nimport { appendToConfigList } from \"./shared.js\";\n\nconst collectArgs = (value: string, previous: string[]): string[] => [...previous, value];\n\ninterface AddAgentOptions {\n name: string;\n command: string;\n arg?: string[];\n cwd?: string;\n inputMode: string;\n timeoutMs?: number;\n}\n\nexport function registerAgentCommands(program: Command): void {\n const agent = program\n .command(\"agent\")\n .description(\"Manage CLI agents registered with OmniNode.\");\n\n agent\n .command(\"list\")\n .description(\"List configured agents.\")\n .action(async () => {\n const config = loadConfig();\n const agents = config.project.agents;\n if (agents.length === 0) {\n console.log(\"No agents configured. Add one with `omninode agent add` or edit omninode.yaml.\");\n return;\n }\n for (const agent of agents) {\n const command = agent.command ?? \"(no command)\";\n console.log(\n `${agent.name} integration=${agent.integration} command=${command} input=${agent.inputMode ?? \"stdin\"}`,\n );\n }\n });\n\n agent\n .command(\"add\")\n .description(\n \"Register a CLI agent in omninode.yaml. Agents run as child processes \" +\n \"(stdin/stdout); native adapters come in a later phase.\",\n )\n .requiredOption(\"--name <name>\", \"Unique agent name.\")\n .requiredOption(\"--command <command>\", \"Executable command, e.g. opencode\")\n .option(\"--arg <value>\", \"Additional command argument (repeatable).\", collectArgs, [])\n .option(\"--cwd <dir>\", \"Working directory for the agent process.\")\n .option(\n \"--input-mode <mode>\",\n \"How the task is delivered: stdin (prompt on stdin), arg (prompt as last argument) or protocol (§21 JSON-lines task protocol).\",\n \"stdin\",\n )\n .option(\"--timeout-ms <ms>\", \"Per-task timeout in milliseconds.\", (value: string) =>\n Number(value),\n )\n .action(async (options: AddAgentOptions) => addAgent(options));\n\n agent\n .command(\"test <name>\")\n .description(\"Verify the OmniNode ↔ agent connection by sending a trivial task.\")\n .action(async (name: string) => testAgent(name));\n}\n\nexport async function addAgent(options: AddAgentOptions): Promise<void> {\n const candidate = agentConfigSchema.safeParse({\n name: options.name,\n type: \"cli\",\n command: options.command,\n ...(options.arg !== undefined && options.arg.length > 0 ? { args: options.arg } : {}),\n ...(options.cwd !== undefined ? { cwd: options.cwd } : {}),\n input_mode: options.inputMode,\n ...(options.timeoutMs !== undefined ? { timeout_ms: options.timeoutMs } : {}),\n });\n if (!candidate.success) {\n const issues = candidate.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n throw new OmniNodeError(\"CLI_USAGE\", `Invalid agent options: ${issues}`);\n }\n const newAgent = candidate.data;\n\n const existing = loadConfig();\n if (existing.project.agents.some((a) => a.name === newAgent.name)) {\n throw new OmniNodeError(\n \"CLI_USAGE\",\n `Agent \"${newAgent.name}\" already exists in omninode.yaml. Remove it first or pick another name.`,\n );\n }\n\n const configPath = appendToConfigList(\"agents\", newAgent);\n console.log(`Added agent \"${newAgent.name}\" (${newAgent.type}, input=${newAgent.input_mode}) to ${configPath}.`);\n console.log(`Run \\`omninode agent test ${newAgent.name}\\` to verify the connection.`);\n}\n\nexport async function testAgent(name: string): Promise<void> {\n const config = loadConfig();\n const agentConfig = config.project.agents.find((a) => a.name === name);\n if (!agentConfig) {\n const available = config.project.agents.map((a) => a.name).join(\", \") || \"(none)\";\n throw new AgentError(\n \"AGENT_NOT_FOUND\",\n `Agent \"${name}\" is not configured. Configured agents: ${available}.`,\n );\n }\n\n const agent = createAgent(agentConfig);\n console.log(\n `Testing agent \"${name}\" (${agent.info.integration}, input=${agentConfig.inputMode ?? \"stdin\"}) — sending a trivial task.`,\n );\n const result = await agent.run({\n taskId: `test-${Date.now()}`,\n objective: \"Reply with the single word: OK\",\n });\n console.log(` status: ${result.status}`);\n if (result.exitCode !== undefined) console.log(` exit: ${result.exitCode}`);\n if (result.summary) console.log(` output: ${result.summary}`);\n if (result.rawOutput && result.rawOutput !== result.summary) {\n console.log(` raw: ${result.rawOutput.slice(0, 200).replace(/\\n/g, \" \")}`);\n }\n if (result.error) console.log(` error: ${result.error}`);\n if (result.status !== \"completed\") process.exitCode = 1;\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function registerRoleCommands(program: Command): void {\n const role = program\n .command(\"role\")\n .description(\"Inspect roles defined in omninode.yaml.\");\n\n role\n .command(\"list\")\n .description(\"List configured roles.\")\n .action(async () => {\n const config = loadConfig();\n const roles = config.project.roles;\n if (roles.length === 0) {\n console.log(\"No roles configured. Add one under `project.roles` in omninode.yaml.\");\n return;\n }\n for (const role of roles) {\n console.log(`${role.id} ${role.name}`);\n for (const responsibility of role.responsibilities) {\n console.log(` - ${responsibility}`);\n }\n }\n });\n}\n","/**\n * Task persistence (§4.1 — execution state). The store is replaceable\n * (§2 — Modular); the default implementation is a local JSON file so\n * OmniNode stays local-first (§25).\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { Task, TaskStatus } from \"../types/task.js\";\n\nexport interface TaskStoreFilter {\n status?: TaskStatus;\n project?: string;\n}\n\nexport interface TaskStore {\n save(task: Task): Promise<void>;\n get(id: string): Promise<Task | undefined>;\n list(filter?: TaskStoreFilter): Promise<Task[]>;\n}\n\nexport class FileTaskStore implements TaskStore {\n private readonly filePath: string;\n /**\n * Read-modify-write operations are serialized: parallel pipeline tasks\n * would otherwise race on the JSON file (last writer wins).\n */\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(directory = `${process.cwd()}/.omninode`) {\n this.filePath = `${directory}/tasks.json`;\n }\n\n async save(task: Task): Promise<void> {\n return this.synchronized(async () => {\n const tasks = await this.load();\n const index = tasks.findIndex((t) => t.id === task.id);\n if (index >= 0) tasks[index] = task;\n else tasks.push(task);\n await this.write(tasks);\n });\n }\n\n async get(id: string): Promise<Task | undefined> {\n return this.synchronized(async () => {\n const tasks = await this.load();\n return tasks.find((t) => t.id === id);\n });\n }\n\n async list(filter: TaskStoreFilter = {}): Promise<Task[]> {\n return this.synchronized(async () => {\n const tasks = await this.load();\n return tasks\n .filter((task) => (filter.status ? task.status === filter.status : true))\n .filter((task) => (filter.project ? task.project === filter.project : true))\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n });\n }\n\n private synchronized<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async load(): Promise<Task[]> {\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as Task[]) : [];\n } catch {\n return [];\n }\n }\n\n private async write(tasks: Task[]): Promise<void> {\n // Write to a temp file and rename for an atomic-enough local save.\n const tmp = `${this.filePath}.tmp`;\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(tmp, `${JSON.stringify(tasks, null, 2)}\\n`, \"utf8\");\n await rename(tmp, this.filePath);\n }\n}\n","/**\n * Task engine (§13, §27 Phase 4): owns the task lifecycle — create, queue,\n * run, cancel — validates role/agent assignment against the registries and\n * persists every transition through the task store.\n */\nimport { randomBytes } from \"node:crypto\";\nimport type { AgentRegistry } from \"../agents/index.js\";\nimport type { RoleRegistry } from \"../roles/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport { TaskError } from \"../errors/index.js\";\nimport type { MemoryService } from \"../memory/index.js\";\nimport type { Task, TaskContext, TaskResult, TaskStatus } from \"../types/task.js\";\nimport type { TaskStore, TaskStoreFilter } from \"./store.js\";\n\nconst ALLOWED_TRANSITIONS: Record<TaskStatus, TaskStatus[]> = {\n created: [\"queued\", \"running\", \"cancelled\"],\n queued: [\"running\", \"cancelled\"],\n running: [\"completed\", \"failed\", \"cancelled\"],\n waiting: [\"running\", \"cancelled\"],\n completed: [],\n failed: [],\n cancelled: [],\n};\n\nexport interface CreateTaskInput {\n objective: string;\n project?: string;\n role?: string;\n agent?: string;\n context?: TaskContext;\n}\n\nexport interface TaskEngineOptions {\n agents: AgentRegistry;\n roles: RoleRegistry;\n store: TaskStore;\n /** When present, tasks gather relevant memory before running and record outcomes after (§20). */\n memory?: MemoryService;\n log?: Logger;\n}\n\nexport class TaskEngine {\n private readonly log: Logger;\n\n constructor(private readonly options: TaskEngineOptions) {\n this.log = (options.log ?? logger).child({ component: \"tasks\" });\n }\n\n get store(): TaskStore {\n return this.options.store;\n }\n\n async create(input: CreateTaskInput): Promise<Task> {\n if (!input.objective || input.objective.trim().length === 0) {\n throw new TaskError(\"TASK_INVALID\", \"Task objective must not be empty.\");\n }\n if (input.role && !this.options.roles.get(input.role)) {\n throw new TaskError(\"TASK_INVALID\", \n `Role \"${input.role}\" is not defined. Add it under project.roles in omninode.yaml.`,\n );\n }\n if (input.agent && !this.options.agents.get(input.agent)) {\n throw new TaskError(\"TASK_INVALID\", \n `Agent \"${input.agent}\" is not registered. Add it with \\`omninode agent add\\`.`,\n );\n }\n\n const now = new Date().toISOString();\n const task: Task = {\n id: generateTaskId(),\n objective: input.objective.trim(),\n status: \"created\",\n createdAt: now,\n updatedAt: now,\n ...(input.project !== undefined ? { project: input.project } : {}),\n ...(input.role !== undefined ? { role: input.role } : {}),\n ...(input.agent !== undefined ? { agent: input.agent } : {}),\n ...(input.context !== undefined ? { context: input.context } : {}),\n };\n await this.options.store.save(task);\n this.log.info(`Created task ${task.id}.`);\n return task;\n }\n\n async queue(id: string): Promise<Task> {\n const task = await this.mustGet(id);\n return this.transition(task, \"queued\");\n }\n\n /** Runs the task through its assigned agent and records the result. */\n async run(id: string): Promise<Task> {\n const task = await this.mustGet(id);\n if (task.status !== \"created\" && task.status !== \"queued\") {\n throw new TaskError(\"TASK_INVALID\", `Task ${id} is \"${task.status}\" and cannot be run.`);\n }\n if (!task.agent) {\n throw new TaskError(\"TASK_INVALID\", `Task ${id} has no agent assigned. Re-create it with --agent.`);\n }\n const agent = this.options.agents.get(task.agent);\n if (!agent) {\n throw new TaskError(\"TASK_INVALID\", `Agent \"${task.agent}\" is not registered anymore.`);\n }\n const role = task.role ? this.options.roles.get(task.role) : undefined;\n\n const running = await this.transition(task, \"running\");\n this.log.info(`Running task ${task.id} on agent \"${task.agent}\".`);\n\n // §20: relevant memory is gathered before the agent receives context.\n let background = running.context?.background;\n if (this.options.memory) {\n const memoryContext = await this.options.memory.gatherContext({\n objective: running.objective,\n ...(running.role ? { role: running.role } : {}),\n ...(running.project ? { project: running.project } : {}),\n });\n if (memoryContext.length > 0) {\n background = [memoryContext, background].filter((part) => part && part.length > 0).join(\"\\n\\n\");\n }\n }\n\n let output;\n try {\n output = await agent.run({\n taskId: running.id,\n objective: running.objective,\n ...(role ? { role } : {}),\n ...(background !== undefined ? { context: background } : {}),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log.error(`Task ${task.id} failed: ${message}`);\n return this.transition(running, \"failed\", {\n result: { error: message, finishedAt: new Date().toISOString() },\n });\n }\n\n const result: TaskResult = {\n ...(output.summary !== undefined ? { summary: output.summary } : {}),\n ...(output.reports !== undefined && output.reports.length > 0 ? { reports: output.reports } : {}),\n // Keep the verbatim output (bounded) for report extraction and audit.\n ...(output.rawOutput !== undefined && output.rawOutput.length > 0\n ? { rawOutput: output.rawOutput.slice(0, 10_000) }\n : {}),\n ...(output.error !== undefined ? { error: output.error } : {}),\n finishedAt: new Date().toISOString(),\n };\n const finalStatus: TaskStatus = output.status === \"completed\" ? \"completed\" : \"failed\";\n const finished = await this.transition(running, finalStatus, { result });\n this.log.info(`Task ${task.id} finished: ${finalStatus}.`);\n // §20: the outcome is written back to memory — best-effort, never fatal.\n if (this.options.memory) {\n await this.options.memory.recordTaskOutcome(finished);\n }\n return finished;\n }\n\n async cancel(id: string): Promise<Task> {\n const task = await this.mustGet(id);\n if (!ALLOWED_TRANSITIONS[task.status].includes(\"cancelled\")) {\n throw new TaskError(\"TASK_INVALID\", `Task ${id} is \"${task.status}\" and cannot be cancelled.`);\n }\n if (task.agent) {\n const agent = this.options.agents.get(task.agent);\n await agent?.cancel?.(task.id);\n }\n return this.transition(task, \"cancelled\");\n }\n\n async get(id: string): Promise<Task | undefined> {\n return this.options.store.get(id);\n }\n\n async list(filter?: TaskStoreFilter): Promise<Task[]> {\n return this.options.store.list(filter);\n }\n\n private async mustGet(id: string): Promise<Task> {\n const task = await this.options.store.get(id);\n if (!task) {\n throw new TaskError(\"TASK_NOT_FOUND\", `Task \"${id}\" does not exist in this project's task store.`);\n }\n return task;\n }\n\n private async transition(\n task: Task,\n to: TaskStatus,\n extra: { result?: TaskResult } = {},\n ): Promise<Task> {\n const allowed = ALLOWED_TRANSITIONS[task.status] ?? [];\n if (!allowed.includes(to)) {\n throw new TaskError(\"TASK_INVALID\", `Task ${task.id} cannot move from \"${task.status}\" to \"${to}\".`);\n }\n const updated: Task = {\n ...task,\n status: to,\n updatedAt: new Date().toISOString(),\n ...(extra.result !== undefined\n ? { result: { ...task.result, ...extra.result } }\n : {}),\n };\n await this.options.store.save(updated);\n return updated;\n }\n}\n\nfunction generateTaskId(): string {\n return `task-${Date.now().toString(36)}-${randomBytes(3).toString(\"hex\")}`;\n}\n","/**\n * Local file-based memory provider: the default implementation so persistent\n * memory works out of the box, locally (§25), with no external service.\n * Relevance is scored by keyword overlap and tag matches — deterministic and\n * dependency-free.\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { IMemoryProvider, MemoryEntry, MemoryQuery } from \"../types/memory.js\";\n\nconst STOPWORDS = new Set([\n \"the\", \"and\", \"for\", \"with\", \"this\", \"that\", \"from\", \"into\", \"was\", \"were\",\n \"have\", \"has\", \"had\", \"are\", \"but\", \"not\", \"you\", \"his\", \"her\", \"its\",\n \"their\", \"them\", \"then\", \"than\", \"when\", \"what\", \"which\", \"will\", \"would\",\n \"been\", \"were\", \"also\", \"because\", \"about\", \"after\", \"before\",\n]);\n\nexport function keywords(text: string): Set<string> {\n return new Set(\n (text ?? \"\")\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .filter((t) => t.length >= 4 && !STOPWORDS.has(t)),\n );\n}\n\nfunction relevanceScore(queryKeywords: Set<string>, entry: MemoryEntry): number {\n if (queryKeywords.size === 0) return 0;\n const entryKeywords = keywords(`${entry.content} ${entry.key}`);\n let overlap = 0;\n for (const keyword of queryKeywords) {\n if (entryKeywords.has(keyword)) overlap += 1;\n }\n let tagMatches = 0;\n for (const tag of entry.tags ?? []) {\n if (queryKeywords.has(tag.toLowerCase())) tagMatches += 1;\n }\n return overlap * 2 + tagMatches * 1.5;\n}\n\nexport class LocalMemoryProvider implements IMemoryProvider {\n readonly name = \"local\";\n private readonly filePath: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(directory = `${process.cwd()}/.omninode`) {\n this.filePath = `${directory}/memory.json`;\n }\n\n async query(query: MemoryQuery): Promise<MemoryEntry[]> {\n return this.synchronized(async () => {\n const entries = await this.load();\n const filtered = entries\n .filter((entry) => (query.scope ? entry.scope === query.scope : true))\n .filter((entry) =>\n query.tags && query.tags.length > 0\n ? query.tags.every((tag) => (entry.tags ?? []).includes(tag))\n : true,\n );\n\n if (!query.text || query.text.trim().length === 0) {\n return filtered\n .sort((a, b) => (b.updatedAt ?? b.createdAt ?? \"\").localeCompare(a.updatedAt ?? a.createdAt ?? \"\"))\n .slice(0, query.limit ?? 10);\n }\n\n const queryKeywords = keywords(query.text);\n return filtered\n .map((entry) => ({ entry, score: relevanceScore(queryKeywords, entry) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, query.limit ?? 10)\n .map(({ entry }) => entry);\n });\n }\n\n async write(entry: MemoryEntry): Promise<void> {\n return this.synchronized(async () => {\n const entries = await this.load();\n const index = entries.findIndex((e) => e.key === entry.key);\n const stamped: MemoryEntry = {\n ...entry,\n createdAt: entry.createdAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n if (index >= 0) entries[index] = stamped;\n else entries.push(stamped);\n await this.saveAll(entries);\n });\n }\n\n async count(): Promise<number> {\n return (await this.load()).length;\n }\n\n private synchronized<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async load(): Promise<MemoryEntry[]> {\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as MemoryEntry[]) : [];\n } catch {\n return [];\n }\n }\n\n private async saveAll(entries: MemoryEntry[]): Promise<void> {\n const tmp = `${this.filePath}.tmp`;\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(tmp, `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n await rename(tmp, this.filePath);\n }\n}\n","/**\n * Remembera memory provider (§19): the preferred Hilbras memory integration,\n * reached over HTTP. Remembera is strictly optional — the core also runs with\n * the local memory provider or none at all (§2).\n *\n * API convention assumed by this adapter (adjust here if the real API differs):\n * write: POST {baseUrl}/api/memory body: MemoryEntry JSON → 2xx\n * query: POST {baseUrl}/api/memory/query body: MemoryQuery JSON → { entries: MemoryEntry[] }\n */\nimport { MemoryError } from \"../errors/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport { resolveApiKey } from \"../providers/auth.js\";\nimport { requestJson } from \"../providers/http.js\";\nimport type { IMemoryProvider, MemoryEntry, MemoryQuery } from \"../types/memory.js\";\n\nexport interface RememberaConfig {\n baseUrl: string;\n apiKeyEnvVar?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport class RememberaMemoryProvider implements IMemoryProvider {\n readonly name = \"remembera\";\n private readonly baseUrl: string;\n private readonly apiKeyEnvVar?: string;\n private readonly env: Record<string, string | undefined>;\n private readonly log: Logger;\n\n constructor(config: RememberaConfig, log: Logger = logger) {\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n this.apiKeyEnvVar = config.apiKeyEnvVar;\n this.env = config.env ?? process.env;\n this.log = log.child({ component: \"remembera\" });\n }\n\n private headers(): Record<string, string> {\n const key = this.apiKeyEnvVar\n ? resolveApiKey({ name: \"remembera\", apiKeyEnvVar: this.apiKeyEnvVar }, this.env)\n : undefined;\n return key ? { authorization: `Bearer ${key}` } : {};\n }\n\n async query(query: MemoryQuery): Promise<MemoryEntry[]> {\n const { status, body } = await this.request(`${this.baseUrl}/api/memory/query`, query);\n if (status !== 200) {\n throw new MemoryError(`Remembera query returned HTTP ${status}.`);\n }\n const entries = (body as { entries?: unknown }).entries;\n if (!Array.isArray(entries)) {\n throw new MemoryError(\"Remembera query response had no entries array.\");\n }\n return entries.map((entry) => this.toEntry(entry)).filter((entry): entry is MemoryEntry => entry !== undefined);\n }\n\n async write(entry: MemoryEntry): Promise<void> {\n const { status } = await this.request(`${this.baseUrl}/api/memory`, entry);\n if (status !== 200 && status !== 201) {\n throw new MemoryError(`Remembera write returned HTTP ${status}.`);\n }\n }\n\n private async request(url: string, body: unknown): Promise<{ status: number; body: unknown }> {\n // Resolved outside the try so auth failures propagate as-is.\n const headers = this.headers();\n try {\n return await requestJson(url, {\n method: \"POST\",\n headers,\n body,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new MemoryError(`Remembera request to ${url} failed: ${message}`, { cause: error });\n }\n }\n\n private toEntry(raw: unknown): MemoryEntry | undefined {\n if (raw === null || typeof raw !== \"object\") {\n this.log.warn(\"Skipping malformed Remembera memory entry.\");\n return undefined;\n }\n const entry = raw as Record<string, unknown>;\n if (typeof entry.key !== \"string\" || typeof entry.content !== \"string\") {\n this.log.warn(\"Skipping Remembera memory entry without key/content.\");\n return undefined;\n }\n const scope = entry.scope;\n return {\n key: entry.key,\n content: entry.content,\n scope:\n scope === \"project\" || scope === \"role\" || scope === \"task\" || scope === \"knowledge\"\n ? scope\n : \"knowledge\",\n ...(Array.isArray(entry.tags) ? { tags: entry.tags.filter((t): t is string => typeof t === \"string\") } : {}),\n ...(typeof entry.createdAt === \"string\" ? { createdAt: entry.createdAt } : {}),\n ...(typeof entry.updatedAt === \"string\" ? { updatedAt: entry.updatedAt } : {}),\n };\n }\n}\n","/** Memory provider factory: memory is optional; local is the default. */\nimport { ConfigError } from \"../errors/index.js\";\nimport type { AppConfig } from \"../config/index.js\";\nimport type { IMemoryProvider } from \"../types/memory.js\";\nimport { LocalMemoryProvider } from \"./local.js\";\nimport { RememberaMemoryProvider } from \"./remembera.js\";\n\nexport type MemoryProviderConfig = NonNullable<AppConfig[\"project\"][\"memory\"]>;\n\nexport function createMemoryProvider(config?: MemoryProviderConfig): IMemoryProvider {\n if (!config || config.provider === \"local\") {\n return new LocalMemoryProvider();\n }\n if (config.provider === \"remembera\") {\n if (!config.baseUrl) {\n throw new ConfigError(\n \"CONFIG_INVALID\",\n `Memory provider \"remembera\" needs a base_url in omninode.yaml.`,\n );\n }\n return new RememberaMemoryProvider({\n baseUrl: config.baseUrl,\n apiKeyEnvVar: config.apiKeyEnvVar,\n });\n }\n throw new ConfigError(\n \"CONFIG_INVALID\",\n `Unknown memory provider \"${config.provider}\". Available: local, remembera.`,\n );\n}\n","/**\n * Memory service (§19–§20): gathers relevant memory before a task runs and\n * records outcomes afterwards — the Task → memory → relevant context →\n * agents → reports → memory loop. Memory failures are best-effort: they log\n * a warning and never fail a task, because memory is an enhancement, not a\n * dependency (§2).\n */\nimport { logger, type Logger } from \"../logger/index.js\";\nimport type { IMemoryProvider, MemoryEntry, MemoryScope } from \"../types/memory.js\";\nimport type { Task } from \"../types/task.js\";\n\nexport interface MemoryContextQuery {\n objective: string;\n role?: string;\n project?: string;\n}\n\nconst MAX_CONTEXT_CHARS = 4_000;\n\nexport class MemoryService {\n private readonly log: Logger;\n\n constructor(\n private readonly provider: IMemoryProvider,\n log: Logger = logger,\n ) {\n this.log = log.child({ component: \"memory\", provider: provider.name });\n }\n\n get providerRef(): IMemoryProvider {\n return this.provider;\n }\n\n get providerName(): string {\n return this.provider.name;\n }\n\n /** Relevant context for a task objective; empty string when nothing matches. */\n async gatherContext(query: MemoryContextQuery): Promise<string> {\n try {\n const entries = await this.provider.query({\n text: query.objective,\n ...(query.role ? { tags: [query.role] } : {}),\n limit: 8,\n });\n if (entries.length === 0) return \"\";\n const byScope = new Map<MemoryScope, MemoryEntry[]>();\n for (const entry of entries) {\n byScope.set(entry.scope, [...(byScope.get(entry.scope) ?? []), entry]);\n }\n const parts: string[] = [];\n for (const scope of [\"project\", \"task\", \"role\", \"knowledge\"] as MemoryScope[]) {\n const scopeEntries = byScope.get(scope) ?? [];\n if (scopeEntries.length === 0) continue;\n const lines = scopeEntries.map((entry) => `- ${entry.content}`).join(\"\\n\");\n parts.push(`### Relevant memory (${scope})\\n${lines}`);\n }\n const context = parts.join(\"\\n\\n\");\n return context.length > MAX_CONTEXT_CHARS ? `${context.slice(0, MAX_CONTEXT_CHARS)}…` : context;\n } catch (error) {\n this.log.warn(\n `Memory query failed (continuing without memory): ${error instanceof Error ? error.message : String(error)}`,\n );\n return \"\";\n }\n }\n\n /** Records a finished task's outcome — best-effort. */\n async recordTaskOutcome(task: Task): Promise<void> {\n const outcome = task.result?.summary ?? task.result?.error ?? \"(no output)\";\n try {\n await this.provider.write({\n key: `task:${task.id}`,\n scope: \"task\",\n content: `Objective: ${task.objective}\\nStatus: ${task.status}\\nOutcome: ${outcome}`,\n tags: [\"task\", ...(task.agent ? [task.agent] : []), ...(task.role ? [task.role] : [])],\n createdAt: task.createdAt,\n });\n // Significant findings become project-level \"known problems\" (§19).\n const significant = (task.result?.reports ?? []).flatMap((report) =>\n report.findings\n .filter((finding) => finding.severity === \"high\" || finding.severity === \"critical\")\n .map((finding) => ({ report, finding })),\n );\n for (const { report, finding } of significant) {\n await this.provider.write({\n key: `finding:${report.id}:${finding.id}`,\n scope: \"project\",\n content: `[${finding.severity}] ${finding.title} — ${finding.detail}`,\n tags: [\"known-problem\", report.agent],\n });\n }\n } catch (error) {\n this.log.warn(\n `Memory write failed (continuing): ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","/** Role registry (§11): the set of roles available for task assignment. */\nimport type { AppConfig } from \"../config/index.js\";\nimport type { RoleDefinition } from \"../types/role.js\";\n\nexport class RoleRegistry {\n private readonly roles = new Map<string, RoleDefinition>();\n\n register(role: RoleDefinition): void {\n this.roles.set(role.id, role);\n }\n\n registerAll(roles: RoleDefinition[]): void {\n for (const role of roles) this.register(role);\n }\n\n get(id: string): RoleDefinition | undefined {\n return this.roles.get(id);\n }\n\n list(): RoleDefinition[] {\n return [...this.roles.values()].sort((a, b) => a.id.localeCompare(b.id));\n }\n}\n\n/** Builds a role registry from the project configuration. */\nexport function buildRoleRegistry(config: AppConfig): RoleRegistry {\n const registry = new RoleRegistry();\n registry.registerAll(config.project.roles);\n return registry;\n}\n","/** Assembles a TaskEngine from the project configuration (local-first defaults). */\nimport type { AppConfig } from \"../config/index.js\";\nimport { buildAgentRegistry } from \"../agents/index.js\";\nimport { createMemoryProvider, MemoryService } from \"../memory/index.js\";\nimport { buildRoleRegistry } from \"../roles/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport { TaskEngine } from \"./engine.js\";\nimport { FileTaskStore } from \"./store.js\";\n\nexport function createTaskEngine(config: AppConfig, log: Logger = logger, directory?: string): TaskEngine {\n const agents = buildAgentRegistry(config, log);\n const roles = buildRoleRegistry(config);\n return new TaskEngine({\n agents,\n roles,\n store: new FileTaskStore(directory),\n ...(config.project.memory !== undefined\n ? { memory: new MemoryService(createMemoryProvider(config.project.memory), log) }\n : {}),\n log,\n });\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { TaskError } from \"../../errors/index.js\";\nimport { createTaskEngine } from \"../../tasks/index.js\";\nimport type { Task } from \"../../types/task.js\";\n\nconst collectFiles = (value: string, previous: string[]): string[] => [...previous, value];\n\nexport function registerTaskCommands(program: Command): void {\n const task = program\n .command(\"task\")\n .description(\"Create, run and inspect tasks (§13).\");\n\n task\n .command(\"create <objective>\")\n .description(\"Create a task. Assign a role and/or agent; run it with `omninode task run`.\")\n .option(\"-r, --role <roleId>\", \"Role id from project.roles (validated at creation).\")\n .option(\"-a, --agent <name>\", \"Agent name from project.agents (validated at creation).\")\n .option(\"-f, --file <path>\", \"File or glob relevant to the task (repeatable).\", collectFiles)\n .action(async (objective: string, options: { role?: string; agent?: string; file?: string[] }) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n const created = await engine.create({\n objective,\n project: config.project.name,\n ...(options.role !== undefined ? { role: options.role } : {}),\n ...(options.agent !== undefined ? { agent: options.agent } : {}),\n ...(options.file !== undefined && options.file.length > 0\n ? { context: { files: options.file } }\n : {}),\n });\n console.log(`Created task ${created.id} (${created.status})`);\n console.log(` objective: ${created.objective}`);\n if (created.role) console.log(` role: ${created.role}`);\n if (created.agent) console.log(` agent: ${created.agent}`);\n if (created.context?.files) console.log(` files: ${created.context.files.join(\", \")}`);\n console.log(`Run \\`omninode task run ${created.id}\\` to execute it.`);\n });\n\n task\n .command(\"run <task-id>\")\n .description(\"Run a task through its assigned agent.\")\n .action(async (taskId: string) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n console.log(`Running task ${taskId}...`);\n const finished = await engine.run(taskId);\n printOutcome(finished);\n if (finished.status !== \"completed\") process.exitCode = 1;\n });\n\n task\n .command(\"status <task-id>\")\n .description(\"Show task details and current status.\")\n .action(async (taskId: string) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n const found = await engine.get(taskId);\n if (!found) {\n throw new TaskError(\n \"TASK_NOT_FOUND\",\n `Task \"${taskId}\" does not exist in this project's task store.`,\n );\n }\n printOutcome(found, { verbose: true });\n });\n\n task\n .command(\"list\")\n .description(\"List tasks in the project's task store.\")\n .option(\"-s, --status <status>\", \"Filter by status (created, queued, running, completed, failed, cancelled).\")\n .action(async (options: { status?: string }) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n const tasks = await engine.list(\n options.status !== undefined ? { status: options.status as Task[\"status\"] } : {},\n );\n if (tasks.length === 0) {\n console.log(\"No tasks found. Create one with `omninode task create`.\");\n return;\n }\n for (const t of tasks) {\n console.log(`${t.id} ${t.status.padEnd(10)} ${truncate(t.objective, 60)}`);\n }\n });\n\n task\n .command(\"cancel <task-id>\")\n .description(\"Cancel a task that has not finished yet.\")\n .action(async (taskId: string) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n const cancelled = await engine.cancel(taskId);\n console.log(`Task ${cancelled.id} is now \"${cancelled.status}\".`);\n });\n}\n\nfunction printOutcome(task: Task, options: { verbose?: boolean } = {}): void {\n console.log(` id: ${task.id}`);\n console.log(` status: ${task.status}`);\n console.log(` created: ${task.createdAt}`);\n if (options.verbose) {\n console.log(` project: ${task.project ?? \"(none)\"}`);\n if (task.role) console.log(` role: ${task.role}`);\n if (task.agent) console.log(` agent: ${task.agent}`);\n if (task.context?.files) console.log(` files: ${task.context.files.join(\", \")}`);\n console.log(` objective: ${task.objective}`);\n }\n const result = task.result;\n if (!result) return;\n if (result.summary) console.log(` summary: ${result.summary}`);\n if (result.reports && result.reports.length > 0) {\n console.log(` reports: ${result.reports.length} structured report(s)`);\n }\n if (result.error) console.log(` error: ${result.error}`);\n if (result.finishedAt) console.log(` ended: ${result.finishedAt}`);\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","/**\n * Report aggregation (§17): normalizes formats, groups duplicate and similar\n * findings, preserves source attribution, and produces one CombinedReport.\n * Grouping uses deterministic token-set similarity so results are testable.\n */\nimport { randomBytes } from \"node:crypto\";\nimport type {\n AggregatedFinding,\n AggregatedRecommendation,\n CombinedReport,\n Finding,\n FindingSeverity,\n FindingSource,\n Report,\n} from \"../types/report.js\";\n\nconst SEVERITY_RANK: Record<FindingSeverity, number> = {\n info: 0,\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\n\nexport interface AggregateOptions {\n objective?: string;\n pipelineRunId?: string;\n taskIds?: string[];\n /** Token-set Jaccard similarity above which findings are merged. */\n similarityThreshold?: number;\n}\n\nexport function aggregateReports(reports: Report[], options: AggregateOptions = {}): CombinedReport {\n const threshold = options.similarityThreshold ?? 0.7;\n\n const findingGroups: AggregatedFinding[] = [];\n const recommendationGroups: AggregatedRecommendation[] = [];\n\n for (const report of reports) {\n for (const finding of report.findings) {\n mergeFinding(findingGroups, finding, report, threshold);\n }\n for (const text of report.recommendations) {\n mergeRecommendation(recommendationGroups, text, report, threshold);\n }\n }\n\n const sources = [...new Set(reports.map((r) => r.agent))].sort();\n const totalRawFindings = reports.reduce((sum, r) => sum + r.findings.length, 0);\n const summary =\n `${reports.length} report(s) from ${sources.length > 0 ? sources.join(\", \") : \"no agents\"}: ` +\n `${findingGroups.length} unique finding group(s) (${totalRawFindings} raw), ` +\n `${recommendationGroups.length} recommendation group(s).`;\n\n return {\n id: `combined-${Date.now().toString(36)}-${randomBytes(3).toString(\"hex\")}`,\n title: options.objective !== undefined ? truncate(options.objective, 120) : \"Combined report\",\n ...(options.objective !== undefined ? { objective: options.objective } : {}),\n ...(options.pipelineRunId !== undefined ? { pipelineRunId: options.pipelineRunId } : {}),\n taskIds: options.taskIds ?? [],\n summary,\n findings: findingGroups.sort((a, b) => rank(b) - rank(a)),\n recommendations: recommendationGroups,\n sources,\n reportIds: reports.map((r) => r.id),\n createdAt: new Date().toISOString(),\n };\n}\n\nfunction rank(finding: AggregatedFinding): number {\n return finding.severity ? SEVERITY_RANK[finding.severity] : -1;\n}\n\nfunction mergeFinding(groups: AggregatedFinding[], finding: Finding, report: Report, threshold: number): void {\n const source: FindingSource = { agent: report.agent, reportId: report.id };\n const group = groups.find((g) => similar(g.title, finding.title, threshold));\n if (group) {\n group.occurrences += 1;\n group.details.push(finding.detail);\n group.sources.push(source);\n group.evidence.push(...(finding.evidence ?? []));\n if (finding.severity && (!group.severity || SEVERITY_RANK[finding.severity] > SEVERITY_RANK[group.severity])) {\n group.severity = finding.severity;\n }\n return;\n }\n groups.push({\n title: finding.title,\n details: [finding.detail],\n sources: [source],\n occurrences: 1,\n ...(finding.severity ? { severity: finding.severity } : {}),\n evidence: [...(finding.evidence ?? [])],\n });\n}\n\nfunction mergeRecommendation(\n groups: AggregatedRecommendation[],\n text: string,\n report: Report,\n threshold: number,\n): void {\n const source: FindingSource = { agent: report.agent, reportId: report.id };\n const group = groups.find((g) => similar(g.text, text, threshold));\n if (group) {\n group.occurrences += 1;\n group.sources.push(source);\n return;\n }\n groups.push({ text, sources: [source], occurrences: 1 });\n}\n\nexport function similar(a: string, b: string, threshold: number): boolean {\n const left = tokens(a);\n const right = tokens(b);\n if (left.size === 0 || right.size === 0) return false;\n let intersection = 0;\n for (const token of left) {\n if (right.has(token)) intersection += 1;\n }\n const union = left.size + right.size - intersection;\n return intersection / union >= threshold;\n}\n\nfunction tokens(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .filter((t) => t.length >= 3),\n );\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","/**\n * Report normalization (§17): turns an agent's text output into a structured\n * Report by extracting findings, recommendations and evidence from\n * markdown-style sections. Deterministic heuristics; AI-assisted extraction\n * can layer on top later via the planner.\n */\nimport type { Finding, FindingSeverity, Report } from \"../types/report.js\";\n\nexport interface ExtractionMeta {\n taskId: string;\n agent: string;\n model?: string;\n}\n\nconst BULLET = /^(?:[-*•]|\\d+[.)])\\s+(.*)$/;\n\ninterface Section {\n heading: string;\n bullets: string[];\n}\n\nfunction parseSections(raw: string): Section[] {\n const sections: Section[] = [];\n let current: Section = { heading: \"\", bullets: [] };\n for (const line of raw.split(\"\\n\")) {\n const heading = /^(#{1,6})\\s+(.*)$/.exec(line.trim());\n if (heading) {\n if (current.heading.length > 0 || current.bullets.length > 0) {\n sections.push(current);\n }\n current = { heading: heading[2]?.toLowerCase() ?? \"\", bullets: [] };\n continue;\n }\n const bullet = BULLET.exec(line.trim());\n if (bullet && current.heading.length > 0) {\n current.bullets.push(bullet[1]?.trim() ?? \"\");\n }\n }\n if (current.heading.length > 0 || current.bullets.length > 0) {\n sections.push(current);\n }\n return sections;\n}\n\nfunction collectBullets(sections: Section[], patterns: RegExp[]): string[] {\n const matches = sections.filter((section) => patterns.some((p) => p.test(section.heading)));\n return matches.flatMap((section) => section.bullets).filter((b) => b.length > 0);\n}\n\nfunction guessSeverity(text: string): FindingSeverity | undefined {\n if (/critical|severe/i.test(text)) return \"critical\";\n if (/\\bhigh\\b|major/i.test(text)) return \"high\";\n if (/medium|moderate/i.test(text)) return \"medium\";\n if (/\\blow\\b|minor/i.test(text)) return \"low\";\n return undefined;\n}\n\nexport function extractReportFromText(raw: string, meta: ExtractionMeta): Report {\n const trimmed = raw.trim();\n const nonEmpty = trimmed\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n // Prefer a prose line over markdown headings/bullets for the summary.\n const proseLine =\n nonEmpty.find((line) => !line.startsWith(\"#\") && !BULLET.test(line)) ?? nonEmpty[0] ?? \"\";\n const cleaned = proseLine.replace(/^#{1,6}\\s+/, \"\").replace(BULLET, \"$1\");\n const summary = cleaned.length > 0 ? truncate(cleaned, 200) : \"(no output)\";\n\n const sections = parseSections(trimmed);\n const findingTexts = collectBullets(sections, [/finding/, /issue/, /problem/, /vulnerab/]);\n const recommendationTexts = collectBullets(sections, [/recommend/, /suggestion/, /next step/, /action/]);\n const evidenceTexts = collectBullets(sections, [/evidence/, /proof/, /log/]);\n\n const findings: Finding[] = findingTexts.map((text, index) => ({\n id: `${meta.taskId}-f-${index + 1}`,\n title: truncate(text, 120),\n detail: text,\n severity: guessSeverity(text),\n }));\n\n return {\n id: `${meta.taskId}-report`,\n taskId: meta.taskId,\n agent: meta.agent,\n ...(meta.model !== undefined ? { model: meta.model } : {}),\n summary,\n findings,\n recommendations: recommendationTexts.map((t) => truncate(t, 200)),\n metadata: evidenceTexts.length > 0 ? { evidence: evidenceTexts } : undefined,\n createdAt: new Date().toISOString(),\n };\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","/**\n * Report service (§16–§17): collects reports from finished tasks (structured\n * protocol reports when present, extraction from text otherwise), persists\n * them with source attribution and generates combined reports.\n */\nimport { logger, type Logger } from \"../logger/index.js\";\nimport type { Task } from \"../types/task.js\";\nimport type { Report, CombinedReport } from \"../types/report.js\";\nimport { aggregateReports, type AggregateOptions } from \"./aggregate.js\";\nimport { extractReportFromText } from \"./extract.js\";\nimport type { ReportStore } from \"./store.js\";\n\nexport interface CombinedMeta {\n objective?: string;\n pipelineRunId?: string;\n taskIds?: string[];\n}\n\nexport class ReportService {\n private readonly log: Logger;\n\n constructor(\n private readonly store: ReportStore,\n log: Logger = logger,\n ) {\n this.log = log.child({ component: \"reports\" });\n }\n\n get storeRef(): ReportStore {\n return this.store;\n }\n\n /** Normalizes finished tasks into reports (§17 — normalizer). */\n async collectFromTasks(tasks: Task[]): Promise<Report[]> {\n const reports: Report[] = [];\n for (const task of tasks) {\n const structured = task.result?.reports ?? [];\n if (structured.length > 0) {\n reports.push(...structured);\n continue;\n }\n const text = task.result?.rawOutput ?? task.result?.summary ?? \"\";\n if (text.trim().length === 0) continue;\n reports.push(\n extractReportFromText(text, {\n taskId: task.id,\n agent: task.agent ?? \"unknown\",\n }),\n );\n }\n return reports;\n }\n\n async saveReports(reports: Report[]): Promise<void> {\n if (reports.length === 0) return;\n await this.store.saveReports(reports);\n this.log.info(`Stored ${reports.length} report(s).`);\n }\n\n async generateCombined(reports: Report[], meta: CombinedMeta = {}): Promise<CombinedReport | undefined> {\n if (reports.length === 0) return undefined;\n const options: AggregateOptions = {\n ...(meta.objective !== undefined ? { objective: meta.objective } : {}),\n ...(meta.pipelineRunId !== undefined ? { pipelineRunId: meta.pipelineRunId } : {}),\n ...(meta.taskIds !== undefined ? { taskIds: meta.taskIds } : {}),\n };\n const combined = aggregateReports(reports, options);\n await this.store.saveCombined(combined);\n this.log.info(`Generated combined report ${combined.id}.`);\n return combined;\n }\n}\n","/**\n * Report persistence (§16 — report storage). Same replaceable-store and\n * serialized-write patterns as the other local stores.\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { CombinedReport, Report } from \"../types/report.js\";\n\nexport interface ReportFilter {\n taskId?: string;\n agent?: string;\n}\n\nexport interface CombinedReportFilter {\n pipelineRunId?: string;\n}\n\nexport interface ReportStore {\n saveReports(reports: Report[]): Promise<void>;\n listReports(filter?: ReportFilter): Promise<Report[]>;\n saveCombined(combined: CombinedReport): Promise<void>;\n getCombined(id: string): Promise<CombinedReport | undefined>;\n listCombined(filter?: CombinedReportFilter): Promise<CombinedReport[]>;\n}\n\ntype StoreEntry = { kind: \"report\"; report: Report } | { kind: \"combined\"; combined: CombinedReport };\n\nexport class FileReportStore implements ReportStore {\n private readonly filePath: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(directory = `${process.cwd()}/.omninode`) {\n this.filePath = `${directory}/reports.json`;\n }\n\n async saveReports(reports: Report[]): Promise<void> {\n return this.synchronized(async () => {\n const entries = await this.load();\n for (const report of reports) {\n const index = entries.findIndex(\n (e) => e.kind === \"report\" && e.report.id === report.id,\n );\n const entry: StoreEntry = { kind: \"report\", report };\n if (index >= 0) entries[index] = entry;\n else entries.push(entry);\n }\n await this.write(entries);\n });\n }\n\n async listReports(filter: ReportFilter = {}): Promise<Report[]> {\n return this.synchronized(async () => {\n const entries = await this.load();\n return entries\n .filter((e): e is { kind: \"report\"; report: Report } => e.kind === \"report\")\n .map((e) => e.report)\n .filter((report) => (filter.taskId ? report.taskId === filter.taskId : true))\n .filter((report) => (filter.agent ? report.agent === filter.agent : true))\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n });\n }\n\n async saveCombined(combined: CombinedReport): Promise<void> {\n return this.synchronized(async () => {\n const entries = await this.load();\n const index = entries.findIndex(\n (e) => e.kind === \"combined\" && e.combined.id === combined.id,\n );\n const entry: StoreEntry = { kind: \"combined\", combined };\n if (index >= 0) entries[index] = entry;\n else entries.push(entry);\n await this.write(entries);\n });\n }\n\n async getCombined(id: string): Promise<CombinedReport | undefined> {\n return this.synchronized(async () => {\n const entries = await this.load();\n const found = entries.find((e) => e.kind === \"combined\" && e.combined.id === id);\n return found?.kind === \"combined\" ? found.combined : undefined;\n });\n }\n\n async listCombined(filter: CombinedReportFilter = {}): Promise<CombinedReport[]> {\n return this.synchronized(async () => {\n const entries = await this.load();\n return entries\n .filter((e): e is { kind: \"combined\"; combined: CombinedReport } => e.kind === \"combined\")\n .map((e) => e.combined)\n .filter((combined) =>\n filter.pipelineRunId ? combined.pipelineRunId === filter.pipelineRunId : true,\n )\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n });\n }\n\n private synchronized<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async load(): Promise<StoreEntry[]> {\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as StoreEntry[]) : [];\n } catch {\n return [];\n }\n }\n\n private async write(entries: StoreEntry[]): Promise<void> {\n const tmp = `${this.filePath}.tmp`;\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(tmp, `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n await rename(tmp, this.filePath);\n }\n}\n","import type { Command } from \"commander\";\nimport { OmniNodeError } from \"../../errors/index.js\";\nimport { ReportService } from \"../../reports/index.js\";\nimport { FileReportStore } from \"../../reports/store.js\";\nimport { truncate } from \"./shared.js\";\n\nfunction service(): ReportService {\n return new ReportService(new FileReportStore());\n}\n\nexport function registerReportCommands(program: Command): void {\n const report = program\n .command(\"report\")\n .description(\"Inspect AI reports collected from tasks and pipelines (§16–§17).\");\n\n report\n .command(\"list\")\n .description(\"List stored reports.\")\n .option(\"--task <taskId>\", \"Only reports for this task.\")\n .option(\"--agent <name>\", \"Only reports from this agent.\")\n .action(async (options: { task?: string; agent?: string }) => {\n const svc = service();\n const reports = await svc.storeRef.listReports({\n ...(options.task !== undefined ? { taskId: options.task } : {}),\n ...(options.agent !== undefined ? { agent: options.agent } : {}),\n });\n if (reports.length === 0) {\n console.log(\"No reports stored yet. Run a pipeline to collect some.\");\n return;\n }\n for (const r of reports) {\n console.log(`${r.id} ${r.agent.padEnd(10)} ${truncate(r.summary, 60)}`);\n }\n });\n\n report\n .command(\"combined\")\n .description(\"List combined reports (aggregated intelligence, §17).\")\n .option(\"--run <pipelineRunId>\", \"Only combined reports for this pipeline run.\")\n .action(async (options: { run?: string }) => {\n const svc = service();\n const combined = await svc.storeRef.listCombined({\n ...(options.run !== undefined ? { pipelineRunId: options.run } : {}),\n });\n if (combined.length === 0) {\n console.log(\"No combined reports stored yet. Run a pipeline to generate one.\");\n return;\n }\n for (const c of combined) {\n console.log(\n `${c.id} ${c.findings.length} finding(s) from ${c.sources.length} source(s)${c.pipelineRunId ? ` run=${c.pipelineRunId}` : \"\"}`,\n );\n }\n });\n\n report\n .command(\"show <id>\")\n .description(\"Show a stored report or combined report in full.\")\n .action(async (id: string) => {\n const svc = service();\n const reports = await svc.storeRef.listReports();\n const raw = reports.find((r) => r.id === id);\n if (raw) {\n console.log(`Report ${raw.id}`);\n console.log(` agent: ${raw.agent}${raw.model ? ` (${raw.model})` : \"\"}`);\n console.log(` task: ${raw.taskId}`);\n console.log(` summary: ${raw.summary}`);\n if (raw.findings.length > 0) {\n console.log(\" findings:\");\n for (const finding of raw.findings) {\n console.log(` - [${finding.severity ?? \"info\"}] ${finding.title}`);\n for (const evidence of finding.evidence ?? []) {\n console.log(` evidence: ${evidence}`);\n }\n }\n }\n if (raw.recommendations.length > 0) {\n console.log(\" recommendations:\");\n for (const recommendation of raw.recommendations) {\n console.log(` - ${recommendation}`);\n }\n }\n return;\n }\n\n const combined = await svc.storeRef.getCombined(id);\n if (combined) {\n console.log(`Combined report ${combined.id}`);\n console.log(` sources: ${combined.sources.join(\", \")}`);\n console.log(` reports: ${combined.reportIds.length}`);\n if (combined.pipelineRunId) console.log(` run: ${combined.pipelineRunId}`);\n console.log(` summary: ${combined.summary}`);\n if (combined.findings.length > 0) {\n console.log(\" findings (grouped, duplicates merged):\");\n for (const finding of combined.findings) {\n console.log(\n ` - [${finding.severity ?? \"info\"}] ${finding.title} (x${finding.occurrences}, sources: ${finding.sources.map((s) => s.agent).join(\", \")})`,\n );\n }\n }\n if (combined.recommendations.length > 0) {\n console.log(\" recommendations:\");\n for (const recommendation of combined.recommendations) {\n console.log(` - ${recommendation.text} (x${recommendation.occurrences})`);\n }\n }\n return;\n }\n\n throw new OmniNodeError(\"REPORT_NOT_FOUND\", `Report \"${id}\" was not found in the report store.`);\n });\n}\n","/**\n * Pipeline engine (§14, §15, §27 Phase 5): validates pipeline definitions,\n * schedules steps over their dependency DAG (implicit sequential chain by\n * default, parallel where the DAG allows), fans research steps out to several\n * agents, hands combined context to plan steps (via a chat model) and to the\n * final execution agent. Every task runs through the TaskEngine, so tasks,\n * results and reports are persisted normally.\n */\nimport { randomBytes } from \"node:crypto\";\nimport type { AgentRegistry } from \"../agents/index.js\";\nimport type { AppConfig } from \"../config/index.js\";\nimport { PipelineError } from \"../errors/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport type { RoleRegistry } from \"../roles/index.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport type { RoleDefinition } from \"../types/role.js\";\nimport type {\n PipelineDefinition,\n PipelineRun,\n PipelineRunStatus,\n PipelineStep,\n PipelineStepRun,\n} from \"../types/pipeline.js\";\nimport type { ChatMessage } from \"../types/chat.js\";\nimport type { Plan } from \"../types/plan.js\";\nimport type { Report } from \"../types/report.js\";\nimport type { ReportService } from \"../reports/index.js\";\nimport type { IPlanner } from \"../planner/index.js\";\nimport type { PlanStore } from \"../planner/store.js\";\nimport { HeuristicPlanner } from \"../planner/heuristic.js\";\nimport { ModelPlanner } from \"../planner/model.js\";\nimport type { TaskEngine } from \"../tasks/index.js\";\nimport type { PipelineRunStore } from \"./store.js\";\n\nexport type ChatFn = (modelRef: string, messages: ChatMessage[]) => Promise<string>;\n\nexport interface PipelineEngineOptions {\n tasks: TaskEngine;\n agents: AgentRegistry;\n roles: RoleRegistry;\n providers: AppConfig[\"project\"][\"providers\"];\n store: PipelineRunStore;\n chat?: ChatFn;\n /** Default planner used by plan steps without their own model (§18). */\n planner?: IPlanner;\n /** When present, plans produced by plan steps are persisted. */\n plans?: PlanStore;\n /** When present, finished runs have their reports collected, stored and combined (§16–§17). */\n reports?: ReportService;\n log?: Logger;\n}\n\nexport interface RunPipelineOptions {\n objective?: string;\n onStep?: (stepRun: PipelineStepRun) => void;\n}\n\ninterface StepOutcome {\n status: \"completed\" | \"failed\" | \"skipped\";\n summary: string;\n /** What this step adds to the combined context (defaults to summary). */\n contextContribution?: string;\n taskIds: string[];\n planId?: string;\n error?: string;\n reports: Report[];\n}\n\ninterface StepContext {\n objective: string;\n role?: RoleDefinition;\n combinedContext: string;\n reports: Report[];\n pipelineRunId?: string;\n}\n\nexport class PipelineEngine {\n private readonly log: Logger;\n\n constructor(private readonly options: PipelineEngineOptions) {\n this.log = (options.log ?? logger).child({ component: \"pipelines\" });\n }\n\n get store(): PipelineRunStore {\n return this.options.store;\n }\n\n /** Structural + semantic validation (§27 Phase 5 — pipeline parser). */\n validate(def: PipelineDefinition): void {\n const ids = new Set<string>();\n for (const step of def.steps) {\n if (ids.has(step.id)) {\n throw new PipelineError(\"PIPELINE_INVALID\", `Duplicate step id \"${step.id}\".`);\n }\n ids.add(step.id);\n }\n for (const step of def.steps) {\n for (const dep of step.dependsOn ?? []) {\n if (!ids.has(dep)) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Step \"${step.id}\" depends on unknown step \"${dep}\".`,\n );\n }\n }\n if ((step.kind === \"research\") && (step.agents ?? []).length === 0) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Research step \"${step.id}\" needs at least one agent.`,\n );\n }\n if ((step.kind === \"execute\" || step.kind === \"custom\") && !step.agent) {\n throw new PipelineError(\"PIPELINE_INVALID\", `Step \"${step.id}\" (${step.kind}) needs an agent.`);\n }\n }\n this.assertAcyclic(def);\n }\n\n private assertAcyclic(def: PipelineDefinition): void {\n const deps = this.effectiveDependencies(def);\n const remaining = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n for (const [id, list] of deps) {\n remaining.set(id, list.length);\n for (const d of list) {\n dependents.set(d, [...(dependents.get(d) ?? []), id]);\n }\n }\n const queue = [...deps.keys()].filter((id) => (remaining.get(id) ?? 0) === 0);\n let processed = 0;\n while (queue.length > 0) {\n const id = queue.shift()!;\n processed += 1;\n for (const next of dependents.get(id) ?? []) {\n const left = (remaining.get(next) ?? 0) - 1;\n remaining.set(next, left);\n if (left === 0) queue.push(next);\n }\n }\n if (processed < deps.size) {\n const stuck = [...deps.keys()].filter((id) => (remaining.get(id) ?? 0) > 0);\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Pipeline \"${def.id}\" has a dependency cycle involving: ${stuck.join(\", \")}.`,\n );\n }\n }\n\n /**\n * Steps run sequentially in definition order unless they declare explicit\n * dependencies, which enable parallel branches.\n */\n private effectiveDependencies(def: PipelineDefinition): Map<string, string[]> {\n const deps = new Map<string, string[]>();\n def.steps.forEach((step, index) => {\n const explicit = step.dependsOn ?? [];\n deps.set(\n step.id,\n explicit.length > 0 ? explicit : index > 0 ? [def.steps[index - 1]!.id] : [],\n );\n });\n return deps;\n }\n\n async run(def: PipelineDefinition, options: RunPipelineOptions = {}): Promise<PipelineRun> {\n this.validate(def);\n\n const objective = (options.objective ?? def.objective ?? \"\").trim();\n if (objective.length === 0) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Pipeline \"${def.id}\" needs an objective — pass one or set it in the definition.`,\n );\n }\n const role = def.role ? this.options.roles.get(def.role) : undefined;\n if (def.role && !role) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Role \"${def.role}\" (pipeline \"${def.id}\") is not defined in project.roles.`,\n );\n }\n // Agents referenced by steps must be registered before anything runs.\n for (const step of def.steps) {\n for (const name of [...(step.agents ?? []), ...(step.agent ? [step.agent] : [])]) {\n if (!this.options.agents.get(name)) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Step \"${step.id}\" references unregistered agent \"${name}\".`,\n );\n }\n }\n }\n\n const now = new Date().toISOString();\n const run: PipelineRun = {\n id: `run-${Date.now().toString(36)}-${randomBytes(3).toString(\"hex\")}`,\n pipelineId: def.id,\n status: \"running\",\n startedAt: now,\n stepRuns: [],\n };\n await this.options.store.save(run);\n this.log.info(`Running pipeline ${def.id} as ${run.id}.`);\n\n const deps = this.effectiveDependencies(def);\n const outcomes = new Map<string, StepOutcome>();\n const pending = new Set(def.steps.map((s) => s.id));\n const contextParts: string[] = [];\n const allReports: Report[] = [];\n\n while (pending.size > 0) {\n const ready = def.steps.filter(\n (step) => pending.has(step.id) && (deps.get(step.id) ?? []).every((d) => outcomes.has(d)),\n );\n if (ready.length === 0) {\n // Cycle — already rejected by validate(), but never hang.\n throw new PipelineError(\"PIPELINE_FAILED\", `Pipeline \"${def.id}\" scheduling stalled.`);\n }\n\n const settled = await Promise.all(\n ready.map(async (step): Promise<StepOutcome> => {\n if (!this.shouldRun(step, deps.get(step.id) ?? [], outcomes)) {\n return { status: \"skipped\", summary: \"\", taskIds: [], reports: [] };\n }\n const ctx: StepContext = {\n objective,\n ...(role ? { role } : {}),\n combinedContext: contextParts.join(\"\\n\\n\"),\n reports: [...allReports],\n pipelineRunId: run.id,\n };\n return this.executeStep(step, ctx);\n }),\n );\n\n ready.forEach((step, index) => {\n const outcome = settled[index]!;\n outcomes.set(step.id, outcome);\n pending.delete(step.id);\n allReports.push(...outcome.reports);\n if (outcome.status !== \"skipped\" && outcome.summary.length > 0) {\n const contribution = outcome.contextContribution ?? outcome.summary;\n contextParts.push(`## Step \"${step.id}\" (${step.kind})\\n${contribution}`);\n }\n const stepRun: PipelineStepRun = {\n stepId: step.id,\n status:\n outcome.status === \"skipped\" ? \"cancelled\" : outcome.status === \"failed\" ? \"failed\" : \"completed\",\n ...(outcome.taskIds.length > 0 ? { taskIds: outcome.taskIds } : {}),\n ...(outcome.planId !== undefined ? { planId: outcome.planId } : {}),\n ...(outcome.error !== undefined ? { error: outcome.error } : {}),\n };\n run.stepRuns.push(stepRun);\n options.onStep?.(stepRun);\n });\n run.reports = [...allReports];\n await this.options.store.save(run);\n }\n\n const failed = [...outcomes.values()].some((o) => o.status === \"failed\");\n const finalStatus: PipelineRunStatus = failed ? \"failed\" : \"completed\";\n const planId = [...outcomes.values()].find((o) => o.planId !== undefined)?.planId;\n\n // Report system (§16–§17): collect, store and combine reports from all tasks.\n let combinedReportId: string | undefined;\n if (this.options.reports) {\n const taskIds = [...outcomes.values()].flatMap((o) => o.taskIds);\n const tasks = (\n await Promise.all(taskIds.map((id) => this.options.tasks.get(id)))\n ).filter((task): task is NonNullable<typeof task> => task !== undefined);\n const collected = await this.options.reports.collectFromTasks(tasks);\n await this.options.reports.saveReports(collected);\n const combined = await this.options.reports.generateCombined(collected, {\n objective,\n pipelineRunId: run.id,\n taskIds,\n });\n combinedReportId = combined?.id;\n if (collected.length > 0) {\n run.reports = collected;\n }\n }\n\n const finished: PipelineRun = {\n ...run,\n status: finalStatus,\n finishedAt: new Date().toISOString(),\n ...(run.reports !== undefined && run.reports.length > 0 ? { reports: run.reports } : {}),\n ...(combinedReportId !== undefined ? { combinedReportId } : {}),\n ...(planId !== undefined ? { planId } : {}),\n };\n await this.options.store.save(finished);\n this.log.info(`Pipeline ${def.id} finished: ${finalStatus}.`);\n return finished;\n }\n\n async get(runId: string): Promise<PipelineRun | undefined> {\n return this.options.store.get(runId);\n }\n\n async listRuns(filter?: { pipelineId?: string }): Promise<PipelineRun[]> {\n return this.options.store.list(filter);\n }\n\n private shouldRun(\n step: PipelineStep,\n deps: string[],\n outcomes: Map<string, StepOutcome>,\n ): boolean {\n const condition = step.condition ?? \"on-success\";\n const depStatuses = deps.map((d) => outcomes.get(d)?.status);\n const anyFailed = depStatuses.includes(\"failed\");\n const anySkipped = depStatuses.includes(\"skipped\");\n if (condition === \"always\") return true;\n if (condition === \"on-failure\") return anyFailed;\n return !anyFailed && !anySkipped;\n }\n\n private async executeStep(step: PipelineStep, ctx: StepContext): Promise<StepOutcome> {\n const retries = step.retries ?? 0;\n let last: StepOutcome | undefined;\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n if (attempt > 0) {\n this.log.warn(`Step \"${step.id}\" failed — retry ${attempt}/${retries}.`);\n }\n last = await this.executeStepOnce(step, ctx);\n if (last.status !== \"failed\") return last;\n }\n return last!;\n }\n\n private async executeStepOnce(step: PipelineStep, ctx: StepContext): Promise<StepOutcome> {\n switch (step.kind) {\n case \"research\":\n return this.runFanOut(step, ctx);\n case \"collect\":\n return { status: \"completed\", summary: \"(collect: outputs gathered from previous steps)\", taskIds: [], reports: [] };\n case \"analyze\":\n if (!step.agent) {\n return { status: \"completed\", summary: \"(analyze: pass-through, no agent assigned)\", taskIds: [], reports: [] };\n }\n return this.runSingle(step, ctx, step.agent);\n case \"plan\":\n return this.runPlan(step, ctx);\n case \"execute\":\n case \"custom\":\n return this.runSingle(step, ctx, step.agent!);\n }\n }\n\n /** Research fan-out: one task per agent, in parallel (§15). */\n private async runFanOut(step: PipelineStep, ctx: StepContext): Promise<StepOutcome> {\n const agentNames = step.agents ?? [];\n const created = await Promise.all(\n agentNames.map((name) =>\n this.options.tasks.create({\n objective: ctx.objective,\n agent: name,\n ...(ctx.role ? { role: ctx.role.id } : {}),\n ...(ctx.combinedContext.length > 0\n ? { context: { background: ctx.combinedContext } }\n : {}),\n }),\n ),\n );\n const results = await Promise.all(created.map((task) => this.options.tasks.run(task.id)));\n\n const failedTasks = results.filter((r) => r.status !== \"completed\");\n const lines = results.map((result, index) => {\n const agentName = agentNames[index] ?? \"unknown\";\n const outcome = result.result?.summary ?? result.result?.error ?? \"(no output)\";\n return `- ${agentName}: ${outcome}`;\n });\n const reports = results.flatMap((r) => r.result?.reports ?? []);\n const summary = lines.join(\"\\n\");\n\n if (failedTasks.length > 0) {\n const firstError = failedTasks[0]?.result?.error ?? \"unknown error\";\n return {\n status: \"failed\",\n summary,\n taskIds: created.map((t) => t.id),\n error: `${failedTasks.length}/${results.length} task(s) failed — ${firstError}`,\n reports,\n };\n }\n return { status: \"completed\", summary, taskIds: created.map((t) => t.id), reports };\n }\n\n private async runSingle(\n step: PipelineStep,\n ctx: StepContext,\n agentName: string,\n ): Promise<StepOutcome> {\n const task = await this.options.tasks.create({\n objective: ctx.objective,\n agent: agentName,\n ...(ctx.role ? { role: ctx.role.id } : {}),\n ...(ctx.combinedContext.length > 0 ? { context: { background: ctx.combinedContext } } : {}),\n });\n const result = await this.options.tasks.run(task.id);\n if (result.status !== \"completed\") {\n return {\n status: \"failed\",\n summary: result.result?.summary ?? \"\",\n taskIds: [task.id],\n error: result.result?.error ?? `task ${task.id} did not complete`,\n reports: result.result?.reports ?? [],\n };\n }\n return {\n status: \"completed\",\n summary: result.result?.summary ?? \"(no output)\",\n taskIds: [task.id],\n reports: result.result?.reports ?? [],\n };\n }\n\n private async runPlan(step: PipelineStep, ctx: StepContext): Promise<StepOutcome> {\n const request = {\n objective: ctx.objective,\n reports: ctx.reports,\n ...(ctx.combinedContext.length > 0 ? { context: ctx.combinedContext } : {}),\n ...(ctx.role ? { role: ctx.role } : {}),\n ...(ctx.pipelineRunId !== undefined ? { pipelineRunId: ctx.pipelineRunId } : {}),\n };\n\n // Selection order: an explicit step model wins, then the configured\n // default planner, then a pass-through (nothing to plan with).\n let planner: IPlanner;\n if (step.model) {\n planner = new ModelPlanner({\n model: step.model,\n chat: this.getChat(),\n fallback: new HeuristicPlanner(),\n log: this.log,\n });\n } else if (this.options.planner) {\n planner = this.options.planner;\n } else {\n return {\n status: \"completed\",\n summary: \"(plan: no model or planner configured — skipped)\",\n taskIds: [],\n reports: [],\n };\n }\n\n let plan: Plan;\n try {\n plan = await planner.plan(request);\n } catch (error) {\n return {\n status: \"failed\",\n summary: \"\",\n taskIds: [],\n error: error instanceof Error ? error.message : String(error),\n reports: [],\n };\n }\n\n await this.options.plans?.save(plan);\n return {\n status: \"completed\",\n summary: plan.summary,\n contextContribution: formatPlan(plan),\n taskIds: [],\n planId: plan.id,\n reports: [],\n };\n }\n\n private getChat(): ChatFn {\n if (this.options.chat) return this.options.chat;\n throw new PipelineError(\n \"PIPELINE_FAILED\",\n \"No chat function available — configure a provider for plan steps.\",\n );\n }\n}\n\nfunction formatPlan(plan: Plan): string {\n const lines = [\n `# Implementation Plan (by ${plan.generatedBy})`,\n plan.summary,\n \"Steps:\",\n ...plan.steps.map((step) => {\n const targets = step.targets && step.targets.length > 0 ? ` [targets: ${step.targets.join(\", \")}]` : \"\";\n return `${step.order}. ${step.title}${targets}`;\n }),\n ];\n if (plan.risks && plan.risks.length > 0) {\n lines.push(\"Risks:\", ...plan.risks.map((risk) => `- ${risk}`));\n }\n return lines.join(\"\\n\");\n}\n\n/** Default chat function: resolves \"provider:model\" against the configured providers. */\nexport function createDefaultChatFn(\n providers: AppConfig[\"project\"][\"providers\"],\n): ChatFn {\n return async (modelRef, messages) => {\n const separator = modelRef.indexOf(\":\");\n if (separator <= 0 || separator === modelRef.length - 1) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Invalid model reference \"${modelRef}\". Use \"provider:model-id\".`,\n );\n }\n const providerName = modelRef.slice(0, separator);\n const modelId = modelRef.slice(separator + 1);\n const providerConfig = providers.find((p) => p.name === providerName);\n if (!providerConfig) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Provider \"${providerName}\" (model \"${modelRef}\") is not configured.`,\n );\n }\n const provider = createProvider(providerConfig);\n const response = await provider.chat({ model: modelId, messages });\n return response.content;\n };\n}\n","/**\n * HeuristicPlanner: a deterministic, dependency-free planner that derives an\n * implementation plan directly from recommendations and significant findings.\n * Used as the no-model option and as the graceful fallback when a model's\n * output can't be parsed.\n */\nimport { randomBytes } from \"node:crypto\";\nimport type { Plan, PlanStep } from \"../types/plan.js\";\nimport type { Finding, FindingSeverity } from \"../types/report.js\";\nimport type { IPlanner, PlanRequest } from \"./types.js\";\n\nconst SEVERITY_RANK: Record<FindingSeverity, number> = {\n info: 0,\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\n\nexport class HeuristicPlanner implements IPlanner {\n readonly name = \"heuristic\";\n\n async plan(request: PlanRequest): Promise<Plan> {\n const steps: PlanStep[] = [];\n const findings = request.reports.flatMap((report) =>\n report.findings.map((finding) => ({ finding, agent: report.agent })),\n );\n\n // One step per distinct recommendation (deduped by text).\n const recommendations = dedupe(request.reports.flatMap((r) => r.recommendations));\n for (const [index, text] of recommendations.entries()) {\n steps.push({\n id: `step-${steps.length + 1}`,\n title: truncate(text, 120),\n order: steps.length + 1,\n ...(index > 0 ? { dependsOn: [`step-${steps.length}`] } : {}),\n });\n }\n\n // Remediation steps for significant findings, most severe first.\n const significant = findings\n .filter(({ finding }) => (finding.severity ? SEVERITY_RANK[finding.severity] >= SEVERITY_RANK.high : false))\n .sort((a, b) => SEVERITY_RANK[b.finding.severity ?? \"info\"] - SEVERITY_RANK[a.finding.severity ?? \"info\"]);\n for (const { finding } of significant) {\n steps.push(remediationStep(finding, steps.length + 1));\n }\n\n if (steps.length === 0) {\n steps.push({\n id: \"step-1\",\n title: \"Gather additional information\",\n description:\n \"The research reports contained no actionable recommendations or significant findings. \" +\n \"Investigate the objective further before planning implementation work.\",\n order: 1,\n });\n }\n\n const risks = significant\n .filter(({ finding }) => finding.severity === \"critical\")\n .map(({ finding }) => `Critical finding unaddressed until its step completes: ${finding.title}`);\n\n return {\n id: `plan-${Date.now().toString(36)}-${randomBytes(3).toString(\"hex\")}`,\n objective: request.objective,\n summary:\n `Derived from ${request.reports.length} report(s): ` +\n `${recommendations.length} recommendation step(s), ${significant.length} remediation step(s).`,\n steps,\n ...(risks.length > 0 ? { risks } : {}),\n generatedBy: \"heuristic\",\n ...(request.taskId !== undefined ? { taskId: request.taskId } : {}),\n ...(request.pipelineRunId !== undefined ? { pipelineRunId: request.pipelineRunId } : {}),\n createdAt: new Date().toISOString(),\n };\n }\n}\n\nfunction remediationStep(finding: Finding, order: number): PlanStep {\n return {\n id: `step-${order}`,\n title: `Fix: ${truncate(finding.title, 100)}`,\n description: finding.detail,\n order,\n dependsOn: order > 1 ? [`step-${order - 1}`] : [],\n sourceFindings: [finding.id],\n };\n}\n\nfunction dedupe(texts: string[]): string[] {\n return [...new Set(texts.map((t) => t.trim()).filter((t) => t.length > 0))];\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","/**\n * ModelPlanner (§18): uses a chat model (\"provider:model-id\" through the chat\n * layer) to produce an implementation plan. The model is asked for JSON\n * matching the plan contract; unparseable output degrades gracefully to the\n * heuristic fallback rather than failing the pipeline.\n */\nimport { randomBytes } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { PlannerError } from \"../errors/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport type { Plan, PlanStep } from \"../types/plan.js\";\nimport type { ChatMessage } from \"../types/chat.js\";\nimport type { ChatFn } from \"../pipelines/index.js\";\nimport { buildPlannerContext } from \"./context.js\";\nimport { HeuristicPlanner } from \"./heuristic.js\";\nimport type { IPlanner, PlanRequest } from \"./types.js\";\n\nexport interface ModelPlannerOptions {\n model: string;\n chat: ChatFn;\n /** Extra instruction appended to the system prompt. */\n instruction?: string;\n /** Used when the model output is unparseable (or the call fails, if tolerateErrors). */\n fallback?: IPlanner;\n log?: Logger;\n}\n\nconst planStepJsonSchema = z\n .object({\n id: z.string().optional(),\n title: z.string().min(1),\n description: z.string().optional(),\n order: z.number().int().optional(),\n targets: z.array(z.string()).optional(),\n acceptance_criteria: z.array(z.string()).optional(),\n depends_on: z.array(z.string()).optional(),\n source_findings: z.array(z.string()).optional(),\n })\n .strict();\n\nconst planJsonSchema = z\n .object({\n summary: z.string().min(1),\n steps: z.array(planStepJsonSchema).min(1),\n risks: z.array(z.string()).optional(),\n notes: z.array(z.string()).optional(),\n })\n .strict();\n\nexport class ModelPlanner implements IPlanner {\n readonly name = \"model\";\n private readonly log: Logger;\n\n constructor(private readonly options: ModelPlannerOptions) {\n this.log = (options.log ?? logger).child({ component: \"planner\", model: options.model });\n }\n\n async plan(request: PlanRequest): Promise<Plan> {\n const context = buildPlannerContext(request);\n const messages: ChatMessage[] = [\n {\n role: \"system\",\n content:\n \"You are the OmniNode planner. Given the objective and the combined research context, \" +\n \"produce a final analysis and a prioritized, actionable implementation plan. \" +\n \"Respond with JSON ONLY (no prose, no code fences) matching exactly this shape: \" +\n '{\"summary\": string, \"steps\": [{\"id\": string, \"title\": string, \"description\": string, ' +\n '\"order\": number, \"targets\": string[], \"acceptance_criteria\": string[], \"source_findings\": string[]}], ' +\n '\"risks\": string[], \"notes\": string[]}. ' +\n (this.options.instruction ?? \"\"),\n },\n { role: \"user\", content: context },\n ];\n\n let responseText: string;\n try {\n responseText = await this.options.chat(this.options.model, messages);\n } catch (error) {\n return this.degrade(request, `planner model call failed: ${describe(error)}`);\n }\n\n const parsed = parsePlanJson(responseText);\n if (!parsed) {\n return this.degrade(request, \"planner model output was not valid plan JSON\");\n }\n\n const plan: Plan = {\n id: `plan-${Date.now().toString(36)}-${randomBytes(3).toString(\"hex\")}`,\n objective: request.objective,\n summary: parsed.summary,\n steps: parsed.steps,\n ...(parsed.risks !== undefined ? { risks: parsed.risks } : {}),\n ...(parsed.notes !== undefined ? { notes: parsed.notes } : {}),\n generatedBy: `model:${this.options.model}`,\n model: this.options.model,\n ...(request.taskId !== undefined ? { taskId: request.taskId } : {}),\n ...(request.pipelineRunId !== undefined ? { pipelineRunId: request.pipelineRunId } : {}),\n createdAt: new Date().toISOString(),\n };\n return plan;\n }\n\n private async degrade(request: PlanRequest, reason: string): Promise<Plan> {\n if (this.options.fallback) {\n this.log.warn(`${reason} — using the heuristic fallback planner.`);\n return this.options.fallback.plan(request);\n }\n throw new PlannerError(\"PLANNER_FAILED\", `Planner failed: ${reason}.`);\n }\n}\n\n/** Extracts and validates the plan JSON from arbitrary model output. */\nexport function parsePlanJson(\n text: string,\n): { summary: string; steps: PlanStep[]; risks?: string[]; notes?: string[] } | undefined {\n const unfenced = text.replace(/```(?:json)?/gi, \"\");\n const start = unfenced.indexOf(\"{\");\n const end = unfenced.lastIndexOf(\"}\");\n if (start < 0 || end <= start) return undefined;\n try {\n const json: unknown = JSON.parse(unfenced.slice(start, end + 1));\n const parsed = planJsonSchema.safeParse(json);\n if (!parsed.success) return undefined;\n\n const steps: PlanStep[] = parsed.data.steps.map((step, index) => ({\n id: step.id ?? `step-${index + 1}`,\n title: step.title,\n description: step.description,\n order: step.order ?? index + 1,\n targets: step.targets,\n acceptanceCriteria: step.acceptance_criteria,\n dependsOn: step.depends_on,\n sourceFindings: step.source_findings,\n }));\n return {\n summary: parsed.data.summary,\n steps: steps.sort((a, b) => a.order - b.order),\n risks: parsed.data.risks,\n notes: parsed.data.notes,\n };\n } catch {\n return undefined;\n }\n}\n\nfunction describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * Planner context builder (§18): assembles everything the planner needs —\n * the objective, the combined findings from the AI reports (with source\n * attribution), relevant memory and the role definition — into one\n * structured text.\n */\nimport type { PlanRequest } from \"./types.js\";\nimport type { Report } from \"../types/report.js\";\n\nexport function buildPlannerContext(request: PlanRequest): string {\n const parts: string[] = [`# Objective\\n${request.objective}`];\n\n if (request.role) {\n const roleLines = [`# Role\\n${request.role.name} (${request.role.id})`];\n if (request.role.responsibilities.length > 0) {\n roleLines.push(\"Responsibilities:\", ...request.role.responsibilities.map((r) => `- ${r}`));\n }\n if (request.role.expectedOutputs.length > 0) {\n roleLines.push(\"Expected outputs:\", ...request.role.expectedOutputs.map((o) => `- ${o}`));\n }\n parts.push(roleLines.join(\"\\n\"));\n }\n\n if (request.reports.length > 0) {\n const agents = [...new Set(request.reports.map((r) => r.agent))].join(\", \");\n const findingLines = request.reports.flatMap((report: Report) =>\n report.findings.map(\n (finding) =>\n `- [${finding.severity ?? \"info\"}] ${finding.title} (source: ${report.agent}, finding: ${finding.id})` +\n (finding.detail ? ` — ${finding.detail}` : \"\"),\n ),\n );\n parts.push(\n `# Findings (${request.reports.length} report(s) by ${agents})\\n` +\n (findingLines.length > 0 ? findingLines.join(\"\\n\") : \"(no findings reported)\"),\n );\n\n const recommendationLines = request.reports.flatMap((report) =>\n report.recommendations.map((text) => `- ${text} (source: ${report.agent})`),\n );\n if (recommendationLines.length > 0) {\n parts.push(`# Recommendations\\n${recommendationLines.join(\"\\n\")}`);\n }\n\n const summaryLines = request.reports.map((report) => `- [${report.agent}] ${report.summary}`);\n parts.push(`# Report summaries\\n${summaryLines.join(\"\\n\")}`);\n }\n\n if (request.memory && request.memory.length > 0) {\n parts.push(\n `# Relevant memory\\n` +\n request.memory.map((entry) => `- [${entry.scope}] ${entry.content}`).join(\"\\n\"),\n );\n }\n\n if (request.context && request.context.length > 0) {\n parts.push(`# Research context\\n${request.context}`);\n }\n\n return parts.join(\"\\n\\n\");\n}\n","/**\n * Pipeline run persistence (§27 Phase 5 — pipeline state). Same\n * replaceable-store pattern as the task store, local-first JSON file.\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { PipelineRun, PipelineRunStatus } from \"../types/pipeline.js\";\n\nexport interface PipelineRunFilter {\n pipelineId?: string;\n status?: PipelineRunStatus;\n}\n\nexport interface PipelineRunStore {\n save(run: PipelineRun): Promise<void>;\n get(id: string): Promise<PipelineRun | undefined>;\n list(filter?: PipelineRunFilter): Promise<PipelineRun[]>;\n}\n\nexport class FilePipelineRunStore implements PipelineRunStore {\n private readonly filePath: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(directory = `${process.cwd()}/.omninode`) {\n this.filePath = `${directory}/pipelines.json`;\n }\n\n async save(run: PipelineRun): Promise<void> {\n return this.synchronized(async () => {\n const runs = await this.load();\n const index = runs.findIndex((r) => r.id === run.id);\n if (index >= 0) runs[index] = run;\n else runs.push(run);\n await this.write(runs);\n });\n }\n\n async get(id: string): Promise<PipelineRun | undefined> {\n return this.synchronized(async () => {\n const runs = await this.load();\n return runs.find((r) => r.id === id);\n });\n }\n\n async list(filter: PipelineRunFilter = {}): Promise<PipelineRun[]> {\n return this.synchronized(async () => {\n const runs = await this.load();\n return runs\n .filter((run) => (filter.pipelineId ? run.pipelineId === filter.pipelineId : true))\n .filter((run) => (filter.status ? run.status === filter.status : true))\n .sort((a, b) => (a.startedAt ?? \"\").localeCompare(b.startedAt ?? \"\"));\n });\n }\n\n private synchronized<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async load(): Promise<PipelineRun[]> {\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as PipelineRun[]) : [];\n } catch {\n return [];\n }\n }\n\n private async write(runs: PipelineRun[]): Promise<void> {\n const tmp = `${this.filePath}.tmp`;\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(tmp, `${JSON.stringify(runs, null, 2)}\\n`, \"utf8\");\n await rename(tmp, this.filePath);\n }\n}\n","/**\n * Plan persistence (§27 Phase 8 — planner result storage). Same\n * replaceable-store pattern as the other local stores.\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { Plan } from \"../types/plan.js\";\n\nexport interface PlanFilter {\n pipelineRunId?: string;\n taskId?: string;\n}\n\nexport interface PlanStore {\n save(plan: Plan): Promise<void>;\n get(id: string): Promise<Plan | undefined>;\n list(filter?: PlanFilter): Promise<Plan[]>;\n}\n\nexport class FilePlanStore implements PlanStore {\n private readonly filePath: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(directory = `${process.cwd()}/.omninode`) {\n this.filePath = `${directory}/plans.json`;\n }\n\n async save(plan: Plan): Promise<void> {\n return this.synchronized(async () => {\n const plans = await this.load();\n const index = plans.findIndex((p) => p.id === plan.id);\n if (index >= 0) plans[index] = plan;\n else plans.push(plan);\n await this.write(plans);\n });\n }\n\n async get(id: string): Promise<Plan | undefined> {\n return this.synchronized(async () => {\n const plans = await this.load();\n return plans.find((p) => p.id === id);\n });\n }\n\n async list(filter: PlanFilter = {}): Promise<Plan[]> {\n return this.synchronized(async () => {\n const plans = await this.load();\n return plans\n .filter((plan) => (filter.pipelineRunId ? plan.pipelineRunId === filter.pipelineRunId : true))\n .filter((plan) => (filter.taskId ? plan.taskId === filter.taskId : true))\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n });\n }\n\n private synchronized<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async load(): Promise<Plan[]> {\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as Plan[]) : [];\n } catch {\n return [];\n }\n }\n\n private async write(plans: Plan[]): Promise<void> {\n const tmp = `${this.filePath}.tmp`;\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(tmp, `${JSON.stringify(plans, null, 2)}\\n`, \"utf8\");\n await rename(tmp, this.filePath);\n }\n}\n","/** Planner factory from project configuration (§18 — planner provider support). */\nimport { ConfigError } from \"../errors/index.js\";\nimport type { AppConfig } from \"../config/index.js\";\nimport type { ChatFn } from \"../pipelines/index.js\";\nimport { HeuristicPlanner } from \"./heuristic.js\";\nimport { ModelPlanner } from \"./model.js\";\nimport type { IPlanner } from \"./types.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\n\nexport function buildPlanner(\n plannerConfig: AppConfig[\"project\"][\"planner\"],\n chat: ChatFn,\n log: Logger = logger,\n): IPlanner | undefined {\n if (!plannerConfig) return undefined;\n if (plannerConfig.kind === \"heuristic\") {\n return new HeuristicPlanner();\n }\n if (!plannerConfig.model) {\n throw new ConfigError(\n \"CONFIG_INVALID\",\n 'Planner kind \"model\" needs a model reference (\"provider:model-id\") in omninode.yaml.',\n );\n }\n return new ModelPlanner({\n model: plannerConfig.model,\n chat,\n ...(plannerConfig.instruction !== undefined ? { instruction: plannerConfig.instruction } : {}),\n fallback: new HeuristicPlanner(),\n log,\n });\n}\n","import type { AppConfig } from \"../config/index.js\";\nimport { buildAgentRegistry } from \"../agents/index.js\";\nimport { createMemoryProvider, MemoryService } from \"../memory/index.js\";\nimport { buildPlanner } from \"../planner/index.js\";\nimport { FilePlanStore } from \"../planner/store.js\";\nimport { buildRoleRegistry } from \"../roles/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport { ReportService } from \"../reports/index.js\";\nimport { FileReportStore } from \"../reports/store.js\";\nimport { TaskEngine } from \"../tasks/index.js\";\nimport { FileTaskStore } from \"../tasks/store.js\";\nimport { PipelineEngine, createDefaultChatFn } from \"./engine.js\";\nimport { FilePipelineRunStore } from \"./store.js\";\n\nexport function buildPipelineEngine(config: AppConfig, log: Logger = logger): PipelineEngine {\n const agents = buildAgentRegistry(config, log);\n const roles = buildRoleRegistry(config);\n const chat = createDefaultChatFn(config.project.providers);\n const tasks = new TaskEngine({\n agents,\n roles,\n store: new FileTaskStore(),\n ...(config.project.memory !== undefined\n ? { memory: new MemoryService(createMemoryProvider(config.project.memory), log) }\n : {}),\n log,\n });\n return new PipelineEngine({\n tasks,\n agents,\n roles,\n providers: config.project.providers,\n store: new FilePipelineRunStore(),\n chat,\n ...(config.project.planner !== undefined\n ? { planner: buildPlanner(config.project.planner, chat, log) }\n : {}),\n plans: new FilePlanStore(),\n reports: new ReportService(new FileReportStore(), log),\n log,\n });\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { PipelineError } from \"../../errors/index.js\";\nimport { buildPipelineEngine } from \"../../pipelines/index.js\";\nimport type { PipelineDefinition } from \"../../types/pipeline.js\";\n\nexport function registerPipelineCommands(program: Command): void {\n const pipeline = program\n .command(\"pipeline\")\n .description(\"Run multi-step AI pipelines defined in omninode.yaml (§14).\");\n\n pipeline\n .command(\"list\")\n .description(\"List configured pipelines.\")\n .action(async () => {\n const config = loadConfig();\n const pipelines = config.project.pipelines;\n if (pipelines.length === 0) {\n console.log(\"No pipelines configured. Add one under `project.pipelines` in omninode.yaml.\");\n return;\n }\n for (const def of pipelines) {\n const name = def.name ? ` ${def.name}` : \"\";\n console.log(`${def.id}${name} ${def.steps.length} step(s)`);\n }\n });\n\n pipeline\n .command(\"run <id> [objective]\")\n .description(\n \"Run a pipeline. The objective argument overrides the definition's default objective.\",\n )\n .action(async (id: string, objective: string | undefined) => {\n const config = loadConfig();\n const def = findPipeline(config, id);\n const engine = buildPipelineEngine(config);\n console.log(\n `Running pipeline \"${def.id}\" (${def.steps.length} step(s))${objective ? ` — \"${objective}\"` : \"\"}...`,\n );\n const finished = await engine.run(def, {\n ...(objective !== undefined ? { objective } : {}),\n onStep: (stepRun) => {\n const suffix = stepRun.error ? ` — ${stepRun.error}` : \"\";\n console.log(` [${stepRun.stepId}] ${stepRun.status}${suffix}`);\n },\n });\n if (finished.reports && finished.reports.length > 0) {\n console.log(` reports: ${finished.reports.length} structured report(s)`);\n }\n if (finished.combinedReportId) {\n console.log(` combined report: ${finished.combinedReportId}`);\n }\n if (finished.planId) {\n console.log(` plan: ${finished.planId}`);\n }\n console.log(`Pipeline ${finished.status}. Run id: ${finished.id}`);\n if (finished.status !== \"completed\") process.exitCode = 1;\n });\n\n pipeline\n .command(\"runs <id>\")\n .description(\"List recorded runs of a pipeline.\")\n .action(async (id: string) => {\n const config = loadConfig();\n const engine = buildPipelineEngine(config);\n const runs = await engine.listRuns({ pipelineId: id });\n if (runs.length === 0) {\n console.log(`No recorded runs for pipeline \"${id}\".`);\n return;\n }\n for (const run of runs) {\n console.log(`${run.id} ${run.status.padEnd(10)} ${run.startedAt ?? \"?\"}`);\n }\n });\n\n pipeline\n .command(\"status <run-id>\")\n .description(\"Show the recorded state of a pipeline run.\")\n .action(async (runId: string) => {\n const config = loadConfig();\n const engine = buildPipelineEngine(config);\n const run = await engine.get(runId);\n if (!run) {\n throw new PipelineError(\n \"PIPELINE_NOT_FOUND\",\n `Pipeline run \"${runId}\" does not exist in this project's run store.`,\n );\n }\n console.log(` id: ${run.id}`);\n console.log(` pipeline: ${run.pipelineId}`);\n console.log(` status: ${run.status}`);\n console.log(` started: ${run.startedAt ?? \"?\"}`);\n if (run.finishedAt) console.log(` finished: ${run.finishedAt}`);\n for (const stepRun of run.stepRuns) {\n console.log(` [${stepRun.stepId}] ${stepRun.status}`);\n }\n if (run.reports && run.reports.length > 0) {\n console.log(` reports: ${run.reports.length}`);\n }\n });\n}\n\nfunction findPipeline(config: ReturnType<typeof loadConfig>, id: string): PipelineDefinition {\n const def = config.project.pipelines.find((p) => p.id === id);\n if (!def) {\n const available = config.project.pipelines.map((p) => p.id).join(\", \") || \"(none)\";\n throw new PipelineError(\n \"PIPELINE_NOT_FOUND\",\n `Pipeline \"${id}\" is not configured. Configured pipelines: ${available}.`,\n );\n }\n return def;\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { createMemoryProvider, MemoryService } from \"../../memory/index.js\";\nimport { truncate } from \"./shared.js\";\n\nexport function registerMemoryCommands(program: Command): void {\n const memory = program\n .command(\"memory\")\n .description(\"Inspect and manage persistent project memory (§19–§20).\");\n\n memory\n .command(\"status\")\n .description(\"Show the active memory provider and how much is stored.\")\n .action(async () => {\n const config = loadConfig();\n const configured = config.project.memory?.provider ?? \"local (default — add a `memory:` section to opt in)\";\n const svc = new MemoryService(createMemoryProvider(config.project.memory));\n const entries = await svc.providerRef.query({ limit: 10_000 });\n console.log(`provider: ${configured}`);\n console.log(`entries: ${entries.length}`);\n const scopes = new Map<string, number>();\n for (const entry of entries) {\n scopes.set(entry.scope, (scopes.get(entry.scope) ?? 0) + 1);\n }\n for (const [scope, count] of [...scopes.entries()].sort()) {\n console.log(` ${scope}: ${count}`);\n }\n });\n\n memory\n .command(\"query <text>\")\n .description(\"Search memory for entries relevant to the text.\")\n .option(\"-s, --scope <scope>\", \"Restrict to a scope: project, task, role or knowledge.\")\n .option(\"-n, --limit <count>\", \"Maximum entries to return.\", (value: string) => Number(value), 10)\n .action(async (text: string, options: { scope?: string; limit: number }) => {\n const config = loadConfig();\n const svc = new MemoryService(createMemoryProvider(config.project.memory));\n const entries = await svc.providerRef.query({\n text,\n ...(options.scope !== undefined ? { scope: options.scope as \"project\" | \"task\" | \"role\" | \"knowledge\" } : {}),\n limit: options.limit,\n });\n if (entries.length === 0) {\n console.log(\"No relevant memory found.\");\n return;\n }\n for (const entry of entries) {\n console.log(`[${entry.scope}] ${entry.key}`);\n console.log(` ${truncate(entry.content.replace(/\\n/g, \" \"), 120)}`);\n }\n });\n\n memory\n .command(\"write <text>\")\n .description(\"Write an entry to memory.\")\n .option(\"-s, --scope <scope>\", \"Memory scope: project, task, role or knowledge.\", \"project\")\n .option(\"-t, --tags <tags>\", \"Comma-separated tags.\", (value: string) =>\n value.split(\",\").map((tag) => tag.trim()).filter((tag) => tag.length > 0),\n )\n .option(\"-k, --key <key>\", \"Entry key (defaults to a generated note key).\")\n .action(async (text: string, options: { scope: string; tags?: string[]; key?: string }) => {\n const config = loadConfig();\n const svc = new MemoryService(createMemoryProvider(config.project.memory));\n const key = options.key ?? `note:${Date.now().toString(36)}`;\n await svc.providerRef.write({\n key,\n scope: options.scope as \"project\" | \"task\" | \"role\" | \"knowledge\",\n content: text,\n ...(options.tags !== undefined && options.tags.length > 0 ? { tags: options.tags } : {}),\n });\n console.log(`Stored memory entry \"${key}\" (${options.scope}).`);\n });\n}\n","import type { Command } from \"commander\";\nimport { OmniNodeError } from \"../../errors/index.js\";\nimport { FilePlanStore } from \"../../planner/store.js\";\nimport { truncate } from \"./shared.js\";\n\nexport function registerPlanCommands(program: Command): void {\n const plan = program\n .command(\"plan\")\n .description(\"Inspect implementation plans produced by the planner layer (§18).\");\n\n plan\n .command(\"list\")\n .description(\"List stored plans.\")\n .option(\"--run <pipelineRunId>\", \"Only plans for this pipeline run.\")\n .action(async (options: { run?: string }) => {\n const store = new FilePlanStore();\n const plans = await store.list({\n ...(options.run !== undefined ? { pipelineRunId: options.run } : {}),\n });\n if (plans.length === 0) {\n console.log(\"No plans stored yet. Run a pipeline with a plan step to generate one.\");\n return;\n }\n for (const p of plans) {\n console.log(`${p.id} ${p.steps.length} step(s) by ${p.generatedBy} ${truncate(p.summary, 50)}`);\n }\n });\n\n plan\n .command(\"show <id>\")\n .description(\"Show a stored implementation plan in full.\")\n .action(async (id: string) => {\n const store = new FilePlanStore();\n const found = await store.get(id);\n if (!found) {\n throw new OmniNodeError(\"PLAN_INVALID\", `Plan \"${id}\" was not found in the plan store.`, {\n details: { id },\n });\n }\n console.log(`Plan ${found.id}`);\n console.log(` objective: ${found.objective}`);\n console.log(` by: ${found.generatedBy}`);\n console.log(` summary: ${found.summary}`);\n console.log(\" steps:\");\n for (const step of [...found.steps].sort((a, b) => a.order - b.order)) {\n const targets = step.targets && step.targets.length > 0 ? ` [${step.targets.join(\", \")}]` : \"\";\n console.log(` ${step.order}. ${step.title}${targets}`);\n if (step.description) console.log(` ${truncate(step.description, 100)}`);\n for (const criterion of step.acceptanceCriteria ?? []) {\n console.log(` accept: ${criterion}`);\n }\n }\n if (found.risks && found.risks.length > 0) {\n console.log(\" risks:\");\n for (const risk of found.risks) {\n console.log(` - ${risk}`);\n }\n }\n });\n}\n"],"mappings":"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","names":["existsSync","existsSync","entry","readFileSync","writeFileSync","readFileSync","writeFileSync","provider","DEFAULT_TIMEOUT_MS","trimmed","agent","role","mkdir","readFile","rename","writeFile","dirname","entry","entry","entry","truncate","randomBytes","truncate","truncate","mkdir","readFile","rename","writeFile","dirname","entry","randomBytes","randomBytes","SEVERITY_RANK","truncate","randomBytes","z","entry","z","randomBytes","run","randomBytes","mkdir","readFile","rename","writeFile","dirname","run","mkdir","readFile","rename","writeFile","dirname","run","entry"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/version.ts","../../src/errors/index.ts","../../src/cli/commands/init.ts","../../src/config/schema.ts","../../src/config/loader.ts","../../src/config/default.ts","../../src/cli/commands/project.ts","../../src/providers/auth.ts","../../src/providers/http.ts","../../src/logger/index.ts","../../src/providers/openai-compatible/index.ts","../../src/providers/omnihilbras/index.ts","../../src/providers/factory.ts","../../src/registry/index.ts","../../src/cli/commands/shared.ts","../../src/cli/commands/providers.ts","../../src/cli/commands/models.ts","../../src/agents/process/index.ts","../../src/agents/registry.ts","../../src/agents/factory.ts","../../src/cli/commands/agents.ts","../../src/cli/commands/roles.ts","../../src/tasks/store.ts","../../src/tasks/engine.ts","../../src/memory/local.ts","../../src/memory/remembera.ts","../../src/memory/factory.ts","../../src/memory/service.ts","../../src/roles/index.ts","../../src/tasks/engine-factory.ts","../../src/cli/commands/tasks.ts","../../src/reports/aggregate.ts","../../src/reports/extract.ts","../../src/reports/service.ts","../../src/reports/store.ts","../../src/cli/commands/reports.ts","../../src/pipelines/engine.ts","../../src/planner/heuristic.ts","../../src/planner/model.ts","../../src/planner/context.ts","../../src/pipelines/store.ts","../../src/planner/store.ts","../../src/planner/factory.ts","../../src/pipelines/engine-factory.ts","../../src/cli/commands/pipelines.ts","../../src/cli/commands/memory.ts","../../src/cli/commands/plan.ts","../../src/cli/commands/status.ts"],"sourcesContent":["import { pathToFileURL } from \"node:url\";\nimport { realpathSync } from \"node:fs\";\nimport { Command } from \"commander\";\nimport { OMNINODE_VERSION } from \"../version.js\";\nimport { isOmniNodeError } from \"../errors/index.js\";\nimport { registerInitCommand } from \"./commands/init.js\";\nimport { registerProjectCommands } from \"./commands/project.js\";\nimport { registerProviderCommands } from \"./commands/providers.js\";\nimport { registerModelsCommand } from \"./commands/models.js\";\nimport { registerAgentCommands } from \"./commands/agents.js\";\nimport { registerRoleCommands } from \"./commands/roles.js\";\nimport { registerTaskCommands } from \"./commands/tasks.js\";\nimport { registerReportCommands } from \"./commands/reports.js\";\nimport { registerPipelineCommands, registerRunAlias } from \"./commands/pipelines.js\";\nimport { registerMemoryCommands } from \"./commands/memory.js\";\nimport { registerPlanCommands } from \"./commands/plan.js\";\nimport { registerStatusCommand } from \"./commands/status.js\";\n\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"omninode\")\n .description(\n \"Provider-agnostic multi-AI orchestration platform: coordinate CLI agents, \" +\n \"AI providers, memory, roles, reports and planning in one execution system.\",\n )\n .version(OMNINODE_VERSION, \"-v, --version\", \"Print the OmniNode version.\");\n\n registerInitCommand(program);\n registerProjectCommands(program);\n registerProviderCommands(program);\n registerAgentCommands(program);\n registerRoleCommands(program);\n registerTaskCommands(program);\n registerReportCommands(program);\n registerModelsCommand(program);\n registerPipelineCommands(program);\n registerMemoryCommands(program);\n registerPlanCommands(program);\n registerStatusCommand(program);\n registerRunAlias(program);\n\n return program;\n}\n\nexport async function run(argv: string[]): Promise<void> {\n const program = createProgram();\n try {\n await program.parseAsync(argv);\n } catch (error) {\n handleError(error);\n }\n}\n\nexport function handleError(error: unknown): never {\n if (isOmniNodeError(error)) {\n console.error(`error: [${error.code}] ${error.message}`);\n if (error.details !== undefined) {\n console.error(JSON.stringify(error.details, null, 2));\n }\n process.exit(1);\n }\n console.error(error instanceof Error ? error.message : String(error));\n process.exit(1);\n}\n\nconst entry = process.argv[1]\n ? pathToFileURL(realpathSync(process.argv[1])).href\n : \"\";\nif (import.meta.url === entry) {\n run(process.argv).catch((error) => handleError(error));\n}\n","export const OMNINODE_VERSION = \"0.10.0\";\n","/** Typed error hierarchy shared across the whole codebase (§4.1 — error model). */\n\nexport type OmniNodeErrorCode =\n | \"CONFIG_NOT_FOUND\"\n | \"CONFIG_INVALID\"\n | \"PROVIDER_NOT_FOUND\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\"\n | \"AGENT_NOT_FOUND\"\n | \"AGENT_FAILED\"\n | \"AGENT_TIMEOUT\"\n | \"TASK_INVALID\"\n | \"TASK_NOT_FOUND\"\n | \"TASK_FAILED\"\n | \"PIPELINE_NOT_FOUND\"\n | \"PIPELINE_INVALID\"\n | \"PIPELINE_FAILED\"\n | \"PLANNER_FAILED\"\n | \"PLAN_INVALID\"\n | \"PROTOCOL_VIOLATION\"\n | \"MEMORY_UNAVAILABLE\"\n | \"REPORT_NOT_FOUND\"\n | \"NOT_IMPLEMENTED\"\n | \"CLI_USAGE\"\n | \"INTERNAL\";\n\nexport interface OmniNodeErrorOptions {\n cause?: unknown;\n details?: Record<string, unknown>;\n}\n\nexport class OmniNodeError extends Error {\n readonly code: OmniNodeErrorCode;\n readonly details?: Record<string, unknown>;\n\n constructor(code: OmniNodeErrorCode, message: string, options: OmniNodeErrorOptions = {}) {\n super(message, { cause: options.cause });\n this.name = new.target.name;\n this.code = code;\n this.details = options.details;\n }\n}\n\nexport class ConfigError extends OmniNodeError {\n constructor(\n code: \"CONFIG_NOT_FOUND\" | \"CONFIG_INVALID\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class ProviderError extends OmniNodeError {\n constructor(\n code:\n | \"PROVIDER_NOT_FOUND\"\n | \"PROVIDER_UNAVAILABLE\"\n | \"PROVIDER_AUTH_FAILED\"\n | \"MODEL_NOT_FOUND\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class AgentError extends OmniNodeError {\n constructor(\n code: \"AGENT_NOT_FOUND\" | \"AGENT_FAILED\" | \"AGENT_TIMEOUT\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class TaskError extends OmniNodeError {\n constructor(\n code: \"TASK_INVALID\" | \"TASK_NOT_FOUND\" | \"TASK_FAILED\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class PipelineError extends OmniNodeError {\n constructor(\n code: \"PIPELINE_NOT_FOUND\" | \"PIPELINE_INVALID\" | \"PIPELINE_FAILED\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class ProtocolError extends OmniNodeError {\n constructor(message: string, options: OmniNodeErrorOptions = {}) {\n super(\"PROTOCOL_VIOLATION\", message, options);\n }\n}\n\nexport class PlannerError extends OmniNodeError {\n constructor(\n code: \"PLANNER_FAILED\" | \"PLAN_INVALID\",\n message: string,\n options: OmniNodeErrorOptions = {},\n ) {\n super(code, message, options);\n }\n}\n\nexport class MemoryError extends OmniNodeError {\n constructor(message: string, options: OmniNodeErrorOptions = {}) {\n super(\"MEMORY_UNAVAILABLE\", message, options);\n }\n}\n\nexport function isOmniNodeError(value: unknown): value is OmniNodeError {\n return value instanceof OmniNodeError;\n}\n","import { existsSync, writeFileSync } from \"node:fs\";\nimport type { Command } from \"commander\";\nimport { OmniNodeError } from \"../../errors/index.js\";\nimport { defaultProjectConfigYaml } from \"../../config/index.js\";\n\nexport async function runInit(options: { force?: boolean; name?: string }): Promise<void> {\n const target = `${process.cwd()}/omninode.yaml`;\n if (!options.force && existsSync(target)) {\n throw new OmniNodeError(\n \"CLI_USAGE\",\n `${target} already exists. Use --force to overwrite it.`,\n );\n }\n writeFileSync(target, defaultProjectConfigYaml(options.name), \"utf8\");\n console.log(`Created ${target}`);\n console.log(\"\\nNext steps:\");\n console.log(\" 1. Add a provider under `project.providers` (see omninode.yaml.example).\");\n console.log(\" 2. Register CLI agents under `project.agents`.\");\n console.log(\" 3. Run `omninode provider list` to validate the configuration.\");\n}\n\nexport function registerInitCommand(program: Command): void {\n program\n .command(\"init\")\n .description(\"Create an omninode.yaml project configuration in the current directory.\")\n .option(\"-f, --force\", \"Overwrite an existing omninode.yaml.\")\n .option(\"-n, --name <name>\", \"Project name to write into the configuration.\", \"My Project\")\n .action(async (options: { force?: boolean; name: string }) => runInit(options));\n}\n","/**\n * Configuration schema. The project file (omninode.yaml) uses snake_case keys\n * as shown in DEVELOPMENT_PLAN.md §7 and §23; the loader maps them onto the\n * camelCase TypeScript contracts in src/types.\n */\nimport { z } from \"zod\";\n\nexport const providerConfigSchema = z\n .object({\n name: z.string().min(1),\n type: z.enum([\"openai-compatible\", \"omnihilbras\", \"openrouter\", \"local\", \"custom\"]),\n base_url: z.string().url(),\n api_key_env_var: z.string().min(1).optional(),\n headers: z.record(z.string()).optional(),\n enabled: z.boolean().optional(),\n metadata: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const agentConfigSchema = z\n .object({\n name: z.string().min(1),\n /** \"cli\" agents communicate over stdin/stdout (process adapter). */\n type: z.enum([\"cli\", \"native\", \"process\"]).default(\"cli\"),\n command: z.string().min(1).optional(),\n args: z.array(z.string()).optional(),\n cwd: z.string().optional(),\n env: z.record(z.string()).optional(),\n input_mode: z.enum([\"stdin\", \"arg\", \"protocol\"]).default(\"stdin\"),\n timeout_ms: z.number().int().positive().optional(),\n metadata: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const roleConfigSchema = z\n .object({\n id: z\n .string()\n .min(1)\n .regex(/^[a-z0-9][a-z0-9-]*$/, \"role id must be kebab-case\"),\n name: z.string().min(1),\n description: z.string().optional(),\n responsibilities: z.array(z.string()).default([]),\n expected_outputs: z.array(z.string()).default([]),\n preferred_agents: z.array(z.string()).optional(),\n system_prompt: z.string().optional(),\n metadata: z.record(z.unknown()).optional(),\n })\n .strict();\n\nexport const pipelineStepConfigSchema = z\n .object({\n id: z.string().min(1),\n kind: z.enum([\"research\", \"collect\", \"analyze\", \"plan\", \"execute\", \"custom\"]),\n agents: z.array(z.string()).optional(),\n agent: z.string().optional(),\n model: z.string().optional(),\n depends_on: z.array(z.string()).optional(),\n retries: z.number().int().min(0).max(10).optional(),\n condition: z.enum([\"always\", \"on-success\", \"on-failure\"]).optional(),\n })\n .strict();\n\nexport const pipelineConfigSchema = z\n .object({\n id: z\n .string()\n .min(1)\n .regex(/^[a-z0-9][a-z0-9-]*$/, \"pipeline id must be kebab-case\"),\n name: z.string().optional(),\n objective: z.string().optional(),\n role: z.string().optional(),\n steps: z.array(pipelineStepConfigSchema).min(1),\n })\n .strict();\n\nexport const plannerConfigSchema = z\n .object({\n kind: z.enum([\"model\", \"heuristic\"]).default(\"model\"),\n model: z.string().optional(),\n instruction: z.string().optional(),\n })\n .strict();\n\nexport const projectConfigSchema = z\n .object({\n name: z.string().min(1),\n providers: z.array(providerConfigSchema).default([]),\n agents: z.array(agentConfigSchema).default([]),\n roles: z.array(roleConfigSchema).default([]),\n pipelines: z.array(pipelineConfigSchema).default([]),\n planner: plannerConfigSchema.optional(),\n memory: z\n .object({\n provider: z.string().min(1).default(\"local\"),\n base_url: z.string().url().optional(),\n api_key_env_var: z.string().min(1).optional(),\n })\n .strict()\n .optional(),\n })\n .strict();\n\nexport const appConfigSchema = z\n .object({\n project: projectConfigSchema,\n logging: z\n .object({ level: z.enum([\"debug\", \"info\", \"warn\", \"error\"]) })\n .strict()\n .optional(),\n })\n .strict();\n\nexport type ProviderConfigYaml = z.infer<typeof providerConfigSchema>;\nexport type AgentConfigYaml = z.infer<typeof agentConfigSchema>;\nexport type RoleConfigYaml = z.infer<typeof roleConfigSchema>;\nexport type PipelineConfigYaml = z.infer<typeof pipelineConfigSchema>;\nexport type PipelineStepConfigYaml = z.infer<typeof pipelineStepConfigSchema>;\nexport type PlannerConfigYaml = z.infer<typeof plannerConfigSchema>;\nexport type ProjectConfigYaml = z.infer<typeof projectConfigSchema>;\nexport type AppConfigYaml = z.infer<typeof appConfigSchema>;\n","/**\n * Configuration loader: discovers omninode.yaml, expands ${ENV_VAR}\n * references (so credentials never live in project files, §24), validates it\n * and maps it onto the core TypeScript contracts.\n */\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { parse as parseYaml } from \"yaml\";\nimport { ConfigError } from \"../errors/index.js\";\nimport type { AgentConfig, AgentIntegrationType } from \"../types/agent.js\";\nimport type { ProviderConfig } from \"../types/provider.js\";\nimport type { RoleDefinition } from \"../types/role.js\";\nimport type { LogLevel } from \"../logger/index.js\";\nimport { appConfigSchema } from \"./schema.js\";\nimport type { AgentConfigYaml, PipelineConfigYaml, ProviderConfigYaml, RoleConfigYaml } from \"./schema.js\";\nimport type { PipelineDefinition } from \"../types/pipeline.js\";\n\nconst CONFIG_FILENAMES = [\"omninode.yaml\", \"omninode.yml\", \"omninode.json\"];\n\nexport interface AppConfig {\n project: {\n name: string;\n providers: ProviderConfig[];\n agents: AgentConfig[];\n roles: RoleDefinition[];\n pipelines: PipelineDefinition[];\n planner?: {\n kind: \"model\" | \"heuristic\";\n model?: string;\n instruction?: string;\n };\n memory?: {\n provider: string;\n baseUrl?: string;\n apiKeyEnvVar?: string;\n };\n };\n logging?: {\n level: LogLevel;\n };\n}\n\nexport interface LoadConfigOptions {\n /** Explicit path; otherwise omninode.yaml/yml/json is looked up in the given directory. */\n path?: string;\n directory?: string;\n /** Environment used for ${VAR} expansion; defaults to process.env. */\n env?: Record<string, string | undefined>;\n}\n\nexport function findConfigFile(directory = process.cwd()): string | undefined {\n for (const filename of CONFIG_FILENAMES) {\n const candidate = `${directory}/${filename}`;\n if (existsSync(candidate)) return candidate;\n }\n return undefined;\n}\n\n/**\n * Replaces ${VAR} and ${VAR:-fallback} references. Unset variables without a\n * fallback abort loading: a half-resolved config could silently misroute\n * authentication.\n */\nexport function expandEnvRefs(\n text: string,\n env: Record<string, string | undefined>,\n source = \"config\",\n): string {\n return text.replace(\n /\\$\\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\\}/g,\n (_match, name: string, fallback?: string) => {\n const value = env[name] ?? fallback;\n if (value === undefined) {\n throw new ConfigError(\n \"CONFIG_INVALID\",\n `Environment variable \"${name}\" is referenced in ${source} but is not set and has no default.`,\n );\n }\n return value;\n },\n );\n}\n\nexport function loadConfig(options: LoadConfigOptions = {}): AppConfig {\n const env = options.env ?? process.env;\n const path = options.path ?? (options.directory ? findConfigFile(options.directory) : findConfigFile());\n if (!path) {\n throw new ConfigError(\n \"CONFIG_NOT_FOUND\",\n \"No omninode.yaml found. Run `omninode init` to create one, or pass an explicit path.\",\n );\n }\n\n const raw = readFileSync(path, \"utf8\");\n const expanded = expandEnvRefs(raw, env, path);\n\n let data: unknown;\n try {\n data = parseYaml(expanded);\n } catch (error) {\n throw new ConfigError(\"CONFIG_INVALID\", `Failed to parse ${path}.`, { cause: error });\n }\n\n const parsed = appConfigSchema.safeParse(data);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((issue) => {\n const location = issue.path.length > 0 ? issue.path.join(\".\") : \"(root)\";\n return `${location}: ${issue.message}`;\n });\n throw new ConfigError(\"CONFIG_INVALID\", `Invalid configuration in ${path}.`, {\n details: { issues },\n });\n }\n\n return toAppConfig(parsed.data);\n}\n\nfunction toAppConfig(yaml: ReturnType<typeof appConfigSchema.parse>): AppConfig {\n return {\n project: {\n name: yaml.project.name,\n providers: yaml.project.providers.map(toProviderConfig),\n agents: yaml.project.agents.map(toAgentConfig),\n roles: yaml.project.roles.map(toRoleDefinition),\n pipelines: yaml.project.pipelines.map(toPipelineDefinition),\n ...(yaml.project.planner !== undefined\n ? {\n planner: {\n kind: yaml.project.planner.kind,\n model: yaml.project.planner.model,\n instruction: yaml.project.planner.instruction,\n },\n }\n : {}),\n ...(yaml.project.memory !== undefined\n ? {\n memory: {\n provider: yaml.project.memory.provider,\n baseUrl: yaml.project.memory.base_url,\n apiKeyEnvVar: yaml.project.memory.api_key_env_var,\n },\n }\n : {}),\n },\n ...(yaml.logging !== undefined ? { logging: yaml.logging } : {}),\n };\n}\n\nfunction toPipelineDefinition(raw: PipelineConfigYaml): PipelineDefinition {\n return {\n id: raw.id,\n name: raw.name,\n objective: raw.objective,\n role: raw.role,\n steps: raw.steps.map((step) => ({\n id: step.id,\n kind: step.kind,\n agents: step.agents,\n agent: step.agent,\n model: step.model,\n dependsOn: step.depends_on,\n retries: step.retries,\n condition: step.condition,\n })),\n };\n}\n\nfunction toProviderConfig(raw: ProviderConfigYaml): ProviderConfig {\n return {\n name: raw.name,\n type: raw.type,\n baseUrl: raw.base_url,\n apiKeyEnvVar: raw.api_key_env_var,\n headers: raw.headers,\n enabled: raw.enabled,\n metadata: raw.metadata,\n };\n}\n\nfunction toAgentConfig(raw: AgentConfigYaml): AgentConfig {\n const integration: AgentIntegrationType =\n raw.type === \"native\" ? \"native\" : \"process\";\n return {\n name: raw.name,\n integration,\n command: raw.command,\n args: raw.args,\n cwd: raw.cwd,\n env: raw.env,\n inputMode: raw.input_mode,\n timeoutMs: raw.timeout_ms,\n metadata: raw.metadata,\n };\n}\n\nfunction toRoleDefinition(raw: RoleConfigYaml): RoleDefinition {\n return {\n id: raw.id,\n name: raw.name,\n description: raw.description,\n responsibilities: raw.responsibilities,\n expectedOutputs: raw.expected_outputs,\n preferredAgents: raw.preferred_agents,\n systemPrompt: raw.system_prompt,\n metadata: raw.metadata,\n };\n}\n\n","/** Template written by `omninode init` (§22, §23). */\n\nexport function defaultProjectConfigYaml(projectName = \"My Project\"): string {\n return `project:\n name: ${projectName}\n\n # Providers connect OmniNode to AI model gateways (Phase 1+).\n # Credentials are referenced by environment variable, never stored in this file.\n providers: []\n # - name: my-gateway\n # type: openai-compatible\n # base_url: https://example.com/v1\n # api_key_env_var: MY_API_KEY\n\n # CLI agents registered with OmniNode (Phase 3 wires them up).\n agents: []\n # - name: opencode\n # type: cli\n # command: opencode\n\n # Roles describe what an AI is supposed to do (Phase 4).\n roles: []\n # - id: architecture-reviewer\n # name: Architecture Reviewer\n # responsibilities:\n # - architecture analysis\n # expected_outputs:\n # - findings\n # - recommendations\n\n # Memory is optional; Remembera is the preferred integration (Phase 7).\n # memory:\n # provider: remembera\n`;\n}\n","import type { Command } from \"commander\";\nimport { runInit } from \"./init.js\";\n\nexport function registerProjectCommands(program: Command): void {\n const project = program\n .command(\"project\")\n .description(\"Project-level operations.\");\n\n project\n .command(\"init\")\n .description(\"Alias of `omninode init`.\")\n .option(\"-f, --force\", \"Overwrite an existing omninode.yaml.\")\n .option(\"-n, --name <name>\", \"Project name to write into the configuration.\", \"My Project\")\n .action(async (options: { force?: boolean; name: string }) => runInit(options));\n}\n","/**\n * Authentication resolution (§24): API keys live in the environment and are\n * referenced from configuration by variable name — never stored in files.\n */\nimport { ProviderError } from \"../errors/index.js\";\n// AuthRef is structurally satisfied by ProviderConfig.\n\n/** Minimal provider identity — any config object with a name and optional env var reference. */\nexport interface AuthRef {\n name: string;\n apiKeyEnvVar?: string;\n headers?: Record<string, string>;\n}\n\nexport function resolveApiKey(\n config: AuthRef,\n env: Record<string, string | undefined> = process.env,\n): string | undefined {\n if (!config.apiKeyEnvVar) return undefined;\n const value = env[config.apiKeyEnvVar];\n if (!value) {\n throw new ProviderError(\n \"PROVIDER_AUTH_FAILED\",\n `Environment variable \"${config.apiKeyEnvVar}\" (referenced by provider \"${config.name}\") is not set.`,\n );\n }\n return value;\n}\n\nexport function authHeaders(\n config: AuthRef,\n env: Record<string, string | undefined> = process.env,\n): Record<string, string> {\n const key = resolveApiKey(config, env);\n const base = { ...(config.headers ?? {}) };\n return key ? { ...base, authorization: `Bearer ${key}` } : base;\n}\n","/**\n * Thin JSON HTTP layer over global fetch. HTTP error statuses are returned to\n * the caller, not thrown — provider methods interpret them; only transport\n * failures (network, timeout, unparseable body) throw.\n */\nimport { ProviderError } from \"../errors/index.js\";\n\nexport interface HttpRequestOptions {\n method?: \"GET\" | \"POST\";\n headers?: Record<string, string>;\n body?: unknown;\n timeoutMs?: number;\n}\n\nexport interface HttpResponse {\n status: number;\n body: unknown;\n}\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport async function requestJson(\n url: string,\n options: HttpRequestOptions = {},\n): Promise<HttpResponse> {\n const { method = \"GET\", headers = {}, body, timeoutMs = DEFAULT_TIMEOUT_MS } = options;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers: {\n accept: \"application/json\",\n ...(body !== undefined ? { \"content-type\": \"application/json\" } : {}),\n ...headers,\n },\n ...(body !== undefined ? { body: JSON.stringify(body) } : {}),\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (error) {\n const reason =\n error instanceof Error && error.name === \"TimeoutError\"\n ? `timed out after ${timeoutMs}ms`\n : error instanceof Error\n ? error.message\n : String(error);\n throw new ProviderError(\"PROVIDER_UNAVAILABLE\", `Request to ${url} failed: ${reason}.`, {\n cause: error,\n });\n }\n\n let parsed: unknown;\n try {\n parsed = await response.json();\n } catch (error) {\n throw new ProviderError(\"PROVIDER_UNAVAILABLE\", `Response from ${url} was not valid JSON.`, {\n cause: error,\n details: { status: response.status },\n });\n }\n\n return { status: response.status, body: parsed };\n}\n","/** Leveled logger with a pluggable sink and child loggers (§4.1 — logging). */\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport interface LogSink {\n write(level: LogLevel, line: string): void;\n}\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n};\n\nexport interface WritableLike {\n write(chunk: string): unknown;\n}\n\nexport class ConsoleLogSink implements LogSink {\n constructor(private readonly stream: WritableLike = process.stderr) {}\n\n write(_level: LogLevel, line: string): void {\n this.stream.write(line + \"\\n\");\n }\n}\n\nexport interface LoggerOptions {\n level?: LogLevel;\n sink?: LogSink;\n /** Structured fields attached to every line, e.g. { component: \"config\" }. */\n context?: Record<string, unknown>;\n}\n\nexport class Logger {\n private readonly level: LogLevel;\n private readonly sink: LogSink;\n private readonly context: Record<string, unknown>;\n\n constructor(options: LoggerOptions = {}) {\n this.level = options.level ?? \"info\";\n this.sink = options.sink ?? new ConsoleLogSink();\n this.context = options.context ?? {};\n }\n\n child(context: Record<string, unknown>): Logger {\n return new Logger({\n level: this.level,\n sink: this.sink,\n context: { ...this.context, ...context },\n });\n }\n\n debug(message: string, data?: Record<string, unknown>): void {\n this.log(\"debug\", message, data);\n }\n\n info(message: string, data?: Record<string, unknown>): void {\n this.log(\"info\", message, data);\n }\n\n warn(message: string, data?: Record<string, unknown>): void {\n this.log(\"warn\", message, data);\n }\n\n error(message: string, data?: Record<string, unknown>): void {\n this.log(\"error\", message, data);\n }\n\n private log(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n if (LEVEL_ORDER[level] < LEVEL_ORDER[this.level]) return;\n const parts = [new Date().toISOString(), level.toUpperCase(), message];\n const merged = { ...this.context, ...data };\n if (Object.keys(merged).length > 0) {\n parts.push(JSON.stringify(merged));\n }\n this.sink.write(level, parts.join(\" \"));\n }\n}\n\n/** Default application logger. Writes to stderr so stdout stays clean for CLI output. */\nexport const logger = new Logger();\n","/**\n * OpenAI-compatible provider adapter (§5, §7): works with OpenAI, OpenRouter,\n * local runtimes (Ollama/LM Studio/vLLM) and custom gateways that expose the\n * /models and /chat/completions endpoints.\n */\nimport { ProviderError } from \"../../errors/index.js\";\nimport { logger, type Logger } from \"../../logger/index.js\";\nimport type { ChatRequest, ChatResponse } from \"../../types/chat.js\";\nimport type { ModelInfo } from \"../../types/model.js\";\nimport type { IChatProvider, ProviderConfig, ProviderStatus } from \"../../types/provider.js\";\nimport { authHeaders } from \"../auth.js\";\nimport { requestJson } from \"../http.js\";\n\ninterface OpenAIModelEntry {\n id?: unknown;\n owned_by?: unknown;\n created?: unknown;\n}\n\ninterface OpenAIChatResponse {\n model?: unknown;\n choices?: unknown;\n usage?: unknown;\n}\n\nexport class OpenAICompatibleProvider implements IChatProvider {\n readonly config: ProviderConfig;\n private readonly log: Logger;\n\n constructor(config: ProviderConfig, log: Logger = logger) {\n this.config = { ...config, baseUrl: normalizeBaseUrl(config.baseUrl) };\n this.log = log.child({ provider: config.name });\n }\n\n async listModels(): Promise<ModelInfo[]> {\n const { status, body } = await requestJson(`${this.config.baseUrl}/models`, {\n headers: authHeaders(this.config),\n });\n if (status === 401 || status === 403) {\n throw authFailed(this.config, status);\n }\n if (status !== 200) {\n throw unavailable(this.config, `Model discovery returned HTTP ${status}.`, status);\n }\n\n const entries = extractModelEntries(body, this.config);\n const models: ModelInfo[] = [];\n let skipped = 0;\n for (const entry of entries) {\n if (typeof entry.id !== \"string\" || entry.id.length === 0) {\n skipped += 1;\n continue;\n }\n models.push({\n provider: this.config.name,\n id: entry.id,\n displayName: entry.id,\n status: \"available\",\n metadata: {\n ...(typeof entry.owned_by === \"string\" ? { ownedBy: entry.owned_by } : {}),\n ...(typeof entry.created === \"number\" ? { createdAt: entry.created } : {}),\n },\n });\n }\n if (skipped > 0) {\n this.log.warn(`Skipped ${skipped} model entr(y/ies) without a valid id.`);\n }\n return models;\n }\n\n async healthCheck(): Promise<ProviderStatus> {\n const lastCheckedAt = new Date().toISOString();\n try {\n const started = Date.now();\n const models = await this.listModels();\n return {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: \"healthy\",\n connected: true,\n modelCount: models.length,\n lastCheckedAt,\n message: `Discovered ${models.length} model(s) in ${Date.now() - started}ms.`,\n };\n } catch (error) {\n return {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: inferHealth(error),\n connected: false,\n modelCount: 0,\n lastCheckedAt,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async chat(request: ChatRequest): Promise<ChatResponse> {\n const { status, body } = await requestJson(`${this.config.baseUrl}/chat/completions`, {\n method: \"POST\",\n headers: authHeaders(this.config),\n body: {\n model: request.model,\n messages: request.messages,\n ...(request.temperature !== undefined ? { temperature: request.temperature } : {}),\n ...(request.maxTokens !== undefined ? { max_tokens: request.maxTokens } : {}),\n ...(request.stop !== undefined ? { stop: request.stop } : {}),\n },\n });\n\n if (status === 401 || status === 403) throw authFailed(this.config, status);\n if (status === 404) {\n throw new ProviderError(\n \"MODEL_NOT_FOUND\",\n `Model \"${request.model}\" or the chat endpoint was not found on provider \"${this.config.name}\" (HTTP 404).`,\n { details: { status } },\n );\n }\n if (status !== 200) {\n throw unavailable(this.config, `Chat completion returned HTTP ${status}.`, status);\n }\n\n const payload = body as OpenAIChatResponse;\n const choices = Array.isArray(payload.choices) ? payload.choices : [];\n const first = choices[0] as { message?: { content?: unknown }; finish_reason?: unknown } | undefined;\n if (!first || typeof first.message?.content !== \"string\") {\n throw unavailable(this.config, \"Chat completion response had no message content.\", status);\n }\n\n const usage = (payload.usage ?? {}) as {\n prompt_tokens?: unknown;\n completion_tokens?: unknown;\n total_tokens?: unknown;\n };\n\n return {\n model: typeof payload.model === \"string\" ? payload.model : request.model,\n content: first.message.content,\n finishReason: typeof first.finish_reason === \"string\" ? first.finish_reason : undefined,\n usage: {\n promptTokens: typeof usage.prompt_tokens === \"number\" ? usage.prompt_tokens : undefined,\n completionTokens:\n typeof usage.completion_tokens === \"number\" ? usage.completion_tokens : undefined,\n totalTokens: typeof usage.total_tokens === \"number\" ? usage.total_tokens : undefined,\n },\n raw: body,\n };\n }\n}\n\nfunction normalizeBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nfunction extractModelEntries(body: unknown, config: ProviderConfig): OpenAIModelEntry[] {\n if (Array.isArray(body)) return body as OpenAIModelEntry[];\n if (body !== null && typeof body === \"object\" && Array.isArray((body as { data?: unknown }).data)) {\n return (body as { data: OpenAIModelEntry[] }).data;\n }\n throw new ProviderError(\n \"PROVIDER_UNAVAILABLE\",\n `Provider \"${config.name}\" returned an unrecognized model list shape.`,\n { details: { endpoint: \"models\" } },\n );\n}\n\nfunction authFailed(config: ProviderConfig, status: number): ProviderError {\n const envHint = config.apiKeyEnvVar\n ? ` Check that $${config.apiKeyEnvVar} is set and valid.`\n : \" The provider requires authentication; configure api_key_env_var for it.\";\n return new ProviderError(\n \"PROVIDER_AUTH_FAILED\",\n `Authentication with provider \"${config.name}\" failed (HTTP ${status}).${envHint}`,\n { details: { status } },\n );\n}\n\nfunction unavailable(config: ProviderConfig, message: string, status: number): ProviderError {\n return new ProviderError(\"PROVIDER_UNAVAILABLE\", `Provider \"${config.name}\": ${message}`, {\n details: { status },\n });\n}\n\nfunction inferHealth(error: unknown): \"degraded\" | \"unreachable\" {\n const status =\n error instanceof ProviderError && typeof error.details?.status === \"number\"\n ? error.details.status\n : undefined;\n return status !== undefined && status >= 500 ? \"degraded\" : \"unreachable\";\n}\n","/**\n * OmniHilbras provider adapter (§6, Phase 2).\n *\n * OmniHilbras is one provider source among many — always optional (§2: the\n * core runs with zero Hilbras dependencies). The gateway exposes an\n * OpenAI-compatible API surface, so this adapter rides the OpenAI-compatible\n * transport and implements the plan's connect flow on top of it:\n *\n * Connect → Authenticate → Fetch Models → Validate Models → Register\n */\nimport { resolveApiKey } from \"../auth.js\";\nimport { OpenAICompatibleProvider } from \"../openai-compatible/index.js\";\nimport type { ModelRegistry } from \"../../registry/index.js\";\nimport type { ModelInfo } from \"../../types/model.js\";\nimport type { ProviderStatus } from \"../../types/provider.js\";\n\nexport interface OmniHilbrasConnectionResult {\n status: ProviderStatus;\n /** Validated, deduplicated models — registered when a registry was given. */\n models: ModelInfo[];\n /** Model ids that appeared more than once in the gateway's list. */\n duplicates: string[];\n /** Number of models written into the registry (0 when no registry given). */\n registered: number;\n}\n\nexport class OmniHilbrasProvider extends OpenAICompatibleProvider {\n /**\n * Run the full connect flow. Throws on authentication or transport failure\n * (use healthCheck() for a non-throwing probe).\n */\n async connect(registry?: ModelRegistry): Promise<OmniHilbrasConnectionResult> {\n // Authenticate — throws PROVIDER_AUTH_FAILED when the referenced env var is unset.\n const apiKey = resolveApiKey(this.config);\n\n // Fetch models — throws on transport errors and non-2xx responses.\n const discovered = await this.listModels();\n\n // Validate — deduplicate ids, annotate gateway metadata, force availability.\n const seen = new Set<string>();\n const models: ModelInfo[] = [];\n const duplicates: string[] = [];\n for (const model of discovered) {\n if (seen.has(model.id)) {\n duplicates.push(model.id);\n continue;\n }\n seen.add(model.id);\n models.push({\n ...model,\n provider: this.config.name,\n status: \"available\",\n metadata: { ...model.metadata, gateway: \"omnihilbras\" },\n });\n }\n\n // Register.\n if (registry) {\n for (const model of models) registry.register(model);\n }\n\n const message =\n `Authenticated${apiKey ? \" with API key\" : \" (no API key configured)\"}; ` +\n `validated ${models.length} unique model(s)` +\n (duplicates.length > 0 ? `, skipped ${duplicates.length} duplicate(s)` : \"\") +\n \".\";\n\n const status: ProviderStatus = {\n name: this.config.name,\n type: this.config.type,\n baseUrl: this.config.baseUrl,\n health: \"healthy\",\n connected: true,\n modelCount: models.length,\n lastCheckedAt: new Date().toISOString(),\n message,\n };\n\n return { status, models, duplicates, registered: registry ? models.length : 0 };\n }\n}\n","/**\n * Provider factory: builds adapter instances from configuration (§5, §7).\n * Custom and local gateways ride the OpenAI-compatible adapter unless a\n * dedicated one exists.\n */\nimport { OmniNodeError } from \"../errors/index.js\";\nimport type { IChatProvider, ProviderConfig, ProviderType } from \"../types/provider.js\";\nimport { OmniHilbrasProvider } from \"./omnihilbras/index.js\";\nimport { OpenAICompatibleProvider } from \"./openai-compatible/index.js\";\n\n/** Provider types served by the OpenAI-compatible adapter. */\nexport const OPENAI_COMPATIBLE_TYPES: readonly ProviderType[] = [\n \"openai-compatible\",\n \"openrouter\",\n \"local\",\n \"custom\",\n];\n\nexport function createProvider(config: ProviderConfig): IChatProvider {\n if (config.type === \"omnihilbras\") {\n return new OmniHilbrasProvider(config);\n }\n if (OPENAI_COMPATIBLE_TYPES.includes(config.type)) {\n return new OpenAICompatibleProvider(config);\n }\n throw new OmniNodeError(\"NOT_IMPLEMENTED\", `Provider type \"${config.type}\" has no adapter yet.`);\n}\n","/**\n * Normalized model registry (§8): aggregates models discovered from all\n * configured providers under \"provider:model\" keys.\n */\nimport type { ModelCapabilities, ModelInfo } from \"../types/model.js\";\nimport type { IProvider } from \"../types/provider.js\";\n\nexport interface ModelFilter {\n provider?: string;\n capability?: keyof ModelCapabilities;\n}\n\nexport interface DiscoveryResult {\n provider: string;\n models: ModelInfo[];\n error?: Error;\n}\n\nexport function registryKey(provider: string, id: string): string {\n return `${provider}:${id}`;\n}\n\nexport class ModelRegistry {\n private readonly models = new Map<string, ModelInfo>();\n\n register(model: ModelInfo): void {\n this.models.set(registryKey(model.provider, model.id), model);\n }\n\n get(provider: string, id: string): ModelInfo | undefined {\n return this.models.get(registryKey(provider, id));\n }\n\n list(filter: ModelFilter = {}): ModelInfo[] {\n return [...this.models.values()]\n .filter((model) => (filter.provider ? model.provider === filter.provider : true))\n .filter((model) =>\n filter.capability ? model.capabilities?.[filter.capability] === true : true,\n )\n .sort((a, b) => a.provider.localeCompare(b.provider) || a.id.localeCompare(b.id));\n }\n\n /** Availability validation (§27 Phase 1): present in the registry and not retired. */\n isAvailable(provider: string, id: string): boolean {\n const model = this.get(provider, id);\n return model !== undefined && (model.status ?? \"available\") === \"available\";\n }\n\n /** Discover models from one provider and register them. */\n async discoverFrom(provider: IProvider): Promise<ModelInfo[]> {\n const discovered = await provider.listModels();\n for (const model of discovered) this.register(model);\n return discovered;\n }\n\n /** Discover from many providers; a failing provider does not abort the rest. */\n async discoverAll(providers: IProvider[]): Promise<DiscoveryResult[]> {\n return Promise.all(\n providers.map(async (provider) => {\n try {\n return {\n provider: provider.config.name,\n models: await this.discoverFrom(provider),\n };\n } catch (error) {\n return {\n provider: provider.config.name,\n models: [],\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }),\n );\n }\n}\n","import { readFileSync, writeFileSync } from \"node:fs\";\nimport { parseDocument } from \"yaml\";\nimport { appConfigSchema, findConfigFile } from \"../../config/index.js\";\nimport { ConfigError, OmniNodeError } from \"../../errors/index.js\";\n\n/** Shared helper for commands whose phase has not landed yet. */\nexport function notImplemented(command: string, when: string): OmniNodeError {\n return new OmniNodeError(\n \"NOT_IMPLEMENTED\",\n `${command} is planned for ${when}. Edit omninode.yaml directly for now.`,\n );\n}\n\nexport function truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\n/**\n * Appends an item to a list in omninode.yaml, preserving comments and\n * formatting, and validates the resulting document before writing.\n * Returns the config path that was edited.\n */\nexport function appendToConfigList(listKey: \"providers\" | \"agents\", item: unknown): string {\n const configPath = findConfigFile();\n if (!configPath) {\n throw new OmniNodeError(\"CONFIG_NOT_FOUND\", \"No omninode.yaml found. Run `omninode init` first.\");\n }\n\n // Edit as a YAML document so existing comments and formatting survive.\n const doc = parseDocument(readFileSync(configPath, \"utf8\"));\n if (doc.getIn([\"project\", listKey]) === undefined) {\n doc.setIn([\"project\", listKey], [item]);\n } else {\n doc.addIn([\"project\", listKey], item);\n }\n\n const validated = appConfigSchema.safeParse(doc.toJS());\n if (!validated.success) {\n const issues = validated.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n throw new ConfigError(\n \"CONFIG_INVALID\",\n `Editing ${configPath} would produce an invalid configuration: ${issues}`,\n );\n }\n\n writeFileSync(configPath, doc.toString(), \"utf8\");\n return configPath;\n}\n","import type { Command } from \"commander\";\nimport { findConfigFile, loadConfig, providerConfigSchema } from \"../../config/index.js\";\nimport { OmniNodeError, ProviderError } from \"../../errors/index.js\";\nimport { createProvider, OmniHilbrasProvider } from \"../../providers/index.js\";\nimport { ModelRegistry } from \"../../registry/index.js\";\nimport type { ProviderStatus } from \"../../types/provider.js\";\nimport { appendToConfigList, notImplemented } from \"./shared.js\";\n\ninterface AddProviderOptions {\n name: string;\n baseUrl: string;\n type: string;\n apiKeyEnvVar?: string;\n}\n\nexport function registerProviderCommands(program: Command): void {\n const provider = program\n .command(\"provider\")\n .description(\"Manage AI providers configured in omninode.yaml.\");\n\n provider\n .command(\"list\")\n .description(\"List configured providers.\")\n .action(async () => {\n const config = loadConfig();\n const providers = config.project.providers;\n if (providers.length === 0) {\n console.log(\n \"No providers configured. Add one with `omninode provider add` or edit omninode.yaml.\",\n );\n return;\n }\n for (const provider of providers) {\n const key = provider.apiKeyEnvVar ? `$${provider.apiKeyEnvVar}` : \"none\";\n const enabled = provider.enabled === false ? \" (disabled)\" : \"\";\n console.log(\n `${provider.name} type=${provider.type} base_url=${provider.baseUrl} key=${key}${enabled}`,\n );\n }\n });\n\n provider\n .command(\"add\")\n .description(\n \"Add a provider to omninode.yaml. OpenAI-compatible gateways (including OpenRouter \" +\n \"and local runtimes) are supported today; OmniHilbras gets its own adapter in Phase 2.\",\n )\n .requiredOption(\"--name <name>\", \"Unique provider name used in configuration and the model registry.\")\n .requiredOption(\"--base-url <url>\", \"Provider base URL, e.g. https://example.com/v1\")\n .option(\n \"--type <type>\",\n \"Provider type: openai-compatible, omnihilbras, openrouter, local or custom.\",\n \"openai-compatible\",\n )\n .option(\n \"--api-key-env-var <envVar>\",\n \"Environment variable holding the API key. Keys are never written to the config file.\",\n )\n .action(async (options: AddProviderOptions) => addProvider(options));\n\n provider\n .command(\"test <name>\")\n .description(\"Test connectivity, authentication and model discovery for a configured provider.\")\n .option(\n \"--connect\",\n \"Run the full provider connect flow (authenticate, fetch, validate, register) where the adapter supports it.\",\n )\n .action(async (name: string, options: { connect?: boolean }) => testProvider(name, options));\n\n provider\n .command(\"remove <name>\")\n .description(\"Remove a provider (planned for Phase 1 follow-up).\")\n .action(() => {\n throw notImplemented(\"omninode provider remove\", \"a Phase 1 follow-up\");\n });\n}\n\nexport async function addProvider(options: AddProviderOptions): Promise<void> {\n const configPath = findConfigFile();\n if (!configPath) {\n throw new OmniNodeError(\"CONFIG_NOT_FOUND\", \"No omninode.yaml found. Run `omninode init` first.\");\n }\n\n const candidate = providerConfigSchema.safeParse({\n name: options.name,\n type: options.type,\n base_url: options.baseUrl,\n ...(options.apiKeyEnvVar !== undefined ? { api_key_env_var: options.apiKeyEnvVar } : {}),\n });\n if (!candidate.success) {\n const issues = candidate.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n throw new OmniNodeError(\"CLI_USAGE\", `Invalid provider options: ${issues}`);\n }\n const newProvider = candidate.data;\n\n // Existing name check happens before the document is edited.\n const existing = loadConfig();\n if (existing.project.providers.some((p) => p.name === newProvider.name)) {\n throw new OmniNodeError(\n \"CLI_USAGE\",\n `Provider \"${newProvider.name}\" already exists in ${findConfigFile() ?? \"omninode.yaml\"}.`,\n );\n }\n\n const writtenPath = appendToConfigList(\"providers\", newProvider);\n console.log(`Added provider \"${newProvider.name}\" (${newProvider.type}) to ${writtenPath}.`);\n if (newProvider.api_key_env_var) {\n console.log(\n `Set $${newProvider.api_key_env_var} in your environment, then run: omninode provider test ${newProvider.name}`,\n );\n } else {\n console.log(`Run \\`omninode provider test ${newProvider.name}\\` to verify connectivity.`);\n }\n}\n\nexport async function testProvider(\n name: string,\n options: { connect?: boolean } = {},\n): Promise<void> {\n const config = loadConfig();\n const providerConfig = config.project.providers.find((p) => p.name === name);\n if (!providerConfig) {\n const available = config.project.providers.map((p) => p.name).join(\", \") || \"(none)\";\n throw new ProviderError(\n \"PROVIDER_NOT_FOUND\",\n `Provider \"${name}\" is not configured. Configured providers: ${available}.`,\n );\n }\n\n const provider = createProvider(providerConfig);\n console.log(`Testing provider \"${name}\" (${providerConfig.type}) at ${provider.config.baseUrl}`);\n\n if (options.connect && provider instanceof OmniHilbrasProvider) {\n const registry = new ModelRegistry();\n try {\n const result = await provider.connect(registry);\n printProviderStatus(result.status);\n console.log(` registered: ${result.registered}`);\n } catch (error) {\n console.log(` connect failed: ${error instanceof Error ? error.message : String(error)}`);\n process.exitCode = 1;\n }\n return;\n }\n\n const health = await provider.healthCheck();\n printProviderStatus(health);\n if (!health.connected) process.exitCode = 1;\n}\n\nfunction printProviderStatus(status: ProviderStatus): void {\n console.log(` health: ${status.health}`);\n console.log(` connected: ${status.connected}`);\n console.log(` models: ${status.modelCount}`);\n if (status.message) console.log(` detail: ${status.message}`);\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { OmniNodeError } from \"../../errors/index.js\";\nimport { createProvider } from \"../../providers/index.js\";\nimport { ModelRegistry } from \"../../registry/index.js\";\nimport type { ModelCapabilities } from \"../../types/model.js\";\n\nconst CAPABILITIES: readonly (keyof ModelCapabilities)[] = [\n \"chat\",\n \"coding\",\n \"tools\",\n \"vision\",\n \"embeddings\",\n];\n\nexport function registerModelsCommand(program: Command): void {\n program\n .command(\"models\")\n .description(\"Discover and list models from configured providers (model registry, §8).\")\n .argument(\"[provider]\", \"Only discover from this provider.\")\n .option(\"-c, --capability <capability>\", `Filter by capability: ${CAPABILITIES.join(\", \")}.`)\n .action(async (providerName: string | undefined, options: { capability?: string }) => {\n const capability = options.capability as keyof ModelCapabilities | undefined;\n if (capability !== undefined && !CAPABILITIES.includes(capability)) {\n throw new OmniNodeError(\n \"CLI_USAGE\",\n `Unknown capability \"${options.capability}\". Valid capabilities: ${CAPABILITIES.join(\", \")}.`,\n );\n }\n\n const config = loadConfig();\n const selected = config.project.providers.filter((p) =>\n providerName ? p.name === providerName : true,\n );\n if (selected.length === 0) {\n throw new OmniNodeError(\n \"PROVIDER_NOT_FOUND\",\n providerName\n ? `Provider \"${providerName}\" is not configured.`\n : \"No providers configured. Add one with `omninode provider add`.\",\n );\n }\n\n const registry = new ModelRegistry();\n for (const providerConfig of selected) {\n try {\n const provider = createProvider(providerConfig);\n const discovered = await registry.discoverFrom(provider);\n console.log(`${providerConfig.name}: ${discovered.length} model(s)`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.log(`${providerConfig.name}: discovery failed — ${message}`);\n }\n }\n\n const models = registry.list({\n ...(providerName !== undefined ? { provider: providerName } : {}),\n ...(capability !== undefined ? { capability } : {}),\n });\n if (models.length === 0) {\n console.log(\"No models found.\");\n return;\n }\n console.log(\"\");\n for (const model of models) {\n console.log(`${model.provider}:${model.id}`);\n }\n });\n}\n","/**\n * Process adapter (§9): runs CLI agents as child processes and communicates\n * over stdin/stdout, managing the process lifecycle, working directory,\n * environment, exit codes, logs and timeouts.\n *\n * Three input modes (§9, §21):\n * - \"stdin\": the composed task text is written to the agent's stdin.\n * - \"arg\": the composed task text is appended as the last command argument.\n * - \"protocol\": NodeToAgentMessage envelopes as JSON lines on stdin; the\n * agent answers with AgentToNodeMessage JSON lines (REPORT,\n * COMPLETION, ERROR, ...) whose structured payloads are parsed\n * into reports.\n */\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { AgentError, ProtocolError } from \"../../errors/index.js\";\nimport { logger, type Logger } from \"../../logger/index.js\";\nimport type {\n AgentConfig,\n AgentInfo,\n AgentTaskInput,\n AgentTaskOutput,\n IAgent,\n} from \"../../types/agent.js\";\nimport type { EnvelopeMeta, NodeToAgentMessage } from \"../../types/protocol.js\";\nimport type { Report } from \"../../types/report.js\";\n\nconst DEFAULT_TIMEOUT_MS = 600_000;\nconst KILL_GRACE_MS = 5_000;\n\nexport function composeTaskText(input: AgentTaskInput): string {\n const sections: string[] = [`# Objective\\n${input.objective}`];\n if (input.role) {\n const lines = [\"# Role\", `${input.role.name} (${input.role.id})`];\n if (input.role.responsibilities.length > 0) {\n lines.push(\"\", \"Responsibilities:\", ...input.role.responsibilities.map((r) => `- ${r}`));\n }\n if (input.role.expectedOutputs.length > 0) {\n lines.push(\"\", \"Expected outputs:\", ...input.role.expectedOutputs.map((o) => `- ${o}`));\n }\n sections.push(lines.join(\"\\n\"));\n }\n if (input.context) sections.push(`# Context\\n${input.context}`);\n if (input.instruction) sections.push(`# Instruction\\n${input.instruction}`);\n return sections.join(\"\\n\\n\");\n}\n\nfunction buildProtocolMessages(input: AgentTaskInput, agentName: string): string[] {\n const meta: EnvelopeMeta = {\n taskId: input.taskId,\n agent: agentName,\n timestamp: new Date().toISOString(),\n };\n const messages: NodeToAgentMessage[] = [\n { type: \"TASK\", payload: { taskId: input.taskId, objective: input.objective } },\n ];\n if (input.role) messages.push({ type: \"ROLE\", payload: input.role });\n if (input.context) messages.push({ type: \"CONTEXT\", payload: { body: input.context } });\n if (input.instruction) messages.push({ type: \"INSTRUCTION\", payload: { text: input.instruction } });\n return messages.map((message) => JSON.stringify({ meta, message }));\n}\n\nexport class ProcessAgent implements IAgent {\n readonly config: AgentConfig;\n readonly info: AgentInfo;\n private readonly log: Logger;\n private readonly running = new Map<string, ChildProcess>();\n\n constructor(config: AgentConfig, log: Logger = logger) {\n if (!config.command) {\n throw new AgentError(\"AGENT_NOT_FOUND\", `Agent \"${config.name}\" has no command configured.`);\n }\n this.config = config;\n this.log = log.child({ agent: config.name });\n this.info = {\n name: config.name,\n integration: \"process\",\n command: config.command,\n cwd: config.cwd,\n status: \"ready\",\n capabilities: [config.inputMode ?? \"stdin\"],\n };\n }\n\n async run(input: AgentTaskInput): Promise<AgentTaskOutput> {\n const command = this.config.command;\n if (!command) {\n throw new AgentError(\"AGENT_NOT_FOUND\", `Agent \"${this.config.name}\" has no command configured.`);\n }\n const mode = this.config.inputMode ?? \"stdin\";\n const timeoutMs = this.config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return new Promise<AgentTaskOutput>((resolve, reject) => {\n const child = spawn(\n command,\n [...(this.config.args ?? []), ...(mode === \"arg\" ? [composeTaskText(input)] : [])],\n {\n cwd: this.config.cwd,\n env: { ...process.env, ...this.config.env },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n },\n );\n this.running.set(input.taskId, child);\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let settled = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n this.log.warn(`Task ${input.taskId} exceeded ${timeoutMs}ms — killing process.`);\n child.kill(\"SIGTERM\");\n setTimeout(() => child.kill(\"SIGKILL\"), KILL_GRACE_MS).unref();\n }, timeoutMs);\n\n const settle = (finish: () => void): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n this.running.delete(input.taskId);\n finish();\n };\n\n child.stdout?.on(\"data\", (chunk: Buffer) => {\n stdout += chunk.toString();\n });\n child.stderr?.on(\"data\", (chunk: Buffer) => {\n stderr += chunk.toString();\n });\n\n // Agents that exit without reading stdin raise EPIPE on write — that is\n // not an agent failure, so the stream error is ignored.\n child.stdin?.on(\"error\", () => {});\n if (mode !== \"arg\") {\n const payload =\n mode === \"protocol\"\n ? buildProtocolMessages(input, this.config.name).join(\"\\n\") + \"\\n\"\n : composeTaskText(input) + \"\\n\";\n child.stdin?.write(payload);\n child.stdin?.end();\n }\n\n child.on(\"error\", (error) => {\n settle(() => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n reject(\n new AgentError(\n \"AGENT_NOT_FOUND\",\n `Agent \"${this.config.name}\": command \"${command}\" was not found. Is it installed and on PATH?`,\n { cause: error },\n ),\n );\n return;\n }\n reject(\n new AgentError(\"AGENT_FAILED\", `Agent \"${this.config.name}\" failed to start: ${error.message}.`, {\n cause: error,\n }),\n );\n });\n });\n\n child.on(\"close\", (code, signal) => {\n settle(() => {\n if (timedOut) {\n reject(\n new AgentError(\n \"AGENT_TIMEOUT\",\n `Agent \"${this.config.name}\" timed out after ${timeoutMs}ms and was killed.`,\n { details: { taskId: input.taskId, stdout: stdout.slice(0, 4000), stderr: stderr.slice(0, 2000) } },\n ),\n );\n return;\n }\n\n const logs = stderr.trim().length > 0 ? stderr.split(\"\\n\") : undefined;\n if (mode === \"protocol\") {\n // interpretProtocolRun can reject (e.g. protocol violations); throwing\n // inside this event callback would escape the promise entirely.\n try {\n resolve(\n interpretProtocolRun({\n input,\n agentName: this.config.name,\n stdout,\n exitCode: code,\n logs,\n }),\n );\n } catch (error) {\n reject(error);\n }\n return;\n }\n\n const trimmed = stdout.trim();\n resolve({\n taskId: input.taskId,\n status: code === 0 ? \"completed\" : \"failed\",\n summary: trimmed.length > 0 ? firstLine(trimmed) : undefined,\n rawOutput: trimmed.length > 0 ? trimmed : undefined,\n exitCode: code ?? undefined,\n logs,\n error:\n code === 0\n ? undefined\n : `Process exited with code ${code ?? \"unknown\"}${signal ? ` (signal: ${signal})` : \"\"}`,\n });\n });\n });\n });\n }\n\n /** Ask the agent to stop current work (SIGTERM). */\n async cancel(taskId: string): Promise<void> {\n const child = this.running.get(taskId);\n if (child) child.kill(\"SIGTERM\");\n }\n\n runningTaskIds(): string[] {\n return [...this.running.keys()];\n }\n}\n\ninterface ProtocolRunInput {\n input: AgentTaskInput;\n agentName: string;\n stdout: string;\n exitCode: number | null;\n logs?: string[];\n}\n\nfunction interpretProtocolRun({ input, agentName, stdout, exitCode, logs }: ProtocolRunInput): AgentTaskOutput {\n const reports: Report[] = [];\n let summary: string | undefined;\n let error: string | undefined;\n let sawProtocolMessage = false;\n\n for (const line of stdout.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n const message = parseAgentMessage(trimmed);\n if (!message) continue;\n sawProtocolMessage = true;\n\n if (message.type === \"REPORT\") {\n const report = normalizeReport(message.payload, input.taskId, agentName, reports.length);\n if (report) reports.push(report);\n } else if (message.type === \"COMPLETION\") {\n const payload = message.payload as { summary?: unknown } | undefined;\n if (typeof payload?.summary === \"string\") summary = payload.summary;\n } else if (message.type === \"ERROR\") {\n const payload = message.payload as { code?: unknown; message?: unknown } | undefined;\n const detail = typeof payload?.message === \"string\" ? payload.message : \"unknown error\";\n const code = typeof payload?.code === \"string\" ? ` [${payload.code}]` : \"\";\n error = `Agent error${code}: ${detail}`;\n }\n // STATUS / QUESTION / ARTIFACT are informational in v0.4 (§21 backlog).\n }\n\n if (!sawProtocolMessage && exitCode === 0) {\n throw new ProtocolError(\n `Agent \"${agentName}\" produced no protocol messages on stdout (input mode \"protocol\").`,\n { details: { taskId: input.taskId, stdout: stdout.slice(0, 2000) } },\n );\n }\n\n const trimmed = stdout.trim();\n return {\n taskId: input.taskId,\n status: error !== undefined || exitCode !== 0 ? \"failed\" : \"completed\",\n summary: summary ?? reports[0]?.summary,\n rawOutput: trimmed.length > 0 ? trimmed : undefined,\n exitCode: exitCode ?? undefined,\n logs,\n reports: reports.length > 0 ? reports : undefined,\n error:\n error ??\n (exitCode !== 0 ? `Process exited with code ${exitCode ?? \"unknown\"}` : undefined),\n };\n}\n\n/** Accepts both bare `{ type, payload }` and enveloped `{ meta, message }` lines. */\nfunction parseAgentMessage(line: string): { type: string; payload: unknown } | undefined {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n if (typeof parsed.type === \"string\") {\n return { type: parsed.type, payload: parsed.payload };\n }\n const inner = parsed.message as Record<string, unknown> | undefined;\n if (inner && typeof inner.type === \"string\") {\n return { type: inner.type, payload: inner.payload };\n }\n } catch {\n // Non-JSON chatter is tolerated; protocol compliance is judged overall.\n }\n return undefined;\n}\n\nfunction normalizeReport(\n payload: unknown,\n taskId: string,\n agentName: string,\n index: number,\n): Report | undefined {\n if (payload === null || typeof payload !== \"object\") return undefined;\n const raw = payload as Record<string, unknown>;\n if (typeof raw.summary !== \"string\") return undefined;\n return {\n id: typeof raw.id === \"string\" ? raw.id : `${taskId}-report-${index}`,\n taskId: typeof raw.taskId === \"string\" ? raw.taskId : taskId,\n agent: typeof raw.agent === \"string\" ? raw.agent : agentName,\n summary: raw.summary,\n findings: Array.isArray(raw.findings) ? (raw.findings as Report[\"findings\"]) : [],\n recommendations: Array.isArray(raw.recommendations) ? (raw.recommendations as string[]) : [],\n createdAt: typeof raw.createdAt === \"string\" ? raw.createdAt : new Date().toISOString(),\n };\n}\n\nfunction firstLine(text: string, maxLength = 200): string {\n const line = text.split(\"\\n\", 1)[0] ?? text;\n return line.length > maxLength ? `${line.slice(0, maxLength)}…` : line;\n}\n","/** Agent registry (§10): the set of agents connected to OmniNode. */\nimport type { IAgent } from \"../types/agent.js\";\n\nexport class AgentRegistry {\n private readonly agents = new Map<string, IAgent>();\n\n register(agent: IAgent): void {\n this.agents.set(agent.info.name, agent);\n }\n\n get(name: string): IAgent | undefined {\n return this.agents.get(name);\n }\n\n list(): IAgent[] {\n return [...this.agents.values()].sort((a, b) => a.info.name.localeCompare(b.info.name));\n }\n}\n","/**\n * Agent factory (§9–§10): builds adapter instances from configuration.\n * \"cli\" agent configs are mapped to the process integration by the loader.\n */\nimport type { AppConfig } from \"../config/index.js\";\nimport { OmniNodeError } from \"../errors/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport type { AgentConfig, IAgent } from \"../types/agent.js\";\nimport { ProcessAgent } from \"./process/index.js\";\nimport { AgentRegistry } from \"./registry.js\";\n\nexport function createAgent(config: AgentConfig): IAgent {\n if (config.integration === \"process\") {\n return new ProcessAgent(config);\n }\n if (config.integration === \"native\") {\n throw new OmniNodeError(\n \"NOT_IMPLEMENTED\",\n `Native agent adapters are planned for a later phase. Use input over stdin/stdout (type \"cli\") for \"${config.name}\" for now.`,\n );\n }\n throw new OmniNodeError(\"NOT_IMPLEMENTED\", `Agent integration \"${config.integration}\" has no adapter yet.`);\n}\n\n/** Builds an agent registry from the project configuration, skipping agents that fail to construct. */\nexport function buildAgentRegistry(config: AppConfig, log: Logger = logger): AgentRegistry {\n const registry = new AgentRegistry();\n for (const agentConfig of config.project.agents) {\n try {\n registry.register(createAgent(agentConfig));\n } catch (error) {\n log.warn(\n `Skipping agent \"${agentConfig.name}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n return registry;\n}\n","import type { Command } from \"commander\";\nimport { agentConfigSchema, loadConfig } from \"../../config/index.js\";\nimport { AgentError, OmniNodeError } from \"../../errors/index.js\";\nimport { createAgent } from \"../../agents/index.js\";\nimport { appendToConfigList } from \"./shared.js\";\n\nconst collectArgs = (value: string, previous: string[]): string[] => [...previous, value];\n\ninterface AddAgentOptions {\n name: string;\n command: string;\n arg?: string[];\n cwd?: string;\n inputMode: string;\n timeoutMs?: number;\n}\n\nexport function registerAgentCommands(program: Command): void {\n const agent = program\n .command(\"agent\")\n .description(\"Manage CLI agents registered with OmniNode.\");\n\n agent\n .command(\"list\")\n .description(\"List configured agents.\")\n .action(async () => {\n const config = loadConfig();\n const agents = config.project.agents;\n if (agents.length === 0) {\n console.log(\"No agents configured. Add one with `omninode agent add` or edit omninode.yaml.\");\n return;\n }\n for (const agent of agents) {\n const command = agent.command ?? \"(no command)\";\n console.log(\n `${agent.name} integration=${agent.integration} command=${command} input=${agent.inputMode ?? \"stdin\"}`,\n );\n }\n });\n\n agent\n .command(\"add\")\n .description(\n \"Register a CLI agent in omninode.yaml. Agents run as child processes \" +\n \"(stdin/stdout); native adapters come in a later phase.\",\n )\n .requiredOption(\"--name <name>\", \"Unique agent name.\")\n .requiredOption(\"--command <command>\", \"Executable command, e.g. opencode\")\n .option(\"--arg <value>\", \"Additional command argument (repeatable).\", collectArgs, [])\n .option(\"--cwd <dir>\", \"Working directory for the agent process.\")\n .option(\n \"--input-mode <mode>\",\n \"How the task is delivered: stdin (prompt on stdin), arg (prompt as last argument) or protocol (§21 JSON-lines task protocol).\",\n \"stdin\",\n )\n .option(\"--timeout-ms <ms>\", \"Per-task timeout in milliseconds.\", (value: string) =>\n Number(value),\n )\n .action(async (options: AddAgentOptions) => addAgent(options));\n\n agent\n .command(\"test <name>\")\n .description(\"Verify the OmniNode ↔ agent connection by sending a trivial task.\")\n .action(async (name: string) => testAgent(name));\n}\n\nexport async function addAgent(options: AddAgentOptions): Promise<void> {\n const candidate = agentConfigSchema.safeParse({\n name: options.name,\n type: \"cli\",\n command: options.command,\n ...(options.arg !== undefined && options.arg.length > 0 ? { args: options.arg } : {}),\n ...(options.cwd !== undefined ? { cwd: options.cwd } : {}),\n input_mode: options.inputMode,\n ...(options.timeoutMs !== undefined ? { timeout_ms: options.timeoutMs } : {}),\n });\n if (!candidate.success) {\n const issues = candidate.error.issues\n .map((issue) => `${issue.path.join(\".\") || \"(root)\"}: ${issue.message}`)\n .join(\"; \");\n throw new OmniNodeError(\"CLI_USAGE\", `Invalid agent options: ${issues}`);\n }\n const newAgent = candidate.data;\n\n const existing = loadConfig();\n if (existing.project.agents.some((a) => a.name === newAgent.name)) {\n throw new OmniNodeError(\n \"CLI_USAGE\",\n `Agent \"${newAgent.name}\" already exists in omninode.yaml. Remove it first or pick another name.`,\n );\n }\n\n const configPath = appendToConfigList(\"agents\", newAgent);\n console.log(`Added agent \"${newAgent.name}\" (${newAgent.type}, input=${newAgent.input_mode}) to ${configPath}.`);\n console.log(`Run \\`omninode agent test ${newAgent.name}\\` to verify the connection.`);\n}\n\nexport async function testAgent(name: string): Promise<void> {\n const config = loadConfig();\n const agentConfig = config.project.agents.find((a) => a.name === name);\n if (!agentConfig) {\n const available = config.project.agents.map((a) => a.name).join(\", \") || \"(none)\";\n throw new AgentError(\n \"AGENT_NOT_FOUND\",\n `Agent \"${name}\" is not configured. Configured agents: ${available}.`,\n );\n }\n\n const agent = createAgent(agentConfig);\n console.log(\n `Testing agent \"${name}\" (${agent.info.integration}, input=${agentConfig.inputMode ?? \"stdin\"}) — sending a trivial task.`,\n );\n const result = await agent.run({\n taskId: `test-${Date.now()}`,\n objective: \"Reply with the single word: OK\",\n });\n console.log(` status: ${result.status}`);\n if (result.exitCode !== undefined) console.log(` exit: ${result.exitCode}`);\n if (result.summary) console.log(` output: ${result.summary}`);\n if (result.rawOutput && result.rawOutput !== result.summary) {\n console.log(` raw: ${result.rawOutput.slice(0, 200).replace(/\\n/g, \" \")}`);\n }\n if (result.error) console.log(` error: ${result.error}`);\n if (result.status !== \"completed\") process.exitCode = 1;\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\n\nexport function registerRoleCommands(program: Command): void {\n const role = program\n .command(\"role\")\n .description(\"Inspect roles defined in omninode.yaml.\");\n\n role\n .command(\"list\")\n .description(\"List configured roles.\")\n .action(async () => {\n const config = loadConfig();\n const roles = config.project.roles;\n if (roles.length === 0) {\n console.log(\"No roles configured. Add one under `project.roles` in omninode.yaml.\");\n return;\n }\n for (const role of roles) {\n console.log(`${role.id} ${role.name}`);\n for (const responsibility of role.responsibilities) {\n console.log(` - ${responsibility}`);\n }\n }\n });\n}\n","/**\n * Task persistence (§4.1 — execution state). The store is replaceable\n * (§2 — Modular); the default implementation is a local JSON file so\n * OmniNode stays local-first (§25).\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { Task, TaskStatus } from \"../types/task.js\";\n\nexport interface TaskStoreFilter {\n status?: TaskStatus;\n project?: string;\n}\n\nexport interface TaskStore {\n save(task: Task): Promise<void>;\n get(id: string): Promise<Task | undefined>;\n list(filter?: TaskStoreFilter): Promise<Task[]>;\n}\n\nexport class FileTaskStore implements TaskStore {\n private readonly filePath: string;\n /**\n * Read-modify-write operations are serialized: parallel pipeline tasks\n * would otherwise race on the JSON file (last writer wins).\n */\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(directory = `${process.cwd()}/.omninode`) {\n this.filePath = `${directory}/tasks.json`;\n }\n\n async save(task: Task): Promise<void> {\n return this.synchronized(async () => {\n const tasks = await this.load();\n const index = tasks.findIndex((t) => t.id === task.id);\n if (index >= 0) tasks[index] = task;\n else tasks.push(task);\n await this.write(tasks);\n });\n }\n\n async get(id: string): Promise<Task | undefined> {\n return this.synchronized(async () => {\n const tasks = await this.load();\n return tasks.find((t) => t.id === id);\n });\n }\n\n async list(filter: TaskStoreFilter = {}): Promise<Task[]> {\n return this.synchronized(async () => {\n const tasks = await this.load();\n return tasks\n .filter((task) => (filter.status ? task.status === filter.status : true))\n .filter((task) => (filter.project ? task.project === filter.project : true))\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n });\n }\n\n private synchronized<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async load(): Promise<Task[]> {\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as Task[]) : [];\n } catch {\n return [];\n }\n }\n\n private async write(tasks: Task[]): Promise<void> {\n // Write to a temp file and rename for an atomic-enough local save.\n const tmp = `${this.filePath}.tmp`;\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(tmp, `${JSON.stringify(tasks, null, 2)}\\n`, \"utf8\");\n await rename(tmp, this.filePath);\n }\n}\n","/**\n * Task engine (§13, §27 Phase 4): owns the task lifecycle — create, queue,\n * run, cancel — validates role/agent assignment against the registries and\n * persists every transition through the task store.\n */\nimport { randomBytes } from \"node:crypto\";\nimport type { AgentRegistry } from \"../agents/index.js\";\nimport type { RoleRegistry } from \"../roles/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport { TaskError } from \"../errors/index.js\";\nimport type { MemoryService } from \"../memory/index.js\";\nimport type { Task, TaskContext, TaskResult, TaskStatus } from \"../types/task.js\";\nimport type { TaskStore, TaskStoreFilter } from \"./store.js\";\n\nconst ALLOWED_TRANSITIONS: Record<TaskStatus, TaskStatus[]> = {\n created: [\"queued\", \"running\", \"cancelled\"],\n queued: [\"running\", \"cancelled\"],\n running: [\"completed\", \"failed\", \"cancelled\"],\n waiting: [\"running\", \"cancelled\"],\n completed: [],\n failed: [],\n cancelled: [],\n};\n\nexport interface CreateTaskInput {\n objective: string;\n project?: string;\n role?: string;\n agent?: string;\n context?: TaskContext;\n}\n\nexport interface TaskEngineOptions {\n agents: AgentRegistry;\n roles: RoleRegistry;\n store: TaskStore;\n /** When present, tasks gather relevant memory before running and record outcomes after (§20). */\n memory?: MemoryService;\n log?: Logger;\n}\n\nexport class TaskEngine {\n private readonly log: Logger;\n\n constructor(private readonly options: TaskEngineOptions) {\n this.log = (options.log ?? logger).child({ component: \"tasks\" });\n }\n\n get store(): TaskStore {\n return this.options.store;\n }\n\n async create(input: CreateTaskInput): Promise<Task> {\n if (!input.objective || input.objective.trim().length === 0) {\n throw new TaskError(\"TASK_INVALID\", \"Task objective must not be empty.\");\n }\n if (input.role && !this.options.roles.get(input.role)) {\n throw new TaskError(\"TASK_INVALID\", \n `Role \"${input.role}\" is not defined. Add it under project.roles in omninode.yaml.`,\n );\n }\n if (input.agent && !this.options.agents.get(input.agent)) {\n throw new TaskError(\"TASK_INVALID\", \n `Agent \"${input.agent}\" is not registered. Add it with \\`omninode agent add\\`.`,\n );\n }\n\n const now = new Date().toISOString();\n const task: Task = {\n id: generateTaskId(),\n objective: input.objective.trim(),\n status: \"created\",\n createdAt: now,\n updatedAt: now,\n ...(input.project !== undefined ? { project: input.project } : {}),\n ...(input.role !== undefined ? { role: input.role } : {}),\n ...(input.agent !== undefined ? { agent: input.agent } : {}),\n ...(input.context !== undefined ? { context: input.context } : {}),\n };\n await this.options.store.save(task);\n this.log.info(`Created task ${task.id}.`);\n return task;\n }\n\n async queue(id: string): Promise<Task> {\n const task = await this.mustGet(id);\n return this.transition(task, \"queued\");\n }\n\n /** Runs the task through its assigned agent and records the result. */\n async run(id: string): Promise<Task> {\n const task = await this.mustGet(id);\n if (task.status !== \"created\" && task.status !== \"queued\") {\n throw new TaskError(\"TASK_INVALID\", `Task ${id} is \"${task.status}\" and cannot be run.`);\n }\n if (!task.agent) {\n throw new TaskError(\"TASK_INVALID\", `Task ${id} has no agent assigned. Re-create it with --agent.`);\n }\n const agent = this.options.agents.get(task.agent);\n if (!agent) {\n throw new TaskError(\"TASK_INVALID\", `Agent \"${task.agent}\" is not registered anymore.`);\n }\n const role = task.role ? this.options.roles.get(task.role) : undefined;\n\n const running = await this.transition(task, \"running\");\n this.log.info(`Running task ${task.id} on agent \"${task.agent}\".`);\n\n // §20: relevant memory is gathered before the agent receives context.\n let background = running.context?.background;\n if (this.options.memory) {\n const memoryContext = await this.options.memory.gatherContext({\n objective: running.objective,\n ...(running.role ? { role: running.role } : {}),\n ...(running.project ? { project: running.project } : {}),\n });\n if (memoryContext.length > 0) {\n background = [memoryContext, background].filter((part) => part && part.length > 0).join(\"\\n\\n\");\n }\n }\n\n let output;\n try {\n output = await agent.run({\n taskId: running.id,\n objective: running.objective,\n ...(role ? { role } : {}),\n ...(background !== undefined ? { context: background } : {}),\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log.error(`Task ${task.id} failed: ${message}`);\n return this.transition(running, \"failed\", {\n result: { error: message, finishedAt: new Date().toISOString() },\n });\n }\n\n const result: TaskResult = {\n ...(output.summary !== undefined ? { summary: output.summary } : {}),\n ...(output.reports !== undefined && output.reports.length > 0 ? { reports: output.reports } : {}),\n // Keep the verbatim output (bounded) for report extraction and audit.\n ...(output.rawOutput !== undefined && output.rawOutput.length > 0\n ? { rawOutput: output.rawOutput.slice(0, 10_000) }\n : {}),\n ...(output.error !== undefined ? { error: output.error } : {}),\n finishedAt: new Date().toISOString(),\n };\n const finalStatus: TaskStatus = output.status === \"completed\" ? \"completed\" : \"failed\";\n const finished = await this.transition(running, finalStatus, { result });\n this.log.info(`Task ${task.id} finished: ${finalStatus}.`);\n // §20: the outcome is written back to memory — best-effort, never fatal.\n if (this.options.memory) {\n await this.options.memory.recordTaskOutcome(finished);\n }\n return finished;\n }\n\n async cancel(id: string): Promise<Task> {\n const task = await this.mustGet(id);\n if (!ALLOWED_TRANSITIONS[task.status].includes(\"cancelled\")) {\n throw new TaskError(\"TASK_INVALID\", `Task ${id} is \"${task.status}\" and cannot be cancelled.`);\n }\n if (task.agent) {\n const agent = this.options.agents.get(task.agent);\n await agent?.cancel?.(task.id);\n }\n return this.transition(task, \"cancelled\");\n }\n\n /** Error recovery (§27 Phase 9): reset a failed/cancelled task so it can run again. */\n async retry(id: string): Promise<Task> {\n const task = await this.mustGet(id);\n if (task.status !== \"failed\" && task.status !== \"cancelled\") {\n throw new TaskError(\n \"TASK_INVALID\",\n `Only failed or cancelled tasks can be retried — task ${id} is \"${task.status}\".`,\n );\n }\n const { result: _discarded, ...rest } = task;\n const reset: Task = {\n ...rest,\n status: \"created\",\n updatedAt: new Date().toISOString(),\n };\n await this.options.store.save(reset);\n this.log.info(`Task ${id} reset for retry.`);\n return reset;\n }\n\n async get(id: string): Promise<Task | undefined> {\n return this.options.store.get(id);\n }\n\n async list(filter?: TaskStoreFilter): Promise<Task[]> {\n return this.options.store.list(filter);\n }\n\n private async mustGet(id: string): Promise<Task> {\n const task = await this.options.store.get(id);\n if (!task) {\n throw new TaskError(\"TASK_NOT_FOUND\", `Task \"${id}\" does not exist in this project's task store.`);\n }\n return task;\n }\n\n private async transition(\n task: Task,\n to: TaskStatus,\n extra: { result?: TaskResult } = {},\n ): Promise<Task> {\n const allowed = ALLOWED_TRANSITIONS[task.status] ?? [];\n if (!allowed.includes(to)) {\n throw new TaskError(\"TASK_INVALID\", `Task ${task.id} cannot move from \"${task.status}\" to \"${to}\".`);\n }\n const updated: Task = {\n ...task,\n status: to,\n updatedAt: new Date().toISOString(),\n ...(extra.result !== undefined\n ? { result: { ...task.result, ...extra.result } }\n : {}),\n };\n await this.options.store.save(updated);\n return updated;\n }\n}\n\nfunction generateTaskId(): string {\n return `task-${Date.now().toString(36)}-${randomBytes(3).toString(\"hex\")}`;\n}\n","/**\n * Local file-based memory provider: the default implementation so persistent\n * memory works out of the box, locally (§25), with no external service.\n * Relevance is scored by keyword overlap and tag matches — deterministic and\n * dependency-free.\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { IMemoryProvider, MemoryEntry, MemoryQuery } from \"../types/memory.js\";\n\nconst STOPWORDS = new Set([\n \"the\", \"and\", \"for\", \"with\", \"this\", \"that\", \"from\", \"into\", \"was\", \"were\",\n \"have\", \"has\", \"had\", \"are\", \"but\", \"not\", \"you\", \"his\", \"her\", \"its\",\n \"their\", \"them\", \"then\", \"than\", \"when\", \"what\", \"which\", \"will\", \"would\",\n \"been\", \"were\", \"also\", \"because\", \"about\", \"after\", \"before\",\n]);\n\nexport function keywords(text: string): Set<string> {\n return new Set(\n (text ?? \"\")\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .filter((t) => t.length >= 4 && !STOPWORDS.has(t)),\n );\n}\n\nfunction relevanceScore(queryKeywords: Set<string>, entry: MemoryEntry): number {\n if (queryKeywords.size === 0) return 0;\n const entryKeywords = keywords(`${entry.content} ${entry.key}`);\n let overlap = 0;\n for (const keyword of queryKeywords) {\n if (entryKeywords.has(keyword)) overlap += 1;\n }\n let tagMatches = 0;\n for (const tag of entry.tags ?? []) {\n if (queryKeywords.has(tag.toLowerCase())) tagMatches += 1;\n }\n return overlap * 2 + tagMatches * 1.5;\n}\n\nexport class LocalMemoryProvider implements IMemoryProvider {\n readonly name = \"local\";\n private readonly filePath: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(directory = `${process.cwd()}/.omninode`) {\n this.filePath = `${directory}/memory.json`;\n }\n\n async query(query: MemoryQuery): Promise<MemoryEntry[]> {\n return this.synchronized(async () => {\n const entries = await this.load();\n const filtered = entries\n .filter((entry) => (query.scope ? entry.scope === query.scope : true))\n .filter((entry) =>\n query.tags && query.tags.length > 0\n ? query.tags.every((tag) => (entry.tags ?? []).includes(tag))\n : true,\n );\n\n if (!query.text || query.text.trim().length === 0) {\n return filtered\n .sort((a, b) => (b.updatedAt ?? b.createdAt ?? \"\").localeCompare(a.updatedAt ?? a.createdAt ?? \"\"))\n .slice(0, query.limit ?? 10);\n }\n\n const queryKeywords = keywords(query.text);\n return filtered\n .map((entry) => ({ entry, score: relevanceScore(queryKeywords, entry) }))\n .filter(({ score }) => score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, query.limit ?? 10)\n .map(({ entry }) => entry);\n });\n }\n\n async write(entry: MemoryEntry): Promise<void> {\n return this.synchronized(async () => {\n const entries = await this.load();\n const index = entries.findIndex((e) => e.key === entry.key);\n const stamped: MemoryEntry = {\n ...entry,\n createdAt: entry.createdAt ?? new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n if (index >= 0) entries[index] = stamped;\n else entries.push(stamped);\n await this.saveAll(entries);\n });\n }\n\n async count(): Promise<number> {\n return (await this.load()).length;\n }\n\n private synchronized<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async load(): Promise<MemoryEntry[]> {\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as MemoryEntry[]) : [];\n } catch {\n return [];\n }\n }\n\n private async saveAll(entries: MemoryEntry[]): Promise<void> {\n const tmp = `${this.filePath}.tmp`;\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(tmp, `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n await rename(tmp, this.filePath);\n }\n}\n","/**\n * Remembera memory provider (§19): the preferred Hilbras memory integration,\n * reached over HTTP. Remembera is strictly optional — the core also runs with\n * the local memory provider or none at all (§2).\n *\n * API convention assumed by this adapter (adjust here if the real API differs):\n * write: POST {baseUrl}/api/memory body: MemoryEntry JSON → 2xx\n * query: POST {baseUrl}/api/memory/query body: MemoryQuery JSON → { entries: MemoryEntry[] }\n */\nimport { MemoryError } from \"../errors/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport { resolveApiKey } from \"../providers/auth.js\";\nimport { requestJson } from \"../providers/http.js\";\nimport type { IMemoryProvider, MemoryEntry, MemoryQuery } from \"../types/memory.js\";\n\nexport interface RememberaConfig {\n baseUrl: string;\n apiKeyEnvVar?: string;\n env?: Record<string, string | undefined>;\n}\n\nexport class RememberaMemoryProvider implements IMemoryProvider {\n readonly name = \"remembera\";\n private readonly baseUrl: string;\n private readonly apiKeyEnvVar?: string;\n private readonly env: Record<string, string | undefined>;\n private readonly log: Logger;\n\n constructor(config: RememberaConfig, log: Logger = logger) {\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n this.apiKeyEnvVar = config.apiKeyEnvVar;\n this.env = config.env ?? process.env;\n this.log = log.child({ component: \"remembera\" });\n }\n\n private headers(): Record<string, string> {\n const key = this.apiKeyEnvVar\n ? resolveApiKey({ name: \"remembera\", apiKeyEnvVar: this.apiKeyEnvVar }, this.env)\n : undefined;\n return key ? { authorization: `Bearer ${key}` } : {};\n }\n\n async query(query: MemoryQuery): Promise<MemoryEntry[]> {\n const { status, body } = await this.request(`${this.baseUrl}/api/memory/query`, query);\n if (status !== 200) {\n throw new MemoryError(`Remembera query returned HTTP ${status}.`);\n }\n const entries = (body as { entries?: unknown }).entries;\n if (!Array.isArray(entries)) {\n throw new MemoryError(\"Remembera query response had no entries array.\");\n }\n return entries.map((entry) => this.toEntry(entry)).filter((entry): entry is MemoryEntry => entry !== undefined);\n }\n\n async write(entry: MemoryEntry): Promise<void> {\n const { status } = await this.request(`${this.baseUrl}/api/memory`, entry);\n if (status !== 200 && status !== 201) {\n throw new MemoryError(`Remembera write returned HTTP ${status}.`);\n }\n }\n\n private async request(url: string, body: unknown): Promise<{ status: number; body: unknown }> {\n // Resolved outside the try so auth failures propagate as-is.\n const headers = this.headers();\n try {\n return await requestJson(url, {\n method: \"POST\",\n headers,\n body,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new MemoryError(`Remembera request to ${url} failed: ${message}`, { cause: error });\n }\n }\n\n private toEntry(raw: unknown): MemoryEntry | undefined {\n if (raw === null || typeof raw !== \"object\") {\n this.log.warn(\"Skipping malformed Remembera memory entry.\");\n return undefined;\n }\n const entry = raw as Record<string, unknown>;\n if (typeof entry.key !== \"string\" || typeof entry.content !== \"string\") {\n this.log.warn(\"Skipping Remembera memory entry without key/content.\");\n return undefined;\n }\n const scope = entry.scope;\n return {\n key: entry.key,\n content: entry.content,\n scope:\n scope === \"project\" || scope === \"role\" || scope === \"task\" || scope === \"knowledge\"\n ? scope\n : \"knowledge\",\n ...(Array.isArray(entry.tags) ? { tags: entry.tags.filter((t): t is string => typeof t === \"string\") } : {}),\n ...(typeof entry.createdAt === \"string\" ? { createdAt: entry.createdAt } : {}),\n ...(typeof entry.updatedAt === \"string\" ? { updatedAt: entry.updatedAt } : {}),\n };\n }\n}\n","/** Memory provider factory: memory is optional; local is the default. */\nimport { ConfigError } from \"../errors/index.js\";\nimport type { AppConfig } from \"../config/index.js\";\nimport type { IMemoryProvider } from \"../types/memory.js\";\nimport { LocalMemoryProvider } from \"./local.js\";\nimport { RememberaMemoryProvider } from \"./remembera.js\";\n\nexport type MemoryProviderConfig = NonNullable<AppConfig[\"project\"][\"memory\"]>;\n\nexport function createMemoryProvider(config?: MemoryProviderConfig): IMemoryProvider {\n if (!config || config.provider === \"local\") {\n return new LocalMemoryProvider();\n }\n if (config.provider === \"remembera\") {\n if (!config.baseUrl) {\n throw new ConfigError(\n \"CONFIG_INVALID\",\n `Memory provider \"remembera\" needs a base_url in omninode.yaml.`,\n );\n }\n return new RememberaMemoryProvider({\n baseUrl: config.baseUrl,\n apiKeyEnvVar: config.apiKeyEnvVar,\n });\n }\n throw new ConfigError(\n \"CONFIG_INVALID\",\n `Unknown memory provider \"${config.provider}\". Available: local, remembera.`,\n );\n}\n","/**\n * Memory service (§19–§20): gathers relevant memory before a task runs and\n * records outcomes afterwards — the Task → memory → relevant context →\n * agents → reports → memory loop. Memory failures are best-effort: they log\n * a warning and never fail a task, because memory is an enhancement, not a\n * dependency (§2).\n */\nimport { logger, type Logger } from \"../logger/index.js\";\nimport type { IMemoryProvider, MemoryEntry, MemoryScope } from \"../types/memory.js\";\nimport type { Task } from \"../types/task.js\";\n\nexport interface MemoryContextQuery {\n objective: string;\n role?: string;\n project?: string;\n}\n\nconst MAX_CONTEXT_CHARS = 4_000;\n\nexport class MemoryService {\n private readonly log: Logger;\n\n constructor(\n private readonly provider: IMemoryProvider,\n log: Logger = logger,\n ) {\n this.log = log.child({ component: \"memory\", provider: provider.name });\n }\n\n get providerRef(): IMemoryProvider {\n return this.provider;\n }\n\n get providerName(): string {\n return this.provider.name;\n }\n\n /** Relevant context for a task objective; empty string when nothing matches. */\n async gatherContext(query: MemoryContextQuery): Promise<string> {\n try {\n const entries = await this.provider.query({\n text: query.objective,\n ...(query.role ? { tags: [query.role] } : {}),\n limit: 8,\n });\n if (entries.length === 0) return \"\";\n const byScope = new Map<MemoryScope, MemoryEntry[]>();\n for (const entry of entries) {\n byScope.set(entry.scope, [...(byScope.get(entry.scope) ?? []), entry]);\n }\n const parts: string[] = [];\n for (const scope of [\"project\", \"task\", \"role\", \"knowledge\"] as MemoryScope[]) {\n const scopeEntries = byScope.get(scope) ?? [];\n if (scopeEntries.length === 0) continue;\n const lines = scopeEntries.map((entry) => `- ${entry.content}`).join(\"\\n\");\n parts.push(`### Relevant memory (${scope})\\n${lines}`);\n }\n const context = parts.join(\"\\n\\n\");\n return context.length > MAX_CONTEXT_CHARS ? `${context.slice(0, MAX_CONTEXT_CHARS)}…` : context;\n } catch (error) {\n this.log.warn(\n `Memory query failed (continuing without memory): ${error instanceof Error ? error.message : String(error)}`,\n );\n return \"\";\n }\n }\n\n /** Records a finished task's outcome — best-effort. */\n async recordTaskOutcome(task: Task): Promise<void> {\n const outcome = task.result?.summary ?? task.result?.error ?? \"(no output)\";\n try {\n await this.provider.write({\n key: `task:${task.id}`,\n scope: \"task\",\n content: `Objective: ${task.objective}\\nStatus: ${task.status}\\nOutcome: ${outcome}`,\n tags: [\"task\", ...(task.agent ? [task.agent] : []), ...(task.role ? [task.role] : [])],\n createdAt: task.createdAt,\n });\n // Significant findings become project-level \"known problems\" (§19).\n const significant = (task.result?.reports ?? []).flatMap((report) =>\n report.findings\n .filter((finding) => finding.severity === \"high\" || finding.severity === \"critical\")\n .map((finding) => ({ report, finding })),\n );\n for (const { report, finding } of significant) {\n await this.provider.write({\n key: `finding:${report.id}:${finding.id}`,\n scope: \"project\",\n content: `[${finding.severity}] ${finding.title} — ${finding.detail}`,\n tags: [\"known-problem\", report.agent],\n });\n }\n } catch (error) {\n this.log.warn(\n `Memory write failed (continuing): ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n}\n","/** Role registry (§11): the set of roles available for task assignment. */\nimport type { AppConfig } from \"../config/index.js\";\nimport type { RoleDefinition } from \"../types/role.js\";\n\nexport class RoleRegistry {\n private readonly roles = new Map<string, RoleDefinition>();\n\n register(role: RoleDefinition): void {\n this.roles.set(role.id, role);\n }\n\n registerAll(roles: RoleDefinition[]): void {\n for (const role of roles) this.register(role);\n }\n\n get(id: string): RoleDefinition | undefined {\n return this.roles.get(id);\n }\n\n list(): RoleDefinition[] {\n return [...this.roles.values()].sort((a, b) => a.id.localeCompare(b.id));\n }\n}\n\n/** Builds a role registry from the project configuration. */\nexport function buildRoleRegistry(config: AppConfig): RoleRegistry {\n const registry = new RoleRegistry();\n registry.registerAll(config.project.roles);\n return registry;\n}\n","/** Assembles a TaskEngine from the project configuration (local-first defaults). */\nimport type { AppConfig } from \"../config/index.js\";\nimport { buildAgentRegistry } from \"../agents/index.js\";\nimport { createMemoryProvider, MemoryService } from \"../memory/index.js\";\nimport { buildRoleRegistry } from \"../roles/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport { TaskEngine } from \"./engine.js\";\nimport { FileTaskStore } from \"./store.js\";\n\nexport function createTaskEngine(config: AppConfig, log: Logger = logger, directory?: string): TaskEngine {\n const agents = buildAgentRegistry(config, log);\n const roles = buildRoleRegistry(config);\n return new TaskEngine({\n agents,\n roles,\n store: new FileTaskStore(directory),\n ...(config.project.memory !== undefined\n ? { memory: new MemoryService(createMemoryProvider(config.project.memory), log) }\n : {}),\n log,\n });\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { TaskError } from \"../../errors/index.js\";\nimport { createTaskEngine } from \"../../tasks/index.js\";\nimport type { Task } from \"../../types/task.js\";\n\nconst collectFiles = (value: string, previous: string[]): string[] => [...previous, value];\n\nexport function registerTaskCommands(program: Command): void {\n const task = program\n .command(\"task\")\n .description(\"Create, run and inspect tasks (§13).\");\n\n task\n .command(\"create <objective>\")\n .description(\"Create a task. Assign a role and/or agent; run it with `omninode task run`.\")\n .option(\"-r, --role <roleId>\", \"Role id from project.roles (validated at creation).\")\n .option(\"-a, --agent <name>\", \"Agent name from project.agents (validated at creation).\")\n .option(\"-f, --file <path>\", \"File or glob relevant to the task (repeatable).\", collectFiles)\n .action(async (objective: string, options: { role?: string; agent?: string; file?: string[] }) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n const created = await engine.create({\n objective,\n project: config.project.name,\n ...(options.role !== undefined ? { role: options.role } : {}),\n ...(options.agent !== undefined ? { agent: options.agent } : {}),\n ...(options.file !== undefined && options.file.length > 0\n ? { context: { files: options.file } }\n : {}),\n });\n console.log(`Created task ${created.id} (${created.status})`);\n console.log(` objective: ${created.objective}`);\n if (created.role) console.log(` role: ${created.role}`);\n if (created.agent) console.log(` agent: ${created.agent}`);\n if (created.context?.files) console.log(` files: ${created.context.files.join(\", \")}`);\n console.log(`Run \\`omninode task run ${created.id}\\` to execute it.`);\n });\n\n task\n .command(\"run <task-id>\")\n .description(\"Run a task through its assigned agent.\")\n .action(async (taskId: string) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n console.log(`Running task ${taskId}...`);\n const finished = await engine.run(taskId);\n printOutcome(finished);\n if (finished.status !== \"completed\") process.exitCode = 1;\n });\n\n task\n .command(\"status <task-id>\")\n .description(\"Show task details and current status.\")\n .action(async (taskId: string) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n const found = await engine.get(taskId);\n if (!found) {\n throw new TaskError(\n \"TASK_NOT_FOUND\",\n `Task \"${taskId}\" does not exist in this project's task store.`,\n );\n }\n printOutcome(found, { verbose: true });\n });\n\n task\n .command(\"list\")\n .description(\"List tasks in the project's task store.\")\n .option(\"-s, --status <status>\", \"Filter by status (created, queued, running, completed, failed, cancelled).\")\n .action(async (options: { status?: string }) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n const tasks = await engine.list(\n options.status !== undefined ? { status: options.status as Task[\"status\"] } : {},\n );\n if (tasks.length === 0) {\n console.log(\"No tasks found. Create one with `omninode task create`.\");\n return;\n }\n for (const t of tasks) {\n console.log(`${t.id} ${t.status.padEnd(10)} ${truncate(t.objective, 60)}`);\n }\n });\n\n task\n .command(\"cancel <task-id>\")\n .description(\"Cancel a task that has not finished yet.\")\n .action(async (taskId: string) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n const cancelled = await engine.cancel(taskId);\n console.log(`Task ${cancelled.id} is now \"${cancelled.status}\".`);\n });\n\n task\n .command(\"retry <task-id>\")\n .description(\"Reset a failed/cancelled task to created; combine with --run to execute it again.\")\n .option(\"--run\", \"Run the task again immediately after resetting it.\")\n .action(async (taskId: string, options: { run?: boolean }) => {\n const config = loadConfig();\n const engine = createTaskEngine(config);\n const reset = await engine.retry(taskId);\n console.log(`Task ${reset.id} reset to \"${reset.status}\".`);\n if (!options.run) return;\n console.log(`Running task ${reset.id}...`);\n const finished = await engine.run(reset.id);\n printOutcome(finished);\n if (finished.status !== \"completed\") process.exitCode = 1;\n });\n}\n\nfunction printOutcome(task: Task, options: { verbose?: boolean } = {}): void {\n console.log(` id: ${task.id}`);\n console.log(` status: ${task.status}`);\n console.log(` created: ${task.createdAt}`);\n if (options.verbose) {\n console.log(` project: ${task.project ?? \"(none)\"}`);\n if (task.role) console.log(` role: ${task.role}`);\n if (task.agent) console.log(` agent: ${task.agent}`);\n if (task.context?.files) console.log(` files: ${task.context.files.join(\", \")}`);\n console.log(` objective: ${task.objective}`);\n }\n const result = task.result;\n if (!result) return;\n if (result.summary) console.log(` summary: ${result.summary}`);\n if (result.reports && result.reports.length > 0) {\n console.log(` reports: ${result.reports.length} structured report(s)`);\n }\n if (result.error) console.log(` error: ${result.error}`);\n if (result.finishedAt) console.log(` ended: ${result.finishedAt}`);\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","/**\n * Report aggregation (§17): normalizes formats, groups duplicate and similar\n * findings, preserves source attribution, and produces one CombinedReport.\n * Grouping uses deterministic token-set similarity so results are testable.\n */\nimport { randomBytes } from \"node:crypto\";\nimport type {\n AggregatedFinding,\n AggregatedRecommendation,\n CombinedReport,\n Finding,\n FindingSeverity,\n FindingSource,\n Report,\n} from \"../types/report.js\";\n\nconst SEVERITY_RANK: Record<FindingSeverity, number> = {\n info: 0,\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\n\nexport interface AggregateOptions {\n objective?: string;\n pipelineRunId?: string;\n taskIds?: string[];\n /** Token-set Jaccard similarity above which findings are merged. */\n similarityThreshold?: number;\n}\n\nexport function aggregateReports(reports: Report[], options: AggregateOptions = {}): CombinedReport {\n const threshold = options.similarityThreshold ?? 0.7;\n\n const findingGroups: AggregatedFinding[] = [];\n const recommendationGroups: AggregatedRecommendation[] = [];\n\n for (const report of reports) {\n for (const finding of report.findings) {\n mergeFinding(findingGroups, finding, report, threshold);\n }\n for (const text of report.recommendations) {\n mergeRecommendation(recommendationGroups, text, report, threshold);\n }\n }\n\n const sources = [...new Set(reports.map((r) => r.agent))].sort();\n const totalRawFindings = reports.reduce((sum, r) => sum + r.findings.length, 0);\n const summary =\n `${reports.length} report(s) from ${sources.length > 0 ? sources.join(\", \") : \"no agents\"}: ` +\n `${findingGroups.length} unique finding group(s) (${totalRawFindings} raw), ` +\n `${recommendationGroups.length} recommendation group(s).`;\n\n return {\n id: `combined-${Date.now().toString(36)}-${randomBytes(3).toString(\"hex\")}`,\n title: options.objective !== undefined ? truncate(options.objective, 120) : \"Combined report\",\n ...(options.objective !== undefined ? { objective: options.objective } : {}),\n ...(options.pipelineRunId !== undefined ? { pipelineRunId: options.pipelineRunId } : {}),\n taskIds: options.taskIds ?? [],\n summary,\n findings: findingGroups.sort((a, b) => rank(b) - rank(a)),\n recommendations: recommendationGroups,\n sources,\n reportIds: reports.map((r) => r.id),\n createdAt: new Date().toISOString(),\n };\n}\n\nfunction rank(finding: AggregatedFinding): number {\n return finding.severity ? SEVERITY_RANK[finding.severity] : -1;\n}\n\nfunction mergeFinding(groups: AggregatedFinding[], finding: Finding, report: Report, threshold: number): void {\n const source: FindingSource = { agent: report.agent, reportId: report.id };\n const group = groups.find((g) => similar(g.title, finding.title, threshold));\n if (group) {\n group.occurrences += 1;\n group.details.push(finding.detail);\n group.sources.push(source);\n group.evidence.push(...(finding.evidence ?? []));\n if (finding.severity && (!group.severity || SEVERITY_RANK[finding.severity] > SEVERITY_RANK[group.severity])) {\n group.severity = finding.severity;\n }\n return;\n }\n groups.push({\n title: finding.title,\n details: [finding.detail],\n sources: [source],\n occurrences: 1,\n ...(finding.severity ? { severity: finding.severity } : {}),\n evidence: [...(finding.evidence ?? [])],\n });\n}\n\nfunction mergeRecommendation(\n groups: AggregatedRecommendation[],\n text: string,\n report: Report,\n threshold: number,\n): void {\n const source: FindingSource = { agent: report.agent, reportId: report.id };\n const group = groups.find((g) => similar(g.text, text, threshold));\n if (group) {\n group.occurrences += 1;\n group.sources.push(source);\n return;\n }\n groups.push({ text, sources: [source], occurrences: 1 });\n}\n\nexport function similar(a: string, b: string, threshold: number): boolean {\n const left = tokens(a);\n const right = tokens(b);\n if (left.size === 0 || right.size === 0) return false;\n let intersection = 0;\n for (const token of left) {\n if (right.has(token)) intersection += 1;\n }\n const union = left.size + right.size - intersection;\n return intersection / union >= threshold;\n}\n\nfunction tokens(text: string): Set<string> {\n return new Set(\n text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .filter((t) => t.length >= 3),\n );\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","/**\n * Report normalization (§17): turns an agent's text output into a structured\n * Report by extracting findings, recommendations and evidence from\n * markdown-style sections. Deterministic heuristics; AI-assisted extraction\n * can layer on top later via the planner.\n */\nimport type { Finding, FindingSeverity, Report } from \"../types/report.js\";\n\nexport interface ExtractionMeta {\n taskId: string;\n agent: string;\n model?: string;\n}\n\nconst BULLET = /^(?:[-*•]|\\d+[.)])\\s+(.*)$/;\n\ninterface Section {\n heading: string;\n bullets: string[];\n}\n\nfunction parseSections(raw: string): Section[] {\n const sections: Section[] = [];\n let current: Section = { heading: \"\", bullets: [] };\n for (const line of raw.split(\"\\n\")) {\n const heading = /^(#{1,6})\\s+(.*)$/.exec(line.trim());\n if (heading) {\n if (current.heading.length > 0 || current.bullets.length > 0) {\n sections.push(current);\n }\n current = { heading: heading[2]?.toLowerCase() ?? \"\", bullets: [] };\n continue;\n }\n const bullet = BULLET.exec(line.trim());\n if (bullet && current.heading.length > 0) {\n current.bullets.push(bullet[1]?.trim() ?? \"\");\n }\n }\n if (current.heading.length > 0 || current.bullets.length > 0) {\n sections.push(current);\n }\n return sections;\n}\n\nfunction collectBullets(sections: Section[], patterns: RegExp[]): string[] {\n const matches = sections.filter((section) => patterns.some((p) => p.test(section.heading)));\n return matches.flatMap((section) => section.bullets).filter((b) => b.length > 0);\n}\n\nfunction guessSeverity(text: string): FindingSeverity | undefined {\n if (/critical|severe/i.test(text)) return \"critical\";\n if (/\\bhigh\\b|major/i.test(text)) return \"high\";\n if (/medium|moderate/i.test(text)) return \"medium\";\n if (/\\blow\\b|minor/i.test(text)) return \"low\";\n return undefined;\n}\n\nexport function extractReportFromText(raw: string, meta: ExtractionMeta): Report {\n const trimmed = raw.trim();\n const nonEmpty = trimmed\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n // Prefer a prose line over markdown headings/bullets for the summary.\n const proseLine =\n nonEmpty.find((line) => !line.startsWith(\"#\") && !BULLET.test(line)) ?? nonEmpty[0] ?? \"\";\n const cleaned = proseLine.replace(/^#{1,6}\\s+/, \"\").replace(BULLET, \"$1\");\n const summary = cleaned.length > 0 ? truncate(cleaned, 200) : \"(no output)\";\n\n const sections = parseSections(trimmed);\n const findingTexts = collectBullets(sections, [/finding/, /issue/, /problem/, /vulnerab/]);\n const recommendationTexts = collectBullets(sections, [/recommend/, /suggestion/, /next step/, /action/]);\n const evidenceTexts = collectBullets(sections, [/evidence/, /proof/, /log/]);\n\n const findings: Finding[] = findingTexts.map((text, index) => ({\n id: `${meta.taskId}-f-${index + 1}`,\n title: truncate(text, 120),\n detail: text,\n severity: guessSeverity(text),\n }));\n\n return {\n id: `${meta.taskId}-report`,\n taskId: meta.taskId,\n agent: meta.agent,\n ...(meta.model !== undefined ? { model: meta.model } : {}),\n summary,\n findings,\n recommendations: recommendationTexts.map((t) => truncate(t, 200)),\n metadata: evidenceTexts.length > 0 ? { evidence: evidenceTexts } : undefined,\n createdAt: new Date().toISOString(),\n };\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","/**\n * Report service (§16–§17): collects reports from finished tasks (structured\n * protocol reports when present, extraction from text otherwise), persists\n * them with source attribution and generates combined reports.\n */\nimport { logger, type Logger } from \"../logger/index.js\";\nimport type { Task } from \"../types/task.js\";\nimport type { Report, CombinedReport } from \"../types/report.js\";\nimport { aggregateReports, type AggregateOptions } from \"./aggregate.js\";\nimport { extractReportFromText } from \"./extract.js\";\nimport type { ReportStore } from \"./store.js\";\n\nexport interface CombinedMeta {\n objective?: string;\n pipelineRunId?: string;\n taskIds?: string[];\n}\n\nexport class ReportService {\n private readonly log: Logger;\n\n constructor(\n private readonly store: ReportStore,\n log: Logger = logger,\n ) {\n this.log = log.child({ component: \"reports\" });\n }\n\n get storeRef(): ReportStore {\n return this.store;\n }\n\n /** Normalizes finished tasks into reports (§17 — normalizer). */\n async collectFromTasks(tasks: Task[]): Promise<Report[]> {\n const reports: Report[] = [];\n for (const task of tasks) {\n const structured = task.result?.reports ?? [];\n if (structured.length > 0) {\n reports.push(...structured);\n continue;\n }\n const text = task.result?.rawOutput ?? task.result?.summary ?? \"\";\n if (text.trim().length === 0) continue;\n reports.push(\n extractReportFromText(text, {\n taskId: task.id,\n agent: task.agent ?? \"unknown\",\n }),\n );\n }\n return reports;\n }\n\n async saveReports(reports: Report[]): Promise<void> {\n if (reports.length === 0) return;\n await this.store.saveReports(reports);\n this.log.info(`Stored ${reports.length} report(s).`);\n }\n\n async generateCombined(reports: Report[], meta: CombinedMeta = {}): Promise<CombinedReport | undefined> {\n if (reports.length === 0) return undefined;\n const options: AggregateOptions = {\n ...(meta.objective !== undefined ? { objective: meta.objective } : {}),\n ...(meta.pipelineRunId !== undefined ? { pipelineRunId: meta.pipelineRunId } : {}),\n ...(meta.taskIds !== undefined ? { taskIds: meta.taskIds } : {}),\n };\n const combined = aggregateReports(reports, options);\n await this.store.saveCombined(combined);\n this.log.info(`Generated combined report ${combined.id}.`);\n return combined;\n }\n}\n","/**\n * Report persistence (§16 — report storage). Same replaceable-store and\n * serialized-write patterns as the other local stores.\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { CombinedReport, Report } from \"../types/report.js\";\n\nexport interface ReportFilter {\n taskId?: string;\n agent?: string;\n}\n\nexport interface CombinedReportFilter {\n pipelineRunId?: string;\n}\n\nexport interface ReportStore {\n saveReports(reports: Report[]): Promise<void>;\n listReports(filter?: ReportFilter): Promise<Report[]>;\n saveCombined(combined: CombinedReport): Promise<void>;\n getCombined(id: string): Promise<CombinedReport | undefined>;\n listCombined(filter?: CombinedReportFilter): Promise<CombinedReport[]>;\n}\n\ntype StoreEntry = { kind: \"report\"; report: Report } | { kind: \"combined\"; combined: CombinedReport };\n\nexport class FileReportStore implements ReportStore {\n private readonly filePath: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(directory = `${process.cwd()}/.omninode`) {\n this.filePath = `${directory}/reports.json`;\n }\n\n async saveReports(reports: Report[]): Promise<void> {\n return this.synchronized(async () => {\n const entries = await this.load();\n for (const report of reports) {\n const index = entries.findIndex(\n (e) => e.kind === \"report\" && e.report.id === report.id,\n );\n const entry: StoreEntry = { kind: \"report\", report };\n if (index >= 0) entries[index] = entry;\n else entries.push(entry);\n }\n await this.write(entries);\n });\n }\n\n async listReports(filter: ReportFilter = {}): Promise<Report[]> {\n return this.synchronized(async () => {\n const entries = await this.load();\n return entries\n .filter((e): e is { kind: \"report\"; report: Report } => e.kind === \"report\")\n .map((e) => e.report)\n .filter((report) => (filter.taskId ? report.taskId === filter.taskId : true))\n .filter((report) => (filter.agent ? report.agent === filter.agent : true))\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n });\n }\n\n async saveCombined(combined: CombinedReport): Promise<void> {\n return this.synchronized(async () => {\n const entries = await this.load();\n const index = entries.findIndex(\n (e) => e.kind === \"combined\" && e.combined.id === combined.id,\n );\n const entry: StoreEntry = { kind: \"combined\", combined };\n if (index >= 0) entries[index] = entry;\n else entries.push(entry);\n await this.write(entries);\n });\n }\n\n async getCombined(id: string): Promise<CombinedReport | undefined> {\n return this.synchronized(async () => {\n const entries = await this.load();\n const found = entries.find((e) => e.kind === \"combined\" && e.combined.id === id);\n return found?.kind === \"combined\" ? found.combined : undefined;\n });\n }\n\n async listCombined(filter: CombinedReportFilter = {}): Promise<CombinedReport[]> {\n return this.synchronized(async () => {\n const entries = await this.load();\n return entries\n .filter((e): e is { kind: \"combined\"; combined: CombinedReport } => e.kind === \"combined\")\n .map((e) => e.combined)\n .filter((combined) =>\n filter.pipelineRunId ? combined.pipelineRunId === filter.pipelineRunId : true,\n )\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n });\n }\n\n private synchronized<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async load(): Promise<StoreEntry[]> {\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as StoreEntry[]) : [];\n } catch {\n return [];\n }\n }\n\n private async write(entries: StoreEntry[]): Promise<void> {\n const tmp = `${this.filePath}.tmp`;\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(tmp, `${JSON.stringify(entries, null, 2)}\\n`, \"utf8\");\n await rename(tmp, this.filePath);\n }\n}\n","import type { Command } from \"commander\";\nimport { OmniNodeError } from \"../../errors/index.js\";\nimport { ReportService } from \"../../reports/index.js\";\nimport { FileReportStore } from \"../../reports/store.js\";\nimport { truncate } from \"./shared.js\";\n\nfunction service(): ReportService {\n return new ReportService(new FileReportStore());\n}\n\nexport function registerReportCommands(program: Command): void {\n const report = program\n .command(\"report\")\n .description(\"Inspect AI reports collected from tasks and pipelines (§16–§17).\");\n\n report\n .command(\"list\")\n .description(\"List stored reports.\")\n .option(\"--task <taskId>\", \"Only reports for this task.\")\n .option(\"--agent <name>\", \"Only reports from this agent.\")\n .action(async (options: { task?: string; agent?: string }) => {\n const svc = service();\n const reports = await svc.storeRef.listReports({\n ...(options.task !== undefined ? { taskId: options.task } : {}),\n ...(options.agent !== undefined ? { agent: options.agent } : {}),\n });\n if (reports.length === 0) {\n console.log(\"No reports stored yet. Run a pipeline to collect some.\");\n return;\n }\n for (const r of reports) {\n console.log(`${r.id} ${r.agent.padEnd(10)} ${truncate(r.summary, 60)}`);\n }\n });\n\n report\n .command(\"combined\")\n .description(\"List combined reports (aggregated intelligence, §17).\")\n .option(\"--run <pipelineRunId>\", \"Only combined reports for this pipeline run.\")\n .action(async (options: { run?: string }) => {\n const svc = service();\n const combined = await svc.storeRef.listCombined({\n ...(options.run !== undefined ? { pipelineRunId: options.run } : {}),\n });\n if (combined.length === 0) {\n console.log(\"No combined reports stored yet. Run a pipeline to generate one.\");\n return;\n }\n for (const c of combined) {\n console.log(\n `${c.id} ${c.findings.length} finding(s) from ${c.sources.length} source(s)${c.pipelineRunId ? ` run=${c.pipelineRunId}` : \"\"}`,\n );\n }\n });\n\n report\n .command(\"show <id>\")\n .description(\"Show a stored report or combined report in full.\")\n .action(async (id: string) => {\n const svc = service();\n const reports = await svc.storeRef.listReports();\n const raw = reports.find((r) => r.id === id);\n if (raw) {\n console.log(`Report ${raw.id}`);\n console.log(` agent: ${raw.agent}${raw.model ? ` (${raw.model})` : \"\"}`);\n console.log(` task: ${raw.taskId}`);\n console.log(` summary: ${raw.summary}`);\n if (raw.findings.length > 0) {\n console.log(\" findings:\");\n for (const finding of raw.findings) {\n console.log(` - [${finding.severity ?? \"info\"}] ${finding.title}`);\n for (const evidence of finding.evidence ?? []) {\n console.log(` evidence: ${evidence}`);\n }\n }\n }\n if (raw.recommendations.length > 0) {\n console.log(\" recommendations:\");\n for (const recommendation of raw.recommendations) {\n console.log(` - ${recommendation}`);\n }\n }\n return;\n }\n\n const combined = await svc.storeRef.getCombined(id);\n if (combined) {\n console.log(`Combined report ${combined.id}`);\n console.log(` sources: ${combined.sources.join(\", \")}`);\n console.log(` reports: ${combined.reportIds.length}`);\n if (combined.pipelineRunId) console.log(` run: ${combined.pipelineRunId}`);\n console.log(` summary: ${combined.summary}`);\n if (combined.findings.length > 0) {\n console.log(\" findings (grouped, duplicates merged):\");\n for (const finding of combined.findings) {\n console.log(\n ` - [${finding.severity ?? \"info\"}] ${finding.title} (x${finding.occurrences}, sources: ${finding.sources.map((s) => s.agent).join(\", \")})`,\n );\n }\n }\n if (combined.recommendations.length > 0) {\n console.log(\" recommendations:\");\n for (const recommendation of combined.recommendations) {\n console.log(` - ${recommendation.text} (x${recommendation.occurrences})`);\n }\n }\n return;\n }\n\n throw new OmniNodeError(\"REPORT_NOT_FOUND\", `Report \"${id}\" was not found in the report store.`);\n });\n}\n","/**\n * Pipeline engine (§14, §15, §27 Phase 5): validates pipeline definitions,\n * schedules steps over their dependency DAG (implicit sequential chain by\n * default, parallel where the DAG allows), fans research steps out to several\n * agents, hands combined context to plan steps (via a chat model) and to the\n * final execution agent. Every task runs through the TaskEngine, so tasks,\n * results and reports are persisted normally.\n */\nimport { randomBytes } from \"node:crypto\";\nimport type { AgentRegistry } from \"../agents/index.js\";\nimport type { AppConfig } from \"../config/index.js\";\nimport { PipelineError } from \"../errors/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport type { RoleRegistry } from \"../roles/index.js\";\nimport { createProvider } from \"../providers/index.js\";\nimport type { RoleDefinition } from \"../types/role.js\";\nimport type {\n PipelineDefinition,\n PipelineRun,\n PipelineRunStatus,\n PipelineStep,\n PipelineStepRun,\n} from \"../types/pipeline.js\";\nimport type { ChatMessage } from \"../types/chat.js\";\nimport type { Plan } from \"../types/plan.js\";\nimport type { Report } from \"../types/report.js\";\nimport type { ReportService } from \"../reports/index.js\";\nimport type { IPlanner } from \"../planner/index.js\";\nimport type { PlanStore } from \"../planner/store.js\";\nimport { HeuristicPlanner } from \"../planner/heuristic.js\";\nimport { ModelPlanner } from \"../planner/model.js\";\nimport type { TaskEngine } from \"../tasks/index.js\";\nimport type { PipelineRunStore } from \"./store.js\";\n\nexport type ChatFn = (modelRef: string, messages: ChatMessage[]) => Promise<string>;\n\nexport interface PipelineEngineOptions {\n tasks: TaskEngine;\n agents: AgentRegistry;\n roles: RoleRegistry;\n providers: AppConfig[\"project\"][\"providers\"];\n store: PipelineRunStore;\n chat?: ChatFn;\n /** Default planner used by plan steps without their own model (§18). */\n planner?: IPlanner;\n /** When present, plans produced by plan steps are persisted. */\n plans?: PlanStore;\n /** When present, finished runs have their reports collected, stored and combined (§16–§17). */\n reports?: ReportService;\n log?: Logger;\n}\n\nexport interface RunPipelineOptions {\n objective?: string;\n onStep?: (stepRun: PipelineStepRun) => void;\n}\n\ninterface StepOutcome {\n status: \"completed\" | \"failed\" | \"skipped\";\n summary: string;\n /** What this step adds to the combined context (defaults to summary). */\n contextContribution?: string;\n taskIds: string[];\n planId?: string;\n error?: string;\n reports: Report[];\n}\n\ninterface StepContext {\n objective: string;\n role?: RoleDefinition;\n combinedContext: string;\n reports: Report[];\n pipelineRunId?: string;\n}\n\nexport class PipelineEngine {\n private readonly log: Logger;\n\n constructor(private readonly options: PipelineEngineOptions) {\n this.log = (options.log ?? logger).child({ component: \"pipelines\" });\n }\n\n get store(): PipelineRunStore {\n return this.options.store;\n }\n\n /** Structural + semantic validation (§27 Phase 5 — pipeline parser). */\n validate(def: PipelineDefinition): void {\n const ids = new Set<string>();\n for (const step of def.steps) {\n if (ids.has(step.id)) {\n throw new PipelineError(\"PIPELINE_INVALID\", `Duplicate step id \"${step.id}\".`);\n }\n ids.add(step.id);\n }\n for (const step of def.steps) {\n for (const dep of step.dependsOn ?? []) {\n if (!ids.has(dep)) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Step \"${step.id}\" depends on unknown step \"${dep}\".`,\n );\n }\n }\n if ((step.kind === \"research\") && (step.agents ?? []).length === 0) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Research step \"${step.id}\" needs at least one agent.`,\n );\n }\n if ((step.kind === \"execute\" || step.kind === \"custom\") && !step.agent) {\n throw new PipelineError(\"PIPELINE_INVALID\", `Step \"${step.id}\" (${step.kind}) needs an agent.`);\n }\n }\n this.assertAcyclic(def);\n }\n\n private assertAcyclic(def: PipelineDefinition): void {\n const deps = this.effectiveDependencies(def);\n const remaining = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n for (const [id, list] of deps) {\n remaining.set(id, list.length);\n for (const d of list) {\n dependents.set(d, [...(dependents.get(d) ?? []), id]);\n }\n }\n const queue = [...deps.keys()].filter((id) => (remaining.get(id) ?? 0) === 0);\n let processed = 0;\n while (queue.length > 0) {\n const id = queue.shift()!;\n processed += 1;\n for (const next of dependents.get(id) ?? []) {\n const left = (remaining.get(next) ?? 0) - 1;\n remaining.set(next, left);\n if (left === 0) queue.push(next);\n }\n }\n if (processed < deps.size) {\n const stuck = [...deps.keys()].filter((id) => (remaining.get(id) ?? 0) > 0);\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Pipeline \"${def.id}\" has a dependency cycle involving: ${stuck.join(\", \")}.`,\n );\n }\n }\n\n /**\n * Steps run sequentially in definition order unless they declare explicit\n * dependencies, which enable parallel branches.\n */\n private effectiveDependencies(def: PipelineDefinition): Map<string, string[]> {\n const deps = new Map<string, string[]>();\n def.steps.forEach((step, index) => {\n const explicit = step.dependsOn ?? [];\n deps.set(\n step.id,\n explicit.length > 0 ? explicit : index > 0 ? [def.steps[index - 1]!.id] : [],\n );\n });\n return deps;\n }\n\n async run(def: PipelineDefinition, options: RunPipelineOptions = {}): Promise<PipelineRun> {\n this.validate(def);\n\n const objective = (options.objective ?? def.objective ?? \"\").trim();\n if (objective.length === 0) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Pipeline \"${def.id}\" needs an objective — pass one or set it in the definition.`,\n );\n }\n const role = def.role ? this.options.roles.get(def.role) : undefined;\n if (def.role && !role) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Role \"${def.role}\" (pipeline \"${def.id}\") is not defined in project.roles.`,\n );\n }\n // Agents referenced by steps must be registered before anything runs.\n for (const step of def.steps) {\n for (const name of [...(step.agents ?? []), ...(step.agent ? [step.agent] : [])]) {\n if (!this.options.agents.get(name)) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Step \"${step.id}\" references unregistered agent \"${name}\".`,\n );\n }\n }\n }\n\n const now = new Date().toISOString();\n const run: PipelineRun = {\n id: `run-${Date.now().toString(36)}-${randomBytes(3).toString(\"hex\")}`,\n pipelineId: def.id,\n objective,\n status: \"running\",\n startedAt: now,\n stepRuns: [],\n };\n await this.options.store.save(run);\n this.log.info(`Running pipeline ${def.id} as ${run.id}.`);\n\n const deps = this.effectiveDependencies(def);\n const outcomes = new Map<string, StepOutcome>();\n const pending = new Set(def.steps.map((s) => s.id));\n const contextParts: string[] = [];\n const allReports: Report[] = [];\n\n while (pending.size > 0) {\n const ready = def.steps.filter(\n (step) => pending.has(step.id) && (deps.get(step.id) ?? []).every((d) => outcomes.has(d)),\n );\n if (ready.length === 0) {\n // Cycle — already rejected by validate(), but never hang.\n throw new PipelineError(\"PIPELINE_FAILED\", `Pipeline \"${def.id}\" scheduling stalled.`);\n }\n\n const settled = await Promise.all(\n ready.map(async (step): Promise<StepOutcome> => {\n if (!this.shouldRun(step, deps.get(step.id) ?? [], outcomes)) {\n return { status: \"skipped\", summary: \"\", taskIds: [], reports: [] };\n }\n const ctx: StepContext = {\n objective,\n ...(role ? { role } : {}),\n combinedContext: contextParts.join(\"\\n\\n\"),\n reports: [...allReports],\n pipelineRunId: run.id,\n };\n return this.executeStep(step, ctx);\n }),\n );\n\n ready.forEach((step, index) => {\n const outcome = settled[index]!;\n outcomes.set(step.id, outcome);\n pending.delete(step.id);\n allReports.push(...outcome.reports);\n if (outcome.status !== \"skipped\" && outcome.summary.length > 0) {\n const contribution = outcome.contextContribution ?? outcome.summary;\n contextParts.push(`## Step \"${step.id}\" (${step.kind})\\n${contribution}`);\n }\n const stepRun: PipelineStepRun = {\n stepId: step.id,\n status:\n outcome.status === \"skipped\" ? \"cancelled\" : outcome.status === \"failed\" ? \"failed\" : \"completed\",\n ...(outcome.taskIds.length > 0 ? { taskIds: outcome.taskIds } : {}),\n ...(outcome.planId !== undefined ? { planId: outcome.planId } : {}),\n ...(outcome.error !== undefined ? { error: outcome.error } : {}),\n };\n run.stepRuns.push(stepRun);\n options.onStep?.(stepRun);\n });\n run.reports = [...allReports];\n await this.options.store.save(run);\n }\n\n const failed = [...outcomes.values()].some((o) => o.status === \"failed\");\n const finalStatus: PipelineRunStatus = failed ? \"failed\" : \"completed\";\n const planId = [...outcomes.values()].find((o) => o.planId !== undefined)?.planId;\n\n // §28 — Result: the outcome of the last completed step with tasks.\n let resultSummary: string | undefined;\n for (let i = def.steps.length - 1; i >= 0; i -= 1) {\n const step = def.steps[i]!;\n const outcome = outcomes.get(step.id);\n if (outcome?.status !== \"completed\" || outcome.taskIds.length === 0) continue;\n const stepTasks = (\n await Promise.all(outcome.taskIds.map((id) => this.options.tasks.get(id)))\n ).filter((task): task is NonNullable<typeof task> => task !== undefined);\n const summaries = stepTasks\n .map((task) => task.result?.summary)\n .filter((summary): summary is string => summary !== undefined);\n if (summaries.length > 0) resultSummary = summaries.join(\"\\n\");\n break;\n }\n\n // Report system (§16–§17): collect, store and combine reports from the\n // analysis tasks (research/analyze) — execution output is a result, not a report.\n let combinedReportId: string | undefined;\n if (this.options.reports) {\n const taskIds = def.steps\n .filter((step) => step.kind === \"research\" || step.kind === \"analyze\")\n .flatMap((step) => outcomes.get(step.id)?.taskIds ?? []);\n const tasks = (\n await Promise.all(taskIds.map((id) => this.options.tasks.get(id)))\n ).filter((task): task is NonNullable<typeof task> => task !== undefined);\n const collected = await this.options.reports.collectFromTasks(tasks);\n await this.options.reports.saveReports(collected);\n const combined = await this.options.reports.generateCombined(collected, {\n objective,\n pipelineRunId: run.id,\n taskIds,\n });\n combinedReportId = combined?.id;\n if (collected.length > 0) {\n run.reports = collected;\n }\n }\n\n const finished: PipelineRun = {\n ...run,\n status: finalStatus,\n finishedAt: new Date().toISOString(),\n ...(run.reports !== undefined && run.reports.length > 0 ? { reports: run.reports } : {}),\n ...(combinedReportId !== undefined ? { combinedReportId } : {}),\n ...(planId !== undefined ? { planId } : {}),\n ...(resultSummary !== undefined ? { resultSummary } : {}),\n };\n await this.options.store.save(finished);\n this.log.info(`Pipeline ${def.id} finished: ${finalStatus}.`);\n return finished;\n }\n\n async get(runId: string): Promise<PipelineRun | undefined> {\n return this.options.store.get(runId);\n }\n\n async listRuns(filter?: { pipelineId?: string }): Promise<PipelineRun[]> {\n return this.options.store.list(filter);\n }\n\n private shouldRun(\n step: PipelineStep,\n deps: string[],\n outcomes: Map<string, StepOutcome>,\n ): boolean {\n const condition = step.condition ?? \"on-success\";\n const depStatuses = deps.map((d) => outcomes.get(d)?.status);\n const anyFailed = depStatuses.includes(\"failed\");\n const anySkipped = depStatuses.includes(\"skipped\");\n if (condition === \"always\") return true;\n if (condition === \"on-failure\") return anyFailed;\n return !anyFailed && !anySkipped;\n }\n\n private async executeStep(step: PipelineStep, ctx: StepContext): Promise<StepOutcome> {\n const retries = step.retries ?? 0;\n let last: StepOutcome | undefined;\n for (let attempt = 0; attempt <= retries; attempt += 1) {\n if (attempt > 0) {\n this.log.warn(`Step \"${step.id}\" failed — retry ${attempt}/${retries}.`);\n }\n last = await this.executeStepOnce(step, ctx);\n if (last.status !== \"failed\") return last;\n }\n return last!;\n }\n\n private async executeStepOnce(step: PipelineStep, ctx: StepContext): Promise<StepOutcome> {\n switch (step.kind) {\n case \"research\":\n return this.runFanOut(step, ctx);\n case \"collect\":\n return { status: \"completed\", summary: \"(collect: outputs gathered from previous steps)\", taskIds: [], reports: [] };\n case \"analyze\":\n if (!step.agent) {\n return { status: \"completed\", summary: \"(analyze: pass-through, no agent assigned)\", taskIds: [], reports: [] };\n }\n return this.runSingle(step, ctx, step.agent);\n case \"plan\":\n return this.runPlan(step, ctx);\n case \"execute\":\n case \"custom\":\n return this.runSingle(step, ctx, step.agent!);\n }\n }\n\n /** Research fan-out: one task per agent, in parallel (§15). */\n private async runFanOut(step: PipelineStep, ctx: StepContext): Promise<StepOutcome> {\n const agentNames = step.agents ?? [];\n const created = await Promise.all(\n agentNames.map((name) =>\n this.options.tasks.create({\n objective: ctx.objective,\n agent: name,\n ...(ctx.role ? { role: ctx.role.id } : {}),\n ...(ctx.combinedContext.length > 0\n ? { context: { background: ctx.combinedContext } }\n : {}),\n }),\n ),\n );\n const results = await Promise.all(created.map((task) => this.options.tasks.run(task.id)));\n\n const failedTasks = results.filter((r) => r.status !== \"completed\");\n const lines = results.map((result, index) => {\n const agentName = agentNames[index] ?? \"unknown\";\n const outcome = result.result?.summary ?? result.result?.error ?? \"(no output)\";\n return `- ${agentName}: ${outcome}`;\n });\n const reports = results.flatMap((r) => r.result?.reports ?? []);\n const summary = lines.join(\"\\n\");\n\n if (failedTasks.length > 0) {\n const firstError = failedTasks[0]?.result?.error ?? \"unknown error\";\n return {\n status: \"failed\",\n summary,\n taskIds: created.map((t) => t.id),\n error: `${failedTasks.length}/${results.length} task(s) failed — ${firstError}`,\n reports,\n };\n }\n return { status: \"completed\", summary, taskIds: created.map((t) => t.id), reports };\n }\n\n private async runSingle(\n step: PipelineStep,\n ctx: StepContext,\n agentName: string,\n ): Promise<StepOutcome> {\n const task = await this.options.tasks.create({\n objective: ctx.objective,\n agent: agentName,\n ...(ctx.role ? { role: ctx.role.id } : {}),\n ...(ctx.combinedContext.length > 0 ? { context: { background: ctx.combinedContext } } : {}),\n });\n const result = await this.options.tasks.run(task.id);\n if (result.status !== \"completed\") {\n return {\n status: \"failed\",\n summary: result.result?.summary ?? \"\",\n taskIds: [task.id],\n error: result.result?.error ?? `task ${task.id} did not complete`,\n reports: result.result?.reports ?? [],\n };\n }\n return {\n status: \"completed\",\n summary: result.result?.summary ?? \"(no output)\",\n taskIds: [task.id],\n reports: result.result?.reports ?? [],\n };\n }\n\n private async runPlan(step: PipelineStep, ctx: StepContext): Promise<StepOutcome> {\n const request = {\n objective: ctx.objective,\n reports: ctx.reports,\n ...(ctx.combinedContext.length > 0 ? { context: ctx.combinedContext } : {}),\n ...(ctx.role ? { role: ctx.role } : {}),\n ...(ctx.pipelineRunId !== undefined ? { pipelineRunId: ctx.pipelineRunId } : {}),\n };\n\n // Selection order: an explicit step model wins, then the configured\n // default planner, then a pass-through (nothing to plan with).\n let planner: IPlanner;\n if (step.model) {\n planner = new ModelPlanner({\n model: step.model,\n chat: this.getChat(),\n fallback: new HeuristicPlanner(),\n log: this.log,\n });\n } else if (this.options.planner) {\n planner = this.options.planner;\n } else {\n return {\n status: \"completed\",\n summary: \"(plan: no model or planner configured — skipped)\",\n taskIds: [],\n reports: [],\n };\n }\n\n let plan: Plan;\n try {\n plan = await planner.plan(request);\n } catch (error) {\n return {\n status: \"failed\",\n summary: \"\",\n taskIds: [],\n error: error instanceof Error ? error.message : String(error),\n reports: [],\n };\n }\n\n await this.options.plans?.save(plan);\n return {\n status: \"completed\",\n summary: plan.summary,\n contextContribution: formatPlan(plan),\n taskIds: [],\n planId: plan.id,\n reports: [],\n };\n }\n\n private getChat(): ChatFn {\n if (this.options.chat) return this.options.chat;\n throw new PipelineError(\n \"PIPELINE_FAILED\",\n \"No chat function available — configure a provider for plan steps.\",\n );\n }\n}\n\nfunction formatPlan(plan: Plan): string {\n const lines = [\n `# Implementation Plan (by ${plan.generatedBy})`,\n plan.summary,\n \"Steps:\",\n ...plan.steps.map((step) => {\n const targets = step.targets && step.targets.length > 0 ? ` [targets: ${step.targets.join(\", \")}]` : \"\";\n return `${step.order}. ${step.title}${targets}`;\n }),\n ];\n if (plan.risks && plan.risks.length > 0) {\n lines.push(\"Risks:\", ...plan.risks.map((risk) => `- ${risk}`));\n }\n return lines.join(\"\\n\");\n}\n\n/** Default chat function: resolves \"provider:model\" against the configured providers. */\nexport function createDefaultChatFn(\n providers: AppConfig[\"project\"][\"providers\"],\n): ChatFn {\n return async (modelRef, messages) => {\n const separator = modelRef.indexOf(\":\");\n if (separator <= 0 || separator === modelRef.length - 1) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Invalid model reference \"${modelRef}\". Use \"provider:model-id\".`,\n );\n }\n const providerName = modelRef.slice(0, separator);\n const modelId = modelRef.slice(separator + 1);\n const providerConfig = providers.find((p) => p.name === providerName);\n if (!providerConfig) {\n throw new PipelineError(\n \"PIPELINE_INVALID\",\n `Provider \"${providerName}\" (model \"${modelRef}\") is not configured.`,\n );\n }\n const provider = createProvider(providerConfig);\n const response = await provider.chat({ model: modelId, messages });\n return response.content;\n };\n}\n","/**\n * HeuristicPlanner: a deterministic, dependency-free planner that derives an\n * implementation plan directly from recommendations and significant findings.\n * Used as the no-model option and as the graceful fallback when a model's\n * output can't be parsed.\n */\nimport { randomBytes } from \"node:crypto\";\nimport type { Plan, PlanStep } from \"../types/plan.js\";\nimport type { Finding, FindingSeverity } from \"../types/report.js\";\nimport type { IPlanner, PlanRequest } from \"./types.js\";\n\nconst SEVERITY_RANK: Record<FindingSeverity, number> = {\n info: 0,\n low: 1,\n medium: 2,\n high: 3,\n critical: 4,\n};\n\nexport class HeuristicPlanner implements IPlanner {\n readonly name = \"heuristic\";\n\n async plan(request: PlanRequest): Promise<Plan> {\n const steps: PlanStep[] = [];\n const findings = request.reports.flatMap((report) =>\n report.findings.map((finding) => ({ finding, agent: report.agent })),\n );\n\n // One step per distinct recommendation (deduped by text).\n const recommendations = dedupe(request.reports.flatMap((r) => r.recommendations));\n for (const [index, text] of recommendations.entries()) {\n steps.push({\n id: `step-${steps.length + 1}`,\n title: truncate(text, 120),\n order: steps.length + 1,\n ...(index > 0 ? { dependsOn: [`step-${steps.length}`] } : {}),\n });\n }\n\n // Remediation steps for significant findings, most severe first.\n const significant = findings\n .filter(({ finding }) => (finding.severity ? SEVERITY_RANK[finding.severity] >= SEVERITY_RANK.high : false))\n .sort((a, b) => SEVERITY_RANK[b.finding.severity ?? \"info\"] - SEVERITY_RANK[a.finding.severity ?? \"info\"]);\n for (const { finding } of significant) {\n steps.push(remediationStep(finding, steps.length + 1));\n }\n\n if (steps.length === 0) {\n steps.push({\n id: \"step-1\",\n title: \"Gather additional information\",\n description:\n \"The research reports contained no actionable recommendations or significant findings. \" +\n \"Investigate the objective further before planning implementation work.\",\n order: 1,\n });\n }\n\n const risks = significant\n .filter(({ finding }) => finding.severity === \"critical\")\n .map(({ finding }) => `Critical finding unaddressed until its step completes: ${finding.title}`);\n\n return {\n id: `plan-${Date.now().toString(36)}-${randomBytes(3).toString(\"hex\")}`,\n objective: request.objective,\n summary:\n `Derived from ${request.reports.length} report(s): ` +\n `${recommendations.length} recommendation step(s), ${significant.length} remediation step(s).`,\n steps,\n ...(risks.length > 0 ? { risks } : {}),\n generatedBy: \"heuristic\",\n ...(request.taskId !== undefined ? { taskId: request.taskId } : {}),\n ...(request.pipelineRunId !== undefined ? { pipelineRunId: request.pipelineRunId } : {}),\n createdAt: new Date().toISOString(),\n };\n }\n}\n\nfunction remediationStep(finding: Finding, order: number): PlanStep {\n return {\n id: `step-${order}`,\n title: `Fix: ${truncate(finding.title, 100)}`,\n description: finding.detail,\n order,\n dependsOn: order > 1 ? [`step-${order - 1}`] : [],\n sourceFindings: [finding.id],\n };\n}\n\nfunction dedupe(texts: string[]): string[] {\n return [...new Set(texts.map((t) => t.trim()).filter((t) => t.length > 0))];\n}\n\nfunction truncate(text: string, max: number): string {\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n","/**\n * ModelPlanner (§18): uses a chat model (\"provider:model-id\" through the chat\n * layer) to produce an implementation plan. The model is asked for JSON\n * matching the plan contract; unparseable output degrades gracefully to the\n * heuristic fallback rather than failing the pipeline.\n */\nimport { randomBytes } from \"node:crypto\";\nimport { z } from \"zod\";\nimport { PlannerError } from \"../errors/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport type { Plan, PlanStep } from \"../types/plan.js\";\nimport type { ChatMessage } from \"../types/chat.js\";\nimport type { ChatFn } from \"../pipelines/index.js\";\nimport { buildPlannerContext } from \"./context.js\";\nimport type { IPlanner, PlanRequest } from \"./types.js\";\n\nexport interface ModelPlannerOptions {\n model: string;\n chat: ChatFn;\n /** Extra instruction appended to the system prompt. */\n instruction?: string;\n /** Used when the model output is unparseable (or the call fails, if tolerateErrors). */\n fallback?: IPlanner;\n log?: Logger;\n}\n\nconst planStepJsonSchema = z\n .object({\n id: z.string().optional(),\n title: z.string().min(1),\n description: z.string().optional(),\n order: z.number().int().optional(),\n targets: z.array(z.string()).optional(),\n acceptance_criteria: z.array(z.string()).optional(),\n depends_on: z.array(z.string()).optional(),\n source_findings: z.array(z.string()).optional(),\n })\n .strict();\n\nconst planJsonSchema = z\n .object({\n summary: z.string().min(1),\n steps: z.array(planStepJsonSchema).min(1),\n risks: z.array(z.string()).optional(),\n notes: z.array(z.string()).optional(),\n })\n .strict();\n\nexport class ModelPlanner implements IPlanner {\n readonly name = \"model\";\n private readonly log: Logger;\n\n constructor(private readonly options: ModelPlannerOptions) {\n this.log = (options.log ?? logger).child({ component: \"planner\", model: options.model });\n }\n\n async plan(request: PlanRequest): Promise<Plan> {\n const context = buildPlannerContext(request);\n const messages: ChatMessage[] = [\n {\n role: \"system\",\n content:\n \"You are the OmniNode planner. Given the objective and the combined research context, \" +\n \"produce a final analysis and a prioritized, actionable implementation plan. \" +\n \"Respond with JSON ONLY (no prose, no code fences) matching exactly this shape: \" +\n '{\"summary\": string, \"steps\": [{\"id\": string, \"title\": string, \"description\": string, ' +\n '\"order\": number, \"targets\": string[], \"acceptance_criteria\": string[], \"source_findings\": string[]}], ' +\n '\"risks\": string[], \"notes\": string[]}. ' +\n (this.options.instruction ?? \"\"),\n },\n { role: \"user\", content: context },\n ];\n\n let responseText: string;\n try {\n responseText = await this.options.chat(this.options.model, messages);\n } catch (error) {\n return this.degrade(request, `planner model call failed: ${describe(error)}`);\n }\n\n const parsed = parsePlanJson(responseText);\n if (!parsed) {\n return this.degrade(request, \"planner model output was not valid plan JSON\");\n }\n\n const plan: Plan = {\n id: `plan-${Date.now().toString(36)}-${randomBytes(3).toString(\"hex\")}`,\n objective: request.objective,\n summary: parsed.summary,\n steps: parsed.steps,\n ...(parsed.risks !== undefined ? { risks: parsed.risks } : {}),\n ...(parsed.notes !== undefined ? { notes: parsed.notes } : {}),\n generatedBy: `model:${this.options.model}`,\n model: this.options.model,\n ...(request.taskId !== undefined ? { taskId: request.taskId } : {}),\n ...(request.pipelineRunId !== undefined ? { pipelineRunId: request.pipelineRunId } : {}),\n createdAt: new Date().toISOString(),\n };\n return plan;\n }\n\n private async degrade(request: PlanRequest, reason: string): Promise<Plan> {\n if (this.options.fallback) {\n this.log.warn(`${reason} — using the heuristic fallback planner.`);\n return this.options.fallback.plan(request);\n }\n throw new PlannerError(\"PLANNER_FAILED\", `Planner failed: ${reason}.`);\n }\n}\n\n/** Extracts and validates the plan JSON from arbitrary model output. */\nexport function parsePlanJson(\n text: string,\n): { summary: string; steps: PlanStep[]; risks?: string[]; notes?: string[] } | undefined {\n const unfenced = text.replace(/```(?:json)?/gi, \"\");\n const start = unfenced.indexOf(\"{\");\n const end = unfenced.lastIndexOf(\"}\");\n if (start < 0 || end <= start) return undefined;\n try {\n const json: unknown = JSON.parse(unfenced.slice(start, end + 1));\n const parsed = planJsonSchema.safeParse(json);\n if (!parsed.success) return undefined;\n\n const steps: PlanStep[] = parsed.data.steps.map((step, index) => ({\n id: step.id ?? `step-${index + 1}`,\n title: step.title,\n description: step.description,\n order: step.order ?? index + 1,\n targets: step.targets,\n acceptanceCriteria: step.acceptance_criteria,\n dependsOn: step.depends_on,\n sourceFindings: step.source_findings,\n }));\n return {\n summary: parsed.data.summary,\n steps: steps.sort((a, b) => a.order - b.order),\n risks: parsed.data.risks,\n notes: parsed.data.notes,\n };\n } catch {\n return undefined;\n }\n}\n\nfunction describe(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * Planner context builder (§18): assembles everything the planner needs —\n * the objective, the combined findings from the AI reports (with source\n * attribution), relevant memory and the role definition — into one\n * structured text.\n */\nimport type { PlanRequest } from \"./types.js\";\nimport type { Report } from \"../types/report.js\";\n\nexport function buildPlannerContext(request: PlanRequest): string {\n const parts: string[] = [`# Objective\\n${request.objective}`];\n\n if (request.role) {\n const roleLines = [`# Role\\n${request.role.name} (${request.role.id})`];\n if (request.role.responsibilities.length > 0) {\n roleLines.push(\"Responsibilities:\", ...request.role.responsibilities.map((r) => `- ${r}`));\n }\n if (request.role.expectedOutputs.length > 0) {\n roleLines.push(\"Expected outputs:\", ...request.role.expectedOutputs.map((o) => `- ${o}`));\n }\n parts.push(roleLines.join(\"\\n\"));\n }\n\n if (request.reports.length > 0) {\n const agents = [...new Set(request.reports.map((r) => r.agent))].join(\", \");\n const findingLines = request.reports.flatMap((report: Report) =>\n report.findings.map(\n (finding) =>\n `- [${finding.severity ?? \"info\"}] ${finding.title} (source: ${report.agent}, finding: ${finding.id})` +\n (finding.detail ? ` — ${finding.detail}` : \"\"),\n ),\n );\n parts.push(\n `# Findings (${request.reports.length} report(s) by ${agents})\\n` +\n (findingLines.length > 0 ? findingLines.join(\"\\n\") : \"(no findings reported)\"),\n );\n\n const recommendationLines = request.reports.flatMap((report) =>\n report.recommendations.map((text) => `- ${text} (source: ${report.agent})`),\n );\n if (recommendationLines.length > 0) {\n parts.push(`# Recommendations\\n${recommendationLines.join(\"\\n\")}`);\n }\n\n const summaryLines = request.reports.map((report) => `- [${report.agent}] ${report.summary}`);\n parts.push(`# Report summaries\\n${summaryLines.join(\"\\n\")}`);\n }\n\n if (request.memory && request.memory.length > 0) {\n parts.push(\n `# Relevant memory\\n` +\n request.memory.map((entry) => `- [${entry.scope}] ${entry.content}`).join(\"\\n\"),\n );\n }\n\n if (request.context && request.context.length > 0) {\n parts.push(`# Research context\\n${request.context}`);\n }\n\n return parts.join(\"\\n\\n\");\n}\n","/**\n * Pipeline run persistence (§27 Phase 5 — pipeline state). Same\n * replaceable-store pattern as the task store, local-first JSON file.\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { PipelineRun, PipelineRunStatus } from \"../types/pipeline.js\";\n\nexport interface PipelineRunFilter {\n pipelineId?: string;\n status?: PipelineRunStatus;\n}\n\nexport interface PipelineRunStore {\n save(run: PipelineRun): Promise<void>;\n get(id: string): Promise<PipelineRun | undefined>;\n list(filter?: PipelineRunFilter): Promise<PipelineRun[]>;\n}\n\nexport class FilePipelineRunStore implements PipelineRunStore {\n private readonly filePath: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(directory = `${process.cwd()}/.omninode`) {\n this.filePath = `${directory}/pipelines.json`;\n }\n\n async save(run: PipelineRun): Promise<void> {\n return this.synchronized(async () => {\n const runs = await this.load();\n const index = runs.findIndex((r) => r.id === run.id);\n if (index >= 0) runs[index] = run;\n else runs.push(run);\n await this.write(runs);\n });\n }\n\n async get(id: string): Promise<PipelineRun | undefined> {\n return this.synchronized(async () => {\n const runs = await this.load();\n return runs.find((r) => r.id === id);\n });\n }\n\n async list(filter: PipelineRunFilter = {}): Promise<PipelineRun[]> {\n return this.synchronized(async () => {\n const runs = await this.load();\n return runs\n .filter((run) => (filter.pipelineId ? run.pipelineId === filter.pipelineId : true))\n .filter((run) => (filter.status ? run.status === filter.status : true))\n .sort((a, b) => (a.startedAt ?? \"\").localeCompare(b.startedAt ?? \"\"));\n });\n }\n\n private synchronized<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async load(): Promise<PipelineRun[]> {\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as PipelineRun[]) : [];\n } catch {\n return [];\n }\n }\n\n private async write(runs: PipelineRun[]): Promise<void> {\n const tmp = `${this.filePath}.tmp`;\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(tmp, `${JSON.stringify(runs, null, 2)}\\n`, \"utf8\");\n await rename(tmp, this.filePath);\n }\n}\n","/**\n * Plan persistence (§27 Phase 8 — planner result storage). Same\n * replaceable-store pattern as the other local stores.\n */\nimport { mkdir, readFile, rename, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { Plan } from \"../types/plan.js\";\n\nexport interface PlanFilter {\n pipelineRunId?: string;\n taskId?: string;\n}\n\nexport interface PlanStore {\n save(plan: Plan): Promise<void>;\n get(id: string): Promise<Plan | undefined>;\n list(filter?: PlanFilter): Promise<Plan[]>;\n}\n\nexport class FilePlanStore implements PlanStore {\n private readonly filePath: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(directory = `${process.cwd()}/.omninode`) {\n this.filePath = `${directory}/plans.json`;\n }\n\n async save(plan: Plan): Promise<void> {\n return this.synchronized(async () => {\n const plans = await this.load();\n const index = plans.findIndex((p) => p.id === plan.id);\n if (index >= 0) plans[index] = plan;\n else plans.push(plan);\n await this.write(plans);\n });\n }\n\n async get(id: string): Promise<Plan | undefined> {\n return this.synchronized(async () => {\n const plans = await this.load();\n return plans.find((p) => p.id === id);\n });\n }\n\n async list(filter: PlanFilter = {}): Promise<Plan[]> {\n return this.synchronized(async () => {\n const plans = await this.load();\n return plans\n .filter((plan) => (filter.pipelineRunId ? plan.pipelineRunId === filter.pipelineRunId : true))\n .filter((plan) => (filter.taskId ? plan.taskId === filter.taskId : true))\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n });\n }\n\n private synchronized<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.queue.then(operation, operation);\n this.queue = result.then(\n () => undefined,\n () => undefined,\n );\n return result;\n }\n\n private async load(): Promise<Plan[]> {\n try {\n const raw = await readFile(this.filePath, \"utf8\");\n const parsed: unknown = JSON.parse(raw);\n return Array.isArray(parsed) ? (parsed as Plan[]) : [];\n } catch {\n return [];\n }\n }\n\n private async write(plans: Plan[]): Promise<void> {\n const tmp = `${this.filePath}.tmp`;\n await mkdir(dirname(this.filePath), { recursive: true });\n await writeFile(tmp, `${JSON.stringify(plans, null, 2)}\\n`, \"utf8\");\n await rename(tmp, this.filePath);\n }\n}\n","/** Planner factory from project configuration (§18 — planner provider support). */\nimport { ConfigError } from \"../errors/index.js\";\nimport type { AppConfig } from \"../config/index.js\";\nimport type { ChatFn } from \"../pipelines/index.js\";\nimport { HeuristicPlanner } from \"./heuristic.js\";\nimport { ModelPlanner } from \"./model.js\";\nimport type { IPlanner } from \"./types.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\n\nexport function buildPlanner(\n plannerConfig: AppConfig[\"project\"][\"planner\"],\n chat: ChatFn,\n log: Logger = logger,\n): IPlanner | undefined {\n if (!plannerConfig) return undefined;\n if (plannerConfig.kind === \"heuristic\") {\n return new HeuristicPlanner();\n }\n if (!plannerConfig.model) {\n throw new ConfigError(\n \"CONFIG_INVALID\",\n 'Planner kind \"model\" needs a model reference (\"provider:model-id\") in omninode.yaml.',\n );\n }\n return new ModelPlanner({\n model: plannerConfig.model,\n chat,\n ...(plannerConfig.instruction !== undefined ? { instruction: plannerConfig.instruction } : {}),\n fallback: new HeuristicPlanner(),\n log,\n });\n}\n","import type { AppConfig } from \"../config/index.js\";\nimport { buildAgentRegistry } from \"../agents/index.js\";\nimport { createMemoryProvider, MemoryService } from \"../memory/index.js\";\nimport { buildPlanner } from \"../planner/index.js\";\nimport { FilePlanStore } from \"../planner/store.js\";\nimport { buildRoleRegistry } from \"../roles/index.js\";\nimport { logger, type Logger } from \"../logger/index.js\";\nimport { ReportService } from \"../reports/index.js\";\nimport { FileReportStore } from \"../reports/store.js\";\nimport { TaskEngine } from \"../tasks/index.js\";\nimport { FileTaskStore } from \"../tasks/store.js\";\nimport { PipelineEngine, createDefaultChatFn } from \"./engine.js\";\nimport { FilePipelineRunStore } from \"./store.js\";\n\nexport function buildPipelineEngine(config: AppConfig, log: Logger = logger): PipelineEngine {\n const agents = buildAgentRegistry(config, log);\n const roles = buildRoleRegistry(config);\n const chat = createDefaultChatFn(config.project.providers);\n const tasks = new TaskEngine({\n agents,\n roles,\n store: new FileTaskStore(),\n ...(config.project.memory !== undefined\n ? { memory: new MemoryService(createMemoryProvider(config.project.memory), log) }\n : {}),\n log,\n });\n return new PipelineEngine({\n tasks,\n agents,\n roles,\n providers: config.project.providers,\n store: new FilePipelineRunStore(),\n chat,\n ...(config.project.planner !== undefined\n ? { planner: buildPlanner(config.project.planner, chat, log) }\n : {}),\n plans: new FilePlanStore(),\n reports: new ReportService(new FileReportStore(), log),\n log,\n });\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { PipelineError } from \"../../errors/index.js\";\nimport { buildPipelineEngine } from \"../../pipelines/index.js\";\nimport type { PipelineDefinition } from \"../../types/pipeline.js\";\n\nexport function registerPipelineCommands(program: Command): void {\n const pipeline = program\n .command(\"pipeline\")\n .description(\"Run multi-step AI pipelines defined in omninode.yaml (§14).\");\n\n pipeline\n .command(\"list\")\n .description(\"List configured pipelines.\")\n .action(async () => {\n const config = loadConfig();\n const pipelines = config.project.pipelines;\n if (pipelines.length === 0) {\n console.log(\"No pipelines configured. Add one under `project.pipelines` in omninode.yaml.\");\n return;\n }\n for (const def of pipelines) {\n const name = def.name ? ` ${def.name}` : \"\";\n console.log(`${def.id}${name} ${def.steps.length} step(s)`);\n }\n });\n\n pipeline\n .command(\"run <id> [objective]\")\n .description(\n \"Run a pipeline. The objective argument overrides the definition's default objective.\",\n )\n .action(async (id: string, objective: string | undefined) => runPipelineAction(id, objective));\n\n pipeline\n .command(\"retry <run-id> [objective]\")\n .description(\n \"Error recovery: re-run a recorded pipeline run as a new run, reusing its objective.\",\n )\n .action(async (runId: string, objective: string | undefined) => {\n const config = loadConfig();\n const engine = buildPipelineEngine(config);\n const previous = await engine.get(runId);\n if (!previous) {\n throw new PipelineError(\n \"PIPELINE_NOT_FOUND\",\n `Pipeline run \"${runId}\" does not exist in this project's run store.`,\n );\n }\n const def = config.project.pipelines.find((p) => p.id === previous.pipelineId);\n if (!def) {\n throw new PipelineError(\n \"PIPELINE_NOT_FOUND\",\n `Pipeline \"${previous.pipelineId}\" (run ${runId}) is no longer configured in omninode.yaml.`,\n );\n }\n await runPipelineAction(def.id, objective ?? previous.objective);\n });\n\n pipeline\n .command(\"runs <id>\")\n .description(\"List recorded runs of a pipeline.\")\n .action(async (id: string) => {\n const config = loadConfig();\n const engine = buildPipelineEngine(config);\n const runs = await engine.listRuns({ pipelineId: id });\n if (runs.length === 0) {\n console.log(`No recorded runs for pipeline \"${id}\".`);\n return;\n }\n for (const run of runs) {\n console.log(`${run.id} ${run.status.padEnd(10)} ${run.startedAt ?? \"?\"}`);\n }\n });\n\n pipeline\n .command(\"status <run-id>\")\n .description(\"Show the recorded state of a pipeline run.\")\n .action(async (runId: string) => {\n const config = loadConfig();\n const engine = buildPipelineEngine(config);\n const run = await engine.get(runId);\n if (!run) {\n throw new PipelineError(\n \"PIPELINE_NOT_FOUND\",\n `Pipeline run \"${runId}\" does not exist in this project's run store.`,\n );\n }\n console.log(` id: ${run.id}`);\n console.log(` pipeline: ${run.pipelineId}`);\n console.log(` status: ${run.status}`);\n console.log(` started: ${run.startedAt ?? \"?\"}`);\n if (run.finishedAt) console.log(` finished: ${run.finishedAt}`);\n if (run.resultSummary) console.log(` result: ${run.resultSummary}`);\n for (const stepRun of run.stepRuns) {\n console.log(` [${stepRun.stepId}] ${stepRun.status}`);\n }\n if (run.reports && run.reports.length > 0) {\n console.log(` reports: ${run.reports.length}`);\n }\n });\n}\n\nasync function runPipelineAction(id: string, objective: string | undefined): Promise<void> {\n const config = loadConfig();\n const def = findPipeline(config, id);\n const engine = buildPipelineEngine(config);\n console.log(\n `Running pipeline \"${def.id}\" (${def.steps.length} step(s))${objective ? ` — \"${objective}\"` : \"\"}...`,\n );\n const finished = await engine.run(def, {\n ...(objective !== undefined ? { objective } : {}),\n onStep: (stepRun) => {\n const suffix = stepRun.error ? ` — ${stepRun.error}` : \"\";\n console.log(` [${stepRun.stepId}] ${stepRun.status}${suffix}`);\n },\n });\n if (finished.reports && finished.reports.length > 0) {\n console.log(` reports: ${finished.reports.length} structured report(s)`);\n }\n if (finished.combinedReportId) {\n console.log(` combined report: ${finished.combinedReportId}`);\n }\n if (finished.planId) {\n console.log(` plan: ${finished.planId}`);\n }\n if (finished.resultSummary) {\n console.log(` result: ${finished.resultSummary}`);\n }\n console.log(`Pipeline ${finished.status}. Run id: ${finished.id}`);\n if (finished.status !== \"completed\") process.exitCode = 1;\n}\n\n/** Top-level `omninode run` — a workflow alias of `pipeline run` (§28). */\nexport function registerRunAlias(program: Command): void {\n program\n .command(\"run <id> [objective]\")\n .description(\"Alias of `omninode pipeline run` — execute a configured pipeline end to end.\")\n .action(async (id: string, objective: string | undefined) => runPipelineAction(id, objective));\n}\n\nfunction findPipeline(config: ReturnType<typeof loadConfig>, id: string): PipelineDefinition {\n const def = config.project.pipelines.find((p) => p.id === id);\n if (!def) {\n const available = config.project.pipelines.map((p) => p.id).join(\", \") || \"(none)\";\n throw new PipelineError(\n \"PIPELINE_NOT_FOUND\",\n `Pipeline \"${id}\" is not configured. Configured pipelines: ${available}.`,\n );\n }\n return def;\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { createMemoryProvider, MemoryService } from \"../../memory/index.js\";\nimport { truncate } from \"./shared.js\";\n\nexport function registerMemoryCommands(program: Command): void {\n const memory = program\n .command(\"memory\")\n .description(\"Inspect and manage persistent project memory (§19–§20).\");\n\n memory\n .command(\"status\")\n .description(\"Show the active memory provider and how much is stored.\")\n .action(async () => {\n const config = loadConfig();\n const configured = config.project.memory?.provider ?? \"local (default — add a `memory:` section to opt in)\";\n const svc = new MemoryService(createMemoryProvider(config.project.memory));\n const entries = await svc.providerRef.query({ limit: 10_000 });\n console.log(`provider: ${configured}`);\n console.log(`entries: ${entries.length}`);\n const scopes = new Map<string, number>();\n for (const entry of entries) {\n scopes.set(entry.scope, (scopes.get(entry.scope) ?? 0) + 1);\n }\n for (const [scope, count] of [...scopes.entries()].sort()) {\n console.log(` ${scope}: ${count}`);\n }\n });\n\n memory\n .command(\"query <text>\")\n .description(\"Search memory for entries relevant to the text.\")\n .option(\"-s, --scope <scope>\", \"Restrict to a scope: project, task, role or knowledge.\")\n .option(\"-n, --limit <count>\", \"Maximum entries to return.\", (value: string) => Number(value), 10)\n .action(async (text: string, options: { scope?: string; limit: number }) => {\n const config = loadConfig();\n const svc = new MemoryService(createMemoryProvider(config.project.memory));\n const entries = await svc.providerRef.query({\n text,\n ...(options.scope !== undefined ? { scope: options.scope as \"project\" | \"task\" | \"role\" | \"knowledge\" } : {}),\n limit: options.limit,\n });\n if (entries.length === 0) {\n console.log(\"No relevant memory found.\");\n return;\n }\n for (const entry of entries) {\n console.log(`[${entry.scope}] ${entry.key}`);\n console.log(` ${truncate(entry.content.replace(/\\n/g, \" \"), 120)}`);\n }\n });\n\n memory\n .command(\"write <text>\")\n .description(\"Write an entry to memory.\")\n .option(\"-s, --scope <scope>\", \"Memory scope: project, task, role or knowledge.\", \"project\")\n .option(\"-t, --tags <tags>\", \"Comma-separated tags.\", (value: string) =>\n value.split(\",\").map((tag) => tag.trim()).filter((tag) => tag.length > 0),\n )\n .option(\"-k, --key <key>\", \"Entry key (defaults to a generated note key).\")\n .action(async (text: string, options: { scope: string; tags?: string[]; key?: string }) => {\n const config = loadConfig();\n const svc = new MemoryService(createMemoryProvider(config.project.memory));\n const key = options.key ?? `note:${Date.now().toString(36)}`;\n await svc.providerRef.write({\n key,\n scope: options.scope as \"project\" | \"task\" | \"role\" | \"knowledge\",\n content: text,\n ...(options.tags !== undefined && options.tags.length > 0 ? { tags: options.tags } : {}),\n });\n console.log(`Stored memory entry \"${key}\" (${options.scope}).`);\n });\n}\n","import type { Command } from \"commander\";\nimport { OmniNodeError } from \"../../errors/index.js\";\nimport { FilePlanStore } from \"../../planner/store.js\";\nimport { truncate } from \"./shared.js\";\n\nexport function registerPlanCommands(program: Command): void {\n const plan = program\n .command(\"plan\")\n .description(\"Inspect implementation plans produced by the planner layer (§18).\");\n\n plan\n .command(\"list\")\n .description(\"List stored plans.\")\n .option(\"--run <pipelineRunId>\", \"Only plans for this pipeline run.\")\n .action(async (options: { run?: string }) => {\n const store = new FilePlanStore();\n const plans = await store.list({\n ...(options.run !== undefined ? { pipelineRunId: options.run } : {}),\n });\n if (plans.length === 0) {\n console.log(\"No plans stored yet. Run a pipeline with a plan step to generate one.\");\n return;\n }\n for (const p of plans) {\n console.log(`${p.id} ${p.steps.length} step(s) by ${p.generatedBy} ${truncate(p.summary, 50)}`);\n }\n });\n\n plan\n .command(\"show <id>\")\n .description(\"Show a stored implementation plan in full.\")\n .action(async (id: string) => {\n const store = new FilePlanStore();\n const found = await store.get(id);\n if (!found) {\n throw new OmniNodeError(\"PLAN_INVALID\", `Plan \"${id}\" was not found in the plan store.`, {\n details: { id },\n });\n }\n console.log(`Plan ${found.id}`);\n console.log(` objective: ${found.objective}`);\n console.log(` by: ${found.generatedBy}`);\n console.log(` summary: ${found.summary}`);\n console.log(\" steps:\");\n for (const step of [...found.steps].sort((a, b) => a.order - b.order)) {\n const targets = step.targets && step.targets.length > 0 ? ` [${step.targets.join(\", \")}]` : \"\";\n console.log(` ${step.order}. ${step.title}${targets}`);\n if (step.description) console.log(` ${truncate(step.description, 100)}`);\n for (const criterion of step.acceptanceCriteria ?? []) {\n console.log(` accept: ${criterion}`);\n }\n }\n if (found.risks && found.risks.length > 0) {\n console.log(\" risks:\");\n for (const risk of found.risks) {\n console.log(` - ${risk}`);\n }\n }\n });\n}\n","import type { Command } from \"commander\";\nimport { loadConfig } from \"../../config/index.js\";\nimport { createMemoryProvider, MemoryService } from \"../../memory/index.js\";\nimport { FilePlanStore } from \"../../planner/store.js\";\nimport { FileReportStore } from \"../../reports/store.js\";\nimport { FileTaskStore } from \"../../tasks/store.js\";\nimport { FilePipelineRunStore } from \"../../pipelines/store.js\";\nimport { OMNINODE_VERSION } from \"../../version.js\";\n\nfunction countBy<T>(items: T[], key: (item: T) => string): string {\n const counts = new Map<string, number>();\n for (const item of items) {\n const k = key(item);\n counts.set(k, (counts.get(k) ?? 0) + 1);\n }\n if (counts.size === 0) return \"0\";\n return `${items.length} (${[...counts.entries()].map(([k, v]) => `${k} ${v}`).join(\", \")})`;\n}\n\nexport function registerStatusCommand(program: Command): void {\n program\n .command(\"status\")\n .description(\"Show the project's OmniNode state overview (config, tasks, runs, reports, plans, memory).\")\n .action(async () => {\n const config = loadConfig();\n\n console.log(`OmniNode v${OMNINODE_VERSION} — project \"${config.project.name}\"`);\n console.log(\n `providers: ${config.project.providers.length > 0 ? config.project.providers.map((p) => p.name).join(\", \") : \"none\"}`,\n );\n console.log(\n `agents: ${config.project.agents.length > 0 ? config.project.agents.map((a) => a.name).join(\", \") : \"none\"}`,\n );\n console.log(\n `roles: ${config.project.roles.length > 0 ? config.project.roles.map((r) => r.id).join(\", \") : \"none\"}`,\n );\n console.log(\n `pipelines: ${config.project.pipelines.length > 0 ? config.project.pipelines.map((p) => p.id).join(\", \") : \"none\"}`,\n );\n\n const tasks = await new FileTaskStore().list();\n console.log(`tasks: ${countBy(tasks, (t) => t.status)}`);\n\n const runs = await new FilePipelineRunStore().list();\n console.log(`runs: ${countBy(runs, (r) => r.status)}`);\n\n const reportStore = new FileReportStore();\n const reports = await reportStore.listReports();\n const combined = await reportStore.listCombined();\n console.log(`reports: ${reports.length} raw, ${combined.length} combined`);\n\n const plans = await new FilePlanStore().list();\n console.log(`plans: ${plans.length}`);\n\n if (config.project.memory !== undefined) {\n const memory = new MemoryService(createMemoryProvider(config.project.memory));\n const entries = await memory.providerRef.query({ limit: 10_000 });\n console.log(`memory: ${memory.providerName}, ${entries.length} entr(ies)`);\n } else {\n console.log(\"memory: not configured (local provider available — add a `memory:` section)\");\n }\n });\n}\n"],"mappings":"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","names":["existsSync","existsSync","entry","readFileSync","writeFileSync","readFileSync","writeFileSync","provider","DEFAULT_TIMEOUT_MS","trimmed","agent","role","mkdir","readFile","rename","writeFile","dirname","entry","entry","entry","truncate","randomBytes","truncate","truncate","mkdir","readFile","rename","writeFile","dirname","entry","randomBytes","randomBytes","SEVERITY_RANK","truncate","randomBytes","z","entry","z","randomBytes","run","randomBytes","mkdir","readFile","rename","writeFile","dirname","run","mkdir","readFile","rename","writeFile","dirname","run","entry"]}