diff --git a/apps/cli/src/docker.ts b/apps/cli/src/docker.ts index 0e40bc4..228dec4 100644 --- a/apps/cli/src/docker.ts +++ b/apps/cli/src/docker.ts @@ -12,7 +12,7 @@ import path from 'node:path'; import { setTimeout as sleep } from 'node:timers/promises'; import { fileURLToPath } from 'node:url'; import { getMode } from './mode.js'; -import type { Orchestrator, WorkerHandle, WorkerOptions as OrchestratorWorkerOptions } from './orchestrator.js'; +import type { Orchestrator, WorkerOptions as OrchestratorWorkerOptions, WorkerHandle } from './orchestrator.js'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -301,7 +301,7 @@ export class DockerOrchestrator implements Orchestrator { return ensureInfra(); } ensureImage(version: string): void { - return ensureImage(version); + ensureImage(version); } spawnWorker(opts: OrchestratorWorkerOptions): WorkerHandle { const proc = spawnWorker(opts as WorkerOptions); @@ -315,10 +315,10 @@ export class DockerOrchestrator implements Orchestrator { }; } stopWorkers(): void { - return stopWorkers(); + stopWorkers(); } stopInfra(clean: boolean): void { - return stopInfra(clean); + stopInfra(clean); } listRunningWorkers(): string { return listRunningWorkers(); diff --git a/apps/worker/src/interfaces/checkpoint-provider.ts b/apps/worker/src/interfaces/checkpoint-provider.ts index a066043..2fdb067 100644 --- a/apps/worker/src/interfaces/checkpoint-provider.ts +++ b/apps/worker/src/interfaces/checkpoint-provider.ts @@ -30,22 +30,13 @@ export interface CheckpointProvider { * Return { skip: true, metrics } to skip the agent (e.g., output files already exist). * Return { skip: false } to run normally. */ - shouldSkipAgent( - agentName: string, - repoPath: string, - deliverablesSubdir: string, - ): Promise; + shouldSkipAgent(agentName: string, repoPath: string, deliverablesSubdir: string): Promise; /** * Called after an agent activity succeeds. * Receives pipeline state and optional file context for artifact persistence. */ - onAgentComplete( - agentName: string, - phase: string, - state: PipelineState, - context?: CheckpointContext, - ): Promise; + onAgentComplete(agentName: string, phase: string, state: PipelineState, context?: CheckpointContext): Promise; } /** Default no-op implementation — no external checkpointing. */ diff --git a/apps/worker/src/interfaces/index.ts b/apps/worker/src/interfaces/index.ts index fac478f..7825c29 100644 --- a/apps/worker/src/interfaces/index.ts +++ b/apps/worker/src/interfaces/index.ts @@ -5,7 +5,7 @@ * Consumers can provide alternate implementations via the DI container. */ -export type { CheckpointProvider, CheckpointContext, SkipDecision } from './checkpoint-provider.js'; +export type { CheckpointContext, CheckpointProvider, SkipDecision } from './checkpoint-provider.js'; export { NoOpCheckpointProvider } from './checkpoint-provider.js'; export type { FindingsProvider } from './findings-provider.js'; export { NoOpFindingsProvider } from './findings-provider.js'; diff --git a/apps/worker/src/services/container.ts b/apps/worker/src/services/container.ts index a9586b3..7f0de9c 100644 --- a/apps/worker/src/services/container.ts +++ b/apps/worker/src/services/container.ts @@ -99,11 +99,7 @@ const DEFAULT_CONFIG: ContainerConfig = { * setContainerFactory() at worker startup to inject custom provider * implementations into every container. */ -type ContainerFactory = ( - workflowId: string, - sessionMetadata: SessionMetadata, - config: ContainerConfig, -) => Container; +type ContainerFactory = (workflowId: string, sessionMetadata: SessionMetadata, config: ContainerConfig) => Container; let containerFactory: ContainerFactory = (_workflowId, sessionMetadata, config) => new Container({ sessionMetadata, config }); diff --git a/apps/worker/src/services/index.ts b/apps/worker/src/services/index.ts index b864d27..48a0019 100644 --- a/apps/worker/src/services/index.ts +++ b/apps/worker/src/services/index.ts @@ -11,14 +11,13 @@ * Services are pure domain logic with no Temporal dependencies. */ +export type { ClaudePromptResult } from '../ai/claude-executor.js'; +export { runClaudePrompt } from '../ai/claude-executor.js'; export type { AgentExecutionInput } from './agent-execution.js'; export { AgentExecutionService } from './agent-execution.js'; - export { ConfigLoaderService } from './config-loader.js'; export type { ContainerDependencies } from './container.js'; export { Container, getContainer, getOrCreateContainer, removeContainer, setContainerFactory } from './container.js'; export { ExploitationCheckerService } from './exploitation-checker.js'; export { loadPrompt } from './prompt-manager.js'; export { assembleFinalReport, injectModelIntoReport } from './reporting.js'; -export type { ClaudePromptResult } from '../ai/claude-executor.js'; -export { runClaudePrompt } from '../ai/claude-executor.js'; diff --git a/apps/worker/src/services/reporting.ts b/apps/worker/src/services/reporting.ts index 1cb11a6..1eacb53 100644 --- a/apps/worker/src/services/reporting.ts +++ b/apps/worker/src/services/reporting.ts @@ -123,7 +123,10 @@ export async function injectModelIntoReport( logger.info(`Injecting model info into report: ${modelStr}`); // 3. Read the final report - const reportPath = path.join(deliverablesDir(repoPath, deliverablesSubdir), 'comprehensive_security_assessment_report.md'); + const reportPath = path.join( + deliverablesDir(repoPath, deliverablesSubdir), + 'comprehensive_security_assessment_report.md', + ); if (!(await fs.pathExists(reportPath))) { logger.warn('Final report not found, skipping model injection'); diff --git a/apps/worker/src/temporal/activities.ts b/apps/worker/src/temporal/activities.ts index de6063f..f80736e 100644 --- a/apps/worker/src/temporal/activities.ts +++ b/apps/worker/src/temporal/activities.ts @@ -22,8 +22,8 @@ import { AuditSession } from '../audit/index.js'; import type { ResumeAttempt } from '../audit/metrics-tracker.js'; import type { SessionMetadata } from '../audit/utils.js'; import type { WorkflowSummary } from '../audit/workflow-logger.js'; -import type { ContainerConfig, ProviderConfig } from '../types/config.js'; import type { CheckpointContext } from '../interfaces/checkpoint-provider.js'; +import { DEFAULT_DELIVERABLES_SUBDIR, deliverablesDir } from '../paths.js'; import { getContainer, getOrCreateContainer, removeContainer } from '../services/container.js'; import { classifyErrorForTemporal, PentestError } from '../services/error-handling.js'; import { ExploitationCheckerService } from '../services/exploitation-checker.js'; @@ -34,9 +34,9 @@ import { assembleFinalReport, injectModelIntoReport } from '../services/reportin import { AGENTS } from '../session-manager.js'; import type { AgentName } from '../types/agents.js'; import { ALL_AGENTS } from '../types/agents.js'; +import type { ContainerConfig, ProviderConfig } from '../types/config.js'; import { ErrorCode } from '../types/errors.js'; import { isErr } from '../types/result.js'; -import { DEFAULT_DELIVERABLES_SUBDIR, deliverablesDir } from '../paths.js'; import { fileExists, readJson } from '../utils/file-io.js'; import { createActivityLogger } from './activity-logger.js'; import type { AgentMetrics, PipelineState, ResumeState } from './shared.js'; @@ -135,7 +135,8 @@ async function runAgentActivity(agentName: AgentName, input: ActivityInput): Pro // Skip guard: the checkpoint provider decides whether to run the agent. // The default NoOp provider always returns { skip: false }. - const skipContainer = getContainer(workflowId) ?? + const skipContainer = + getContainer(workflowId) ?? getOrCreateContainer(workflowId, buildSessionMetadata(input), buildContainerConfig(input)); const decision = await skipContainer.checkpointProvider.shouldSkipAgent( agentName, @@ -321,7 +322,15 @@ export async function runPreflightValidation(input: ActivityInput): Promise