@intrect/openswarm 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +544 -0
- package/config.example.yaml +107 -0
- package/dist/adapters/base.d.ts +8 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +104 -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/index.d.ts +17 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +47 -0
- package/dist/adapters/index.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/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/types.d.ts +65 -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 +210 -0
- package/dist/agents/agentPair.d.ts.map +1 -0
- package/dist/agents/agentPair.js +420 -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 +237 -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 +285 -0
- package/dist/agents/documenter.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 +231 -0
- package/dist/agents/pairMetrics.js.map +1 -0
- package/dist/agents/pairPipeline.d.ts +155 -0
- package/dist/agents/pairPipeline.d.ts.map +1 -0
- package/dist/agents/pairPipeline.js +793 -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 +11 -0
- package/dist/agents/pipelineFormat.d.ts.map +1 -0
- package/dist/agents/pipelineFormat.js +164 -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 +175 -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 +213 -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 +218 -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 +308 -0
- package/dist/agents/tester.js.map +1 -0
- package/dist/agents/worker.d.ts +30 -0
- package/dist/agents/worker.d.ts.map +1 -0
- package/dist/agents/worker.js +128 -0
- package/dist/agents/worker.js.map +1 -0
- package/dist/automation/autonomousRunner.d.ts +123 -0
- package/dist/automation/autonomousRunner.d.ts.map +1 -0
- package/dist/automation/autonomousRunner.js +1082 -0
- package/dist/automation/autonomousRunner.js.map +1 -0
- package/dist/automation/ciWorker.d.ts +51 -0
- package/dist/automation/ciWorker.d.ts.map +1 -0
- package/dist/automation/ciWorker.js +282 -0
- package/dist/automation/ciWorker.js.map +1 -0
- package/dist/automation/conflictResolver.d.ts +29 -0
- package/dist/automation/conflictResolver.d.ts.map +1 -0
- package/dist/automation/conflictResolver.js +261 -0
- package/dist/automation/conflictResolver.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 +132 -0
- package/dist/automation/dailyReporter.js.map +1 -0
- package/dist/automation/index.d.ts +7 -0
- package/dist/automation/index.d.ts.map +1 -0
- package/dist/automation/index.js +7 -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 +231 -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/prProcessor.d.ts +62 -0
- package/dist/automation/prProcessor.d.ts.map +1 -0
- package/dist/automation/prProcessor.js +700 -0
- package/dist/automation/prProcessor.js.map +1 -0
- package/dist/automation/runnerExecution.d.ts +49 -0
- package/dist/automation/runnerExecution.d.ts.map +1 -0
- package/dist/automation/runnerExecution.js +663 -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 +495 -0
- package/dist/automation/runnerState.js.map +1 -0
- package/dist/automation/runnerTypes.d.ts +46 -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 +394 -0
- package/dist/automation/scheduler.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 +189 -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 +138 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config.d.ts +308 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +529 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/eventHub.d.ts +194 -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 +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/service.d.ts +27 -0
- package/dist/core/service.d.ts.map +1 -0
- package/dist/core/service.js +438 -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 +413 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/discord/discordCore.d.ts +104 -0
- package/dist/discord/discordCore.d.ts.map +1 -0
- package/dist/discord/discordCore.js +698 -0
- package/dist/discord/discordCore.js.map +1 -0
- package/dist/discord/discordHandlers.d.ts +86 -0
- package/dist/discord/discordHandlers.d.ts.map +1 -0
- package/dist/discord/discordHandlers.js +849 -0
- package/dist/discord/discordHandlers.js.map +1 -0
- package/dist/discord/discordPair.d.ts +6 -0
- package/dist/discord/discordPair.d.ts.map +1 -0
- package/dist/discord/discordPair.js +567 -0
- package/dist/discord/discordPair.js.map +1 -0
- package/dist/discord/index.d.ts +4 -0
- package/dist/discord/index.d.ts.map +1 -0
- package/dist/discord/index.js +11 -0
- package/dist/discord/index.js.map +1 -0
- package/dist/github/github.d.ts +236 -0
- package/dist/github/github.d.ts.map +1 -0
- package/dist/github/github.js +535 -0
- package/dist/github/github.js.map +1 -0
- package/dist/github/index.d.ts +2 -0
- package/dist/github/index.d.ts.map +1 -0
- package/dist/github/index.js +2 -0
- package/dist/github/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge/analyzer.d.ts +36 -0
- package/dist/knowledge/analyzer.d.ts.map +1 -0
- package/dist/knowledge/analyzer.js +170 -0
- package/dist/knowledge/analyzer.js.map +1 -0
- package/dist/knowledge/gitInfo.d.ts +10 -0
- package/dist/knowledge/gitInfo.d.ts.map +1 -0
- package/dist/knowledge/gitInfo.js +134 -0
- package/dist/knowledge/gitInfo.js.map +1 -0
- package/dist/knowledge/graph.d.ts +45 -0
- package/dist/knowledge/graph.d.ts.map +1 -0
- package/dist/knowledge/graph.js +262 -0
- package/dist/knowledge/graph.js.map +1 -0
- package/dist/knowledge/graphqlExporter.d.ts +64 -0
- package/dist/knowledge/graphqlExporter.d.ts.map +1 -0
- package/dist/knowledge/graphqlExporter.js +333 -0
- package/dist/knowledge/graphqlExporter.js.map +1 -0
- package/dist/knowledge/index.d.ts +58 -0
- package/dist/knowledge/index.d.ts.map +1 -0
- package/dist/knowledge/index.js +212 -0
- package/dist/knowledge/index.js.map +1 -0
- package/dist/knowledge/repository.d.ts +64 -0
- package/dist/knowledge/repository.d.ts.map +1 -0
- package/dist/knowledge/repository.js +250 -0
- package/dist/knowledge/repository.js.map +1 -0
- package/dist/knowledge/riskOnAnalyzer.d.ts +79 -0
- package/dist/knowledge/riskOnAnalyzer.d.ts.map +1 -0
- package/dist/knowledge/riskOnAnalyzer.js +243 -0
- package/dist/knowledge/riskOnAnalyzer.js.map +1 -0
- package/dist/knowledge/scanner.d.ts +14 -0
- package/dist/knowledge/scanner.d.ts.map +1 -0
- package/dist/knowledge/scanner.js +350 -0
- package/dist/knowledge/scanner.js.map +1 -0
- package/dist/knowledge/store.d.ts +23 -0
- package/dist/knowledge/store.d.ts.map +1 -0
- package/dist/knowledge/store.js +86 -0
- package/dist/knowledge/store.js.map +1 -0
- package/dist/knowledge/types.d.ts +288 -0
- package/dist/knowledge/types.d.ts.map +1 -0
- package/dist/knowledge/types.js +111 -0
- package/dist/knowledge/types.js.map +1 -0
- package/dist/linear/index.d.ts +3 -0
- package/dist/linear/index.d.ts.map +1 -0
- package/dist/linear/index.js +3 -0
- package/dist/linear/index.js.map +1 -0
- package/dist/linear/linear.d.ts +160 -0
- package/dist/linear/linear.d.ts.map +1 -0
- package/dist/linear/linear.js +983 -0
- package/dist/linear/linear.js.map +1 -0
- package/dist/linear/projectUpdater.d.ts +23 -0
- package/dist/linear/projectUpdater.d.ts.map +1 -0
- package/dist/linear/projectUpdater.js +347 -0
- package/dist/linear/projectUpdater.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 +436 -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 +89 -0
- package/dist/locale/index.js.map +1 -0
- package/dist/locale/ko.d.ts +3 -0
- package/dist/locale/ko.d.ts.map +1 -0
- package/dist/locale/ko.js +436 -0
- package/dist/locale/ko.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 +278 -0
- package/dist/locale/prompts/en.js.map +1 -0
- package/dist/locale/prompts/ko.d.ts +3 -0
- package/dist/locale/prompts/ko.d.ts.map +1 -0
- package/dist/locale/prompts/ko.js +279 -0
- package/dist/locale/prompts/ko.js.map +1 -0
- package/dist/locale/types.d.ts +407 -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/memory/codex.d.ts +93 -0
- package/dist/memory/codex.d.ts.map +1 -0
- package/dist/memory/codex.js +366 -0
- package/dist/memory/codex.js.map +1 -0
- package/dist/memory/compaction.d.ts +21 -0
- package/dist/memory/compaction.d.ts.map +1 -0
- package/dist/memory/compaction.js +205 -0
- package/dist/memory/compaction.js.map +1 -0
- package/dist/memory/index.d.ts +13 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +13 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/memoryCore.d.ts +178 -0
- package/dist/memory/memoryCore.d.ts.map +1 -0
- package/dist/memory/memoryCore.js +623 -0
- package/dist/memory/memoryCore.js.map +1 -0
- package/dist/memory/memoryOps.d.ts +90 -0
- package/dist/memory/memoryOps.d.ts.map +1 -0
- package/dist/memory/memoryOps.js +606 -0
- package/dist/memory/memoryOps.js.map +1 -0
- package/dist/orchestration/conflictDetector.d.ts +15 -0
- package/dist/orchestration/conflictDetector.d.ts.map +1 -0
- package/dist/orchestration/conflictDetector.js +130 -0
- package/dist/orchestration/conflictDetector.js.map +1 -0
- package/dist/orchestration/decisionEngine.d.ts +177 -0
- package/dist/orchestration/decisionEngine.d.ts.map +1 -0
- package/dist/orchestration/decisionEngine.js +496 -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/taskParser.d.ts +67 -0
- package/dist/orchestration/taskParser.d.ts.map +1 -0
- package/dist/orchestration/taskParser.js +542 -0
- package/dist/orchestration/taskParser.js.map +1 -0
- package/dist/orchestration/taskScheduler.d.ts +141 -0
- package/dist/orchestration/taskScheduler.d.ts.map +1 -0
- package/dist/orchestration/taskScheduler.js +317 -0
- package/dist/orchestration/taskScheduler.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/runners/cliRunner.d.ts +11 -0
- package/dist/runners/cliRunner.d.ts.map +1 -0
- package/dist/runners/cliRunner.js +194 -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 +304 -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 +235 -0
- package/dist/support/chatBackend.js.map +1 -0
- package/dist/support/chatMemory.d.ts +71 -0
- package/dist/support/chatMemory.d.ts.map +1 -0
- package/dist/support/chatMemory.js +119 -0
- package/dist/support/chatMemory.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 +998 -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 +3 -0
- package/dist/support/dashboardHtml.d.ts.map +1 -0
- package/dist/support/dashboardHtml.js +2070 -0
- package/dist/support/dashboardHtml.js.map +1 -0
- package/dist/support/delete-beliefs.d.ts +2 -0
- package/dist/support/delete-beliefs.d.ts.map +1 -0
- package/dist/support/delete-beliefs.js +34 -0
- package/dist/support/delete-beliefs.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/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 +13 -0
- package/dist/support/index.d.ts.map +1 -0
- package/dist/support/index.js +13 -0
- package/dist/support/index.js.map +1 -0
- package/dist/support/planner.d.ts +58 -0
- package/dist/support/planner.d.ts.map +1 -0
- package/dist/support/planner.js +395 -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 +259 -0
- package/dist/support/projectMapper.js.map +1 -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 +328 -0
- package/dist/support/rollback.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/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/web.d.ts +11 -0
- package/dist/support/web.d.ts.map +1 -0
- package/dist/support/web.js +938 -0
- package/dist/support/web.js.map +1 -0
- package/dist/support/workflowLinear.d.ts +99 -0
- package/dist/support/workflowLinear.d.ts.map +1 -0
- package/dist/support/workflowLinear.js +257 -0
- package/dist/support/workflowLinear.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 +144 -0
- package/dist/support/worktreeManager.js.map +1 -0
- package/dist/taskState/store.d.ts +101 -0
- package/dist/taskState/store.d.ts.map +1 -0
- package/dist/taskState/store.js +346 -0
- package/dist/taskState/store.js.map +1 -0
- package/package.json +70 -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/ISSUE_ANALYSIS.md +31 -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
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// CryptoQuant API Adapter
|
|
3
|
+
// Stablecoin Exchange Flow Analysis
|
|
4
|
+
// USDC Netflow data integration for Risk-On signals
|
|
5
|
+
import * as https from 'https';
|
|
6
|
+
// CryptoQuantAdapter Class
|
|
7
|
+
export class CryptoQuantAdapter {
|
|
8
|
+
apiToken;
|
|
9
|
+
baseUrl;
|
|
10
|
+
cacheDir;
|
|
11
|
+
rateLimitPerDay;
|
|
12
|
+
dataWindow;
|
|
13
|
+
rateLimitState;
|
|
14
|
+
constructor(config) {
|
|
15
|
+
this.apiToken = config.apiToken;
|
|
16
|
+
this.baseUrl = config.baseUrl || 'https://api.cryptoquant.com/v1';
|
|
17
|
+
this.cacheDir = config.cacheDir || './cache/cryptoquant';
|
|
18
|
+
this.rateLimitPerDay = config.rateLimitPerDay || 50;
|
|
19
|
+
this.dataWindow = config.dataWindow || 7; // Default 7 days
|
|
20
|
+
this.rateLimitState = {
|
|
21
|
+
requestsToday: 0,
|
|
22
|
+
lastResetDate: new Date().toISOString().slice(0, 10),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Fetch USDC Netflow data from CryptoQuant
|
|
27
|
+
* @param exchange - Exchange name (e.g., "binance", "coinbase", "kraken")
|
|
28
|
+
* @param daysBack - Number of days back from today (default: 7)
|
|
29
|
+
*/
|
|
30
|
+
async getUSDCNetflow(exchange, daysBack = 7) {
|
|
31
|
+
// Check rate limit
|
|
32
|
+
this.checkRateLimit();
|
|
33
|
+
const toDate = new Date();
|
|
34
|
+
const fromDate = new Date(toDate.getTime() - daysBack * 24 * 60 * 60 * 1000);
|
|
35
|
+
const fromStr = fromDate.toISOString().slice(0, 10).replace(/-/g, '');
|
|
36
|
+
const toStr = toDate.toISOString().slice(0, 10).replace(/-/g, '');
|
|
37
|
+
const params = {
|
|
38
|
+
token: 'usdc_eth', // USDC on Ethereum
|
|
39
|
+
exchange: exchange,
|
|
40
|
+
window: 'day',
|
|
41
|
+
from: fromStr,
|
|
42
|
+
to: toStr,
|
|
43
|
+
limit: daysBack,
|
|
44
|
+
};
|
|
45
|
+
const queryString = new URLSearchParams(params).toString();
|
|
46
|
+
const url = `${this.baseUrl}/stablecoin/exchange-flows/netflow?${queryString}`;
|
|
47
|
+
console.log(`[CryptoQuantAdapter] Fetching USDC Netflow: ${exchange} (${daysBack}d)`);
|
|
48
|
+
try {
|
|
49
|
+
const response = await this.makeRequest(url);
|
|
50
|
+
if (!response.data || !Array.isArray(response.data)) {
|
|
51
|
+
console.warn('[CryptoQuantAdapter] Unexpected response format:', response);
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
// Transform API response to USDCNetflowData
|
|
55
|
+
const data = response.data.map((item) => ({
|
|
56
|
+
timestamp: item.timestamp || Math.floor(new Date(item.date).getTime() / 1000),
|
|
57
|
+
date: item.date,
|
|
58
|
+
exchange: exchange,
|
|
59
|
+
netflow: item.netflow || (item.inflow - item.outflow),
|
|
60
|
+
inflow: item.inflow,
|
|
61
|
+
outflow: item.outflow,
|
|
62
|
+
token: 'usdc_eth',
|
|
63
|
+
}));
|
|
64
|
+
this.recordApiCall();
|
|
65
|
+
return data;
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
console.error('[CryptoQuantAdapter] API error:', err);
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Fetch USDC Netflow from multiple exchanges
|
|
74
|
+
*/
|
|
75
|
+
async getUSDCNetflowMultiExchange(exchanges = ['binance', 'coinbase', 'kraken'], daysBack = 7) {
|
|
76
|
+
const results = new Map();
|
|
77
|
+
for (const exchange of exchanges) {
|
|
78
|
+
try {
|
|
79
|
+
const data = await this.getUSDCNetflow(exchange, daysBack);
|
|
80
|
+
results.set(exchange, data);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.warn(`[CryptoQuantAdapter] Failed to fetch ${exchange}:`, err);
|
|
84
|
+
results.set(exchange, []);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return results;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Analyze USDC Netflow data for Risk-On signal
|
|
91
|
+
*/
|
|
92
|
+
analyzeRiskOnSignal(data) {
|
|
93
|
+
if (data.length === 0) {
|
|
94
|
+
return {
|
|
95
|
+
score: 50,
|
|
96
|
+
trend: 'stable',
|
|
97
|
+
netflowTrend: 0,
|
|
98
|
+
cexInflowStrength: 0,
|
|
99
|
+
cexOutflowStrength: 0,
|
|
100
|
+
confidence: 0,
|
|
101
|
+
lastUpdated: Date.now(),
|
|
102
|
+
recommendation: '데이터 부족으로 신호를 분석할 수 없습니다.',
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
// Sort by timestamp
|
|
106
|
+
const sorted = [...data].sort((a, b) => a.timestamp - b.timestamp);
|
|
107
|
+
// Calculate netflow trend (recent vs older)
|
|
108
|
+
const recent = sorted.slice(-3);
|
|
109
|
+
const older = sorted.slice(0, Math.max(1, sorted.length - 3));
|
|
110
|
+
const recentNetflow = recent.reduce((sum, d) => sum + d.netflow, 0) / recent.length;
|
|
111
|
+
const olderNetflow = older.reduce((sum, d) => sum + d.netflow, 0) / older.length;
|
|
112
|
+
const netflowTrend = recentNetflow - olderNetflow;
|
|
113
|
+
const trend = netflowTrend > 100 ? 'increasing' : netflowTrend < -100 ? 'decreasing' : 'stable';
|
|
114
|
+
// Calculate inflow/outflow strength
|
|
115
|
+
const totalInflow = sorted.reduce((sum, d) => sum + d.inflow, 0);
|
|
116
|
+
const totalOutflow = sorted.reduce((sum, d) => sum + d.outflow, 0);
|
|
117
|
+
const totalFlow = totalInflow + totalOutflow;
|
|
118
|
+
const inflowRatio = totalFlow > 0 ? totalInflow / totalFlow : 0.5;
|
|
119
|
+
const outflowRatio = totalFlow > 0 ? totalOutflow / totalFlow : 0.5;
|
|
120
|
+
// Risk-On Score calculation
|
|
121
|
+
// 위험자산 선호: CEX inflow 증가 = 구매압 증가
|
|
122
|
+
// 위험자산 회피: CEX outflow 증가 = 판매압 증가
|
|
123
|
+
const inflowScore = Math.min(100, inflowRatio * 200); // 0-100
|
|
124
|
+
const outflowScore = Math.min(100, outflowRatio * 200); // 0-100
|
|
125
|
+
const trendScore = Math.min(100, Math.max(0, 50 + (netflowTrend / 1000) * 50)); // 0-100
|
|
126
|
+
const score = Math.round((inflowScore * 0.5 + trendScore * 0.5));
|
|
127
|
+
// Confidence based on data consistency
|
|
128
|
+
const variance = this.calculateVariance(sorted.map(d => d.netflow));
|
|
129
|
+
const confidence = Math.round(Math.max(0, Math.min(100, 100 - variance / 100)));
|
|
130
|
+
// Recommendation
|
|
131
|
+
let recommendation = '';
|
|
132
|
+
if (score > 65) {
|
|
133
|
+
recommendation = '🟢 위험자산 선호 신호 (Risk-On): CEX 유입이 강함';
|
|
134
|
+
}
|
|
135
|
+
else if (score < 35) {
|
|
136
|
+
recommendation = '🔴 위험자산 회피 신호 (Risk-Off): CEX 유출이 강함';
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
recommendation = '🟡 중립: 명확한 신호 없음';
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
score,
|
|
143
|
+
trend,
|
|
144
|
+
netflowTrend,
|
|
145
|
+
cexInflowStrength: Math.round(inflowScore),
|
|
146
|
+
cexOutflowStrength: Math.round(outflowScore),
|
|
147
|
+
confidence,
|
|
148
|
+
lastUpdated: Date.now(),
|
|
149
|
+
recommendation,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Private: Make HTTPS request
|
|
154
|
+
*/
|
|
155
|
+
async makeRequest(url) {
|
|
156
|
+
return new Promise((resolve, reject) => {
|
|
157
|
+
https.get(url, {
|
|
158
|
+
headers: {
|
|
159
|
+
'Authorization': `Bearer ${this.apiToken}`,
|
|
160
|
+
'User-Agent': 'OpenSwarm/1.0',
|
|
161
|
+
},
|
|
162
|
+
}, (res) => {
|
|
163
|
+
let data = '';
|
|
164
|
+
res.on('data', (chunk) => {
|
|
165
|
+
data += chunk;
|
|
166
|
+
});
|
|
167
|
+
res.on('end', () => {
|
|
168
|
+
try {
|
|
169
|
+
const json = JSON.parse(data);
|
|
170
|
+
if (res.statusCode !== 200) {
|
|
171
|
+
reject(new Error(`CryptoQuant API error: ${res.statusCode} ${json.message || ''}`));
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
resolve(json);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
reject(new Error(`Failed to parse CryptoQuant response: ${err}`));
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
}).on('error', reject);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Private: Check rate limit
|
|
186
|
+
*/
|
|
187
|
+
checkRateLimit() {
|
|
188
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
189
|
+
if (today !== this.rateLimitState.lastResetDate) {
|
|
190
|
+
this.rateLimitState.requestsToday = 0;
|
|
191
|
+
this.rateLimitState.lastResetDate = today;
|
|
192
|
+
}
|
|
193
|
+
if (this.rateLimitState.requestsToday >= this.rateLimitPerDay) {
|
|
194
|
+
throw new Error(`[CryptoQuantAdapter] Rate limit exceeded: ${this.rateLimitPerDay} requests/day`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Private: Record API call
|
|
199
|
+
*/
|
|
200
|
+
recordApiCall() {
|
|
201
|
+
this.rateLimitState.requestsToday++;
|
|
202
|
+
console.log(`[CryptoQuantAdapter] API calls today: ${this.rateLimitState.requestsToday}/${this.rateLimitPerDay}`);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Private: Calculate variance for confidence
|
|
206
|
+
*/
|
|
207
|
+
calculateVariance(values) {
|
|
208
|
+
if (values.length === 0)
|
|
209
|
+
return 0;
|
|
210
|
+
const mean = values.reduce((a, b) => a + b) / values.length;
|
|
211
|
+
const squaredDiffs = values.map(v => Math.pow(v - mean, 2));
|
|
212
|
+
const variance = squaredDiffs.reduce((a, b) => a + b) / values.length;
|
|
213
|
+
return Math.sqrt(variance); // Return standard deviation
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Get current rate limit status
|
|
217
|
+
*/
|
|
218
|
+
getRateLimitStatus() {
|
|
219
|
+
return {
|
|
220
|
+
used: this.rateLimitState.requestsToday,
|
|
221
|
+
limit: this.rateLimitPerDay,
|
|
222
|
+
remaining: Math.max(0, this.rateLimitPerDay - this.rateLimitState.requestsToday),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Singleton Instance
|
|
227
|
+
let adapterInstance = null;
|
|
228
|
+
export function initCryptoQuantAdapter(config) {
|
|
229
|
+
adapterInstance = new CryptoQuantAdapter(config);
|
|
230
|
+
return adapterInstance;
|
|
231
|
+
}
|
|
232
|
+
export function getCryptoQuantAdapter() {
|
|
233
|
+
if (!adapterInstance) {
|
|
234
|
+
throw new Error('CryptoQuantAdapter not initialized. Call initCryptoQuantAdapter() first.');
|
|
235
|
+
}
|
|
236
|
+
return adapterInstance;
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=cryptoQuantAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cryptoQuantAdapter.js","sourceRoot":"","sources":["../../src/adapters/cryptoQuantAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type { CliAdapter, CliRunOptions, CliRunResult, AdapterCapabilities, AdapterName, WorkerResult, ReviewResult, ProcessContext, } from './types.js';
|
|
2
|
+
export { spawnCli } from './base.js';
|
|
3
|
+
export { ClaudeCliAdapter } from './claude.js';
|
|
4
|
+
export { CodexCliAdapter } from './codex.js';
|
|
5
|
+
export { registerProcess, getProcess, getAllProcesses, killProcess, startHealthChecker, stopHealthChecker } from './processRegistry.js';
|
|
6
|
+
import type { AdapterName, CliAdapter } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* Get an adapter by name. Defaults to 'claude'.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getAdapter(name?: string): CliAdapter;
|
|
11
|
+
export declare function setDefaultAdapter(name: AdapterName): void;
|
|
12
|
+
export declare function getDefaultAdapterName(): AdapterName;
|
|
13
|
+
/**
|
|
14
|
+
* List adapters that are currently installed and available.
|
|
15
|
+
*/
|
|
16
|
+
export declare function listAvailableAdapters(): Promise<string[]>;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAKA,YAAY,EACV,UAAU,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIxI,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAS1D;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE,MAAuB,GAAG,UAAU,CAMpE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAKzD;AAED,wBAAgB,qBAAqB,IAAI,WAAW,CAEnD;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ/D"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// OpenSwarm - CLI Adapter Registry
|
|
3
|
+
// Barrel exports + adapter lookup
|
|
4
|
+
// ============================================
|
|
5
|
+
export { spawnCli } from './base.js';
|
|
6
|
+
export { ClaudeCliAdapter } from './claude.js';
|
|
7
|
+
export { CodexCliAdapter } from './codex.js';
|
|
8
|
+
export { registerProcess, getProcess, getAllProcesses, killProcess, startHealthChecker, stopHealthChecker } from './processRegistry.js';
|
|
9
|
+
import { ClaudeCliAdapter } from './claude.js';
|
|
10
|
+
import { CodexCliAdapter } from './codex.js';
|
|
11
|
+
const adapters = {
|
|
12
|
+
claude: new ClaudeCliAdapter(),
|
|
13
|
+
codex: new CodexCliAdapter(),
|
|
14
|
+
};
|
|
15
|
+
let defaultAdapter = 'claude';
|
|
16
|
+
/**
|
|
17
|
+
* Get an adapter by name. Defaults to 'claude'.
|
|
18
|
+
*/
|
|
19
|
+
export function getAdapter(name = defaultAdapter) {
|
|
20
|
+
const adapter = adapters[name];
|
|
21
|
+
if (!adapter) {
|
|
22
|
+
throw new Error(`Unknown adapter: "${name}". Available: ${Object.keys(adapters).join(', ')}`);
|
|
23
|
+
}
|
|
24
|
+
return adapter;
|
|
25
|
+
}
|
|
26
|
+
export function setDefaultAdapter(name) {
|
|
27
|
+
if (!adapters[name]) {
|
|
28
|
+
throw new Error(`Unknown adapter: "${name}". Available: ${Object.keys(adapters).join(', ')}`);
|
|
29
|
+
}
|
|
30
|
+
defaultAdapter = name;
|
|
31
|
+
}
|
|
32
|
+
export function getDefaultAdapterName() {
|
|
33
|
+
return defaultAdapter;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* List adapters that are currently installed and available.
|
|
37
|
+
*/
|
|
38
|
+
export async function listAvailableAdapters() {
|
|
39
|
+
const results = [];
|
|
40
|
+
for (const [name, adapter] of Object.entries(adapters)) {
|
|
41
|
+
if (await adapter.isAvailable()) {
|
|
42
|
+
results.push(name);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return results;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,mCAAmC;AACnC,kCAAkC;AAClC,+CAA+C;AAa/C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAExI,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,QAAQ,GAA+B;IAC3C,MAAM,EAAE,IAAI,gBAAgB,EAAE;IAC9B,KAAK,EAAE,IAAI,eAAe,EAAE;CAC7B,CAAC;AAEF,IAAI,cAAc,GAAgB,QAAQ,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,cAAc;IACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,iBAAiB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAiB;IACjD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,iBAAiB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvD,IAAI,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ChildProcess } from 'node:child_process';
|
|
2
|
+
export interface ProcessInfo {
|
|
3
|
+
pid: number;
|
|
4
|
+
taskId: string;
|
|
5
|
+
stage: string;
|
|
6
|
+
model?: string;
|
|
7
|
+
projectPath: string;
|
|
8
|
+
spawnedAt: number;
|
|
9
|
+
lastActivityAt: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Register a spawned CLI process for tracking.
|
|
13
|
+
* Automatically hooks into stdout/stderr for activity tracking
|
|
14
|
+
* and proc.close for cleanup.
|
|
15
|
+
*/
|
|
16
|
+
export declare function registerProcess(info: ProcessInfo, proc: ChildProcess): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get a single process by PID
|
|
19
|
+
*/
|
|
20
|
+
export declare function getProcess(pid: number): ProcessInfo | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Get all tracked processes
|
|
23
|
+
*/
|
|
24
|
+
export declare function getAllProcesses(): ProcessInfo[];
|
|
25
|
+
/**
|
|
26
|
+
* Kill a tracked process. Sends SIGTERM first, then SIGKILL after 5s.
|
|
27
|
+
*/
|
|
28
|
+
export declare function killProcess(pid: number, force?: boolean): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Start periodic health checker that verifies processes are still alive.
|
|
31
|
+
* Removes stale entries from the registry.
|
|
32
|
+
*/
|
|
33
|
+
export declare function startHealthChecker(intervalMs?: number): void;
|
|
34
|
+
/**
|
|
35
|
+
* Stop the health checker
|
|
36
|
+
*/
|
|
37
|
+
export declare function stopHealthChecker(): void;
|
|
38
|
+
//# sourceMappingURL=processRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processRegistry.d.ts","sourceRoot":"","sources":["../../src/adapters/processRegistry.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAiD3E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE/D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CA0B9E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,SAAQ,GAAG,IAAI,CAwB3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// OpenSwarm - Process Registry
|
|
3
|
+
// Global singleton for tracking spawned CLI processes
|
|
4
|
+
// ============================================
|
|
5
|
+
import { broadcastEvent } from '../core/eventHub.js';
|
|
6
|
+
// Registry (singleton)
|
|
7
|
+
const registry = new Map();
|
|
8
|
+
let healthCheckTimer = null;
|
|
9
|
+
// Throttle activity broadcasts: PID → last broadcast timestamp
|
|
10
|
+
const activityThrottle = new Map();
|
|
11
|
+
const ACTIVITY_THROTTLE_MS = 5000;
|
|
12
|
+
/**
|
|
13
|
+
* Register a spawned CLI process for tracking.
|
|
14
|
+
* Automatically hooks into stdout/stderr for activity tracking
|
|
15
|
+
* and proc.close for cleanup.
|
|
16
|
+
*/
|
|
17
|
+
export function registerProcess(info, proc) {
|
|
18
|
+
registry.set(info.pid, info);
|
|
19
|
+
// Broadcast spawn event
|
|
20
|
+
broadcastEvent({
|
|
21
|
+
type: 'process:spawn',
|
|
22
|
+
data: {
|
|
23
|
+
pid: info.pid,
|
|
24
|
+
taskId: info.taskId,
|
|
25
|
+
stage: info.stage,
|
|
26
|
+
model: info.model,
|
|
27
|
+
projectPath: info.projectPath,
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
// Track activity from stdout/stderr
|
|
31
|
+
const updateActivity = () => {
|
|
32
|
+
const entry = registry.get(info.pid);
|
|
33
|
+
if (!entry)
|
|
34
|
+
return;
|
|
35
|
+
entry.lastActivityAt = Date.now();
|
|
36
|
+
// Throttled broadcast
|
|
37
|
+
const lastBroadcast = activityThrottle.get(info.pid) ?? 0;
|
|
38
|
+
if (Date.now() - lastBroadcast >= ACTIVITY_THROTTLE_MS) {
|
|
39
|
+
activityThrottle.set(info.pid, Date.now());
|
|
40
|
+
// Activity updates go through process:spawn (lightweight)
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
proc.stdout?.on('data', updateActivity);
|
|
44
|
+
proc.stderr?.on('data', updateActivity);
|
|
45
|
+
// Cleanup on close
|
|
46
|
+
proc.on('close', (code, signal) => {
|
|
47
|
+
const entry = registry.get(info.pid);
|
|
48
|
+
const durationMs = entry ? Date.now() - entry.spawnedAt : 0;
|
|
49
|
+
registry.delete(info.pid);
|
|
50
|
+
activityThrottle.delete(info.pid);
|
|
51
|
+
broadcastEvent({
|
|
52
|
+
type: 'process:exit',
|
|
53
|
+
data: {
|
|
54
|
+
pid: info.pid,
|
|
55
|
+
exitCode: code,
|
|
56
|
+
signal: signal,
|
|
57
|
+
durationMs,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get a single process by PID
|
|
64
|
+
*/
|
|
65
|
+
export function getProcess(pid) {
|
|
66
|
+
return registry.get(pid);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get all tracked processes
|
|
70
|
+
*/
|
|
71
|
+
export function getAllProcesses() {
|
|
72
|
+
return Array.from(registry.values());
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Kill a tracked process. Sends SIGTERM first, then SIGKILL after 5s.
|
|
76
|
+
*/
|
|
77
|
+
export async function killProcess(pid, force = false) {
|
|
78
|
+
const entry = registry.get(pid);
|
|
79
|
+
if (!entry)
|
|
80
|
+
return false;
|
|
81
|
+
try {
|
|
82
|
+
if (force) {
|
|
83
|
+
process.kill(pid, 'SIGKILL');
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
process.kill(pid, 'SIGTERM');
|
|
87
|
+
// Escalate to SIGKILL after 5s if still alive
|
|
88
|
+
setTimeout(() => {
|
|
89
|
+
try {
|
|
90
|
+
process.kill(pid, 0); // Check if alive
|
|
91
|
+
process.kill(pid, 'SIGKILL');
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Already dead — good
|
|
95
|
+
}
|
|
96
|
+
}, 5000);
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
// Process already gone
|
|
102
|
+
registry.delete(pid);
|
|
103
|
+
activityThrottle.delete(pid);
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Start periodic health checker that verifies processes are still alive.
|
|
109
|
+
* Removes stale entries from the registry.
|
|
110
|
+
*/
|
|
111
|
+
export function startHealthChecker(intervalMs = 30000) {
|
|
112
|
+
if (healthCheckTimer)
|
|
113
|
+
return;
|
|
114
|
+
healthCheckTimer = setInterval(() => {
|
|
115
|
+
for (const [pid, info] of registry) {
|
|
116
|
+
try {
|
|
117
|
+
process.kill(pid, 0); // No-op signal — just checks if alive
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Process is dead but wasn't cleaned up
|
|
121
|
+
const durationMs = Date.now() - info.spawnedAt;
|
|
122
|
+
registry.delete(pid);
|
|
123
|
+
activityThrottle.delete(pid);
|
|
124
|
+
broadcastEvent({
|
|
125
|
+
type: 'process:exit',
|
|
126
|
+
data: {
|
|
127
|
+
pid,
|
|
128
|
+
exitCode: null,
|
|
129
|
+
signal: null,
|
|
130
|
+
durationMs,
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
console.log(`[ProcessRegistry] Removed stale process PID=${pid} (${info.stage})`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}, intervalMs);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Stop the health checker
|
|
140
|
+
*/
|
|
141
|
+
export function stopHealthChecker() {
|
|
142
|
+
if (healthCheckTimer) {
|
|
143
|
+
clearInterval(healthCheckTimer);
|
|
144
|
+
healthCheckTimer = null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
//# sourceMappingURL=processRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processRegistry.js","sourceRoot":"","sources":["../../src/adapters/processRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks raw vs filtered output sizes for cost reporting
|
|
3
|
+
*/
|
|
4
|
+
export interface OutputSizeInfo {
|
|
5
|
+
rawBytes: number;
|
|
6
|
+
filteredBytes: number;
|
|
7
|
+
savingsPercent: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* SmartStreamBuffer filters Claude CLI stream-json (NDJSON) output in real-time.
|
|
11
|
+
*
|
|
12
|
+
* Kept events:
|
|
13
|
+
* - type 'result' — preserved verbatim (contains cost, usage, final result text)
|
|
14
|
+
* - type 'assistant' — only text blocks extracted (tool_use blocks discarded)
|
|
15
|
+
*
|
|
16
|
+
* Discarded events:
|
|
17
|
+
* - tool_use content blocks (large file contents, command outputs)
|
|
18
|
+
* - tool_result events
|
|
19
|
+
* - system events
|
|
20
|
+
* - content_block_start / content_block_delta / content_block_stop
|
|
21
|
+
*
|
|
22
|
+
* The filtered output is compatible with:
|
|
23
|
+
* - extractResultFromStreamJson() — scans lines for type 'result'
|
|
24
|
+
* - extractCostFromStreamJson() — scans lines for type 'result'
|
|
25
|
+
* - extractWorkerFromText() — matches file/command patterns in text
|
|
26
|
+
*/
|
|
27
|
+
export declare class SmartStreamBuffer {
|
|
28
|
+
private rawBytes;
|
|
29
|
+
private lineBuffer;
|
|
30
|
+
private resultEvents;
|
|
31
|
+
private textFragments;
|
|
32
|
+
/**
|
|
33
|
+
* Process a raw stdout chunk from the CLI process.
|
|
34
|
+
* Splits into NDJSON lines, filters, and accumulates.
|
|
35
|
+
*/
|
|
36
|
+
processChunk(chunk: string): void;
|
|
37
|
+
/**
|
|
38
|
+
* Flush any remaining buffered line (call at end of stream).
|
|
39
|
+
*/
|
|
40
|
+
flush(): void;
|
|
41
|
+
private processLine;
|
|
42
|
+
/**
|
|
43
|
+
* Build filtered stdout string compatible with downstream parsers.
|
|
44
|
+
*
|
|
45
|
+
* Output format:
|
|
46
|
+
* 1. All result events (verbatim NDJSON lines)
|
|
47
|
+
* 2. A synthetic assistant event containing all collected text fragments
|
|
48
|
+
*
|
|
49
|
+
* This ensures extractResultFromStreamJson() and extractCostFromStreamJson()
|
|
50
|
+
* find their result events, while extractWorkerFromText() can match patterns
|
|
51
|
+
* in the synthetic assistant text.
|
|
52
|
+
*/
|
|
53
|
+
buildFilteredStdout(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Get size tracking info for cost reporting.
|
|
56
|
+
*/
|
|
57
|
+
getSizeInfo(): OutputSizeInfo;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=streamBuffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamBuffer.d.ts","sourceRoot":"","sources":["../../src/adapters/streamBuffer.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,aAAa,CAAgB;IAErC;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAejC;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb,OAAO,CAAC,WAAW;IA0BnB;;;;;;;;;;OAUG;IACH,mBAAmB,IAAI,MAAM;IAwB7B;;OAEG;IACH,WAAW,IAAI,cAAc;CAa9B"}
|