@intrect/openswarm 0.17.1 → 0.17.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -5
- package/config.example.yaml +18 -0
- package/dist/adapters/agenticLoop.d.ts +2 -0
- package/dist/adapters/agenticLoop.d.ts.map +1 -1
- package/dist/adapters/agenticLoop.js +7 -4
- package/dist/adapters/agenticLoop.js.map +1 -1
- package/dist/adapters/base.d.ts.map +1 -1
- package/dist/adapters/base.js +9 -0
- package/dist/adapters/base.js.map +1 -1
- package/dist/adapters/claude.d.ts.map +1 -1
- package/dist/adapters/claude.js +6 -3
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +3 -2
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/codexResponses.d.ts +2 -1
- package/dist/adapters/codexResponses.d.ts.map +1 -1
- package/dist/adapters/codexResponses.js +35 -31
- package/dist/adapters/codexResponses.js.map +1 -1
- package/dist/adapters/errorClassification.d.ts +11 -0
- package/dist/adapters/errorClassification.d.ts.map +1 -1
- package/dist/adapters/errorClassification.js +22 -0
- package/dist/adapters/errorClassification.js.map +1 -1
- package/dist/adapters/gpt.d.ts.map +1 -1
- package/dist/adapters/gpt.js +2 -1
- package/dist/adapters/gpt.js.map +1 -1
- package/dist/adapters/local.d.ts.map +1 -1
- package/dist/adapters/local.js +2 -1
- package/dist/adapters/local.js.map +1 -1
- package/dist/adapters/openrouter.d.ts.map +1 -1
- package/dist/adapters/openrouter.js +2 -1
- package/dist/adapters/openrouter.js.map +1 -1
- package/dist/adapters/processRegistry.d.ts.map +1 -1
- package/dist/adapters/processRegistry.js +8 -0
- package/dist/adapters/processRegistry.js.map +1 -1
- package/dist/adapters/types.d.ts +2 -0
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/agents/pairPipeline.d.ts +10 -139
- package/dist/agents/pairPipeline.d.ts.map +1 -1
- package/dist/agents/pairPipeline.js +127 -35
- package/dist/agents/pairPipeline.js.map +1 -1
- package/dist/agents/pairPipelineTypes.d.ts +109 -0
- package/dist/agents/pairPipelineTypes.d.ts.map +1 -0
- package/dist/agents/pairPipelineTypes.js +2 -0
- package/dist/agents/pairPipelineTypes.js.map +1 -0
- package/dist/agents/pipelineGuards.d.ts.map +1 -1
- package/dist/agents/pipelineGuards.js +346 -0
- package/dist/agents/pipelineGuards.js.map +1 -1
- package/dist/agents/pipelineTaskPrefix.d.ts +3 -0
- package/dist/agents/pipelineTaskPrefix.d.ts.map +1 -0
- package/dist/agents/pipelineTaskPrefix.js +16 -0
- package/dist/agents/pipelineTaskPrefix.js.map +1 -0
- package/dist/agents/reflection.d.ts +1 -1
- package/dist/agents/reflection.d.ts.map +1 -1
- package/dist/agents/reflection.js +3 -1
- package/dist/agents/reflection.js.map +1 -1
- package/dist/agents/reviewer.d.ts +6 -0
- package/dist/agents/reviewer.d.ts.map +1 -1
- package/dist/agents/reviewer.js +4 -1
- package/dist/agents/reviewer.js.map +1 -1
- package/dist/agents/stageErrorClassification.d.ts +16 -0
- package/dist/agents/stageErrorClassification.d.ts.map +1 -0
- package/dist/agents/stageErrorClassification.js +38 -0
- package/dist/agents/stageErrorClassification.js.map +1 -0
- package/dist/agents/stageModelResolver.d.ts +8 -0
- package/dist/agents/stageModelResolver.d.ts.map +1 -0
- package/dist/agents/stageModelResolver.js +22 -0
- package/dist/agents/stageModelResolver.js.map +1 -0
- package/dist/agents/worker.d.ts +33 -0
- package/dist/agents/worker.d.ts.map +1 -1
- package/dist/agents/worker.js +62 -5
- package/dist/agents/worker.js.map +1 -1
- package/dist/agents/workerFanout.d.ts +38 -0
- package/dist/agents/workerFanout.d.ts.map +1 -0
- package/dist/agents/workerFanout.js +277 -0
- package/dist/agents/workerFanout.js.map +1 -0
- package/dist/agents/workerFanoutGate.d.ts +48 -0
- package/dist/agents/workerFanoutGate.d.ts.map +1 -0
- package/dist/agents/workerFanoutGate.js +146 -0
- package/dist/agents/workerFanoutGate.js.map +1 -0
- package/dist/agents/workerValidationEvidence.d.ts +5 -0
- package/dist/agents/workerValidationEvidence.d.ts.map +1 -0
- package/dist/agents/workerValidationEvidence.js +75 -0
- package/dist/agents/workerValidationEvidence.js.map +1 -0
- package/dist/auth/linearPkce.d.ts.map +1 -1
- package/dist/auth/linearPkce.js +1 -12
- package/dist/auth/linearPkce.js.map +1 -1
- package/dist/auth/oauthPkce.d.ts.map +1 -1
- package/dist/auth/oauthPkce.js +1 -14
- package/dist/auth/oauthPkce.js.map +1 -1
- package/dist/auth/oauthStore.d.ts.map +1 -1
- package/dist/auth/oauthStore.js +28 -2
- package/dist/auth/oauthStore.js.map +1 -1
- package/dist/auth/openBrowser.d.ts +2 -0
- package/dist/auth/openBrowser.d.ts.map +1 -0
- package/dist/auth/openBrowser.js +32 -0
- package/dist/auth/openBrowser.js.map +1 -0
- package/dist/auth/openrouterPkce.d.ts.map +1 -1
- package/dist/auth/openrouterPkce.js +1 -14
- package/dist/auth/openrouterPkce.js.map +1 -1
- package/dist/automation/autonomousRunner.d.ts +24 -6
- package/dist/automation/autonomousRunner.d.ts.map +1 -1
- package/dist/automation/autonomousRunner.js +242 -41
- package/dist/automation/autonomousRunner.js.map +1 -1
- package/dist/automation/backlogGrooming.d.ts +52 -0
- package/dist/automation/backlogGrooming.d.ts.map +1 -0
- package/dist/automation/backlogGrooming.js +231 -0
- package/dist/automation/backlogGrooming.js.map +1 -0
- package/dist/automation/runnerExecution.d.ts +1 -1
- package/dist/automation/runnerExecution.d.ts.map +1 -1
- package/dist/automation/runnerExecution.js +31 -9
- package/dist/automation/runnerExecution.js.map +1 -1
- package/dist/automation/runnerTypes.d.ts +3 -1
- package/dist/automation/runnerTypes.d.ts.map +1 -1
- package/dist/automation/taskSource.d.ts +6 -3
- package/dist/automation/taskSource.d.ts.map +1 -1
- package/dist/automation/taskSource.js +5 -0
- package/dist/automation/taskSource.js.map +1 -1
- package/dist/cli/daemon.d.ts +20 -3
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +42 -2
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/fixBoard.d.ts +14 -0
- package/dist/cli/fixBoard.d.ts.map +1 -0
- package/dist/cli/fixBoard.js +32 -0
- package/dist/cli/fixBoard.js.map +1 -0
- package/dist/cli/fixCommand.d.ts +8 -0
- package/dist/cli/fixCommand.d.ts.map +1 -1
- package/dist/cli/fixCommand.js +47 -8
- package/dist/cli/fixCommand.js.map +1 -1
- package/dist/cli/memoryCommand.d.ts +37 -0
- package/dist/cli/memoryCommand.d.ts.map +1 -0
- package/dist/cli/memoryCommand.js +156 -0
- package/dist/cli/memoryCommand.js.map +1 -0
- package/dist/cli/reviewAudit.d.ts +68 -0
- package/dist/cli/reviewAudit.d.ts.map +1 -1
- package/dist/cli/reviewAudit.js +147 -4
- package/dist/cli/reviewAudit.js.map +1 -1
- package/dist/cli/reviewMaxCommand.d.ts +2 -0
- package/dist/cli/reviewMaxCommand.d.ts.map +1 -1
- package/dist/cli/reviewMaxCommand.js +61 -33
- package/dist/cli/reviewMaxCommand.js.map +1 -1
- package/dist/cli.js +68 -13
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +413 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +51 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/eventHub.d.ts +22 -0
- package/dist/core/eventHub.d.ts.map +1 -1
- package/dist/core/eventHub.js +1 -0
- package/dist/core/eventHub.js.map +1 -1
- package/dist/core/providerOverride.d.ts +9 -0
- package/dist/core/providerOverride.d.ts.map +1 -1
- package/dist/core/providerOverride.js +12 -0
- package/dist/core/providerOverride.js.map +1 -1
- package/dist/core/service.d.ts.map +1 -1
- package/dist/core/service.js +8 -2
- package/dist/core/service.js.map +1 -1
- package/dist/core/types.d.ts +61 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/linear/linear.d.ts +2 -1
- package/dist/linear/linear.d.ts.map +1 -1
- package/dist/linear/linear.js +34 -12
- package/dist/linear/linear.js.map +1 -1
- package/dist/linear/projectUpdater.d.ts.map +1 -1
- package/dist/linear/projectUpdater.js +40 -13
- package/dist/linear/projectUpdater.js.map +1 -1
- package/dist/locale/prompts/en.d.ts.map +1 -1
- package/dist/locale/prompts/en.js +15 -5
- package/dist/locale/prompts/en.js.map +1 -1
- package/dist/locale/prompts/ko.d.ts.map +1 -1
- package/dist/locale/prompts/ko.js +15 -5
- package/dist/locale/prompts/ko.js.map +1 -1
- package/dist/mcp/mcpClient.d.ts.map +1 -1
- package/dist/mcp/mcpClient.js +85 -4
- package/dist/mcp/mcpClient.js.map +1 -1
- package/dist/memory/compaction.d.ts +2 -2
- package/dist/memory/compaction.d.ts.map +1 -1
- package/dist/memory/compaction.js +22 -17
- package/dist/memory/compaction.js.map +1 -1
- package/dist/memory/index.d.ts +3 -3
- package/dist/memory/index.js +3 -3
- package/dist/memory/memoryCore.d.ts +16 -27
- package/dist/memory/memoryCore.d.ts.map +1 -1
- package/dist/memory/memoryCore.js +160 -102
- package/dist/memory/memoryCore.js.map +1 -1
- package/dist/memory/memoryFilters.d.ts +8 -0
- package/dist/memory/memoryFilters.d.ts.map +1 -0
- package/dist/memory/memoryFilters.js +26 -0
- package/dist/memory/memoryFilters.js.map +1 -0
- package/dist/memory/memoryOps.d.ts +7 -23
- package/dist/memory/memoryOps.d.ts.map +1 -1
- package/dist/memory/memoryOps.js +54 -117
- package/dist/memory/memoryOps.js.map +1 -1
- package/dist/memory/repoKnowledge.d.ts.map +1 -1
- package/dist/memory/repoKnowledge.js +48 -3
- package/dist/memory/repoKnowledge.js.map +1 -1
- package/dist/notify/notifier.d.ts.map +1 -1
- package/dist/notify/notifier.js +23 -16
- package/dist/notify/notifier.js.map +1 -1
- package/dist/orchestration/conflictDetector.d.ts.map +1 -1
- package/dist/orchestration/conflictDetector.js +48 -12
- package/dist/orchestration/conflictDetector.js.map +1 -1
- package/dist/orchestration/taskParser.d.ts.map +1 -1
- package/dist/orchestration/taskParser.js +18 -7
- package/dist/orchestration/taskParser.js.map +1 -1
- package/dist/orchestration/taskScheduler.d.ts +5 -0
- package/dist/orchestration/taskScheduler.d.ts.map +1 -1
- package/dist/orchestration/taskScheduler.js +37 -12
- package/dist/orchestration/taskScheduler.js.map +1 -1
- package/dist/registry/bsDetector.d.ts.map +1 -1
- package/dist/registry/bsDetector.js +23 -3
- package/dist/registry/bsDetector.js.map +1 -1
- package/dist/registry/entityScanner.d.ts.map +1 -1
- package/dist/registry/entityScanner.js +10 -5
- package/dist/registry/entityScanner.js.map +1 -1
- package/dist/registry/graphql/resolvers.d.ts +1 -1
- package/dist/registry/graphql/resolvers.d.ts.map +1 -1
- package/dist/registry/graphql/resolvers.js +92 -15
- package/dist/registry/graphql/resolvers.js.map +1 -1
- package/dist/registry/memoryBridge.js +4 -4
- package/dist/registry/memoryBridge.js.map +1 -1
- package/dist/registry/sqliteStore.d.ts +1 -1
- package/dist/registry/sqliteStore.d.ts.map +1 -1
- package/dist/registry/sqliteStore.js +20 -5
- package/dist/registry/sqliteStore.js.map +1 -1
- package/dist/support/chatMemory.js +1 -1
- package/dist/support/chatMemory.js.map +1 -1
- package/dist/support/dashboardHtml.d.ts +1 -1
- package/dist/support/dashboardHtml.d.ts.map +1 -1
- package/dist/support/dashboardHtml.js +12 -0
- package/dist/support/dashboardHtml.js.map +1 -1
- package/dist/support/gitTracker.d.ts +30 -3
- package/dist/support/gitTracker.d.ts.map +1 -1
- package/dist/support/gitTracker.js +108 -29
- package/dist/support/gitTracker.js.map +1 -1
- package/dist/support/projectMapper.d.ts.map +1 -1
- package/dist/support/projectMapper.js +5 -0
- package/dist/support/projectMapper.js.map +1 -1
- package/dist/support/repoMetadata.d.ts +10 -0
- package/dist/support/repoMetadata.d.ts.map +1 -1
- package/dist/support/repoMetadata.js +31 -0
- package/dist/support/repoMetadata.js.map +1 -1
- package/dist/support/rollback.d.ts.map +1 -1
- package/dist/support/rollback.js +10 -3
- package/dist/support/rollback.js.map +1 -1
- package/dist/support/timeWindow.d.ts.map +1 -1
- package/dist/support/timeWindow.js +46 -40
- package/dist/support/timeWindow.js.map +1 -1
- package/dist/support/updateNotifier.d.ts +12 -0
- package/dist/support/updateNotifier.d.ts.map +1 -1
- package/dist/support/updateNotifier.js +71 -0
- package/dist/support/updateNotifier.js.map +1 -1
- package/dist/support/web.d.ts.map +1 -1
- package/dist/support/web.js +74 -8
- package/dist/support/web.js.map +1 -1
- package/dist/support/worktreeManager.d.ts +33 -0
- package/dist/support/worktreeManager.d.ts.map +1 -1
- package/dist/support/worktreeManager.js +172 -2
- package/dist/support/worktreeManager.js.map +1 -1
- package/dist/taskState/store.d.ts.map +1 -1
- package/dist/taskState/store.js +2 -3
- package/dist/taskState/store.js.map +1 -1
- package/dist/tui/App.js +1 -1
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/chatModel.d.ts +2 -4
- package/dist/tui/chatModel.d.ts.map +1 -1
- package/dist/tui/chatModel.js +5 -10
- package/dist/tui/chatModel.js.map +1 -1
- package/dist/tui/components/AuditBoard.d.ts +3 -2
- package/dist/tui/components/AuditBoard.d.ts.map +1 -1
- package/dist/tui/components/AuditBoard.js +13 -4
- package/dist/tui/components/AuditBoard.js.map +1 -1
- package/dist/tui/components/ChatInput.js +1 -1
- package/dist/tui/components/ChatLog.js +1 -1
- package/dist/tui/components/ChatLog.js.map +1 -1
- package/dist/tui/components/DataTable.d.ts +3 -1
- package/dist/tui/components/DataTable.d.ts.map +1 -1
- package/dist/tui/components/DataTable.js +22 -4
- package/dist/tui/components/DataTable.js.map +1 -1
- package/dist/tui/components/LiveLog.js +1 -1
- package/dist/tui/components/LiveLog.js.map +1 -1
- package/dist/tui/components/StageTimeline.d.ts +1 -1
- package/dist/tui/components/StageTimeline.d.ts.map +1 -1
- package/dist/tui/components/StageTimeline.js +6 -3
- package/dist/tui/components/StageTimeline.js.map +1 -1
- package/dist/tui/components/SubagentTree.d.ts +6 -6
- package/dist/tui/components/SubagentTree.d.ts.map +1 -1
- package/dist/tui/components/SubagentTree.js +39 -7
- package/dist/tui/components/SubagentTree.js.map +1 -1
- package/dist/tui/eventCoalescer.d.ts +29 -0
- package/dist/tui/eventCoalescer.d.ts.map +1 -0
- package/dist/tui/eventCoalescer.js +56 -0
- package/dist/tui/eventCoalescer.js.map +1 -0
- package/dist/tui/hooks/useMonitor.d.ts +3 -1
- package/dist/tui/hooks/useMonitor.d.ts.map +1 -1
- package/dist/tui/hooks/useMonitor.js +17 -1
- package/dist/tui/hooks/useMonitor.js.map +1 -1
- package/dist/tui/hooks/usePipelineEvents.d.ts +1 -1
- package/dist/tui/hooks/usePipelineEvents.d.ts.map +1 -1
- package/dist/tui/hooks/usePipelineEvents.js +18 -4
- package/dist/tui/hooks/usePipelineEvents.js.map +1 -1
- package/dist/tui/hooks/useTerminalSize.d.ts.map +1 -1
- package/dist/tui/hooks/useTerminalSize.js +3 -1
- package/dist/tui/hooks/useTerminalSize.js.map +1 -1
- package/dist/tui/monitorApi.d.ts +4 -4
- package/dist/tui/monitorApi.d.ts.map +1 -1
- package/dist/tui/monitorApi.js +13 -7
- package/dist/tui/monitorApi.js.map +1 -1
- package/dist/tui/monitorRows.d.ts +41 -2
- package/dist/tui/monitorRows.d.ts.map +1 -1
- package/dist/tui/monitorRows.js +86 -7
- package/dist/tui/monitorRows.js.map +1 -1
- package/dist/tui/panels/ChatPanel.d.ts.map +1 -1
- package/dist/tui/panels/ChatPanel.js +70 -15
- package/dist/tui/panels/ChatPanel.js.map +1 -1
- package/dist/tui/panels/MonitorPanel.d.ts +2 -1
- package/dist/tui/panels/MonitorPanel.d.ts.map +1 -1
- package/dist/tui/panels/MonitorPanel.js +2 -2
- package/dist/tui/panels/MonitorPanel.js.map +1 -1
- package/dist/tui/panels/PipelinePanel.d.ts.map +1 -1
- package/dist/tui/panels/PipelinePanel.js +6 -1
- package/dist/tui/panels/PipelinePanel.js.map +1 -1
- package/dist/tui/pipelineEvents.d.ts +14 -0
- package/dist/tui/pipelineEvents.d.ts.map +1 -1
- package/dist/tui/pipelineEvents.js +89 -1
- package/dist/tui/pipelineEvents.js.map +1 -1
- package/dist/tui/sse.d.ts.map +1 -1
- package/dist/tui/sse.js +29 -3
- package/dist/tui/sse.js.map +1 -1
- package/dist/tui/subagentTree.d.ts +26 -3
- package/dist/tui/subagentTree.d.ts.map +1 -1
- package/dist/tui/subagentTree.js +89 -14
- package/dist/tui/subagentTree.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
// ============================================
|
|
6
6
|
import { createServer } from 'node:http';
|
|
7
7
|
import { randomBytes, createHash } from 'node:crypto';
|
|
8
|
-
import { exec } from 'node:child_process';
|
|
9
8
|
import { AuthProfileStore } from './oauthStore.js';
|
|
9
|
+
import { openBrowser } from './openBrowser.js';
|
|
10
10
|
// ----- Constants -----
|
|
11
11
|
const OPENROUTER_AUTH_ENDPOINT = 'https://openrouter.ai/auth';
|
|
12
12
|
const OPENROUTER_KEYS_ENDPOINT = 'https://openrouter.ai/api/v1/auth/keys';
|
|
@@ -24,19 +24,6 @@ function generateCodeChallenge(verifier) {
|
|
|
24
24
|
function generateState() {
|
|
25
25
|
return randomBytes(32).toString('hex');
|
|
26
26
|
}
|
|
27
|
-
// ----- Browser open (cross-platform) -----
|
|
28
|
-
function openBrowser(url) {
|
|
29
|
-
const platform = process.platform;
|
|
30
|
-
const cmd = platform === 'darwin' ? 'open' :
|
|
31
|
-
platform === 'win32' ? 'start' :
|
|
32
|
-
'xdg-open';
|
|
33
|
-
exec(`${cmd} "${url}"`, (err) => {
|
|
34
|
-
if (err) {
|
|
35
|
-
console.error(`[Auth] 브라우저를 자동으로 열 수 없습니다. 직접 열어주세요:`);
|
|
36
|
-
console.error(url);
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
27
|
/**
|
|
41
28
|
* OpenRouter PKCE 흐름 실행.
|
|
42
29
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openrouterPkce.js","sourceRoot":"","sources":["../../src/auth/openrouterPkce.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,mCAAmC;AACnC,2DAA2D;AAC3D,2CAA2C;AAC3C,+CAA+C;AAE/C,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"openrouterPkce.js","sourceRoot":"","sources":["../../src/auth/openrouterPkce.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,13 @@ import type { AdapterName } from '../adapters/types.js';
|
|
|
4
4
|
export { setNotifier, setTaskSource } from './runnerExecution.js';
|
|
5
5
|
export type { AutonomousConfig, RunnerState } from './runnerTypes.js';
|
|
6
6
|
export type { ProjectInfo } from './runnerState.js';
|
|
7
|
+
export declare function decisionSelectionBudget(availableSlots: number, candidateCount: number): number;
|
|
7
8
|
export declare class AutonomousRunner {
|
|
8
9
|
private config;
|
|
9
10
|
private engine;
|
|
10
11
|
private scheduler;
|
|
12
|
+
/** Adapter default-model cache for the dashboard PAIR bar (INT-2393). */
|
|
13
|
+
private defaultModelCache;
|
|
11
14
|
private cronJob;
|
|
12
15
|
private state;
|
|
13
16
|
private _heartbeatRunning;
|
|
@@ -30,6 +33,9 @@ export declare class AutonomousRunner {
|
|
|
30
33
|
* untouched stays the legacy "run all allowed projects" fallback. (INT-2207)
|
|
31
34
|
*/
|
|
32
35
|
private shouldFilterByEnabled;
|
|
36
|
+
private sameProjectCandidateCap;
|
|
37
|
+
private currentProjectLoad;
|
|
38
|
+
private canQueueProjectCandidate;
|
|
33
39
|
/** Persist the project selection so it survives a restart. No-op under dryRun
|
|
34
40
|
* (tests) to avoid touching the real ~/.openswarm. (INT-2208) */
|
|
35
41
|
private persistSelection;
|
|
@@ -44,6 +50,7 @@ export declare class AutonomousRunner {
|
|
|
44
50
|
private static readonly MAX_RETRY_COUNT;
|
|
45
51
|
private rateLimitUntil;
|
|
46
52
|
private unresolvableIssueIds;
|
|
53
|
+
private lastBacklogGroomingAt;
|
|
47
54
|
private get taskStateRef();
|
|
48
55
|
private loadTaskState;
|
|
49
56
|
private saveTaskState;
|
|
@@ -72,8 +79,19 @@ export declare class AutonomousRunner {
|
|
|
72
79
|
private refreshKnowledgeGraphs;
|
|
73
80
|
/** Send system message to dashboard LIVE LOG */
|
|
74
81
|
private syslog;
|
|
82
|
+
private lastSkipSummary;
|
|
83
|
+
/**
|
|
84
|
+
* Log unmapped/disabled project skips as one aggregate line per category,
|
|
85
|
+
* and stay silent while the summary is identical to the previous heartbeat.
|
|
86
|
+
*/
|
|
87
|
+
private syslogSkipSummary;
|
|
88
|
+
private groupTasksForGrooming;
|
|
89
|
+
private maybeRunBacklogGrooming;
|
|
75
90
|
heartbeat(): Promise<void>;
|
|
76
91
|
private heartbeatParallel;
|
|
92
|
+
private resolveRunnableCandidates;
|
|
93
|
+
private detectSafeCandidateIds;
|
|
94
|
+
private enqueueCandidate;
|
|
77
95
|
/** Execute task in pair mode */
|
|
78
96
|
private executeTaskPairMode;
|
|
79
97
|
private getExecCtx;
|
|
@@ -104,29 +122,29 @@ export declare class AutonomousRunner {
|
|
|
104
122
|
};
|
|
105
123
|
getTurboMode(): boolean;
|
|
106
124
|
setTurboMode(enabled: boolean): void;
|
|
107
|
-
getAdapterSummary(): {
|
|
125
|
+
getAdapterSummary(): Promise<{
|
|
108
126
|
defaultAdapter: "codex" | "local" | "codex-responses" | "gpt" | "lmstudio" | "openrouter" | "claude";
|
|
109
127
|
worker: {
|
|
110
|
-
adapter: "
|
|
128
|
+
adapter: import("../core/types.js").AgentAdapterName;
|
|
111
129
|
model: string | undefined;
|
|
112
130
|
enabled: boolean;
|
|
113
131
|
};
|
|
114
132
|
reviewer: {
|
|
115
|
-
adapter: "
|
|
133
|
+
adapter: import("../core/types.js").AgentAdapterName;
|
|
116
134
|
model: string | undefined;
|
|
117
135
|
enabled: boolean;
|
|
118
136
|
};
|
|
119
137
|
tester: {
|
|
120
|
-
adapter: "
|
|
138
|
+
adapter: import("../core/types.js").AgentAdapterName;
|
|
121
139
|
model: string | undefined;
|
|
122
140
|
enabled: boolean;
|
|
123
141
|
} | undefined;
|
|
124
142
|
documenter: {
|
|
125
|
-
adapter: "
|
|
143
|
+
adapter: import("../core/types.js").AgentAdapterName;
|
|
126
144
|
model: string | undefined;
|
|
127
145
|
enabled: boolean;
|
|
128
146
|
} | undefined;
|
|
129
|
-
}
|
|
147
|
+
}>;
|
|
130
148
|
switchProvider(adapter: AdapterName): void;
|
|
131
149
|
pauseScheduler(): void;
|
|
132
150
|
resumeScheduler(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autonomousRunner.d.ts","sourceRoot":"","sources":["../../src/automation/autonomousRunner.ts"],"names":[],"mappings":"AAGA,OAAO,EAkBL,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"autonomousRunner.d.ts","sourceRoot":"","sources":["../../src/automation/autonomousRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { getDecisionEngine, classifyStuck, } from '../orchestration/decisionEngi
|
|
|
7
7
|
import { checkWorkAllowed } from '../support/timeWindow.js';
|
|
8
8
|
import { recordTaskOutcome } from '../memory/repoKnowledge.js';
|
|
9
9
|
import { updateProjectAfterTask } from '../linear/projectUpdater.js';
|
|
10
|
-
import { initScheduler } from '../orchestration/taskScheduler.js';
|
|
10
|
+
import { initScheduler, normalizeProjectPath } from '../orchestration/taskScheduler.js';
|
|
11
11
|
import { formatPipelineResultEmbed, } from '../agents/pairPipeline.js';
|
|
12
12
|
import * as planner from '../support/planner.js';
|
|
13
13
|
import * as execution from './runnerExecution.js';
|
|
@@ -22,13 +22,25 @@ import { STUCK_LABEL } from '../linear/index.js';
|
|
|
22
22
|
import { refreshGraph, toProjectSlug } from '../knowledge/index.js';
|
|
23
23
|
import { checkAllMonitors, getActiveMonitors } from './longRunningMonitor.js';
|
|
24
24
|
import { detectFileConflicts } from '../orchestration/conflictDetector.js';
|
|
25
|
+
import { resolveAdapterDefaultModel } from '../agents/stageModelResolver.js';
|
|
26
|
+
import { applyBacklogGrooming, filterGroomableTasks, runBacklogGroomingPlanner, summarizeGroomingDecision, } from './backlogGrooming.js';
|
|
25
27
|
// Re-export types and integration setters (used by service.ts)
|
|
26
28
|
export { setNotifier, setTaskSource } from './runnerExecution.js';
|
|
27
29
|
let runnerInstance = null;
|
|
30
|
+
const DECISION_SELECTION_OVERSAMPLE = 3;
|
|
31
|
+
export function decisionSelectionBudget(availableSlots, candidateCount) {
|
|
32
|
+
const slots = Math.max(0, Math.floor(availableSlots));
|
|
33
|
+
const candidates = Math.max(0, Math.floor(candidateCount));
|
|
34
|
+
if (slots === 0 || candidates === 0)
|
|
35
|
+
return 0;
|
|
36
|
+
return Math.min(candidates, Math.max(slots, slots * DECISION_SELECTION_OVERSAMPLE));
|
|
37
|
+
}
|
|
28
38
|
export class AutonomousRunner {
|
|
29
39
|
config;
|
|
30
40
|
engine;
|
|
31
41
|
scheduler;
|
|
42
|
+
/** Adapter default-model cache for the dashboard PAIR bar (INT-2393). */
|
|
43
|
+
defaultModelCache = new Map();
|
|
32
44
|
cronJob = null;
|
|
33
45
|
state = {
|
|
34
46
|
isRunning: false,
|
|
@@ -80,6 +92,30 @@ export class AutonomousRunner {
|
|
|
80
92
|
shouldFilterByEnabled() {
|
|
81
93
|
return this.projectSelectionTouched || this.enabledProjects.size > 0;
|
|
82
94
|
}
|
|
95
|
+
sameProjectCandidateCap() {
|
|
96
|
+
const sameProjectParallel = (this.config.allowSameProjectConcurrent ?? true) && (this.config.worktreeMode ?? false);
|
|
97
|
+
if (!sameProjectParallel || this.config.maxConcurrentPerProject == null)
|
|
98
|
+
return null;
|
|
99
|
+
const cap = Math.floor(this.config.maxConcurrentPerProject);
|
|
100
|
+
const maxConcurrent = this.config.maxConcurrentTasks ?? 1;
|
|
101
|
+
return Math.max(1, Math.min(cap, maxConcurrent));
|
|
102
|
+
}
|
|
103
|
+
currentProjectLoad(projectPath) {
|
|
104
|
+
const target = normalizeProjectPath(projectPath);
|
|
105
|
+
const queued = this.scheduler.getQueuedTasks()
|
|
106
|
+
.filter(task => normalizeProjectPath(task.projectPath) === target)
|
|
107
|
+
.length;
|
|
108
|
+
const running = this.scheduler.getRunningTasks()
|
|
109
|
+
.filter(task => normalizeProjectPath(task.projectPath) === target)
|
|
110
|
+
.length;
|
|
111
|
+
return queued + running;
|
|
112
|
+
}
|
|
113
|
+
canQueueProjectCandidate(projectPath) {
|
|
114
|
+
const cap = this.sameProjectCandidateCap();
|
|
115
|
+
if (cap == null)
|
|
116
|
+
return true;
|
|
117
|
+
return this.currentProjectLoad(projectPath) < cap;
|
|
118
|
+
}
|
|
83
119
|
/** Persist the project selection so it survives a restart. No-op under dryRun
|
|
84
120
|
* (tests) to avoid touching the real ~/.openswarm. (INT-2208) */
|
|
85
121
|
persistSelection() {
|
|
@@ -107,6 +143,7 @@ export class AutonomousRunner {
|
|
|
107
143
|
// the first resolve failure so they aren't re-picked every heartbeat (which
|
|
108
144
|
// starved other actionable tasks — they were top-priority but never runnable). (INT-1875)
|
|
109
145
|
unresolvableIssueIds = new Set();
|
|
146
|
+
lastBacklogGroomingAt = 0;
|
|
110
147
|
get taskStateRef() {
|
|
111
148
|
return {
|
|
112
149
|
completedTaskIds: this.completedTaskIds,
|
|
@@ -158,6 +195,7 @@ export class AutonomousRunner {
|
|
|
158
195
|
this.scheduler = initScheduler({
|
|
159
196
|
maxConcurrent: config.maxConcurrentTasks ?? 1,
|
|
160
197
|
allowSameProjectConcurrent: config.allowSameProjectConcurrent ?? true,
|
|
198
|
+
maxConcurrentPerProject: config.maxConcurrentPerProject,
|
|
161
199
|
worktreeMode: config.worktreeMode ?? false,
|
|
162
200
|
});
|
|
163
201
|
// Set up scheduler event handling
|
|
@@ -630,6 +668,112 @@ export class AutonomousRunner {
|
|
|
630
668
|
console.log(`[HB] ${line}`);
|
|
631
669
|
broadcastEvent({ type: 'log', data: { taskId: 'system', stage: 'heartbeat', line } });
|
|
632
670
|
}
|
|
671
|
+
lastSkipSummary = '';
|
|
672
|
+
/**
|
|
673
|
+
* Log unmapped/disabled project skips as one aggregate line per category,
|
|
674
|
+
* and stay silent while the summary is identical to the previous heartbeat.
|
|
675
|
+
*/
|
|
676
|
+
syslogSkipSummary(unmapped, disabled) {
|
|
677
|
+
const fmt = (m) => [...m.entries()]
|
|
678
|
+
.sort((a, b) => b[1] - a[1])
|
|
679
|
+
.map(([name, n]) => `${name} (${n})`)
|
|
680
|
+
.join(', ');
|
|
681
|
+
const total = (m) => [...m.values()].reduce((a, b) => a + b, 0);
|
|
682
|
+
const lines = [];
|
|
683
|
+
if (unmapped.size > 0) {
|
|
684
|
+
lines.push(` ⚠ Skipped ${total(unmapped)} issue(s) in ${unmapped.size} unmapped project(s): ${fmt(unmapped)} — run \`openswarm add\` to map`);
|
|
685
|
+
}
|
|
686
|
+
if (disabled.size > 0) {
|
|
687
|
+
lines.push(` ⚠ Skipped ${total(disabled)} issue(s) in ${disabled.size} disabled project(s): ${fmt(disabled)}`);
|
|
688
|
+
}
|
|
689
|
+
const summary = lines.join('\n');
|
|
690
|
+
if (summary === this.lastSkipSummary)
|
|
691
|
+
return;
|
|
692
|
+
this.lastSkipSummary = summary;
|
|
693
|
+
for (const line of lines)
|
|
694
|
+
this.syslog(line);
|
|
695
|
+
}
|
|
696
|
+
async groupTasksForGrooming(tasks) {
|
|
697
|
+
const byProjectId = new Map();
|
|
698
|
+
for (const repoPath of this.config.allowedProjects) {
|
|
699
|
+
try {
|
|
700
|
+
const resolvedPath = repoPath.replace('~', process.env.HOME || '');
|
|
701
|
+
const meta = await loadRepoMetadata(resolvedPath);
|
|
702
|
+
if (meta?.linear?.projectId)
|
|
703
|
+
byProjectId.set(meta.linear.projectId, resolvedPath);
|
|
704
|
+
}
|
|
705
|
+
catch {
|
|
706
|
+
// Grooming is advisory; unreadable metadata should not block normal work.
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
const groups = new Map();
|
|
710
|
+
for (const task of tasks) {
|
|
711
|
+
const projectPath = task.projectPath
|
|
712
|
+
?? (task.linearProject?.id ? byProjectId.get(task.linearProject.id) : undefined)
|
|
713
|
+
?? undefined;
|
|
714
|
+
if (!projectPath)
|
|
715
|
+
continue;
|
|
716
|
+
const list = groups.get(projectPath) ?? [];
|
|
717
|
+
list.push(task);
|
|
718
|
+
groups.set(projectPath, list);
|
|
719
|
+
}
|
|
720
|
+
return groups;
|
|
721
|
+
}
|
|
722
|
+
async maybeRunBacklogGrooming(tasks) {
|
|
723
|
+
const cfg = this.config.backlogGrooming;
|
|
724
|
+
if (!cfg?.enabled)
|
|
725
|
+
return tasks;
|
|
726
|
+
const cadenceMs = Math.max(1, cfg.cadenceHours ?? 24) * 60 * 60 * 1000;
|
|
727
|
+
const now = Date.now();
|
|
728
|
+
if (this.lastBacklogGroomingAt && now - this.lastBacklogGroomingAt < cadenceMs)
|
|
729
|
+
return tasks;
|
|
730
|
+
const source = getTaskSource();
|
|
731
|
+
if (!source) {
|
|
732
|
+
this.syslog('⚠ Backlog grooming skipped: no task source');
|
|
733
|
+
return tasks;
|
|
734
|
+
}
|
|
735
|
+
const groomable = filterGroomableTasks(tasks);
|
|
736
|
+
if (groomable.length === 0)
|
|
737
|
+
return tasks;
|
|
738
|
+
const mode = cfg.mode ?? 'comment';
|
|
739
|
+
const moved = new Set();
|
|
740
|
+
const groups = await this.groupTasksForGrooming(groomable);
|
|
741
|
+
if (groups.size === 0) {
|
|
742
|
+
this.syslog('⚠ Backlog grooming skipped: no mapped project paths');
|
|
743
|
+
return tasks;
|
|
744
|
+
}
|
|
745
|
+
let successfulPlannerRuns = 0;
|
|
746
|
+
for (const [projectPath, groupTasks] of groups) {
|
|
747
|
+
this.syslog(`⟳ Backlog grooming: ${groupTasks.length} issue(s) in ${projectPath.split('/').pop()}`);
|
|
748
|
+
const result = await runBacklogGroomingPlanner({
|
|
749
|
+
tasks: groupTasks,
|
|
750
|
+
projectPath,
|
|
751
|
+
projectName: groupTasks[0]?.linearProject?.name,
|
|
752
|
+
model: cfg.plannerModel ?? this.config.plannerModel,
|
|
753
|
+
timeoutMs: cfg.plannerTimeoutMs ?? this.config.plannerTimeoutMs,
|
|
754
|
+
maxIssues: cfg.maxIssues,
|
|
755
|
+
onLog: (line) => broadcastEvent({ type: 'log', data: { taskId: 'system', stage: 'groom', line } }),
|
|
756
|
+
});
|
|
757
|
+
if (!result.success) {
|
|
758
|
+
this.syslog(`⚠ Backlog grooming failed: ${result.error ?? 'unknown error'}`);
|
|
759
|
+
continue;
|
|
760
|
+
}
|
|
761
|
+
successfulPlannerRuns++;
|
|
762
|
+
const validIssueIds = new Set(groupTasks.map(task => task.issueId || task.id));
|
|
763
|
+
const applied = await applyBacklogGrooming(source, result, mode, validIssueIds);
|
|
764
|
+
for (const issueId of applied.movedIssueIds)
|
|
765
|
+
moved.add(issueId);
|
|
766
|
+
this.syslog(`✓ Backlog grooming: ${result.decisions.length} decision(s), ${applied.commented} comment(s), ${applied.failedComments} comment failure(s), ${applied.updatedDescriptions} description update(s), ${applied.moved} moved, ${applied.skippedUnknown} unknown skipped`);
|
|
767
|
+
for (const decision of result.decisions.slice(0, 5)) {
|
|
768
|
+
this.syslog(` ${summarizeGroomingDecision(decision)}`);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
if (successfulPlannerRuns > 0)
|
|
772
|
+
this.lastBacklogGroomingAt = now;
|
|
773
|
+
if (moved.size === 0)
|
|
774
|
+
return tasks;
|
|
775
|
+
return tasks.filter(task => !moved.has(task.issueId || task.id));
|
|
776
|
+
}
|
|
633
777
|
async heartbeat() {
|
|
634
778
|
if (this._heartbeatRunning) {
|
|
635
779
|
console.log('[AutonomousRunner] Heartbeat already running, skipping');
|
|
@@ -696,13 +840,19 @@ export class AutonomousRunner {
|
|
|
696
840
|
await reportToDiscord(`⚠️ Linear fetch failed: ${fetchResult.error}`);
|
|
697
841
|
return;
|
|
698
842
|
}
|
|
699
|
-
|
|
843
|
+
let tasks = fetchResult.tasks;
|
|
700
844
|
if (tasks.length === 0) {
|
|
701
845
|
this.syslog('— No tasks in backlog');
|
|
702
846
|
return;
|
|
703
847
|
}
|
|
704
848
|
this.lastFetchedTasks = tasks;
|
|
705
849
|
this.syslog(`✓ Found ${tasks.length} tasks from Linear`);
|
|
850
|
+
tasks = await this.maybeRunBacklogGrooming(tasks);
|
|
851
|
+
this.lastFetchedTasks = tasks;
|
|
852
|
+
if (tasks.length === 0) {
|
|
853
|
+
this.syslog('— No executable tasks after backlog grooming');
|
|
854
|
+
return;
|
|
855
|
+
}
|
|
706
856
|
// Filter out completed and over-retried tasks
|
|
707
857
|
const filteredTasks = this.filterAlreadyProcessed(tasks);
|
|
708
858
|
if (filteredTasks.length === 0) {
|
|
@@ -777,6 +927,10 @@ export class AutonomousRunner {
|
|
|
777
927
|
this.syslog(` ⚠ openswarm.json unreadable for ${repoPath.split('/').pop()}: ${e.message}`);
|
|
778
928
|
}
|
|
779
929
|
}
|
|
930
|
+
// Aggregate skip reasons per project instead of logging one line per issue —
|
|
931
|
+
// dozens of unmapped issues used to flood the LIVE LOG every heartbeat.
|
|
932
|
+
const skippedUnmapped = new Map();
|
|
933
|
+
const skippedDisabled = new Map();
|
|
780
934
|
tasksForEngine = executableTasks.filter(task => {
|
|
781
935
|
const projName = task.linearProject?.name;
|
|
782
936
|
const projId = task.linearProject?.id;
|
|
@@ -788,15 +942,17 @@ export class AutonomousRunner {
|
|
|
788
942
|
?? this.projectPathCache.get(projName.toLowerCase())
|
|
789
943
|
?? this.projectPathCache.get(projName.replace(/-/g, ' '))));
|
|
790
944
|
if (!cachedPath) {
|
|
791
|
-
|
|
945
|
+
const key = projName ?? projId ?? 'unknown';
|
|
946
|
+
skippedUnmapped.set(key, (skippedUnmapped.get(key) ?? 0) + 1);
|
|
792
947
|
return false;
|
|
793
948
|
}
|
|
794
949
|
const enabled = this.isProjectEnabled(cachedPath);
|
|
795
950
|
if (!enabled) {
|
|
796
|
-
|
|
951
|
+
skippedDisabled.set(projName ?? cachedPath, (skippedDisabled.get(projName ?? cachedPath) ?? 0) + 1);
|
|
797
952
|
}
|
|
798
953
|
return enabled;
|
|
799
954
|
});
|
|
955
|
+
this.syslogSkipSummary(skippedUnmapped, skippedDisabled);
|
|
800
956
|
if (tasksForEngine.length === 0) {
|
|
801
957
|
this.syslog(`⚠ No enabled tasks (${executableTasks.length} executable, ${tasks.length - executableTasks.length} backlog)`);
|
|
802
958
|
this.syslog(` Path cache: [${[...this.projectPathCache.entries()].map(([k, v]) => `${k}→${v}`).join(', ')}]`);
|
|
@@ -805,20 +961,67 @@ export class AutonomousRunner {
|
|
|
805
961
|
}
|
|
806
962
|
this.syslog(` Tasks: ${tasksForEngine.length} enabled-or-uncached / ${executableTasks.length} executable / ${tasks.length} total`);
|
|
807
963
|
}
|
|
808
|
-
// Get validated task list from DecisionEngine
|
|
809
|
-
this.syslog('⟳ Decision Engine evaluating tasks...');
|
|
810
|
-
const decision = await this.engine.heartbeatMultiple(tasksForEngine, maxSlots, [] // No project exclusion — worktree mode isolates each task
|
|
811
|
-
);
|
|
812
|
-
console.log(`[AutonomousRunner] Decision: ${decision.action} — ${decision.reason} (${decision.tasks?.length ?? 0} tasks)`);
|
|
813
|
-
if (decision.action === 'skip' || decision.action === 'defer') {
|
|
814
|
-
this.syslog(`→ Decision: ${decision.action} — ${decision.reason}`);
|
|
815
|
-
return;
|
|
816
|
-
}
|
|
817
|
-
// Add validated tasks to queue (with conflict detection)
|
|
818
964
|
let enqueuedCount = 0;
|
|
819
|
-
|
|
965
|
+
let skippedCount = 0;
|
|
966
|
+
const consideredTaskIds = new Set();
|
|
967
|
+
let pass = 0;
|
|
968
|
+
while (enqueuedCount < maxSlots) {
|
|
969
|
+
const remainingSlots = maxSlots - enqueuedCount;
|
|
970
|
+
const selectableTasks = tasksForEngine.filter(task => !consideredTaskIds.has(task.id));
|
|
971
|
+
const selectionBudget = decisionSelectionBudget(remainingSlots, selectableTasks.length);
|
|
972
|
+
if (selectionBudget === 0)
|
|
973
|
+
break;
|
|
974
|
+
this.syslog(pass === 0
|
|
975
|
+
? '⟳ Decision Engine evaluating tasks...'
|
|
976
|
+
: `⟳ Backfill pass (${remainingSlots} slot(s) open)...`);
|
|
977
|
+
const decision = await this.engine.heartbeatMultiple(selectableTasks, selectionBudget, [] // No project exclusion — worktree mode isolates each task
|
|
978
|
+
);
|
|
979
|
+
console.log(`[AutonomousRunner] Decision: ${decision.action} — ${decision.reason} (${decision.tasks?.length ?? 0} tasks)`);
|
|
980
|
+
skippedCount += decision.skippedCount ?? 0;
|
|
981
|
+
if (decision.action === 'skip' || decision.action === 'defer') {
|
|
982
|
+
this.syslog(`→ Decision: ${decision.action} — ${decision.reason}`);
|
|
983
|
+
break;
|
|
984
|
+
}
|
|
985
|
+
for (const { task } of decision.tasks) {
|
|
986
|
+
consideredTaskIds.add(task.id);
|
|
987
|
+
}
|
|
988
|
+
const candidates = await this.resolveRunnableCandidates(decision.tasks);
|
|
989
|
+
const safeTasks = await this.detectSafeCandidateIds(candidates);
|
|
990
|
+
const before = enqueuedCount;
|
|
991
|
+
for (const { task, projectPath } of candidates) {
|
|
992
|
+
if (enqueuedCount >= maxSlots)
|
|
993
|
+
break;
|
|
994
|
+
if (!safeTasks.has(task.id))
|
|
995
|
+
continue;
|
|
996
|
+
if (!this.canQueueProjectCandidate(projectPath)) {
|
|
997
|
+
this.syslog(` Project cap reached: ${projectPath}`);
|
|
998
|
+
continue;
|
|
999
|
+
}
|
|
1000
|
+
this.enqueueCandidate(task, projectPath);
|
|
1001
|
+
enqueuedCount++;
|
|
1002
|
+
}
|
|
1003
|
+
pass++;
|
|
1004
|
+
if (enqueuedCount >= maxSlots)
|
|
1005
|
+
break;
|
|
1006
|
+
if (decision.tasks.length === 0)
|
|
1007
|
+
break;
|
|
1008
|
+
if (selectionBudget >= selectableTasks.length)
|
|
1009
|
+
break;
|
|
1010
|
+
if (enqueuedCount === before)
|
|
1011
|
+
continue;
|
|
1012
|
+
}
|
|
1013
|
+
if (enqueuedCount === 0 && skippedCount > 0) {
|
|
1014
|
+
this.syslog(`— No new tasks queued (skipped: ${skippedCount})`);
|
|
1015
|
+
}
|
|
1016
|
+
else {
|
|
1017
|
+
this.syslog(`✓ Enqueued ${enqueuedCount} task(s) | skipped: ${skippedCount}`);
|
|
1018
|
+
}
|
|
1019
|
+
// Execute tasks
|
|
1020
|
+
await this.runAvailableTasks();
|
|
1021
|
+
}
|
|
1022
|
+
async resolveRunnableCandidates(decisionTasks) {
|
|
820
1023
|
const candidates = [];
|
|
821
|
-
for (const { task } of
|
|
1024
|
+
for (const { task } of decisionTasks) {
|
|
822
1025
|
if (this.scheduler.isTaskQueued(task.id) || this.scheduler.isTaskRunning(task.id)) {
|
|
823
1026
|
this.syslog(` Skip (already queued/running): ${task.issueIdentifier || task.id.slice(0, 8)} ${task.title}`);
|
|
824
1027
|
continue;
|
|
@@ -846,6 +1049,9 @@ export class AutonomousRunner {
|
|
|
846
1049
|
// rate limiter only. Completions are still recorded for cost telemetry.
|
|
847
1050
|
candidates.push({ task, projectPath });
|
|
848
1051
|
}
|
|
1052
|
+
return candidates;
|
|
1053
|
+
}
|
|
1054
|
+
async detectSafeCandidateIds(candidates) {
|
|
849
1055
|
// Group candidates by projectPath for conflict detection
|
|
850
1056
|
const byProject = new Map();
|
|
851
1057
|
for (const c of candidates) {
|
|
@@ -885,27 +1091,16 @@ export class AutonomousRunner {
|
|
|
885
1091
|
safeTasks.add(c.task.id);
|
|
886
1092
|
}
|
|
887
1093
|
}
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
if (task.issueId) {
|
|
898
|
-
getTaskSource()?.updateState(task.issueId, 'In Progress').catch((err) => console.warn(`[AutonomousRunner] Failed to claim issue ${task.issueIdentifier}:`, err));
|
|
899
|
-
}
|
|
900
|
-
}
|
|
901
|
-
if (enqueuedCount === 0 && decision.skippedCount > 0) {
|
|
902
|
-
this.syslog(`— No new tasks queued (skipped: ${decision.skippedCount})`);
|
|
903
|
-
}
|
|
904
|
-
else {
|
|
905
|
-
this.syslog(`✓ Enqueued ${enqueuedCount} task(s) | skipped: ${decision.skippedCount}`);
|
|
1094
|
+
return safeTasks;
|
|
1095
|
+
}
|
|
1096
|
+
enqueueCandidate(task, projectPath) {
|
|
1097
|
+
this.scheduler.enqueue(task, projectPath);
|
|
1098
|
+
broadcastEvent({ type: 'task:queued', data: { taskId: task.id, title: task.title, projectPath, issueIdentifier: task.issueIdentifier } });
|
|
1099
|
+
this.syslog(`✓ Queued: ${task.issueIdentifier || ''} ${task.title} → ${projectPath.split('/').slice(-2).join('/')}`);
|
|
1100
|
+
// Claim the task immediately: set Linear to 'In Progress' so restarts don't re-queue it
|
|
1101
|
+
if (task.issueId) {
|
|
1102
|
+
getTaskSource()?.updateState(task.issueId, 'In Progress').catch((err) => console.warn(`[AutonomousRunner] Failed to claim issue ${task.issueIdentifier}:`, err));
|
|
906
1103
|
}
|
|
907
|
-
// Execute tasks
|
|
908
|
-
await this.runAvailableTasks();
|
|
909
1104
|
}
|
|
910
1105
|
/** Execute task in pair mode */
|
|
911
1106
|
async executeTaskPairMode(task) {
|
|
@@ -1115,19 +1310,25 @@ export class AutonomousRunner {
|
|
|
1115
1310
|
broadcastEvent({ type: 'log', data: { taskId: 'system', stage: 'turbo', line: 'TURBO OFF — normal pace resumed' } });
|
|
1116
1311
|
}
|
|
1117
1312
|
}
|
|
1118
|
-
getAdapterSummary() {
|
|
1313
|
+
async getAdapterSummary() {
|
|
1119
1314
|
const defaultAdapter = this.config.defaultAdapter ?? 'codex';
|
|
1120
1315
|
const defaultRoles = this.config.defaultRoles;
|
|
1316
|
+
const workerAdapter = defaultRoles?.worker?.adapter ?? defaultAdapter;
|
|
1317
|
+
const reviewerAdapter = defaultRoles?.reviewer?.adapter ?? defaultAdapter;
|
|
1121
1318
|
return {
|
|
1122
1319
|
defaultAdapter,
|
|
1123
1320
|
worker: {
|
|
1124
|
-
adapter:
|
|
1125
|
-
|
|
1321
|
+
adapter: workerAdapter,
|
|
1322
|
+
// Resolve the adapter's real default when config omits the model, so the
|
|
1323
|
+
// dashboard's PAIR bar shows what's running instead of "-". (INT-2393)
|
|
1324
|
+
model: defaultRoles?.worker?.model ?? this.config.workerModel
|
|
1325
|
+
?? await resolveAdapterDefaultModel(workerAdapter, this.defaultModelCache),
|
|
1126
1326
|
enabled: defaultRoles?.worker?.enabled !== false,
|
|
1127
1327
|
},
|
|
1128
1328
|
reviewer: {
|
|
1129
|
-
adapter:
|
|
1130
|
-
model: defaultRoles?.reviewer?.model ?? this.config.reviewerModel
|
|
1329
|
+
adapter: reviewerAdapter,
|
|
1330
|
+
model: defaultRoles?.reviewer?.model ?? this.config.reviewerModel
|
|
1331
|
+
?? await resolveAdapterDefaultModel(reviewerAdapter, this.defaultModelCache),
|
|
1131
1332
|
enabled: defaultRoles?.reviewer?.enabled !== false,
|
|
1132
1333
|
},
|
|
1133
1334
|
tester: defaultRoles?.tester ? {
|