@amsterdamdatalabs/enact-factory 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +674 -0
- package/README.md +566 -0
- package/dist/adapters/agenticLoop.d.ts +90 -0
- package/dist/adapters/agenticLoop.d.ts.map +1 -0
- package/dist/adapters/agenticLoop.js +219 -0
- package/dist/adapters/agenticLoop.js.map +1 -0
- package/dist/adapters/base.d.ts +16 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +135 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude.d.ts +13 -0
- package/dist/adapters/claude.d.ts.map +1 -0
- package/dist/adapters/claude.js +318 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex.d.ts +14 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +366 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/cryptoQuantAdapter.d.ts +85 -0
- package/dist/adapters/cryptoQuantAdapter.d.ts.map +1 -0
- package/dist/adapters/cryptoQuantAdapter.js +238 -0
- package/dist/adapters/cryptoQuantAdapter.js.map +1 -0
- package/dist/adapters/cursor.d.ts +13 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +300 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/envPath.d.ts +20 -0
- package/dist/adapters/envPath.d.ts.map +1 -0
- package/dist/adapters/envPath.js +49 -0
- package/dist/adapters/envPath.js.map +1 -0
- package/dist/adapters/hermes.d.ts +13 -0
- package/dist/adapters/hermes.d.ts.map +1 -0
- package/dist/adapters/hermes.js +283 -0
- package/dist/adapters/hermes.js.map +1 -0
- package/dist/adapters/index.d.ts +18 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +56 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/opencode.d.ts +13 -0
- package/dist/adapters/opencode.d.ts.map +1 -0
- package/dist/adapters/opencode.js +282 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/processRegistry.d.ts +38 -0
- package/dist/adapters/processRegistry.d.ts.map +1 -0
- package/dist/adapters/processRegistry.js +147 -0
- package/dist/adapters/processRegistry.js.map +1 -0
- package/dist/adapters/responses.d.ts +16 -0
- package/dist/adapters/responses.d.ts.map +1 -0
- package/dist/adapters/responses.js +244 -0
- package/dist/adapters/responses.js.map +1 -0
- package/dist/adapters/streamBuffer.d.ts +59 -0
- package/dist/adapters/streamBuffer.d.ts.map +1 -0
- package/dist/adapters/streamBuffer.js +123 -0
- package/dist/adapters/streamBuffer.js.map +1 -0
- package/dist/adapters/tools.d.ts +30 -0
- package/dist/adapters/tools.d.ts.map +1 -0
- package/dist/adapters/tools.js +219 -0
- package/dist/adapters/tools.js.map +1 -0
- package/dist/adapters/types.d.ts +82 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +6 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/agents/agentBus.d.ts +160 -0
- package/dist/agents/agentBus.d.ts.map +1 -0
- package/dist/agents/agentBus.js +350 -0
- package/dist/agents/agentBus.js.map +1 -0
- package/dist/agents/agentPair.d.ts +215 -0
- package/dist/agents/agentPair.d.ts.map +1 -0
- package/dist/agents/agentPair.js +456 -0
- package/dist/agents/agentPair.js.map +1 -0
- package/dist/agents/auditor.d.ts +27 -0
- package/dist/agents/auditor.d.ts.map +1 -0
- package/dist/agents/auditor.js +238 -0
- package/dist/agents/auditor.js.map +1 -0
- package/dist/agents/cliStreamParser.d.ts +18 -0
- package/dist/agents/cliStreamParser.d.ts.map +1 -0
- package/dist/agents/cliStreamParser.js +156 -0
- package/dist/agents/cliStreamParser.js.map +1 -0
- package/dist/agents/documenter.d.ts +31 -0
- package/dist/agents/documenter.d.ts.map +1 -0
- package/dist/agents/documenter.js +286 -0
- package/dist/agents/documenter.js.map +1 -0
- package/dist/agents/draftAnalyzer.d.ts +50 -0
- package/dist/agents/draftAnalyzer.d.ts.map +1 -0
- package/dist/agents/draftAnalyzer.js +289 -0
- package/dist/agents/draftAnalyzer.js.map +1 -0
- package/dist/agents/evaluator.d.ts +61 -0
- package/dist/agents/evaluator.d.ts.map +1 -0
- package/dist/agents/evaluator.js +338 -0
- package/dist/agents/evaluator.js.map +1 -0
- package/dist/agents/executor.d.ts +33 -0
- package/dist/agents/executor.d.ts.map +1 -0
- package/dist/agents/executor.js +130 -0
- package/dist/agents/executor.js.map +1 -0
- package/dist/agents/index.d.ts +10 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +10 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/pairMetrics.d.ts +63 -0
- package/dist/agents/pairMetrics.d.ts.map +1 -0
- package/dist/agents/pairMetrics.js +232 -0
- package/dist/agents/pairMetrics.js.map +1 -0
- package/dist/agents/pairPipeline.d.ts +184 -0
- package/dist/agents/pairPipeline.d.ts.map +1 -0
- package/dist/agents/pairPipeline.js +934 -0
- package/dist/agents/pairPipeline.js.map +1 -0
- package/dist/agents/pairWebhook.d.ts +59 -0
- package/dist/agents/pairWebhook.d.ts.map +1 -0
- package/dist/agents/pairWebhook.js +242 -0
- package/dist/agents/pairWebhook.js.map +1 -0
- package/dist/agents/pipelineFormat.d.ts +8 -0
- package/dist/agents/pipelineFormat.d.ts.map +1 -0
- package/dist/agents/pipelineFormat.js +65 -0
- package/dist/agents/pipelineFormat.js.map +1 -0
- package/dist/agents/pipelineGuards.d.ts +23 -0
- package/dist/agents/pipelineGuards.d.ts.map +1 -0
- package/dist/agents/pipelineGuards.js +257 -0
- package/dist/agents/pipelineGuards.js.map +1 -0
- package/dist/agents/reviewer.d.ts +37 -0
- package/dist/agents/reviewer.d.ts.map +1 -0
- package/dist/agents/reviewer.js +214 -0
- package/dist/agents/reviewer.js.map +1 -0
- package/dist/agents/skillDocumenter.d.ts +23 -0
- package/dist/agents/skillDocumenter.d.ts.map +1 -0
- package/dist/agents/skillDocumenter.js +219 -0
- package/dist/agents/skillDocumenter.js.map +1 -0
- package/dist/agents/tester.d.ts +37 -0
- package/dist/agents/tester.d.ts.map +1 -0
- package/dist/agents/tester.js +309 -0
- package/dist/agents/tester.js.map +1 -0
- package/dist/automation/autonomousRunner.d.ts +145 -0
- package/dist/automation/autonomousRunner.d.ts.map +1 -0
- package/dist/automation/autonomousRunner.js +1272 -0
- package/dist/automation/autonomousRunner.js.map +1 -0
- package/dist/automation/dailyReporter.d.ts +26 -0
- package/dist/automation/dailyReporter.d.ts.map +1 -0
- package/dist/automation/dailyReporter.js +130 -0
- package/dist/automation/dailyReporter.js.map +1 -0
- package/dist/automation/index.d.ts +5 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js +5 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/longRunningMonitor.d.ts +26 -0
- package/dist/automation/longRunningMonitor.d.ts.map +1 -0
- package/dist/automation/longRunningMonitor.js +356 -0
- package/dist/automation/longRunningMonitor.js.map +1 -0
- package/dist/automation/prOwnership.d.ts +18 -0
- package/dist/automation/prOwnership.d.ts.map +1 -0
- package/dist/automation/prOwnership.js +61 -0
- package/dist/automation/prOwnership.js.map +1 -0
- package/dist/automation/runnerExecution.d.ts +57 -0
- package/dist/automation/runnerExecution.d.ts.map +1 -0
- package/dist/automation/runnerExecution.js +701 -0
- package/dist/automation/runnerExecution.js.map +1 -0
- package/dist/automation/runnerState.d.ts +170 -0
- package/dist/automation/runnerState.d.ts.map +1 -0
- package/dist/automation/runnerState.js +496 -0
- package/dist/automation/runnerState.js.map +1 -0
- package/dist/automation/runnerTypes.d.ts +57 -0
- package/dist/automation/runnerTypes.d.ts.map +1 -0
- package/dist/automation/runnerTypes.js +5 -0
- package/dist/automation/runnerTypes.js.map +1 -0
- package/dist/automation/scheduler.d.ts +75 -0
- package/dist/automation/scheduler.d.ts.map +1 -0
- package/dist/automation/scheduler.js +402 -0
- package/dist/automation/scheduler.js.map +1 -0
- package/dist/azdo/azdo.d.ts +70 -0
- package/dist/azdo/azdo.d.ts.map +1 -0
- package/dist/azdo/azdo.js +328 -0
- package/dist/azdo/azdo.js.map +1 -0
- package/dist/azdo/index.d.ts +3 -0
- package/dist/azdo/index.d.ts.map +1 -0
- package/dist/azdo/index.js +3 -0
- package/dist/azdo/index.js.map +1 -0
- package/dist/azdo/projectUpdater.d.ts +13 -0
- package/dist/azdo/projectUpdater.d.ts.map +1 -0
- package/dist/azdo/projectUpdater.js +155 -0
- package/dist/azdo/projectUpdater.js.map +1 -0
- package/dist/azureDevOps/client.d.ts +75 -0
- package/dist/azureDevOps/client.d.ts.map +1 -0
- package/dist/azureDevOps/client.js +150 -0
- package/dist/azureDevOps/client.js.map +1 -0
- package/dist/azureDevOps/hierarchy.d.ts +119 -0
- package/dist/azureDevOps/hierarchy.d.ts.map +1 -0
- package/dist/azureDevOps/hierarchy.js +470 -0
- package/dist/azureDevOps/hierarchy.js.map +1 -0
- package/dist/azureDevOps/mapper.d.ts +101 -0
- package/dist/azureDevOps/mapper.d.ts.map +1 -0
- package/dist/azureDevOps/mapper.js +438 -0
- package/dist/azureDevOps/mapper.js.map +1 -0
- package/dist/azureDevOps/stateMapping.d.ts +15 -0
- package/dist/azureDevOps/stateMapping.d.ts.map +1 -0
- package/dist/azureDevOps/stateMapping.js +141 -0
- package/dist/azureDevOps/stateMapping.js.map +1 -0
- package/dist/cli/authHandler.d.ts +13 -0
- package/dist/cli/authHandler.d.ts.map +1 -0
- package/dist/cli/authHandler.js +70 -0
- package/dist/cli/authHandler.js.map +1 -0
- package/dist/cli/checkHandler.d.ts +27 -0
- package/dist/cli/checkHandler.d.ts.map +1 -0
- package/dist/cli/checkHandler.js +560 -0
- package/dist/cli/checkHandler.js.map +1 -0
- package/dist/cli/daemon.d.ts +30 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +141 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/factoryCommands.d.ts +3 -0
- package/dist/cli/factoryCommands.d.ts.map +1 -0
- package/dist/cli/factoryCommands.js +165 -0
- package/dist/cli/factoryCommands.js.map +1 -0
- package/dist/cli/promptHandler.d.ts +13 -0
- package/dist/cli/promptHandler.d.ts.map +1 -0
- package/dist/cli/promptHandler.js +193 -0
- package/dist/cli/promptHandler.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +320 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/agentLifecycle.d.ts +322 -0
- package/dist/core/agentLifecycle.d.ts.map +1 -0
- package/dist/core/agentLifecycle.js +230 -0
- package/dist/core/agentLifecycle.js.map +1 -0
- package/dist/core/areaMapping.d.ts +9 -0
- package/dist/core/areaMapping.d.ts.map +1 -0
- package/dist/core/areaMapping.js +37 -0
- package/dist/core/areaMapping.js.map +1 -0
- package/dist/core/config.d.ts +469 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +780 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/dashboardContract.d.ts +204 -0
- package/dist/core/dashboardContract.d.ts.map +1 -0
- package/dist/core/dashboardContract.js +205 -0
- package/dist/core/dashboardContract.js.map +1 -0
- package/dist/core/devopsModel.d.ts +138 -0
- package/dist/core/devopsModel.d.ts.map +1 -0
- package/dist/core/devopsModel.js +137 -0
- package/dist/core/devopsModel.js.map +1 -0
- package/dist/core/envFile.d.ts +11 -0
- package/dist/core/envFile.d.ts.map +1 -0
- package/dist/core/envFile.js +104 -0
- package/dist/core/envFile.js.map +1 -0
- package/dist/core/eventHub.d.ts +220 -0
- package/dist/core/eventHub.d.ts.map +1 -0
- package/dist/core/eventHub.js +136 -0
- package/dist/core/eventHub.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +7 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/laneExecutionState.d.ts +29 -0
- package/dist/core/laneExecutionState.d.ts.map +1 -0
- package/dist/core/laneExecutionState.js +18 -0
- package/dist/core/laneExecutionState.js.map +1 -0
- package/dist/core/laneStatus.d.ts +49 -0
- package/dist/core/laneStatus.d.ts.map +1 -0
- package/dist/core/laneStatus.js +153 -0
- package/dist/core/laneStatus.js.map +1 -0
- package/dist/core/prSidecar.d.ts +96 -0
- package/dist/core/prSidecar.d.ts.map +1 -0
- package/dist/core/prSidecar.js +33 -0
- package/dist/core/prSidecar.js.map +1 -0
- package/dist/core/runtimeConfig.d.ts +6 -0
- package/dist/core/runtimeConfig.d.ts.map +1 -0
- package/dist/core/runtimeConfig.js +24 -0
- package/dist/core/runtimeConfig.js.map +1 -0
- package/dist/core/scmProvider.d.ts +19 -0
- package/dist/core/scmProvider.d.ts.map +1 -0
- package/dist/core/scmProvider.js +38 -0
- package/dist/core/scmProvider.js.map +1 -0
- package/dist/core/service.d.ts +10 -0
- package/dist/core/service.d.ts.map +1 -0
- package/dist/core/service.js +297 -0
- package/dist/core/service.js.map +1 -0
- package/dist/core/traceCollector.d.ts +105 -0
- package/dist/core/traceCollector.d.ts.map +1 -0
- package/dist/core/traceCollector.js +141 -0
- package/dist/core/traceCollector.js.map +1 -0
- package/dist/core/types.d.ts +432 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/workItemMapper.d.ts +39 -0
- package/dist/core/workItemMapper.d.ts.map +1 -0
- package/dist/core/workItemMapper.js +427 -0
- package/dist/core/workItemMapper.js.map +1 -0
- package/dist/core/workItemModel.d.ts +120 -0
- package/dist/core/workItemModel.d.ts.map +1 -0
- package/dist/core/workItemModel.js +104 -0
- package/dist/core/workItemModel.js.map +1 -0
- package/dist/core/workItemPayload.d.ts +195 -0
- package/dist/core/workItemPayload.d.ts.map +1 -0
- package/dist/core/workItemPayload.js +24 -0
- package/dist/core/workItemPayload.js.map +1 -0
- package/dist/core/workspaceConfig.d.ts +57 -0
- package/dist/core/workspaceConfig.d.ts.map +1 -0
- package/dist/core/workspaceConfig.js +184 -0
- package/dist/core/workspaceConfig.js.map +1 -0
- package/dist/doctor.d.ts +18 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +34 -0
- package/dist/doctor.js.map +1 -0
- package/dist/factory/activeSkill.d.ts +11 -0
- package/dist/factory/activeSkill.d.ts.map +1 -0
- package/dist/factory/activeSkill.js +44 -0
- package/dist/factory/activeSkill.js.map +1 -0
- package/dist/factory/assignment.d.ts +54 -0
- package/dist/factory/assignment.d.ts.map +1 -0
- package/dist/factory/assignment.js +94 -0
- package/dist/factory/assignment.js.map +1 -0
- package/dist/factory/auditLog.d.ts +10 -0
- package/dist/factory/auditLog.d.ts.map +1 -0
- package/dist/factory/auditLog.js +38 -0
- package/dist/factory/auditLog.js.map +1 -0
- package/dist/factory/closureRequirements.d.ts +12 -0
- package/dist/factory/closureRequirements.d.ts.map +1 -0
- package/dist/factory/closureRequirements.js +30 -0
- package/dist/factory/closureRequirements.js.map +1 -0
- package/dist/factory/delegationPrompt.d.ts +3 -0
- package/dist/factory/delegationPrompt.d.ts.map +1 -0
- package/dist/factory/delegationPrompt.js +16 -0
- package/dist/factory/delegationPrompt.js.map +1 -0
- package/dist/factory/http.d.ts +3 -0
- package/dist/factory/http.d.ts.map +1 -0
- package/dist/factory/http.js +555 -0
- package/dist/factory/http.js.map +1 -0
- package/dist/factory/lifecyclePushMap.d.ts +4 -0
- package/dist/factory/lifecyclePushMap.d.ts.map +1 -0
- package/dist/factory/lifecyclePushMap.js +7 -0
- package/dist/factory/lifecyclePushMap.js.map +1 -0
- package/dist/factory/missions.d.ts +125 -0
- package/dist/factory/missions.d.ts.map +1 -0
- package/dist/factory/missions.js +304 -0
- package/dist/factory/missions.js.map +1 -0
- package/dist/factory/mode.d.ts +9 -0
- package/dist/factory/mode.d.ts.map +1 -0
- package/dist/factory/mode.js +30 -0
- package/dist/factory/mode.js.map +1 -0
- package/dist/factory/operatorActiveSkill.d.ts +15 -0
- package/dist/factory/operatorActiveSkill.d.ts.map +1 -0
- package/dist/factory/operatorActiveSkill.js +95 -0
- package/dist/factory/operatorActiveSkill.js.map +1 -0
- package/dist/factory/paseoDispatcher.d.ts +52 -0
- package/dist/factory/paseoDispatcher.d.ts.map +1 -0
- package/dist/factory/paseoDispatcher.js +122 -0
- package/dist/factory/paseoDispatcher.js.map +1 -0
- package/dist/factory/paseoLifecycle.d.ts +32 -0
- package/dist/factory/paseoLifecycle.d.ts.map +1 -0
- package/dist/factory/paseoLifecycle.js +260 -0
- package/dist/factory/paseoLifecycle.js.map +1 -0
- package/dist/factory/paths.d.ts +31 -0
- package/dist/factory/paths.d.ts.map +1 -0
- package/dist/factory/paths.js +139 -0
- package/dist/factory/paths.js.map +1 -0
- package/dist/factory/progressWatchdog.d.ts +58 -0
- package/dist/factory/progressWatchdog.d.ts.map +1 -0
- package/dist/factory/progressWatchdog.js +160 -0
- package/dist/factory/progressWatchdog.js.map +1 -0
- package/dist/factory/roster.d.ts +59 -0
- package/dist/factory/roster.d.ts.map +1 -0
- package/dist/factory/roster.js +116 -0
- package/dist/factory/roster.js.map +1 -0
- package/dist/factory/runtime.d.ts +44 -0
- package/dist/factory/runtime.d.ts.map +1 -0
- package/dist/factory/runtime.js +238 -0
- package/dist/factory/runtime.js.map +1 -0
- package/dist/factory/sync.d.ts +29 -0
- package/dist/factory/sync.d.ts.map +1 -0
- package/dist/factory/sync.js +77 -0
- package/dist/factory/sync.js.map +1 -0
- package/dist/factory/workitemQueues.d.ts +37 -0
- package/dist/factory/workitemQueues.d.ts.map +1 -0
- package/dist/factory/workitemQueues.js +99 -0
- package/dist/factory/workitemQueues.js.map +1 -0
- package/dist/factory/workitemTriage.d.ts +9 -0
- package/dist/factory/workitemTriage.d.ts.map +1 -0
- package/dist/factory/workitemTriage.js +81 -0
- package/dist/factory/workitemTriage.js.map +1 -0
- package/dist/hooks.d.ts +18 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +96 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/dist/install/agentCatalog.d.ts +7 -0
- package/dist/install/agentCatalog.d.ts.map +1 -0
- package/dist/install/agentCatalog.js +28 -0
- package/dist/install/agentCatalog.js.map +1 -0
- package/dist/install/bundlePaths.d.ts +10 -0
- package/dist/install/bundlePaths.d.ts.map +1 -0
- package/dist/install/bundlePaths.js +30 -0
- package/dist/install/bundlePaths.js.map +1 -0
- package/dist/install/codex.d.ts +43 -0
- package/dist/install/codex.d.ts.map +1 -0
- package/dist/install/codex.js +207 -0
- package/dist/install/codex.js.map +1 -0
- package/dist/install/enactHome.d.ts +37 -0
- package/dist/install/enactHome.d.ts.map +1 -0
- package/dist/install/enactHome.js +152 -0
- package/dist/install/enactHome.js.map +1 -0
- package/dist/install/plugins.d.ts +115 -0
- package/dist/install/plugins.d.ts.map +1 -0
- package/dist/install/plugins.js +259 -0
- package/dist/install/plugins.js.map +1 -0
- package/dist/install/setup.d.ts +33 -0
- package/dist/install/setup.d.ts.map +1 -0
- package/dist/install/setup.js +167 -0
- package/dist/install/setup.js.map +1 -0
- package/dist/locale/en.d.ts +3 -0
- package/dist/locale/en.d.ts.map +1 -0
- package/dist/locale/en.js +435 -0
- package/dist/locale/en.js.map +1 -0
- package/dist/locale/index.d.ts +28 -0
- package/dist/locale/index.d.ts.map +1 -0
- package/dist/locale/index.js +84 -0
- package/dist/locale/index.js.map +1 -0
- package/dist/locale/prompts/en.d.ts +3 -0
- package/dist/locale/prompts/en.d.ts.map +1 -0
- package/dist/locale/prompts/en.js +254 -0
- package/dist/locale/prompts/en.js.map +1 -0
- package/dist/locale/types.d.ts +433 -0
- package/dist/locale/types.d.ts.map +1 -0
- package/dist/locale/types.js +5 -0
- package/dist/locale/types.js.map +1 -0
- package/dist/mcp/server.d.ts +489 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +597 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/orchestration/decisionEngine.d.ts +175 -0
- package/dist/orchestration/decisionEngine.d.ts.map +1 -0
- package/dist/orchestration/decisionEngine.js +471 -0
- package/dist/orchestration/decisionEngine.js.map +1 -0
- package/dist/orchestration/index.d.ts +5 -0
- package/dist/orchestration/index.d.ts.map +1 -0
- package/dist/orchestration/index.js +5 -0
- package/dist/orchestration/index.js.map +1 -0
- package/dist/orchestration/workItemParser.d.ts +67 -0
- package/dist/orchestration/workItemParser.d.ts.map +1 -0
- package/dist/orchestration/workItemParser.js +560 -0
- package/dist/orchestration/workItemParser.js.map +1 -0
- package/dist/orchestration/workItemScheduler.d.ts +141 -0
- package/dist/orchestration/workItemScheduler.d.ts.map +1 -0
- package/dist/orchestration/workItemScheduler.js +317 -0
- package/dist/orchestration/workItemScheduler.js.map +1 -0
- package/dist/orchestration/workflow.d.ts +145 -0
- package/dist/orchestration/workflow.d.ts.map +1 -0
- package/dist/orchestration/workflow.js +301 -0
- package/dist/orchestration/workflow.js.map +1 -0
- package/dist/providers/codexSessions.d.ts +93 -0
- package/dist/providers/codexSessions.d.ts.map +1 -0
- package/dist/providers/codexSessions.js +366 -0
- package/dist/providers/codexSessions.js.map +1 -0
- package/dist/registry/bsDetector.d.ts +24 -0
- package/dist/registry/bsDetector.d.ts.map +1 -0
- package/dist/registry/bsDetector.js +276 -0
- package/dist/registry/bsDetector.js.map +1 -0
- package/dist/registry/entityScanner.d.ts +36 -0
- package/dist/registry/entityScanner.d.ts.map +1 -0
- package/dist/registry/entityScanner.js +693 -0
- package/dist/registry/entityScanner.js.map +1 -0
- package/dist/registry/index.d.ts +9 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +13 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/schema.d.ts +307 -0
- package/dist/registry/schema.d.ts.map +1 -0
- package/dist/registry/schema.js +139 -0
- package/dist/registry/schema.js.map +1 -0
- package/dist/registry/sqliteStore.d.ts +101 -0
- package/dist/registry/sqliteStore.d.ts.map +1 -0
- package/dist/registry/sqliteStore.js +688 -0
- package/dist/registry/sqliteStore.js.map +1 -0
- package/dist/registry/workItemBridge.d.ts +8 -0
- package/dist/registry/workItemBridge.d.ts.map +1 -0
- package/dist/registry/workItemBridge.js +30 -0
- package/dist/registry/workItemBridge.js.map +1 -0
- package/dist/runners/cliRunner.d.ts +11 -0
- package/dist/runners/cliRunner.d.ts.map +1 -0
- package/dist/runners/cliRunner.js +193 -0
- package/dist/runners/cliRunner.js.map +1 -0
- package/dist/support/apiCache.d.ts +85 -0
- package/dist/support/apiCache.d.ts.map +1 -0
- package/dist/support/apiCache.js +163 -0
- package/dist/support/apiCache.js.map +1 -0
- package/dist/support/chat.d.ts +3 -0
- package/dist/support/chat.d.ts.map +1 -0
- package/dist/support/chat.js +305 -0
- package/dist/support/chat.js.map +1 -0
- package/dist/support/chatBackend.d.ts +25 -0
- package/dist/support/chatBackend.d.ts.map +1 -0
- package/dist/support/chatBackend.js +289 -0
- package/dist/support/chatBackend.js.map +1 -0
- package/dist/support/chatTui.d.ts +3 -0
- package/dist/support/chatTui.d.ts.map +1 -0
- package/dist/support/chatTui.js +1082 -0
- package/dist/support/chatTui.js.map +1 -0
- package/dist/support/costTracker.d.ts +29 -0
- package/dist/support/costTracker.d.ts.map +1 -0
- package/dist/support/costTracker.js +113 -0
- package/dist/support/costTracker.js.map +1 -0
- package/dist/support/dashboardHtml.d.ts +5 -0
- package/dist/support/dashboardHtml.d.ts.map +1 -0
- package/dist/support/dashboardHtml.js +2629 -0
- package/dist/support/dashboardHtml.js.map +1 -0
- package/dist/support/dev.d.ts +55 -0
- package/dist/support/dev.d.ts.map +1 -0
- package/dist/support/dev.js +298 -0
- package/dist/support/dev.js.map +1 -0
- package/dist/support/editParser.d.ts +37 -0
- package/dist/support/editParser.d.ts.map +1 -0
- package/dist/support/editParser.js +365 -0
- package/dist/support/editParser.js.map +1 -0
- package/dist/support/ghosttyThemeCatalog.generated.d.ts +2 -0
- package/dist/support/ghosttyThemeCatalog.generated.d.ts.map +1 -0
- package/dist/support/ghosttyThemeCatalog.generated.js +11116 -0
- package/dist/support/ghosttyThemeCatalog.generated.js.map +1 -0
- package/dist/support/gitStatus.d.ts +21 -0
- package/dist/support/gitStatus.d.ts.map +1 -0
- package/dist/support/gitStatus.js +108 -0
- package/dist/support/gitStatus.js.map +1 -0
- package/dist/support/gitTracker.d.ts +30 -0
- package/dist/support/gitTracker.d.ts.map +1 -0
- package/dist/support/gitTracker.js +143 -0
- package/dist/support/gitTracker.js.map +1 -0
- package/dist/support/index.d.ts +12 -0
- package/dist/support/index.d.ts.map +1 -0
- package/dist/support/index.js +12 -0
- package/dist/support/index.js.map +1 -0
- package/dist/support/planner.d.ts +64 -0
- package/dist/support/planner.d.ts.map +1 -0
- package/dist/support/planner.js +396 -0
- package/dist/support/planner.js.map +1 -0
- package/dist/support/projectMapper.d.ts +46 -0
- package/dist/support/projectMapper.d.ts.map +1 -0
- package/dist/support/projectMapper.js +273 -0
- package/dist/support/projectMapper.js.map +1 -0
- package/dist/support/pty-helper.py +117 -0
- package/dist/support/quotaTracker.d.ts +29 -0
- package/dist/support/quotaTracker.d.ts.map +1 -0
- package/dist/support/quotaTracker.js +89 -0
- package/dist/support/quotaTracker.js.map +1 -0
- package/dist/support/rateLimiter.d.ts +101 -0
- package/dist/support/rateLimiter.d.ts.map +1 -0
- package/dist/support/rateLimiter.js +219 -0
- package/dist/support/rateLimiter.js.map +1 -0
- package/dist/support/rollback.d.ts +61 -0
- package/dist/support/rollback.d.ts.map +1 -0
- package/dist/support/rollback.js +329 -0
- package/dist/support/rollback.js.map +1 -0
- package/dist/support/sharedShell.d.ts +17 -0
- package/dist/support/sharedShell.d.ts.map +1 -0
- package/dist/support/sharedShell.js +439 -0
- package/dist/support/sharedShell.js.map +1 -0
- package/dist/support/stuckDetector.d.ts +68 -0
- package/dist/support/stuckDetector.d.ts.map +1 -0
- package/dist/support/stuckDetector.js +174 -0
- package/dist/support/stuckDetector.js.map +1 -0
- package/dist/support/terminalBridge.d.ts +18 -0
- package/dist/support/terminalBridge.d.ts.map +1 -0
- package/dist/support/terminalBridge.js +553 -0
- package/dist/support/terminalBridge.js.map +1 -0
- package/dist/support/timeWindow.d.ts +60 -0
- package/dist/support/timeWindow.d.ts.map +1 -0
- package/dist/support/timeWindow.js +236 -0
- package/dist/support/timeWindow.js.map +1 -0
- package/dist/support/uiThemes.d.ts +44 -0
- package/dist/support/uiThemes.d.ts.map +1 -0
- package/dist/support/uiThemes.js +290 -0
- package/dist/support/uiThemes.js.map +1 -0
- package/dist/support/web.d.ts +29 -0
- package/dist/support/web.d.ts.map +1 -0
- package/dist/support/web.js +1097 -0
- package/dist/support/web.js.map +1 -0
- package/dist/support/worktreeManager.d.ts +20 -0
- package/dist/support/worktreeManager.d.ts.map +1 -0
- package/dist/support/worktreeManager.js +140 -0
- package/dist/support/worktreeManager.js.map +1 -0
- package/dist/task_state_model.py +55 -0
- package/dist/workItemState/store.d.ts +122 -0
- package/dist/workItemState/store.d.ts.map +1 -0
- package/dist/workItemState/store.js +438 -0
- package/dist/workItemState/store.js.map +1 -0
- package/dist/workItems/azdoBridge.d.ts +42 -0
- package/dist/workItems/azdoBridge.d.ts.map +1 -0
- package/dist/workItems/azdoBridge.js +143 -0
- package/dist/workItems/azdoBridge.js.map +1 -0
- package/dist/workItems/azdoSyncRuntime.d.ts +28 -0
- package/dist/workItems/azdoSyncRuntime.d.ts.map +1 -0
- package/dist/workItems/azdoSyncRuntime.js +158 -0
- package/dist/workItems/azdoSyncRuntime.js.map +1 -0
- package/dist/workItems/azureDevOpsSync.d.ts +128 -0
- package/dist/workItems/azureDevOpsSync.d.ts.map +1 -0
- package/dist/workItems/azureDevOpsSync.js +748 -0
- package/dist/workItems/azureDevOpsSync.js.map +1 -0
- package/dist/workItems/helpers.d.ts +11 -0
- package/dist/workItems/helpers.d.ts.map +1 -0
- package/dist/workItems/helpers.js +17 -0
- package/dist/workItems/helpers.js.map +1 -0
- package/dist/workItems/index.d.ts +21 -0
- package/dist/workItems/index.d.ts.map +1 -0
- package/dist/workItems/index.js +89 -0
- package/dist/workItems/index.js.map +1 -0
- package/dist/workItems/localWorkItemFetcher.d.ts +55 -0
- package/dist/workItems/localWorkItemFetcher.d.ts.map +1 -0
- package/dist/workItems/localWorkItemFetcher.js +209 -0
- package/dist/workItems/localWorkItemFetcher.js.map +1 -0
- package/dist/workItems/migrations/001_rename_workItem_to_work_item.sql +10 -0
- package/dist/workItems/postgresStore.d.ts +78 -0
- package/dist/workItems/postgresStore.d.ts.map +1 -0
- package/dist/workItems/postgresStore.js +937 -0
- package/dist/workItems/postgresStore.js.map +1 -0
- package/dist/workItems/schema.d.ts +257 -0
- package/dist/workItems/schema.d.ts.map +1 -0
- package/dist/workItems/schema.js +176 -0
- package/dist/workItems/schema.js.map +1 -0
- package/dist/workItems/sqliteStore.d.ts +124 -0
- package/dist/workItems/sqliteStore.d.ts.map +1 -0
- package/dist/workItems/sqliteStore.js +713 -0
- package/dist/workItems/sqliteStore.js.map +1 -0
- package/dist/workItems/workItemBoardHtml.d.ts +5 -0
- package/dist/workItems/workItemBoardHtml.d.ts.map +1 -0
- package/dist/workItems/workItemBoardHtml.js +2192 -0
- package/dist/workItems/workItemBoardHtml.js.map +1 -0
- package/package.json +99 -0
- package/templates/AGENTS.md +432 -0
- package/templates/BOOT.md +25 -0
- package/templates/BOOTSTRAP.md +50 -0
- package/templates/CHANGELOG_AUDIT.md +74 -0
- package/templates/HEARTBEAT.md +86 -0
- package/templates/IDENTITY.md +27 -0
- package/templates/PR_LAND.md +75 -0
- package/templates/PR_REVIEW.md +97 -0
- package/templates/SOUL.dev.md +52 -0
- package/templates/SOUL.md +81 -0
- package/templates/TOOLS.md +52 -0
- package/templates/USER.md +22 -0
- package/templates/WORKITEM_ANALYSIS.md +31 -0
- package/templates/agents/executor.md +26 -0
- package/templates/agents/plan.md +22 -0
- package/templates/agents/ralph.md +37 -0
- package/templates/agents/review.md +22 -0
- package/templates/agents/team.md +39 -0
|
@@ -0,0 +1,701 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// Enact Factory - Runner Execution Helpers
|
|
3
|
+
// Execution/reporting/integration logic extracted from AutonomousRunner
|
|
4
|
+
// ============================================
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { homedir } from 'node:os';
|
|
7
|
+
import { createPipelineFromConfig, buildWorkItemPrefix } from '../agents/pairPipeline.js';
|
|
8
|
+
import { formatParsedWorkItemSummary, loadParsedWorkItem } from '../orchestration/workItemParser.js';
|
|
9
|
+
import * as executorAgent from '../agents/executor.js';
|
|
10
|
+
import * as reviewerAgent from '../agents/reviewer.js';
|
|
11
|
+
import * as projectMapper from '../support/projectMapper.js';
|
|
12
|
+
import * as azdo from '../azdo/index.js';
|
|
13
|
+
import * as planner from '../support/planner.js';
|
|
14
|
+
import { runDraftAnalysis } from '../agents/draftAnalyzer.js';
|
|
15
|
+
import { t } from '../locale/index.js';
|
|
16
|
+
import { broadcastEvent } from '../core/eventHub.js';
|
|
17
|
+
import { branchNameFor, shouldTeardown } from '../core/devopsModel.js';
|
|
18
|
+
import { createWorktree, commitAndCreatePR, removeWorktree, } from '../support/worktreeManager.js';
|
|
19
|
+
import { getWorkItemStore } from '../workItems/index.js';
|
|
20
|
+
import { getDecompositionDepth, getChildrenCount, getDailyCreationCount, canCreateMoreWorkItems, registerDecomposition, } from '../automation/runnerState.js';
|
|
21
|
+
import { buildWorkItemStateSyncComment, completeParentIfChildrenDone, markWorkItemBlocked, markWorkItemDecomposed, markWorkItemDone, markWorkItemInProgress, releaseDependentWorkItems, upsertWorkItemState, } from '../workItemState/store.js';
|
|
22
|
+
let notificationSend = null;
|
|
23
|
+
/** @deprecated Discord removed — registers an optional notification sink */
|
|
24
|
+
export function setDiscordReporter(sendFn) {
|
|
25
|
+
notificationSend = sendFn;
|
|
26
|
+
console.log('[AutonomousRunner] Notification reporter registered');
|
|
27
|
+
}
|
|
28
|
+
export async function reportToDiscord(message) {
|
|
29
|
+
if (notificationSend) {
|
|
30
|
+
try {
|
|
31
|
+
await notificationSend(message);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
console.error('[AutonomousRunner] Notification report failed:', error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
console.log('[AutonomousRunner]', message);
|
|
39
|
+
}
|
|
40
|
+
let workItemFetch = null;
|
|
41
|
+
let workItemSource = null;
|
|
42
|
+
export function setAzdoFetcher(fetchFn) {
|
|
43
|
+
workItemFetch = fetchFn;
|
|
44
|
+
workItemSource = 'azdo';
|
|
45
|
+
console.log('[AutonomousRunner] Azdo fetcher registered');
|
|
46
|
+
}
|
|
47
|
+
export function setLocalFetcher(fetchFn) {
|
|
48
|
+
workItemFetch = fetchFn;
|
|
49
|
+
workItemSource = 'local';
|
|
50
|
+
console.log('[AutonomousRunner] Local fetcher registered');
|
|
51
|
+
}
|
|
52
|
+
// Track consecutive fetch failures for visibility
|
|
53
|
+
let fetchFailureCount = 0;
|
|
54
|
+
export async function fetchAzdoWorkItems() {
|
|
55
|
+
if (!workItemFetch) {
|
|
56
|
+
console.log('[AutonomousRunner] No workItem fetcher registered');
|
|
57
|
+
return { workItems: [], error: 'No workItem fetcher registered' };
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const workItems = await workItemFetch();
|
|
61
|
+
if (fetchFailureCount > 0) {
|
|
62
|
+
console.log(`[AutonomousRunner] WorkItem fetch recovered after ${fetchFailureCount} failures`);
|
|
63
|
+
}
|
|
64
|
+
fetchFailureCount = 0;
|
|
65
|
+
return { workItems };
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
fetchFailureCount++;
|
|
69
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
70
|
+
console.error(`[AutonomousRunner] WorkItem fetch failed (${fetchFailureCount}x consecutive): ${msg}`);
|
|
71
|
+
return { workItems: [], error: msg };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Get current workItem source type
|
|
76
|
+
*/
|
|
77
|
+
export function getWorkItemSource() {
|
|
78
|
+
return workItemSource;
|
|
79
|
+
}
|
|
80
|
+
// Project Path Resolution
|
|
81
|
+
export async function resolveProjectPath(ctx, workItem) {
|
|
82
|
+
// For local workItems, projectPath is already resolved
|
|
83
|
+
if (workItem.source === 'local' && workItem.projectPath) {
|
|
84
|
+
// Verify the path exists
|
|
85
|
+
if (!existsSync(workItem.projectPath)) {
|
|
86
|
+
console.error(`[AutonomousRunner] Local workItem "${workItem.title}" project path does not exist: ${workItem.projectPath}`);
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
return workItem.projectPath;
|
|
90
|
+
}
|
|
91
|
+
// For Azdo workItems, resolve via project mapping
|
|
92
|
+
const projectName = workItem.azdoProject?.name;
|
|
93
|
+
const projectId = workItem.azdoProject?.id;
|
|
94
|
+
if (!projectId || !projectName) {
|
|
95
|
+
console.error(`[AutonomousRunner] WorkItem "${workItem.title}" has no project info - SKIP`);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// 1순위: allowedProjects에서 정확한 basename 매칭 (fuzzy보다 신뢰도 높음)
|
|
99
|
+
for (const allowed of ctx.allowedProjects) {
|
|
100
|
+
const expanded = allowed.replace(/^~(?=\/|$)/, homedir());
|
|
101
|
+
const dirName = expanded.split('/').pop();
|
|
102
|
+
if (dirName === projectName || dirName?.toLowerCase() === projectName.toLowerCase()) {
|
|
103
|
+
if (await isValidProjectPath(expanded)) {
|
|
104
|
+
console.log(`[AutonomousRunner] AllowedProjects match: ${projectName} → ${expanded}`);
|
|
105
|
+
return expanded;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// 2순위: ~/dev/{name} 직접 경로
|
|
110
|
+
const directPath = `${homedir()}/dev/${projectName}`;
|
|
111
|
+
if (await isValidProjectPath(directPath)) {
|
|
112
|
+
console.log(`[AutonomousRunner] Direct path found: ${projectName} → ${directPath}`);
|
|
113
|
+
return directPath;
|
|
114
|
+
}
|
|
115
|
+
const lowerPath = `${homedir()}/dev/${projectName.toLowerCase()}`;
|
|
116
|
+
if (await isValidProjectPath(lowerPath)) {
|
|
117
|
+
console.log(`[AutonomousRunner] Lowercase path found: ${projectName} → ${lowerPath}`);
|
|
118
|
+
return lowerPath;
|
|
119
|
+
}
|
|
120
|
+
// 3순위: ~/dev/tools/ 서브디렉토리
|
|
121
|
+
const toolsPath = `${homedir()}/dev/tools/${projectName}`;
|
|
122
|
+
if (await isValidProjectPath(toolsPath)) {
|
|
123
|
+
console.log(`[AutonomousRunner] Tools path found: ${projectName} → ${toolsPath}`);
|
|
124
|
+
return toolsPath;
|
|
125
|
+
}
|
|
126
|
+
// 4순위: fuzzy match (스캔 기반, 오탐 가능성 있음)
|
|
127
|
+
const mappedPath = await projectMapper.mapAzdoProject(projectId, projectName, ctx.allowedProjects);
|
|
128
|
+
if (mappedPath) {
|
|
129
|
+
console.log(`[AutonomousRunner] Fuzzy mapped: ${projectName} → ${mappedPath}`);
|
|
130
|
+
return mappedPath;
|
|
131
|
+
}
|
|
132
|
+
console.error(`[AutonomousRunner] Failed to resolve project path for "${projectName}" - SKIP`);
|
|
133
|
+
console.error(`[AutonomousRunner] Tried: allowedProjects, ${directPath}, ${lowerPath}, ${toolsPath}, fuzzy mapper`);
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
export async function isValidProjectPath(path) {
|
|
137
|
+
try {
|
|
138
|
+
const fs = await import('fs/promises');
|
|
139
|
+
const stats = await fs.stat(path);
|
|
140
|
+
if (!stats.isDirectory())
|
|
141
|
+
return false;
|
|
142
|
+
const checks = ['.git', 'package.json', 'pyproject.toml'];
|
|
143
|
+
for (const check of checks) {
|
|
144
|
+
try {
|
|
145
|
+
await fs.stat(`${path}/${check}`);
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// continue
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// WorkItem Decomposition
|
|
159
|
+
export async function decomposeWorkItem(ctx, workItem, projectPath, targetMinutes, draftAnalysis) {
|
|
160
|
+
console.log(`[AutonomousRunner] Decomposing workItem: ${workItem.title}`);
|
|
161
|
+
const workItemId = workItem.workItemId || workItem.id;
|
|
162
|
+
const maxDepth = ctx.decompositionMaxDepth ?? 2;
|
|
163
|
+
const maxChildren = ctx.decompositionMaxChildren ?? 5;
|
|
164
|
+
const dailyLimit = ctx.decompositionDailyLimit ?? 20;
|
|
165
|
+
const autoBacklog = ctx.decompositionAutoBacklog ?? true;
|
|
166
|
+
// ============================================
|
|
167
|
+
// Pre-checks: Depth, Children, Daily Limit
|
|
168
|
+
// ============================================
|
|
169
|
+
// Check decomposition depth limit
|
|
170
|
+
if (workItem.workItemId) {
|
|
171
|
+
const currentDepth = getDecompositionDepth(workItem.workItemId);
|
|
172
|
+
if (currentDepth >= maxDepth) {
|
|
173
|
+
console.log(`[AutonomousRunner] Decomposition depth limit reached: ${currentDepth}/${maxDepth}`);
|
|
174
|
+
if (autoBacklog && workItem.workItemId) {
|
|
175
|
+
try {
|
|
176
|
+
await azdo.updateWorkItemState(workItem.workItemId, 'Backlog');
|
|
177
|
+
await azdo.addComment(workItem.workItemId, `⚠️ **Auto-moved to Backlog**\n\n` +
|
|
178
|
+
`Reason: Decomposition depth limit reached (${currentDepth}/${maxDepth})\n\n` +
|
|
179
|
+
`This workItem has been nested too deeply. Please review and simplify the workItem structure, ` +
|
|
180
|
+
`or handle it manually.`);
|
|
181
|
+
console.log(`[AutonomousRunner] WorkItem moved to backlog (depth limit)`);
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
console.error(`[AutonomousRunner] Failed to move to backlog:`, err);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
// Check children count limit
|
|
190
|
+
const childrenCount = getChildrenCount(workItem.workItemId);
|
|
191
|
+
if (childrenCount >= maxChildren) {
|
|
192
|
+
console.log(`[AutonomousRunner] Children count limit reached: ${childrenCount}/${maxChildren}`);
|
|
193
|
+
if (autoBacklog) {
|
|
194
|
+
try {
|
|
195
|
+
await azdo.updateWorkItemState(workItem.workItemId, 'Backlog');
|
|
196
|
+
await azdo.addComment(workItem.workItemId, `⚠️ **Auto-moved to Backlog**\n\n` +
|
|
197
|
+
`Reason: Too many sub-workItems already created (${childrenCount}/${maxChildren})\n\n` +
|
|
198
|
+
`This workItem has generated too many sub-workItems. Please review the decomposition strategy, ` +
|
|
199
|
+
`or handle it manually.`);
|
|
200
|
+
console.log(`[AutonomousRunner] WorkItem moved to backlog (children limit)`);
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
console.error(`[AutonomousRunner] Failed to move to backlog:`, err);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Check daily creation limit
|
|
210
|
+
// NOTE: Don't move to Backlog on daily limit — it resets tomorrow.
|
|
211
|
+
// Moving to Backlog would permanently exclude the workItem from future heartbeats.
|
|
212
|
+
// Instead, skip decomposition and fall through to direct execution.
|
|
213
|
+
if (!canCreateMoreWorkItems(dailyLimit)) {
|
|
214
|
+
const currentCount = getDailyCreationCount();
|
|
215
|
+
console.log(`[AutonomousRunner] Daily workItem creation limit reached: ${currentCount}/${dailyLimit} — skipping decomposition (will retry tomorrow)`);
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'decompose', status: 'start' } });
|
|
219
|
+
await ctx.reportToDiscord(t('runner.decomposition.starting', {
|
|
220
|
+
title: workItem.title,
|
|
221
|
+
estimated: String(planner.estimateWorkItemDuration(workItem)),
|
|
222
|
+
threshold: String(targetMinutes),
|
|
223
|
+
}));
|
|
224
|
+
// Periodic progress log while planner runs (fallback if stdout isn't streaming)
|
|
225
|
+
let elapsed = 0;
|
|
226
|
+
const progressTimer = setInterval(() => {
|
|
227
|
+
elapsed += 30;
|
|
228
|
+
broadcastEvent({ type: 'log', data: { workItemId, stage: 'decompose', line: `⏱ Planner running... ${elapsed}s` } });
|
|
229
|
+
}, 30000);
|
|
230
|
+
let result;
|
|
231
|
+
try {
|
|
232
|
+
result = await planner.runPlanner({
|
|
233
|
+
workItemTitle: workItem.title,
|
|
234
|
+
workItemDescription: workItem.description || '',
|
|
235
|
+
projectPath,
|
|
236
|
+
projectName: workItem.azdoProject?.name,
|
|
237
|
+
targetMinutes,
|
|
238
|
+
model: ctx.plannerModel ?? 'claude-sonnet-4-5-20250929',
|
|
239
|
+
timeoutMs: ctx.plannerTimeoutMs ?? 600000,
|
|
240
|
+
onLog: (line) => broadcastEvent({ type: 'log', data: { workItemId, stage: 'decompose', line } }),
|
|
241
|
+
draftAnalysis: draftAnalysis ? {
|
|
242
|
+
workItemType: draftAnalysis.workItemType,
|
|
243
|
+
intentSummary: draftAnalysis.intentSummary,
|
|
244
|
+
relevantFiles: draftAnalysis.relevantFiles,
|
|
245
|
+
suggestedApproach: draftAnalysis.suggestedApproach,
|
|
246
|
+
projectStats: draftAnalysis.projectStats,
|
|
247
|
+
} : undefined,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
finally {
|
|
251
|
+
clearInterval(progressTimer);
|
|
252
|
+
}
|
|
253
|
+
await ctx.reportToDiscord(planner.formatPlannerResult(result));
|
|
254
|
+
if (!result.success) {
|
|
255
|
+
console.error(`[AutonomousRunner] Planner failed: ${result.error}`);
|
|
256
|
+
broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'decompose', status: 'fail' } });
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
if (!result.needsDecomposition || result.subWorkItems.length === 0) {
|
|
260
|
+
console.log('[AutonomousRunner] Planner determined no decomposition needed');
|
|
261
|
+
return 'no-decomp';
|
|
262
|
+
}
|
|
263
|
+
if (!workItem.workItemId) {
|
|
264
|
+
console.error('[AutonomousRunner] Cannot create sub-workItems: no parent workItemId');
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
const createdSubWorkItems = [];
|
|
268
|
+
for (const [index, subWorkItem] of result.subWorkItems.entries()) {
|
|
269
|
+
const depsStr = subWorkItem.dependencies?.length
|
|
270
|
+
? `\n\n${t('runner.decomposition.prerequisite', { deps: subWorkItem.dependencies.join(', ') })}`
|
|
271
|
+
: '';
|
|
272
|
+
const subDescription = `${subWorkItem.description}\n\n` +
|
|
273
|
+
`${t('runner.decomposition.estimatedTime', { n: String(subWorkItem.estimatedMinutes) })}${depsStr}\n\n` +
|
|
274
|
+
t('runner.decomposition.autoDecomposed', { parentTitle: workItem.title });
|
|
275
|
+
const subResult = await azdo.createSubWorkItem(workItem.workItemId, subWorkItem.title, subDescription, {
|
|
276
|
+
priority: subWorkItem.priority,
|
|
277
|
+
projectId: workItem.azdoProject?.id,
|
|
278
|
+
estimatedMinutes: subWorkItem.estimatedMinutes,
|
|
279
|
+
});
|
|
280
|
+
if ('error' in subResult) {
|
|
281
|
+
console.error(`[AutonomousRunner] Failed to create sub-workItem: ${subResult.error}`);
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
createdSubWorkItems.push({
|
|
285
|
+
id: subResult.id,
|
|
286
|
+
identifier: subResult.identifier,
|
|
287
|
+
title: subResult.title,
|
|
288
|
+
dependencies: subWorkItem.dependencies || [],
|
|
289
|
+
topoRank: index,
|
|
290
|
+
estimatedMinutes: subWorkItem.estimatedMinutes,
|
|
291
|
+
});
|
|
292
|
+
console.log(`[AutonomousRunner] Created sub-workItem: ${subResult.identifier}`);
|
|
293
|
+
}
|
|
294
|
+
if (createdSubWorkItems.length === 0) {
|
|
295
|
+
console.error('[AutonomousRunner] No sub-workItems created');
|
|
296
|
+
broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'decompose', status: 'fail' } });
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
// Register decomposition in tracking (for limits)
|
|
300
|
+
registerDecomposition(workItem.workItemId, workItem.parentId, // Parent ID if this workItem is also a sub-workItem
|
|
301
|
+
createdSubWorkItems.map(s => s.id));
|
|
302
|
+
console.log(`[AutonomousRunner] Registered decomposition: parent=${workItem.workItemId}, children=${createdSubWorkItems.length}, daily=${getDailyCreationCount()}/${dailyLimit}`);
|
|
303
|
+
await azdo.markAsDecomposed(workItem.workItemId, createdSubWorkItems.length, result.totalEstimatedMinutes);
|
|
304
|
+
const childIdByTitle = new Map(createdSubWorkItems.map((subWorkItem) => [subWorkItem.title, subWorkItem.id]));
|
|
305
|
+
const parentState = markWorkItemDecomposed(workItem.workItemId, {
|
|
306
|
+
workItemIdentifier: workItem.workItemIdentifier,
|
|
307
|
+
title: workItem.title,
|
|
308
|
+
projectId: workItem.azdoProject?.id,
|
|
309
|
+
projectName: workItem.azdoProject?.name,
|
|
310
|
+
parentWorkItemId: workItem.parentId,
|
|
311
|
+
childWorkItemIds: createdSubWorkItems.map((subWorkItem) => subWorkItem.id),
|
|
312
|
+
});
|
|
313
|
+
await azdo.addComment(workItem.workItemId, buildWorkItemStateSyncComment(parentState, 'Parent workItem decomposed'));
|
|
314
|
+
const subWorkItemList = createdSubWorkItems
|
|
315
|
+
.map((s, i) => `${i + 1}. ${s.identifier}: ${s.title}`)
|
|
316
|
+
.join('\n');
|
|
317
|
+
await ctx.reportToDiscord(t('runner.decomposition.completed', {
|
|
318
|
+
original: workItem.workItemIdentifier || workItem.workItemId || '',
|
|
319
|
+
count: String(createdSubWorkItems.length),
|
|
320
|
+
list: subWorkItemList,
|
|
321
|
+
totalMinutes: String(result.totalEstimatedMinutes),
|
|
322
|
+
}));
|
|
323
|
+
broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'decompose', status: 'complete' } });
|
|
324
|
+
// Log each sub-workItem as a log line for the dashboard
|
|
325
|
+
for (const s of createdSubWorkItems) {
|
|
326
|
+
broadcastEvent({ type: 'log', data: { workItemId, stage: 'decompose', line: `↳ ${s.identifier}: ${s.title}` } });
|
|
327
|
+
}
|
|
328
|
+
console.log(`[AutonomousRunner] Decomposition complete: ${createdSubWorkItems.length} sub-workItems created`);
|
|
329
|
+
for (const subWorkItem of createdSubWorkItems) {
|
|
330
|
+
const dependencyWorkItemIds = subWorkItem.dependencies
|
|
331
|
+
.map((title) => childIdByTitle.get(title))
|
|
332
|
+
.filter((value) => Boolean(value));
|
|
333
|
+
const isReady = dependencyWorkItemIds.length === 0;
|
|
334
|
+
const childState = upsertWorkItemState(subWorkItem.id, {
|
|
335
|
+
workItemIdentifier: subWorkItem.identifier,
|
|
336
|
+
title: subWorkItem.title,
|
|
337
|
+
projectId: workItem.azdoProject?.id,
|
|
338
|
+
projectName: workItem.azdoProject?.name,
|
|
339
|
+
parentWorkItemId: workItem.workItemId,
|
|
340
|
+
dependencyWorkItemIds,
|
|
341
|
+
dependencyTitles: subWorkItem.dependencies,
|
|
342
|
+
topoRank: subWorkItem.topoRank,
|
|
343
|
+
execution: {
|
|
344
|
+
status: isReady ? 'todo' : 'blocked',
|
|
345
|
+
blockedReason: isReady ? undefined : `Waiting on dependencies: ${dependencyWorkItemIds.join(', ')}`,
|
|
346
|
+
retryCount: 0,
|
|
347
|
+
},
|
|
348
|
+
azdoState: isReady ? 'Todo' : 'Backlog',
|
|
349
|
+
});
|
|
350
|
+
try {
|
|
351
|
+
if (isReady) {
|
|
352
|
+
await azdo.updateWorkItemState(subWorkItem.id, 'Todo');
|
|
353
|
+
console.log(`[AutonomousRunner] Moved ${subWorkItem.identifier} to Todo`);
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
console.log(`[AutonomousRunner] Keeping ${subWorkItem.identifier} in Backlog until dependencies resolve`);
|
|
357
|
+
}
|
|
358
|
+
await azdo.addComment(subWorkItem.id, buildWorkItemStateSyncComment(childState, isReady ? 'WorkItem ready after decomposition' : 'WorkItem blocked by decomposition dependency'));
|
|
359
|
+
}
|
|
360
|
+
catch (err) {
|
|
361
|
+
console.warn(`[AutonomousRunner] Failed to initialize ${subWorkItem.identifier} state:`, err);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Trigger immediate heartbeat to pick up newly created sub-workItems
|
|
365
|
+
if (ctx.scheduleNextHeartbeat) {
|
|
366
|
+
console.log('[AutonomousRunner] Scheduling immediate heartbeat to process sub-workItems...');
|
|
367
|
+
ctx.scheduleNextHeartbeat();
|
|
368
|
+
}
|
|
369
|
+
return true;
|
|
370
|
+
}
|
|
371
|
+
// Pipeline Execution
|
|
372
|
+
export async function executePipeline(ctx, workItem, projectPath) {
|
|
373
|
+
console.log(`[AutonomousRunner] executePipeline: ${workItem.title}`);
|
|
374
|
+
// ============================================
|
|
375
|
+
// Draft Analysis (Haiku 사전 분석 — ~3초)
|
|
376
|
+
// Planner + Executor에 enriched context 제공
|
|
377
|
+
// ============================================
|
|
378
|
+
let draftResult;
|
|
379
|
+
if (ctx.enableDraftAnalysis !== false) {
|
|
380
|
+
try {
|
|
381
|
+
// Use stable internal workItem id so dashboard can map draft stage rows
|
|
382
|
+
// back to project/workItem metadata populated from workItem:queued events.
|
|
383
|
+
const workItemId = workItem.id;
|
|
384
|
+
broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'draft', status: 'start' } });
|
|
385
|
+
draftResult = await runDraftAnalysis({
|
|
386
|
+
workItemTitle: workItem.title,
|
|
387
|
+
workItemDescription: workItem.description || '',
|
|
388
|
+
projectPath,
|
|
389
|
+
model: ctx.draftModel,
|
|
390
|
+
timeoutMs: 30000,
|
|
391
|
+
onLog: (line) => broadcastEvent({ type: 'log', data: { workItemId, stage: 'draft', line } }),
|
|
392
|
+
});
|
|
393
|
+
broadcastEvent({ type: 'pipeline:stage', data: { workItemId, stage: 'draft', status: 'complete' } });
|
|
394
|
+
console.log(`[AutonomousRunner] Draft: type=${draftResult.workItemType}, files=${draftResult.relevantFiles.length}, ${draftResult.durationMs}ms`);
|
|
395
|
+
}
|
|
396
|
+
catch (err) {
|
|
397
|
+
console.warn('[AutonomousRunner] Draft analysis failed (non-blocking):', err);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if (ctx.enableDecomposition) {
|
|
401
|
+
const threshold = ctx.decompositionThresholdMinutes ?? 30;
|
|
402
|
+
const needsDecomp = planner.needsDecomposition(workItem, threshold, true); // heuristic pre-filter
|
|
403
|
+
if (needsDecomp) {
|
|
404
|
+
const estimated = planner.estimateWorkItemDuration(workItem);
|
|
405
|
+
console.log(`[AutonomousRunner] WorkItem "${workItem.title}" may need decomposition (estimated ${estimated}min > ${threshold}min)`);
|
|
406
|
+
const decomposed = await decomposeWorkItem(ctx, workItem, projectPath, threshold, draftResult);
|
|
407
|
+
if (decomposed === true) {
|
|
408
|
+
// Successfully decomposed into sub-workItems
|
|
409
|
+
return {
|
|
410
|
+
success: true,
|
|
411
|
+
sessionId: `decomposed-${Date.now()}`,
|
|
412
|
+
iterations: 0,
|
|
413
|
+
totalDuration: 0,
|
|
414
|
+
finalStatus: 'decomposed',
|
|
415
|
+
stages: [],
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
if (decomposed === 'no-decomp') {
|
|
419
|
+
// Planner says workItem is smaller than threshold — proceed with direct execution
|
|
420
|
+
console.log('[AutonomousRunner] Planner says workItem fits in threshold, executing directly');
|
|
421
|
+
}
|
|
422
|
+
else {
|
|
423
|
+
// Decomposition failed (limit reached, planner error, API error, etc.)
|
|
424
|
+
// Fall through to direct execution instead of aborting entirely
|
|
425
|
+
console.log('[AutonomousRunner] Decomposition failed, falling back to direct execution');
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
// ============================================
|
|
430
|
+
// Git Worktree: work in an isolated branch per workItem
|
|
431
|
+
// ============================================
|
|
432
|
+
let worktreeInfo = null;
|
|
433
|
+
let actualPath = projectPath;
|
|
434
|
+
let teardownLifecycle = null;
|
|
435
|
+
if (ctx.worktreeMode && workItem.workItemId && workItem.workItemIdentifier) {
|
|
436
|
+
const workItemKind = workItem.workItemId
|
|
437
|
+
? (await (await getWorkItemStore()).getWorkItem(workItem.workItemId))?.kind ?? 'Backlog item'
|
|
438
|
+
: 'Backlog item';
|
|
439
|
+
const branchName = branchNameFor({ workItemId: workItem.workItemIdentifier, title: workItem.title }, workItemKind);
|
|
440
|
+
try {
|
|
441
|
+
worktreeInfo = await createWorktree(projectPath, workItem.workItemId, branchName);
|
|
442
|
+
actualPath = worktreeInfo.worktreePath;
|
|
443
|
+
broadcastEvent({
|
|
444
|
+
type: 'log',
|
|
445
|
+
data: {
|
|
446
|
+
workItemId: workItem.workItemId,
|
|
447
|
+
stage: 'worktree',
|
|
448
|
+
line: `Worktree: ${actualPath} (branch: ${branchName})`,
|
|
449
|
+
},
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
catch (err) {
|
|
453
|
+
console.warn('[Worktree] Failed to create worktree, falling back to main repo:', err);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
try {
|
|
457
|
+
const roles = ctx.getRolesForProject(projectPath); // look up config using original path
|
|
458
|
+
const pipeline = createPipelineFromConfig(roles, ctx.pairMaxAttempts ?? 3, ctx.guards, ctx.jobProfiles, draftResult ? {
|
|
459
|
+
workItemType: draftResult.workItemType,
|
|
460
|
+
intentSummary: draftResult.intentSummary,
|
|
461
|
+
relevantFiles: draftResult.relevantFiles,
|
|
462
|
+
suggestedApproach: draftResult.suggestedApproach,
|
|
463
|
+
projectStats: draftResult.projectStats,
|
|
464
|
+
registrySnapshot: draftResult.registrySnapshot,
|
|
465
|
+
} : undefined);
|
|
466
|
+
const workItemPrefix = buildWorkItemPrefix(workItem, actualPath);
|
|
467
|
+
pipeline.on('stage:start', ({ stage }) => {
|
|
468
|
+
console.log(`[${workItemPrefix}] Stage started: ${stage}`);
|
|
469
|
+
});
|
|
470
|
+
const workItemReportCtx = {
|
|
471
|
+
workItemIdentifier: workItem.workItemIdentifier || workItem.workItemId,
|
|
472
|
+
projectName: workItem.azdoProject?.name,
|
|
473
|
+
projectPath: actualPath,
|
|
474
|
+
};
|
|
475
|
+
pipeline.on('stage:complete', async ({ stage, result }) => {
|
|
476
|
+
console.log(`[${workItemPrefix}] Stage completed: ${stage}, success=${result.success}`);
|
|
477
|
+
await reportStageResult(stage, result, ctx.reportToDiscord, workItemReportCtx);
|
|
478
|
+
});
|
|
479
|
+
pipeline.on('revision:start', ({ stage }) => {
|
|
480
|
+
void ctx.reportToDiscord(t('runner.pipeline.revisionNeeded', { stage }));
|
|
481
|
+
});
|
|
482
|
+
// HALT event: low confidence → report to Azdo + Discord
|
|
483
|
+
pipeline.on('halt', async ({ confidence, haltReason, sessionId, iteration }) => {
|
|
484
|
+
console.warn(`[${workItemPrefix}] HALT event: confidence=${confidence}%, reason=${haltReason}`);
|
|
485
|
+
// Report to Azdo
|
|
486
|
+
if (workItem.workItemId && ctx.guards?.haltToAzdo) {
|
|
487
|
+
try {
|
|
488
|
+
await azdo.logHalt(workItem.workItemId, sessionId, confidence, iteration, haltReason);
|
|
489
|
+
}
|
|
490
|
+
catch (err) {
|
|
491
|
+
console.error(`[${workItemPrefix}] Azdo logHalt failed:`, err);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
// Report to Discord
|
|
495
|
+
await ctx.reportToDiscord(`⚠️ HALT - Low Confidence\nWorkItem: ${workItem.title}\nConfidence: ${confidence}%\nIteration: #${iteration}\nReason: ${haltReason || 'Low confidence score'}`);
|
|
496
|
+
});
|
|
497
|
+
const stages = getEnabledStages(roles);
|
|
498
|
+
const workItemRef = workItem.workItemIdentifier || workItem.workItemId || '';
|
|
499
|
+
const projectDisplay = workItem.azdoProject?.name
|
|
500
|
+
? `📁 ${workItem.azdoProject.name} (${actualPath.split('/').slice(-2).join('/')})`
|
|
501
|
+
: actualPath.split('/').slice(-2).join('/');
|
|
502
|
+
await ctx.reportToDiscord(`${t('runner.pipeline.starting')}\n${t('runner.result.workItemLabel')}: ${workItem.title}\nProject: ${projectDisplay}` +
|
|
503
|
+
(workItemRef ? `\nWorkItem: ${workItemRef}` : '') +
|
|
504
|
+
`\nStages: ${stages.join(' → ')}` +
|
|
505
|
+
(worktreeInfo ? `\nBranch: ${worktreeInfo.branchName}` : ''));
|
|
506
|
+
if (workItem.workItemId) {
|
|
507
|
+
try {
|
|
508
|
+
const sessionId = `pipeline-${Date.now()}`;
|
|
509
|
+
const inProgressState = await markWorkItemInProgress(workItem.workItemId, {
|
|
510
|
+
workItemIdentifier: workItem.workItemIdentifier,
|
|
511
|
+
title: workItem.title,
|
|
512
|
+
projectId: workItem.azdoProject?.id,
|
|
513
|
+
projectName: workItem.azdoProject?.name,
|
|
514
|
+
azdoState: 'In Progress',
|
|
515
|
+
sessionId,
|
|
516
|
+
branchName: worktreeInfo?.branchName,
|
|
517
|
+
worktreePath: actualPath,
|
|
518
|
+
});
|
|
519
|
+
await azdo.logPairStart(workItem.workItemId, sessionId, projectPath);
|
|
520
|
+
await azdo.addComment(workItem.workItemId, buildWorkItemStateSyncComment(inProgressState, 'WorkItem execution started'));
|
|
521
|
+
}
|
|
522
|
+
catch (err) {
|
|
523
|
+
console.error(`[${workItemPrefix}] Azdo logPairStart failed:`, err);
|
|
524
|
+
// Continue pipeline even if this fails
|
|
525
|
+
await azdo.updateWorkItemState(workItem.workItemId, 'In Progress');
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
// Run pipeline in worktree path
|
|
529
|
+
const result = await pipeline.run(workItem, actualPath);
|
|
530
|
+
// Create PR (worktree mode + pipeline success = finalStatus 'approved')
|
|
531
|
+
if (worktreeInfo && result.success && result.finalStatus === 'approved') {
|
|
532
|
+
try {
|
|
533
|
+
const prUrl = await commitAndCreatePR(worktreeInfo, workItem.title, workItem.workItemIdentifier || '', workItem.description || '');
|
|
534
|
+
result.prUrl = prUrl;
|
|
535
|
+
broadcastEvent({
|
|
536
|
+
type: 'log',
|
|
537
|
+
data: {
|
|
538
|
+
workItemId: workItem.workItemId || workItem.id,
|
|
539
|
+
stage: 'pr',
|
|
540
|
+
line: `PR created: ${prUrl}`,
|
|
541
|
+
},
|
|
542
|
+
});
|
|
543
|
+
console.log(`[Runner] PR created for ${workItem.workItemIdentifier}: ${prUrl}`);
|
|
544
|
+
teardownLifecycle = { phase: 'done', status: 'merging' };
|
|
545
|
+
}
|
|
546
|
+
catch (err) {
|
|
547
|
+
console.error('[Worktree] PR creation failed:', err);
|
|
548
|
+
broadcastEvent({
|
|
549
|
+
type: 'log',
|
|
550
|
+
data: {
|
|
551
|
+
workItemId: workItem.workItemId || workItem.id,
|
|
552
|
+
stage: 'pr',
|
|
553
|
+
line: `PR creation failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
554
|
+
},
|
|
555
|
+
});
|
|
556
|
+
teardownLifecycle = { phase: 'failed', status: 'active' };
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
else if (worktreeInfo) {
|
|
560
|
+
// Log why PR was not created
|
|
561
|
+
const reason = !result.success
|
|
562
|
+
? `Pipeline failed (${result.finalStatus})`
|
|
563
|
+
: `Unexpected state (success=${result.success}, finalStatus=${result.finalStatus})`;
|
|
564
|
+
console.log(`[Runner] PR not created for ${workItem.workItemIdentifier}: ${reason}`);
|
|
565
|
+
teardownLifecycle = {
|
|
566
|
+
phase: result.success ? 'done' : 'failed',
|
|
567
|
+
status: result.success ? 'active' : 'active',
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
return result;
|
|
571
|
+
}
|
|
572
|
+
finally {
|
|
573
|
+
if (worktreeInfo && teardownLifecycle && shouldTeardown(teardownLifecycle)) {
|
|
574
|
+
await removeWorktree(worktreeInfo).catch((err) => console.warn('[Worktree] Cleanup failed:', err));
|
|
575
|
+
}
|
|
576
|
+
else if (worktreeInfo) {
|
|
577
|
+
console.log(`[Worktree] Preserving ${worktreeInfo.worktreePath} until merge/teardown policy is satisfied`);
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
function getEnabledStages(stages) {
|
|
582
|
+
const enabledStages = [];
|
|
583
|
+
if (stages?.coder?.enabled !== false)
|
|
584
|
+
enabledStages.push('coder');
|
|
585
|
+
if (stages?.critic?.enabled !== false)
|
|
586
|
+
enabledStages.push('critic');
|
|
587
|
+
if (stages?.tester?.enabled)
|
|
588
|
+
enabledStages.push('tester');
|
|
589
|
+
if (stages?.documenter?.enabled)
|
|
590
|
+
enabledStages.push('documenter');
|
|
591
|
+
return enabledStages;
|
|
592
|
+
}
|
|
593
|
+
// Reporting
|
|
594
|
+
async function reportStageResult(stage, result, reportFn, workItemCtx) {
|
|
595
|
+
switch (stage) {
|
|
596
|
+
case 'coder':
|
|
597
|
+
await reportFn(executorAgent.formatWorkReport(result.result, workItemCtx));
|
|
598
|
+
break;
|
|
599
|
+
case 'critic':
|
|
600
|
+
await reportFn(reviewerAgent.formatReviewFeedback(result.result));
|
|
601
|
+
break;
|
|
602
|
+
case 'tester': {
|
|
603
|
+
const { formatTestReport } = await import('../agents/tester.js');
|
|
604
|
+
await reportFn(formatTestReport(result.result));
|
|
605
|
+
break;
|
|
606
|
+
}
|
|
607
|
+
case 'documenter': {
|
|
608
|
+
const { formatDocReport } = await import('../agents/documenter.js');
|
|
609
|
+
await reportFn(formatDocReport(result.result));
|
|
610
|
+
break;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
export async function requestApproval(decision, reportFn) {
|
|
615
|
+
if (!decision.workItem)
|
|
616
|
+
return;
|
|
617
|
+
const projectInfo = decision.workItem.azdoProject?.name
|
|
618
|
+
? `📁 **${decision.workItem.azdoProject.name}**\n`
|
|
619
|
+
: '';
|
|
620
|
+
const workItemRef = decision.workItem.workItemIdentifier || decision.workItem.workItemId || 'N/A';
|
|
621
|
+
await reportFn(`${t('runner.approval.title')}\n${t('runner.approval.question', { project: projectInfo, title: decision.workItem.title })}\n` +
|
|
622
|
+
`WorkItem: ${workItemRef}\nPriority: P${decision.workItem.priority}\n${t('runner.approval.reason')}: ${decision.reason}\n${t('runner.approval.footer')}`);
|
|
623
|
+
if (decision.workItem.workItemId) {
|
|
624
|
+
const parsed = await loadParsedWorkItem(decision.workItem.workItemId);
|
|
625
|
+
if (parsed) {
|
|
626
|
+
const summary = formatParsedWorkItemSummary(parsed);
|
|
627
|
+
await reportFn(`\`\`\`\n${summary.slice(0, 1800)}\n\`\`\``);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
export async function reportExecutionResult(workItem, result, reportFn) {
|
|
632
|
+
const duration = (result.duration / 1000).toFixed(1);
|
|
633
|
+
const stepCount = Object.keys(result.execution.stepResults).length;
|
|
634
|
+
const completedCount = Object.values(result.execution.stepResults)
|
|
635
|
+
.filter(r => r.status === 'completed').length;
|
|
636
|
+
const projectPrefix = workItem.azdoProject?.name ? `[${workItem.azdoProject.name}] ` : '';
|
|
637
|
+
const workItemDisplay = `${projectPrefix}${workItem.title}`;
|
|
638
|
+
if (result.success) {
|
|
639
|
+
await reportFn(`${t('runner.result.workItemCompleted')}\n${t('runner.result.workItemLabel')}: ${workItemDisplay}\n` +
|
|
640
|
+
`${t('runner.result.duration')}: ${duration}s\n${t('runner.result.completedSteps')}: ${completedCount}/${stepCount}`);
|
|
641
|
+
}
|
|
642
|
+
else {
|
|
643
|
+
await reportFn(`${t('runner.result.workItemFailed')}\n${t('runner.result.workItemLabel')}: ${workItemDisplay}\n` +
|
|
644
|
+
`${t('runner.result.failedStep')}: ${result.failedStep || 'Unknown'}\n${t('runner.result.rollback')}: ${result.rollbackPerformed ? '✅' : '❌'}`);
|
|
645
|
+
const failedStepResult = result.execution.stepResults[result.failedStep || ''];
|
|
646
|
+
if (failedStepResult?.error) {
|
|
647
|
+
await reportFn(`\`\`\`\n${failedStepResult.error.slice(0, 1500)}\n\`\`\``);
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
export async function reconcileCompletionState(workItem) {
|
|
652
|
+
if (!workItem.workItemId)
|
|
653
|
+
return;
|
|
654
|
+
const released = releaseDependentWorkItems(workItem.workItemId);
|
|
655
|
+
for (const child of released) {
|
|
656
|
+
try {
|
|
657
|
+
await azdo.updateWorkItemState(child.workItemId, 'Todo');
|
|
658
|
+
await azdo.addComment(child.workItemId, buildWorkItemStateSyncComment(child, 'WorkItem unblocked and ready'));
|
|
659
|
+
}
|
|
660
|
+
catch (err) {
|
|
661
|
+
console.warn(`[AutonomousRunner] Failed to release dependent workItem ${child.workItemId}:`, err);
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
const parent = completeParentIfChildrenDone(workItem.workItemId);
|
|
665
|
+
if (!parent)
|
|
666
|
+
return;
|
|
667
|
+
try {
|
|
668
|
+
await azdo.updateWorkItemState(parent.workItemId, 'Done');
|
|
669
|
+
await azdo.addComment(parent.workItemId, buildWorkItemStateSyncComment(parent, 'All child workItems completed'));
|
|
670
|
+
}
|
|
671
|
+
catch (err) {
|
|
672
|
+
console.warn(`[AutonomousRunner] Failed to complete parent workItem ${parent.workItemId}:`, err);
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
export async function syncFailureState(workItem, reason) {
|
|
676
|
+
if (!workItem.workItemId)
|
|
677
|
+
return;
|
|
678
|
+
const state = await markWorkItemBlocked(workItem.workItemId, reason, workItem.blockedBy || [], workItem.azdoState);
|
|
679
|
+
try {
|
|
680
|
+
await azdo.addComment(workItem.workItemId, buildWorkItemStateSyncComment(state, 'WorkItem blocked'));
|
|
681
|
+
}
|
|
682
|
+
catch (err) {
|
|
683
|
+
console.warn(`[AutonomousRunner] Failed to sync blocked state for ${workItem.workItemId}:`, err);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
export async function syncSuccessState(workItem, confidence) {
|
|
687
|
+
if (!workItem.workItemId)
|
|
688
|
+
return;
|
|
689
|
+
const state = await markWorkItemDone(workItem.workItemId, {
|
|
690
|
+
workItemIdentifier: workItem.workItemIdentifier,
|
|
691
|
+
title: workItem.title,
|
|
692
|
+
confidence,
|
|
693
|
+
});
|
|
694
|
+
try {
|
|
695
|
+
await azdo.addComment(workItem.workItemId, buildWorkItemStateSyncComment(state, 'WorkItem completed'));
|
|
696
|
+
}
|
|
697
|
+
catch (err) {
|
|
698
|
+
console.warn(`[AutonomousRunner] Failed to sync success state for ${workItem.workItemId}:`, err);
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
//# sourceMappingURL=runnerExecution.js.map
|