patchwork-os 0.2.0-alpha.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.bridge.md +352 -0
- package/README.md +72 -0
- package/deploy/README.md +172 -0
- package/deploy/bootstrap-new-vps.sh +364 -0
- package/deploy/claude-ide-bridge.service.template +67 -0
- package/deploy/claude-ide-bridge@.service +31 -0
- package/deploy/ecosystem.config.js.example +36 -0
- package/deploy/install-vps-service.sh +240 -0
- package/deploy/nginx-claude-bridge.conf.template +129 -0
- package/dist/activityLog.d.ts +112 -0
- package/dist/activityLog.js +399 -0
- package/dist/activityLog.js.map +1 -0
- package/dist/activityTypes.d.ts +28 -0
- package/dist/activityTypes.js +9 -0
- package/dist/activityTypes.js.map +1 -0
- package/dist/adapters/base.d.ts +78 -0
- package/dist/adapters/base.js +14 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude.d.ts +18 -0
- package/dist/adapters/claude.js +276 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/gemini.d.ts +17 -0
- package/dist/adapters/gemini.js +218 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/grok.d.ts +7 -0
- package/dist/adapters/grok.js +21 -0
- package/dist/adapters/grok.js.map +1 -0
- package/dist/adapters/index.d.ts +5 -0
- package/dist/adapters/index.js +37 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/local.d.ts +7 -0
- package/dist/adapters/local.js +22 -0
- package/dist/adapters/local.js.map +1 -0
- package/dist/adapters/openai.d.ts +22 -0
- package/dist/adapters/openai.js +284 -0
- package/dist/adapters/openai.js.map +1 -0
- package/dist/adapters/sse.d.ts +13 -0
- package/dist/adapters/sse.js +58 -0
- package/dist/adapters/sse.js.map +1 -0
- package/dist/analyticsAggregator.d.ts +28 -0
- package/dist/analyticsAggregator.js +133 -0
- package/dist/analyticsAggregator.js.map +1 -0
- package/dist/analyticsPrefs.d.ts +9 -0
- package/dist/analyticsPrefs.js +50 -0
- package/dist/analyticsPrefs.js.map +1 -0
- package/dist/analyticsSend.d.ts +12 -0
- package/dist/analyticsSend.js +34 -0
- package/dist/analyticsSend.js.map +1 -0
- package/dist/approvalHttp.d.ts +46 -0
- package/dist/approvalHttp.js +370 -0
- package/dist/approvalHttp.js.map +1 -0
- package/dist/approvalQueue.d.ts +49 -0
- package/dist/approvalQueue.js +84 -0
- package/dist/approvalQueue.js.map +1 -0
- package/dist/automation.d.ts +675 -0
- package/dist/automation.js +1038 -0
- package/dist/automation.js.map +1 -0
- package/dist/bridge.d.ts +85 -0
- package/dist/bridge.js +1535 -0
- package/dist/bridge.js.map +1 -0
- package/dist/bridgeLockDiscovery.d.ts +11 -0
- package/dist/bridgeLockDiscovery.js +49 -0
- package/dist/bridgeLockDiscovery.js.map +1 -0
- package/dist/bridgeToken.d.ts +22 -0
- package/dist/bridgeToken.js +114 -0
- package/dist/bridgeToken.js.map +1 -0
- package/dist/bridgeToolsRules.d.ts +20 -0
- package/dist/bridgeToolsRules.js +79 -0
- package/dist/bridgeToolsRules.js.map +1 -0
- package/dist/ccPermissions.d.ts +59 -0
- package/dist/ccPermissions.js +163 -0
- package/dist/ccPermissions.js.map +1 -0
- package/dist/claudeDriver.d.ts +129 -0
- package/dist/claudeDriver.js +459 -0
- package/dist/claudeDriver.js.map +1 -0
- package/dist/claudeMdPatch.d.ts +29 -0
- package/dist/claudeMdPatch.js +164 -0
- package/dist/claudeMdPatch.js.map +1 -0
- package/dist/claudeOrchestrator.d.ts +171 -0
- package/dist/claudeOrchestrator.js +591 -0
- package/dist/claudeOrchestrator.js.map +1 -0
- package/dist/commands/install.d.ts +1 -0
- package/dist/commands/install.js +158 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/marketplace.d.ts +11 -0
- package/dist/commands/marketplace.js +120 -0
- package/dist/commands/marketplace.js.map +1 -0
- package/dist/commands/patchworkInit.d.ts +14 -0
- package/dist/commands/patchworkInit.js +155 -0
- package/dist/commands/patchworkInit.js.map +1 -0
- package/dist/commands/task.d.ts +14 -0
- package/dist/commands/task.js +289 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/tokenEfficiency.d.ts +9 -0
- package/dist/commands/tokenEfficiency.js +211 -0
- package/dist/commands/tokenEfficiency.js.map +1 -0
- package/dist/commands/tools.d.ts +28 -0
- package/dist/commands/tools.js +326 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commitIssueLinkLog.d.ts +77 -0
- package/dist/commitIssueLinkLog.js +142 -0
- package/dist/commitIssueLinkLog.js.map +1 -0
- package/dist/companions/registry.d.ts +12 -0
- package/dist/companions/registry.js +71 -0
- package/dist/companions/registry.js.map +1 -0
- package/dist/config.d.ts +105 -0
- package/dist/config.js +720 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto.d.ts +16 -0
- package/dist/crypto.js +34 -0
- package/dist/crypto.js.map +1 -0
- package/dist/dashboard.d.ts +12 -0
- package/dist/dashboard.js +149 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/decisionTraceLog.d.ts +77 -0
- package/dist/decisionTraceLog.js +147 -0
- package/dist/decisionTraceLog.js.map +1 -0
- package/dist/errors.d.ts +32 -0
- package/dist/errors.js +34 -0
- package/dist/errors.js.map +1 -0
- package/dist/extensionClient.d.ts +279 -0
- package/dist/extensionClient.js +1253 -0
- package/dist/extensionClient.js.map +1 -0
- package/dist/fileLock.d.ts +36 -0
- package/dist/fileLock.js +121 -0
- package/dist/fileLock.js.map +1 -0
- package/dist/fp/activityAnalytics.d.ts +39 -0
- package/dist/fp/activityAnalytics.js +111 -0
- package/dist/fp/activityAnalytics.js.map +1 -0
- package/dist/fp/async.d.ts +48 -0
- package/dist/fp/async.js +60 -0
- package/dist/fp/async.js.map +1 -0
- package/dist/fp/automationInterpreter.d.ts +37 -0
- package/dist/fp/automationInterpreter.js +523 -0
- package/dist/fp/automationInterpreter.js.map +1 -0
- package/dist/fp/automationProgram.d.ts +89 -0
- package/dist/fp/automationProgram.js +29 -0
- package/dist/fp/automationProgram.js.map +1 -0
- package/dist/fp/automationState.d.ts +135 -0
- package/dist/fp/automationState.js +206 -0
- package/dist/fp/automationState.js.map +1 -0
- package/dist/fp/automationUtils.d.ts +31 -0
- package/dist/fp/automationUtils.js +61 -0
- package/dist/fp/automationUtils.js.map +1 -0
- package/dist/fp/brandedTypes.d.ts +32 -0
- package/dist/fp/brandedTypes.js +41 -0
- package/dist/fp/brandedTypes.js.map +1 -0
- package/dist/fp/commandDescription.d.ts +18 -0
- package/dist/fp/commandDescription.js +125 -0
- package/dist/fp/commandDescription.js.map +1 -0
- package/dist/fp/extensionSnapshot.d.ts +10 -0
- package/dist/fp/extensionSnapshot.js +14 -0
- package/dist/fp/extensionSnapshot.js.map +1 -0
- package/dist/fp/index.d.ts +8 -0
- package/dist/fp/index.js +9 -0
- package/dist/fp/index.js.map +1 -0
- package/dist/fp/interpreterContext.d.ts +69 -0
- package/dist/fp/interpreterContext.js +56 -0
- package/dist/fp/interpreterContext.js.map +1 -0
- package/dist/fp/policyParser.d.ts +16 -0
- package/dist/fp/policyParser.js +334 -0
- package/dist/fp/policyParser.js.map +1 -0
- package/dist/fp/result.d.ts +38 -0
- package/dist/fp/result.js +57 -0
- package/dist/fp/result.js.map +1 -0
- package/dist/fp/tokenBucket.d.ts +27 -0
- package/dist/fp/tokenBucket.js +36 -0
- package/dist/fp/tokenBucket.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1465 -0
- package/dist/index.js.map +1 -0
- package/dist/instructionsUtils.d.ts +17 -0
- package/dist/instructionsUtils.js +38 -0
- package/dist/instructionsUtils.js.map +1 -0
- package/dist/lockfile.d.ts +16 -0
- package/dist/lockfile.js +172 -0
- package/dist/lockfile.js.map +1 -0
- package/dist/logger.d.ts +16 -0
- package/dist/logger.js +68 -0
- package/dist/logger.js.map +1 -0
- package/dist/oauth.d.ts +105 -0
- package/dist/oauth.js +880 -0
- package/dist/oauth.js.map +1 -0
- package/dist/orchestrator/childBridgeClient.d.ts +33 -0
- package/dist/orchestrator/childBridgeClient.js +321 -0
- package/dist/orchestrator/childBridgeClient.js.map +1 -0
- package/dist/orchestrator/childBridgeRegistry.d.ts +67 -0
- package/dist/orchestrator/childBridgeRegistry.js +297 -0
- package/dist/orchestrator/childBridgeRegistry.js.map +1 -0
- package/dist/orchestrator/index.d.ts +3 -0
- package/dist/orchestrator/index.js +3 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/orchestratorBridge.d.ts +32 -0
- package/dist/orchestrator/orchestratorBridge.js +412 -0
- package/dist/orchestrator/orchestratorBridge.js.map +1 -0
- package/dist/orchestrator/orchestratorConfig.d.ts +11 -0
- package/dist/orchestrator/orchestratorConfig.js +85 -0
- package/dist/orchestrator/orchestratorConfig.js.map +1 -0
- package/dist/orchestrator/orchestratorTools.d.ts +16 -0
- package/dist/orchestrator/orchestratorTools.js +272 -0
- package/dist/orchestrator/orchestratorTools.js.map +1 -0
- package/dist/patchworkCli.d.ts +15 -0
- package/dist/patchworkCli.js +41 -0
- package/dist/patchworkCli.js.map +1 -0
- package/dist/patchworkConfig.d.ts +28 -0
- package/dist/patchworkConfig.js +30 -0
- package/dist/patchworkConfig.js.map +1 -0
- package/dist/plugin.d.ts +106 -0
- package/dist/plugin.js +31 -0
- package/dist/plugin.js.map +1 -0
- package/dist/pluginLoader.d.ts +44 -0
- package/dist/pluginLoader.js +357 -0
- package/dist/pluginLoader.js.map +1 -0
- package/dist/pluginWatcher.d.ts +24 -0
- package/dist/pluginWatcher.js +139 -0
- package/dist/pluginWatcher.js.map +1 -0
- package/dist/preToolUseHook.d.ts +10 -0
- package/dist/preToolUseHook.js +57 -0
- package/dist/preToolUseHook.js.map +1 -0
- package/dist/probe.d.ts +35 -0
- package/dist/probe.js +143 -0
- package/dist/probe.js.map +1 -0
- package/dist/prompts.d.ts +27 -0
- package/dist/prompts.js +1680 -0
- package/dist/prompts.js.map +1 -0
- package/dist/quickTaskPresets.d.ts +64 -0
- package/dist/quickTaskPresets.js +156 -0
- package/dist/quickTaskPresets.js.map +1 -0
- package/dist/recipes/compiler.d.ts +44 -0
- package/dist/recipes/compiler.js +140 -0
- package/dist/recipes/compiler.js.map +1 -0
- package/dist/recipes/installer.d.ts +25 -0
- package/dist/recipes/installer.js +62 -0
- package/dist/recipes/installer.js.map +1 -0
- package/dist/recipes/parser.d.ts +18 -0
- package/dist/recipes/parser.js +160 -0
- package/dist/recipes/parser.js.map +1 -0
- package/dist/recipes/scheduler.d.ts +45 -0
- package/dist/recipes/scheduler.js +110 -0
- package/dist/recipes/scheduler.js.map +1 -0
- package/dist/recipes/schema.d.ts +71 -0
- package/dist/recipes/schema.js +11 -0
- package/dist/recipes/schema.js.map +1 -0
- package/dist/recipesHttp.d.ts +63 -0
- package/dist/recipesHttp.js +183 -0
- package/dist/recipesHttp.js.map +1 -0
- package/dist/resources.d.ts +33 -0
- package/dist/resources.js +266 -0
- package/dist/resources.js.map +1 -0
- package/dist/riskTier.d.ts +40 -0
- package/dist/riskTier.js +142 -0
- package/dist/riskTier.js.map +1 -0
- package/dist/runLog.d.ts +90 -0
- package/dist/runLog.js +143 -0
- package/dist/runLog.js.map +1 -0
- package/dist/server.d.ts +160 -0
- package/dist/server.js +1244 -0
- package/dist/server.js.map +1 -0
- package/dist/sessionCheckpoint.d.ts +37 -0
- package/dist/sessionCheckpoint.js +123 -0
- package/dist/sessionCheckpoint.js.map +1 -0
- package/dist/streamableHttp.d.ts +86 -0
- package/dist/streamableHttp.js +702 -0
- package/dist/streamableHttp.js.map +1 -0
- package/dist/telemetry.d.ts +18 -0
- package/dist/telemetry.js +95 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tools/activityLog.d.ts +140 -0
- package/dist/tools/activityLog.js +204 -0
- package/dist/tools/activityLog.js.map +1 -0
- package/dist/tools/auditDependencies.d.ts +67 -0
- package/dist/tools/auditDependencies.js +298 -0
- package/dist/tools/auditDependencies.js.map +1 -0
- package/dist/tools/batchLsp.d.ts +262 -0
- package/dist/tools/batchLsp.js +328 -0
- package/dist/tools/batchLsp.js.map +1 -0
- package/dist/tools/blame-utils.d.ts +30 -0
- package/dist/tools/blame-utils.js +60 -0
- package/dist/tools/blame-utils.js.map +1 -0
- package/dist/tools/bridgeDoctor.d.ts +78 -0
- package/dist/tools/bridgeDoctor.js +542 -0
- package/dist/tools/bridgeDoctor.js.map +1 -0
- package/dist/tools/bridgeStatus.d.ts +122 -0
- package/dist/tools/bridgeStatus.js +250 -0
- package/dist/tools/bridgeStatus.js.map +1 -0
- package/dist/tools/cancelClaudeTask.d.ts +48 -0
- package/dist/tools/cancelClaudeTask.js +56 -0
- package/dist/tools/cancelClaudeTask.js.map +1 -0
- package/dist/tools/checkDocumentDirty.d.ts +56 -0
- package/dist/tools/checkDocumentDirty.js +74 -0
- package/dist/tools/checkDocumentDirty.js.map +1 -0
- package/dist/tools/clipboard.d.ts +80 -0
- package/dist/tools/clipboard.js +211 -0
- package/dist/tools/clipboard.js.map +1 -0
- package/dist/tools/closeTabs.d.ts +84 -0
- package/dist/tools/closeTabs.js +97 -0
- package/dist/tools/closeTabs.js.map +1 -0
- package/dist/tools/codeLens.d.ts +50 -0
- package/dist/tools/codeLens.js +47 -0
- package/dist/tools/codeLens.js.map +1 -0
- package/dist/tools/contextBundle.d.ts +75 -0
- package/dist/tools/contextBundle.js +218 -0
- package/dist/tools/contextBundle.js.map +1 -0
- package/dist/tools/createIssueFromAIComment.d.ts +75 -0
- package/dist/tools/createIssueFromAIComment.js +119 -0
- package/dist/tools/createIssueFromAIComment.js.map +1 -0
- package/dist/tools/ctxGetTaskContext.d.ts +103 -0
- package/dist/tools/ctxGetTaskContext.js +274 -0
- package/dist/tools/ctxGetTaskContext.js.map +1 -0
- package/dist/tools/ctxQueryTraces.d.ts +142 -0
- package/dist/tools/ctxQueryTraces.js +194 -0
- package/dist/tools/ctxQueryTraces.js.map +1 -0
- package/dist/tools/ctxSaveTrace.d.ts +87 -0
- package/dist/tools/ctxSaveTrace.js +94 -0
- package/dist/tools/ctxSaveTrace.js.map +1 -0
- package/dist/tools/debug.d.ts +206 -0
- package/dist/tools/debug.js +234 -0
- package/dist/tools/debug.js.map +1 -0
- package/dist/tools/decorations.d.ts +130 -0
- package/dist/tools/decorations.js +160 -0
- package/dist/tools/decorations.js.map +1 -0
- package/dist/tools/detectUnusedCode.d.ts +78 -0
- package/dist/tools/detectUnusedCode.js +173 -0
- package/dist/tools/detectUnusedCode.js.map +1 -0
- package/dist/tools/documentLinks.d.ts +62 -0
- package/dist/tools/documentLinks.js +55 -0
- package/dist/tools/documentLinks.js.map +1 -0
- package/dist/tools/editText.d.ts +108 -0
- package/dist/tools/editText.js +318 -0
- package/dist/tools/editText.js.map +1 -0
- package/dist/tools/enrichCommit.d.ts +89 -0
- package/dist/tools/enrichCommit.js +201 -0
- package/dist/tools/enrichCommit.js.map +1 -0
- package/dist/tools/enrichStackTrace.d.ts +121 -0
- package/dist/tools/enrichStackTrace.js +194 -0
- package/dist/tools/enrichStackTrace.js.map +1 -0
- package/dist/tools/explainDiagnostic.d.ts +137 -0
- package/dist/tools/explainDiagnostic.js +230 -0
- package/dist/tools/explainDiagnostic.js.map +1 -0
- package/dist/tools/explainSymbol.d.ts +119 -0
- package/dist/tools/explainSymbol.js +177 -0
- package/dist/tools/explainSymbol.js.map +1 -0
- package/dist/tools/fileOperations.d.ts +186 -0
- package/dist/tools/fileOperations.js +330 -0
- package/dist/tools/fileOperations.js.map +1 -0
- package/dist/tools/fileWatcher.d.ts +107 -0
- package/dist/tools/fileWatcher.js +121 -0
- package/dist/tools/fileWatcher.js.map +1 -0
- package/dist/tools/findFiles.d.ts +65 -0
- package/dist/tools/findFiles.js +142 -0
- package/dist/tools/findFiles.js.map +1 -0
- package/dist/tools/findRelatedTests.d.ts +83 -0
- package/dist/tools/findRelatedTests.js +196 -0
- package/dist/tools/findRelatedTests.js.map +1 -0
- package/dist/tools/fixAllLintErrors.d.ts +66 -0
- package/dist/tools/fixAllLintErrors.js +128 -0
- package/dist/tools/fixAllLintErrors.js.map +1 -0
- package/dist/tools/foldingRanges.d.ts +50 -0
- package/dist/tools/foldingRanges.js +51 -0
- package/dist/tools/foldingRanges.js.map +1 -0
- package/dist/tools/formatAndSave.d.ts +57 -0
- package/dist/tools/formatAndSave.js +87 -0
- package/dist/tools/formatAndSave.js.map +1 -0
- package/dist/tools/formatDocument.d.ts +61 -0
- package/dist/tools/formatDocument.js +144 -0
- package/dist/tools/formatDocument.js.map +1 -0
- package/dist/tools/generateAPIDocumentation.d.ts +62 -0
- package/dist/tools/generateAPIDocumentation.js +249 -0
- package/dist/tools/generateAPIDocumentation.js.map +1 -0
- package/dist/tools/generateTests.d.ts +75 -0
- package/dist/tools/generateTests.js +226 -0
- package/dist/tools/generateTests.js.map +1 -0
- package/dist/tools/getAIComments.d.ts +79 -0
- package/dist/tools/getAIComments.js +93 -0
- package/dist/tools/getAIComments.js.map +1 -0
- package/dist/tools/getAnalyticsReport.d.ts +102 -0
- package/dist/tools/getAnalyticsReport.js +137 -0
- package/dist/tools/getAnalyticsReport.js.map +1 -0
- package/dist/tools/getArchitectureContext.d.ts +85 -0
- package/dist/tools/getArchitectureContext.js +135 -0
- package/dist/tools/getArchitectureContext.js.map +1 -0
- package/dist/tools/getBufferContent.d.ts +80 -0
- package/dist/tools/getBufferContent.js +207 -0
- package/dist/tools/getBufferContent.js.map +1 -0
- package/dist/tools/getChangeImpact.d.ts +76 -0
- package/dist/tools/getChangeImpact.js +184 -0
- package/dist/tools/getChangeImpact.js.map +1 -0
- package/dist/tools/getClaudeTaskStatus.d.ts +87 -0
- package/dist/tools/getClaudeTaskStatus.js +89 -0
- package/dist/tools/getClaudeTaskStatus.js.map +1 -0
- package/dist/tools/getCodeCoverage.d.ts +86 -0
- package/dist/tools/getCodeCoverage.js +237 -0
- package/dist/tools/getCodeCoverage.js.map +1 -0
- package/dist/tools/getCommitsForIssue.d.ts +98 -0
- package/dist/tools/getCommitsForIssue.js +106 -0
- package/dist/tools/getCommitsForIssue.js.map +1 -0
- package/dist/tools/getCurrentSelection.d.ts +123 -0
- package/dist/tools/getCurrentSelection.js +113 -0
- package/dist/tools/getCurrentSelection.js.map +1 -0
- package/dist/tools/getDebugState.d.ts +140 -0
- package/dist/tools/getDebugState.js +109 -0
- package/dist/tools/getDebugState.js.map +1 -0
- package/dist/tools/getDependencyTree.d.ts +59 -0
- package/dist/tools/getDependencyTree.js +207 -0
- package/dist/tools/getDependencyTree.js.map +1 -0
- package/dist/tools/getDiagnostics.d.ts +108 -0
- package/dist/tools/getDiagnostics.js +371 -0
- package/dist/tools/getDiagnostics.js.map +1 -0
- package/dist/tools/getDiffFromHandoff.d.ts +89 -0
- package/dist/tools/getDiffFromHandoff.js +163 -0
- package/dist/tools/getDiffFromHandoff.js.map +1 -0
- package/dist/tools/getDocumentSymbols.d.ts +74 -0
- package/dist/tools/getDocumentSymbols.js +177 -0
- package/dist/tools/getDocumentSymbols.js.map +1 -0
- package/dist/tools/getFileTree.d.ts +66 -0
- package/dist/tools/getFileTree.js +131 -0
- package/dist/tools/getFileTree.js.map +1 -0
- package/dist/tools/getGitDiff.d.ts +50 -0
- package/dist/tools/getGitDiff.js +73 -0
- package/dist/tools/getGitDiff.js.map +1 -0
- package/dist/tools/getGitHotspots.d.ts +88 -0
- package/dist/tools/getGitHotspots.js +145 -0
- package/dist/tools/getGitHotspots.js.map +1 -0
- package/dist/tools/getGitLog.d.ts +62 -0
- package/dist/tools/getGitLog.js +87 -0
- package/dist/tools/getGitLog.js.map +1 -0
- package/dist/tools/getGitStatus.d.ts +72 -0
- package/dist/tools/getGitStatus.js +126 -0
- package/dist/tools/getGitStatus.js.map +1 -0
- package/dist/tools/getImportTree.d.ts +73 -0
- package/dist/tools/getImportTree.js +223 -0
- package/dist/tools/getImportTree.js.map +1 -0
- package/dist/tools/getImportedSignatures.d.ts +62 -0
- package/dist/tools/getImportedSignatures.js +255 -0
- package/dist/tools/getImportedSignatures.js.map +1 -0
- package/dist/tools/getOpenEditors.d.ts +62 -0
- package/dist/tools/getOpenEditors.js +126 -0
- package/dist/tools/getOpenEditors.js.map +1 -0
- package/dist/tools/getPRTemplate.d.ts +68 -0
- package/dist/tools/getPRTemplate.js +187 -0
- package/dist/tools/getPRTemplate.js.map +1 -0
- package/dist/tools/getProjectContext.d.ts +114 -0
- package/dist/tools/getProjectContext.js +344 -0
- package/dist/tools/getProjectContext.js.map +1 -0
- package/dist/tools/getProjectInfo.d.ts +51 -0
- package/dist/tools/getProjectInfo.js +325 -0
- package/dist/tools/getProjectInfo.js.map +1 -0
- package/dist/tools/getSecurityAdvisories.d.ts +105 -0
- package/dist/tools/getSecurityAdvisories.js +472 -0
- package/dist/tools/getSecurityAdvisories.js.map +1 -0
- package/dist/tools/getSessionUsage.d.ts +58 -0
- package/dist/tools/getSessionUsage.js +57 -0
- package/dist/tools/getSessionUsage.js.map +1 -0
- package/dist/tools/getSymbolHistory.d.ts +157 -0
- package/dist/tools/getSymbolHistory.js +256 -0
- package/dist/tools/getSymbolHistory.js.map +1 -0
- package/dist/tools/getToolCapabilities.d.ts +69 -0
- package/dist/tools/getToolCapabilities.js +298 -0
- package/dist/tools/getToolCapabilities.js.map +1 -0
- package/dist/tools/getTypeSignature.d.ts +70 -0
- package/dist/tools/getTypeSignature.js +132 -0
- package/dist/tools/getTypeSignature.js.map +1 -0
- package/dist/tools/getWorkspaceFolders.d.ts +58 -0
- package/dist/tools/getWorkspaceFolders.js +69 -0
- package/dist/tools/getWorkspaceFolders.js.map +1 -0
- package/dist/tools/getWorkspaceSettings.d.ts +44 -0
- package/dist/tools/getWorkspaceSettings.js +70 -0
- package/dist/tools/getWorkspaceSettings.js.map +1 -0
- package/dist/tools/git-utils.d.ts +16 -0
- package/dist/tools/git-utils.js +46 -0
- package/dist/tools/git-utils.js.map +1 -0
- package/dist/tools/gitHistory.d.ts +110 -0
- package/dist/tools/gitHistory.js +167 -0
- package/dist/tools/gitHistory.js.map +1 -0
- package/dist/tools/gitWrite.d.ts +612 -0
- package/dist/tools/gitWrite.js +983 -0
- package/dist/tools/gitWrite.js.map +1 -0
- package/dist/tools/github/actions.d.ts +152 -0
- package/dist/tools/github/actions.js +195 -0
- package/dist/tools/github/actions.js.map +1 -0
- package/dist/tools/github/index.d.ts +3 -0
- package/dist/tools/github/index.js +4 -0
- package/dist/tools/github/index.js.map +1 -0
- package/dist/tools/github/issues.d.ts +281 -0
- package/dist/tools/github/issues.js +340 -0
- package/dist/tools/github/issues.js.map +1 -0
- package/dist/tools/github/pr.d.ts +433 -0
- package/dist/tools/github/pr.js +588 -0
- package/dist/tools/github/pr.js.map +1 -0
- package/dist/tools/github/shared.d.ts +4 -0
- package/dist/tools/github/shared.js +12 -0
- package/dist/tools/github/shared.js.map +1 -0
- package/dist/tools/handoffNote.d.ts +106 -0
- package/dist/tools/handoffNote.js +232 -0
- package/dist/tools/handoffNote.js.map +1 -0
- package/dist/tools/headless/lspClient.d.ts +26 -0
- package/dist/tools/headless/lspClient.js +221 -0
- package/dist/tools/headless/lspClient.js.map +1 -0
- package/dist/tools/headless/lspFallback.d.ts +28 -0
- package/dist/tools/headless/lspFallback.js +122 -0
- package/dist/tools/headless/lspFallback.js.map +1 -0
- package/dist/tools/hoverAtCursor.d.ts +54 -0
- package/dist/tools/hoverAtCursor.js +68 -0
- package/dist/tools/hoverAtCursor.js.map +1 -0
- package/dist/tools/httpClient.d.ts +141 -0
- package/dist/tools/httpClient.js +486 -0
- package/dist/tools/httpClient.js.map +1 -0
- package/dist/tools/index.d.ts +49 -0
- package/dist/tools/index.js +672 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inlayHints.d.ts +81 -0
- package/dist/tools/inlayHints.js +76 -0
- package/dist/tools/inlayHints.js.map +1 -0
- package/dist/tools/issueRefs.d.ts +14 -0
- package/dist/tools/issueRefs.js +27 -0
- package/dist/tools/issueRefs.js.map +1 -0
- package/dist/tools/jumpToFirstError.d.ts +63 -0
- package/dist/tools/jumpToFirstError.js +124 -0
- package/dist/tools/jumpToFirstError.js.map +1 -0
- package/dist/tools/launchQuickTask.d.ts +76 -0
- package/dist/tools/launchQuickTask.js +170 -0
- package/dist/tools/launchQuickTask.js.map +1 -0
- package/dist/tools/linters/biome.d.ts +2 -0
- package/dist/tools/linters/biome.js +44 -0
- package/dist/tools/linters/biome.js.map +1 -0
- package/dist/tools/linters/cargo.d.ts +2 -0
- package/dist/tools/linters/cargo.js +45 -0
- package/dist/tools/linters/cargo.js.map +1 -0
- package/dist/tools/linters/eslint.d.ts +2 -0
- package/dist/tools/linters/eslint.js +59 -0
- package/dist/tools/linters/eslint.js.map +1 -0
- package/dist/tools/linters/govet.d.ts +2 -0
- package/dist/tools/linters/govet.js +37 -0
- package/dist/tools/linters/govet.js.map +1 -0
- package/dist/tools/linters/pyright.d.ts +2 -0
- package/dist/tools/linters/pyright.js +34 -0
- package/dist/tools/linters/pyright.js.map +1 -0
- package/dist/tools/linters/ruff.d.ts +2 -0
- package/dist/tools/linters/ruff.js +30 -0
- package/dist/tools/linters/ruff.js.map +1 -0
- package/dist/tools/linters/types.d.ts +16 -0
- package/dist/tools/linters/types.js +2 -0
- package/dist/tools/linters/types.js.map +1 -0
- package/dist/tools/linters/typescript.d.ts +2 -0
- package/dist/tools/linters/typescript.js +38 -0
- package/dist/tools/linters/typescript.js.map +1 -0
- package/dist/tools/listClaudeTasks.d.ts +84 -0
- package/dist/tools/listClaudeTasks.js +88 -0
- package/dist/tools/listClaudeTasks.js.map +1 -0
- package/dist/tools/listTerminals.d.ts +55 -0
- package/dist/tools/listTerminals.js +78 -0
- package/dist/tools/listTerminals.js.map +1 -0
- package/dist/tools/lsp.d.ts +1086 -0
- package/dist/tools/lsp.js +1339 -0
- package/dist/tools/lsp.js.map +1 -0
- package/dist/tools/navigateToSymbolByName.d.ts +56 -0
- package/dist/tools/navigateToSymbolByName.js +170 -0
- package/dist/tools/navigateToSymbolByName.js.map +1 -0
- package/dist/tools/openDiff.d.ts +66 -0
- package/dist/tools/openDiff.js +126 -0
- package/dist/tools/openDiff.js.map +1 -0
- package/dist/tools/openFile.d.ts +69 -0
- package/dist/tools/openFile.js +129 -0
- package/dist/tools/openFile.js.map +1 -0
- package/dist/tools/openInBrowser.d.ts +55 -0
- package/dist/tools/openInBrowser.js +129 -0
- package/dist/tools/openInBrowser.js.map +1 -0
- package/dist/tools/organizeImports.d.ts +56 -0
- package/dist/tools/organizeImports.js +115 -0
- package/dist/tools/organizeImports.js.map +1 -0
- package/dist/tools/performanceReport.d.ts +133 -0
- package/dist/tools/performanceReport.js +218 -0
- package/dist/tools/performanceReport.js.map +1 -0
- package/dist/tools/planPersistence.d.ts +306 -0
- package/dist/tools/planPersistence.js +485 -0
- package/dist/tools/planPersistence.js.map +1 -0
- package/dist/tools/previewEdit.d.ts +107 -0
- package/dist/tools/previewEdit.js +270 -0
- package/dist/tools/previewEdit.js.map +1 -0
- package/dist/tools/recentTracesDigest.d.ts +35 -0
- package/dist/tools/recentTracesDigest.js +98 -0
- package/dist/tools/recentTracesDigest.js.map +1 -0
- package/dist/tools/refactorAnalyze.d.ts +78 -0
- package/dist/tools/refactorAnalyze.js +141 -0
- package/dist/tools/refactorAnalyze.js.map +1 -0
- package/dist/tools/refactorExtractFunction.d.ts +52 -0
- package/dist/tools/refactorExtractFunction.js +121 -0
- package/dist/tools/refactorExtractFunction.js.map +1 -0
- package/dist/tools/refactorPreview.d.ts +75 -0
- package/dist/tools/refactorPreview.js +93 -0
- package/dist/tools/refactorPreview.js.map +1 -0
- package/dist/tools/replaceBlock.d.ts +62 -0
- package/dist/tools/replaceBlock.js +125 -0
- package/dist/tools/replaceBlock.js.map +1 -0
- package/dist/tools/resumeClaudeTask.d.ts +75 -0
- package/dist/tools/resumeClaudeTask.js +149 -0
- package/dist/tools/resumeClaudeTask.js.map +1 -0
- package/dist/tools/runClaudeTask.d.ts +97 -0
- package/dist/tools/runClaudeTask.js +224 -0
- package/dist/tools/runClaudeTask.js.map +1 -0
- package/dist/tools/runCommand.d.ts +82 -0
- package/dist/tools/runCommand.js +101 -0
- package/dist/tools/runCommand.js.map +1 -0
- package/dist/tools/runTests.d.ts +146 -0
- package/dist/tools/runTests.js +315 -0
- package/dist/tools/runTests.js.map +1 -0
- package/dist/tools/saveDocument.d.ts +50 -0
- package/dist/tools/saveDocument.js +73 -0
- package/dist/tools/saveDocument.js.map +1 -0
- package/dist/tools/screenshot.d.ts +23 -0
- package/dist/tools/screenshot.js +43 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/screenshotAndAnnotate.d.ts +103 -0
- package/dist/tools/screenshotAndAnnotate.js +192 -0
- package/dist/tools/screenshotAndAnnotate.js.map +1 -0
- package/dist/tools/searchAndReplace.d.ts +108 -0
- package/dist/tools/searchAndReplace.js +281 -0
- package/dist/tools/searchAndReplace.js.map +1 -0
- package/dist/tools/searchTools.d.ts +61 -0
- package/dist/tools/searchTools.js +85 -0
- package/dist/tools/searchTools.js.map +1 -0
- package/dist/tools/searchWorkspace.d.ts +99 -0
- package/dist/tools/searchWorkspace.js +189 -0
- package/dist/tools/searchWorkspace.js.map +1 -0
- package/dist/tools/selectionRanges.d.ts +58 -0
- package/dist/tools/selectionRanges.js +61 -0
- package/dist/tools/selectionRanges.js.map +1 -0
- package/dist/tools/semanticTokens.d.ts +87 -0
- package/dist/tools/semanticTokens.js +86 -0
- package/dist/tools/semanticTokens.js.map +1 -0
- package/dist/tools/setActiveWorkspaceFolder.d.ts +41 -0
- package/dist/tools/setActiveWorkspaceFolder.js +38 -0
- package/dist/tools/setActiveWorkspaceFolder.js.map +1 -0
- package/dist/tools/signatureHelp.d.ts +86 -0
- package/dist/tools/signatureHelp.js +79 -0
- package/dist/tools/signatureHelp.js.map +1 -0
- package/dist/tools/spawnWorkspace.d.ts +103 -0
- package/dist/tools/spawnWorkspace.js +268 -0
- package/dist/tools/spawnWorkspace.js.map +1 -0
- package/dist/tools/stackTraceParser.d.ts +43 -0
- package/dist/tools/stackTraceParser.js +139 -0
- package/dist/tools/stackTraceParser.js.map +1 -0
- package/dist/tools/terminal.d.ts +352 -0
- package/dist/tools/terminal.js +670 -0
- package/dist/tools/terminal.js.map +1 -0
- package/dist/tools/testRunners/cargoTest.d.ts +2 -0
- package/dist/tools/testRunners/cargoTest.js +129 -0
- package/dist/tools/testRunners/cargoTest.js.map +1 -0
- package/dist/tools/testRunners/goTest.d.ts +2 -0
- package/dist/tools/testRunners/goTest.js +108 -0
- package/dist/tools/testRunners/goTest.js.map +1 -0
- package/dist/tools/testRunners/pytest.d.ts +2 -0
- package/dist/tools/testRunners/pytest.js +135 -0
- package/dist/tools/testRunners/pytest.js.map +1 -0
- package/dist/tools/testRunners/types.d.ts +18 -0
- package/dist/tools/testRunners/types.js +2 -0
- package/dist/tools/testRunners/types.js.map +1 -0
- package/dist/tools/testRunners/vitestJest.d.ts +3 -0
- package/dist/tools/testRunners/vitestJest.js +215 -0
- package/dist/tools/testRunners/vitestJest.js.map +1 -0
- package/dist/tools/testTraceToSource.d.ts +80 -0
- package/dist/tools/testTraceToSource.js +206 -0
- package/dist/tools/testTraceToSource.js.map +1 -0
- package/dist/tools/transaction.d.ts +243 -0
- package/dist/tools/transaction.js +309 -0
- package/dist/tools/transaction.js.map +1 -0
- package/dist/tools/typeHierarchy.d.ts +77 -0
- package/dist/tools/typeHierarchy.js +86 -0
- package/dist/tools/typeHierarchy.js.map +1 -0
- package/dist/tools/utils.d.ts +124 -0
- package/dist/tools/utils.js +566 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/tools/vscodeCommands.d.ts +90 -0
- package/dist/tools/vscodeCommands.js +112 -0
- package/dist/tools/vscodeCommands.js.map +1 -0
- package/dist/tools/vscodeTasks.d.ts +102 -0
- package/dist/tools/vscodeTasks.js +110 -0
- package/dist/tools/vscodeTasks.js.map +1 -0
- package/dist/tools/watchDiagnostics.d.ts +64 -0
- package/dist/tools/watchDiagnostics.js +270 -0
- package/dist/tools/watchDiagnostics.js.map +1 -0
- package/dist/tools/workspaceSettings.d.ts +57 -0
- package/dist/tools/workspaceSettings.js +80 -0
- package/dist/tools/workspaceSettings.js.map +1 -0
- package/dist/transport.d.ts +207 -0
- package/dist/transport.js +1272 -0
- package/dist/transport.js.map +1 -0
- package/dist/version.d.ts +13 -0
- package/dist/version.js +31 -0
- package/dist/version.js.map +1 -0
- package/dist/wsUtils.d.ts +8 -0
- package/dist/wsUtils.js +54 -0
- package/dist/wsUtils.js.map +1 -0
- package/package.json +118 -0
- package/scripts/gen-claude-desktop-config.sh +124 -0
- package/scripts/gen-mcp-config.sh +390 -0
- package/scripts/install-extension.sh +106 -0
- package/scripts/mcp-stdio-shim.cjs +482 -0
- package/scripts/postinstall.mjs +68 -0
- package/scripts/start-all.sh +502 -0
- package/scripts/start-orchestrator.sh +186 -0
- package/scripts/start-remote.sh +126 -0
- package/scripts/start-vps.sh +116 -0
- package/templates/CLAUDE.bridge.md +125 -0
- package/templates/automation-policies/security-first.json +46 -0
- package/templates/automation-policies/strict-lint.json +41 -0
- package/templates/automation-policies/test-driven.json +54 -0
- package/templates/automation-policy.example.json +105 -0
- package/templates/bridge-tools.md +111 -0
- package/templates/dispatch-context.md +33 -0
- package/templates/managed-agent/code-review-agent.md +50 -0
- package/templates/managed-agent/managed-agent-mcp.json +102 -0
- package/templates/recipes/ambient-journal.yaml +11 -0
- package/templates/recipes/daily-status.yaml +21 -0
- package/templates/recipes/lint-on-save.yaml +13 -0
- package/templates/recipes/stale-branches.yaml +18 -0
- package/templates/recipes/watch-failing-tests.yaml +15 -0
- package/templates/scheduled-tasks/dependency-audit/SKILL.md +77 -0
- package/templates/scheduled-tasks/health-check/SKILL.md +73 -0
- package/templates/scheduled-tasks/nightly-review/SKILL.md +69 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OrchestratorBridge — multi-IDE proxy layer.
|
|
3
|
+
*
|
|
4
|
+
* This is NOT the same as the regular `Bridge` in `src/bridge.ts`.
|
|
5
|
+
*
|
|
6
|
+
* | Aspect | Bridge (bridge.ts) | OrchestratorBridge (this file) |
|
|
7
|
+
* |-----------------|---------------------------------------------|----------------------------------------------------------|
|
|
8
|
+
* | Purpose | Direct MCP server for a single IDE/workspace | Proxy that fans out to one or more child Bridge instances |
|
|
9
|
+
* | Tool execution | Runs tools locally (fs, LSP, git, etc.) | Forwards every tool call to the appropriate child bridge |
|
|
10
|
+
* | Clients | Claude Code CLI, Claude Desktop, remote HTTP | Claude Code CLI only (WebSocket) |
|
|
11
|
+
* | Lock file flag | `isBridge: true` | `orchestrator: true` |
|
|
12
|
+
* | Start command | `claude-ide-bridge` (default) | `claude-ide-bridge --mode orchestrator` |
|
|
13
|
+
* | Multi-IDE | Single workspace | Discovers all running bridges via lock-file scan, routes |
|
|
14
|
+
* |
|
|
15
|
+
* Why they look identical in Claude's tool list: the orchestrator exposes the
|
|
16
|
+
* same tool *names* as its child bridges (they are proxied 1-for-1, with an
|
|
17
|
+
* optional `__<IDE>` suffix when multiple workspaces conflict). In a single-IDE
|
|
18
|
+
* setup the tool lists are therefore identical, which is expected — every call
|
|
19
|
+
* is transparently forwarded.
|
|
20
|
+
*
|
|
21
|
+
* Use OrchestratorBridge when you need to address multiple IDE workspaces from
|
|
22
|
+
* one Claude session. Use Bridge directly for a single-workspace setup.
|
|
23
|
+
*/
|
|
24
|
+
import { randomUUID } from "node:crypto";
|
|
25
|
+
import { ErrorCodes } from "../errors.js";
|
|
26
|
+
import { buildEnforcementReminder } from "../instructionsUtils.js";
|
|
27
|
+
import { LockFileManager } from "../lockfile.js";
|
|
28
|
+
import { Logger } from "../logger.js";
|
|
29
|
+
import { Server } from "../server.js";
|
|
30
|
+
import { McpTransport } from "../transport.js";
|
|
31
|
+
import { PACKAGE_VERSION } from "../version.js";
|
|
32
|
+
import { ChildBridgeClient } from "./childBridgeClient.js";
|
|
33
|
+
import { ChildBridgeRegistry } from "./childBridgeRegistry.js";
|
|
34
|
+
import { createOrchestratorTools } from "./orchestratorTools.js";
|
|
35
|
+
export class OrchestratorBridge {
|
|
36
|
+
config;
|
|
37
|
+
logger;
|
|
38
|
+
server;
|
|
39
|
+
lockFile;
|
|
40
|
+
registry;
|
|
41
|
+
clients = new Map();
|
|
42
|
+
sessions = new Map();
|
|
43
|
+
authToken;
|
|
44
|
+
startedAt = Date.now();
|
|
45
|
+
healthTimer = null;
|
|
46
|
+
constructor(config) {
|
|
47
|
+
this.config = config;
|
|
48
|
+
this.logger = new Logger(config.verbose, config.jsonl);
|
|
49
|
+
this.lockFile = new LockFileManager(this.logger);
|
|
50
|
+
this.registry = new ChildBridgeRegistry(config.lockDir, config.healthIntervalMs, config.port);
|
|
51
|
+
this.authToken = config.fixedToken ?? randomUUID();
|
|
52
|
+
this.server = new Server(this.authToken, this.logger);
|
|
53
|
+
}
|
|
54
|
+
async start() {
|
|
55
|
+
this.logger.info(`Orchestrator bridge starting on port ${this.config.port}`);
|
|
56
|
+
// Discover child bridges
|
|
57
|
+
this.registry.start();
|
|
58
|
+
// Initial health probe
|
|
59
|
+
await this.probeAll();
|
|
60
|
+
// Start health probe loop
|
|
61
|
+
this.healthTimer = setInterval(async () => {
|
|
62
|
+
this.registry.refresh();
|
|
63
|
+
await this.probeAll();
|
|
64
|
+
}, this.config.healthIntervalMs);
|
|
65
|
+
this.healthTimer.unref();
|
|
66
|
+
// Start HTTP/WS server
|
|
67
|
+
this.server.on("connection", (ws) => this.handleConnection(ws));
|
|
68
|
+
await this.server.listen(this.config.port, this.config.bindAddress);
|
|
69
|
+
// Write lock file with orchestrator: true
|
|
70
|
+
this.lockFile.write(this.config.port, this.authToken, [], "Orchestrator", {
|
|
71
|
+
orchestrator: true,
|
|
72
|
+
});
|
|
73
|
+
this.setupShutdownHandlers();
|
|
74
|
+
this.logger.info(`Orchestrator bridge ready on port ${this.config.port} (token: ${this.authToken.slice(0, 8)}...)`);
|
|
75
|
+
this.logger.info(`Monitoring ${this.registry.getAll().length} child bridge(s)`);
|
|
76
|
+
}
|
|
77
|
+
async probeAll() {
|
|
78
|
+
const bridges = this.registry.getAll();
|
|
79
|
+
await Promise.all(bridges.map(async (b) => {
|
|
80
|
+
let client = this.clients.get(b.port);
|
|
81
|
+
if (!client) {
|
|
82
|
+
client = new ChildBridgeClient(b.port, b.authToken);
|
|
83
|
+
this.clients.set(b.port, client);
|
|
84
|
+
}
|
|
85
|
+
const alive = await client.ping();
|
|
86
|
+
const elapsed = Date.now() - b.discoveredAt;
|
|
87
|
+
const inGrace = b.warmingUp && elapsed < 15_000;
|
|
88
|
+
if (alive) {
|
|
89
|
+
// First success for a warming bridge — reset any startup failure counts
|
|
90
|
+
if (b.warmingUp) {
|
|
91
|
+
client.resetCircuit();
|
|
92
|
+
}
|
|
93
|
+
// Always re-fetch tools so plugin hot-reloads are reflected in new sessions.
|
|
94
|
+
// For existing sessions, re-register proxied tools and notify clients if the
|
|
95
|
+
// tool list changed (e.g., after a plugin reload in the child bridge).
|
|
96
|
+
const prevToolNames = b.tools.map((t) => t.name).join(",");
|
|
97
|
+
const tools = await client.listTools();
|
|
98
|
+
// If listTools() returned empty, the HTTP session init likely failed silently.
|
|
99
|
+
// Don't mark the bridge healthy yet — keep it warming so the next probe retries.
|
|
100
|
+
// A real bridge always has at least one tool registered.
|
|
101
|
+
if (tools.length === 0 && !b.healthy) {
|
|
102
|
+
this.logger.debug(`Bridge port ${b.port} (${b.ideName}) pinged alive but returned 0 tools — retrying next cycle`);
|
|
103
|
+
this.registry.keepWarm(b.port);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const nextToolNames = tools.map((t) => t.name).join(",");
|
|
107
|
+
this.registry.markHealthy(b.port, tools);
|
|
108
|
+
if (prevToolNames !== nextToolNames && this.sessions.size > 0) {
|
|
109
|
+
this.logger.info(`Tool list changed for bridge port ${b.port} — refreshing ${this.sessions.size} session(s)`);
|
|
110
|
+
for (const session of this.sessions.values()) {
|
|
111
|
+
this.refreshProxiedToolsForSession(session);
|
|
112
|
+
if (session.ws.readyState === 1 /* OPEN */) {
|
|
113
|
+
McpTransport.sendNotification(session.ws, "notifications/tools/list_changed", undefined, this.logger);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else if (inGrace) {
|
|
119
|
+
// Still within startup grace window — don't penalise, just wait
|
|
120
|
+
this.registry.keepWarm(b.port);
|
|
121
|
+
this.logger.debug(`Bridge port ${b.port} (${b.ideName}) warming up — ${Math.round(elapsed / 1000)}s elapsed`);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// Grace window expired or bridge was already healthy — count the failure
|
|
125
|
+
if (b.warmingUp)
|
|
126
|
+
this.registry.markWarm(b.port);
|
|
127
|
+
this.registry.markUnhealthy(b.port);
|
|
128
|
+
await client.closeSession().catch(() => { });
|
|
129
|
+
}
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
handleConnection(ws) {
|
|
133
|
+
const sessionId = randomUUID();
|
|
134
|
+
const transport = new McpTransport(this.logger);
|
|
135
|
+
// Build the workspace-aware instructions string
|
|
136
|
+
const instructions = this.buildInstructions();
|
|
137
|
+
transport.setInstructions(instructions);
|
|
138
|
+
// In multi-bridge mode, pre-pin to the best bridge so we only expose
|
|
139
|
+
// that bridge's tools at connection time (lazy tool exposure).
|
|
140
|
+
const healthy = this.registry.getHealthy();
|
|
141
|
+
const initialStickyPort = healthy.length > 1 ? (this.registry.pickBest()?.port ?? null) : null;
|
|
142
|
+
// Register orchestrator-native tools
|
|
143
|
+
const tools = createOrchestratorTools({
|
|
144
|
+
registry: this.registry,
|
|
145
|
+
config: this.config,
|
|
146
|
+
startedAt: this.startedAt,
|
|
147
|
+
getActiveSessions: () => this.sessions.size,
|
|
148
|
+
setStickyBridge: (port) => {
|
|
149
|
+
const s = this.sessions.get(sessionId);
|
|
150
|
+
if (s) {
|
|
151
|
+
s.stickyBridgePort = port;
|
|
152
|
+
// Swap exposed tools to match the new active bridge.
|
|
153
|
+
this.refreshProxiedToolsForSession(s);
|
|
154
|
+
if (s.ws.readyState === 1 /* OPEN */) {
|
|
155
|
+
McpTransport.sendNotification(s.ws, "notifications/tools/list_changed", undefined, this.logger);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
for (const tool of tools) {
|
|
161
|
+
transport.registerTool(tool.schema, tool.handler);
|
|
162
|
+
}
|
|
163
|
+
const session = {
|
|
164
|
+
id: sessionId,
|
|
165
|
+
ws,
|
|
166
|
+
transport,
|
|
167
|
+
stickyBridgePort: initialStickyPort,
|
|
168
|
+
registeredProxyNames: new Set(),
|
|
169
|
+
connectedAt: Date.now(),
|
|
170
|
+
};
|
|
171
|
+
this.sessions.set(sessionId, session);
|
|
172
|
+
// Register proxied tools (filtered to active bridge when multi-bridge)
|
|
173
|
+
this.refreshProxiedToolsForSession(session);
|
|
174
|
+
transport.attach(ws);
|
|
175
|
+
// Auth was already validated at WebSocket upgrade time (server.ts).
|
|
176
|
+
// Mark the transport ready immediately so tool calls work even when
|
|
177
|
+
// the MCP client reconnects without re-sending the initialize handshake
|
|
178
|
+
// (e.g. after an orchestrator restart or dropped connection).
|
|
179
|
+
transport.markInitialized();
|
|
180
|
+
ws.on("close", () => {
|
|
181
|
+
this.sessions.delete(sessionId);
|
|
182
|
+
this.logger.debug(`Session closed: ${sessionId.slice(0, 8)}`);
|
|
183
|
+
});
|
|
184
|
+
this.logger.info(`Client connected: session ${sessionId.slice(0, 8)}`);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Recompute proxied tools for a session and update the transport in-place.
|
|
188
|
+
*
|
|
189
|
+
* Multi-bridge mode (session has a stickyBridgePort): expose only the active
|
|
190
|
+
* bridge's tools, no suffix/prefix needed. Tools exclusive to the previous
|
|
191
|
+
* bridge are deregistered so the tool list stays lean.
|
|
192
|
+
*
|
|
193
|
+
* Single-bridge mode (one healthy bridge): expose all tools with no prefix.
|
|
194
|
+
* All-bridges mode (multi-bridge but no sticky yet): expose all bridges with
|
|
195
|
+
* [wsN] prefix and __IDE suffix on conflicts.
|
|
196
|
+
*/
|
|
197
|
+
refreshProxiedToolsForSession(session) {
|
|
198
|
+
const healthy = this.registry.getHealthy();
|
|
199
|
+
const filterPort = healthy.length > 1 ? session.stickyBridgePort : null;
|
|
200
|
+
const newNames = new Set();
|
|
201
|
+
if (filterPort !== null) {
|
|
202
|
+
// Lazy mode: expose only the active bridge's tools
|
|
203
|
+
const b = healthy.find((h) => h.port === filterPort);
|
|
204
|
+
if (b) {
|
|
205
|
+
for (const tool of b.tools) {
|
|
206
|
+
if (!/^[a-zA-Z0-9_]+$/.test(tool.name))
|
|
207
|
+
continue;
|
|
208
|
+
newNames.add(tool.name);
|
|
209
|
+
const capturedPort = b.port;
|
|
210
|
+
const capturedToolName = tool.name;
|
|
211
|
+
session.transport.replaceTool({ ...tool, description: tool.description }, async (args, signal) => this.routeToolCall(capturedToolName, args, session, signal, capturedPort));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
// Full mode: all bridges with [wsN] prefix and __IDE suffix on conflicts
|
|
217
|
+
const toolNameCount = new Map();
|
|
218
|
+
for (const b of healthy) {
|
|
219
|
+
for (const tool of b.tools) {
|
|
220
|
+
toolNameCount.set(tool.name, (toolNameCount.get(tool.name) ?? 0) + 1);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const ideNameCount = new Map();
|
|
224
|
+
for (const b of healthy) {
|
|
225
|
+
ideNameCount.set(b.ideName, (ideNameCount.get(b.ideName) ?? 0) + 1);
|
|
226
|
+
}
|
|
227
|
+
for (const b of healthy) {
|
|
228
|
+
const ideTag = b.ideName.replace(/[^a-zA-Z0-9]/g, "");
|
|
229
|
+
const ideNameAmbiguous = (ideNameCount.get(b.ideName) ?? 0) > 1;
|
|
230
|
+
const suffix = healthy.length > 1
|
|
231
|
+
? `__${ideTag}${ideNameAmbiguous ? `_${b.port}` : ""}`
|
|
232
|
+
: "";
|
|
233
|
+
const wsIndex = healthy.indexOf(b);
|
|
234
|
+
const descPrefix = healthy.length === 1 ? "" : `[ws${wsIndex + 1}] `;
|
|
235
|
+
for (const tool of b.tools) {
|
|
236
|
+
const hasConflict = (toolNameCount.get(tool.name) ?? 0) > 1;
|
|
237
|
+
const proxyName = hasConflict ? `${tool.name}${suffix}` : tool.name;
|
|
238
|
+
if (!/^[a-zA-Z0-9_]+$/.test(proxyName))
|
|
239
|
+
continue;
|
|
240
|
+
newNames.add(proxyName);
|
|
241
|
+
const capturedPort = b.port;
|
|
242
|
+
const capturedToolName = tool.name;
|
|
243
|
+
session.transport.replaceTool({
|
|
244
|
+
...tool,
|
|
245
|
+
name: proxyName,
|
|
246
|
+
description: `${descPrefix}${tool.description}`,
|
|
247
|
+
}, async (args, signal) => this.routeToolCall(capturedToolName, args, session, signal, capturedPort));
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Deregister tools that belonged to the previous active bridge but are no
|
|
252
|
+
// longer in the new set (e.g. after switchWorkspace or bridge going away).
|
|
253
|
+
for (const oldName of session.registeredProxyNames) {
|
|
254
|
+
if (!newNames.has(oldName)) {
|
|
255
|
+
session.transport.deregisterTool(oldName);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
session.registeredProxyNames = newNames;
|
|
259
|
+
}
|
|
260
|
+
async routeToolCall(toolName, args, session, signal, preferredPort) {
|
|
261
|
+
// Determine target bridge
|
|
262
|
+
let targetPort = preferredPort ?? session?.stickyBridgePort ?? null;
|
|
263
|
+
if (!targetPort) {
|
|
264
|
+
// Try workspace from args
|
|
265
|
+
const workspaceArg = args.workspace ?? args.path ?? args.file;
|
|
266
|
+
if (typeof workspaceArg === "string") {
|
|
267
|
+
const bridge = this.registry.pickForWorkspace(workspaceArg);
|
|
268
|
+
if (bridge)
|
|
269
|
+
targetPort = bridge.port;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
if (!targetPort) {
|
|
273
|
+
const best = this.registry.pickBest();
|
|
274
|
+
if (best) {
|
|
275
|
+
targetPort = best.port;
|
|
276
|
+
// Set sticky affinity on first successful route
|
|
277
|
+
if (session && !session.stickyBridgePort) {
|
|
278
|
+
session.stickyBridgePort = best.port;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
if (!targetPort) {
|
|
283
|
+
const all = this.registry.getAll();
|
|
284
|
+
const warming = this.registry.getWarmingUp();
|
|
285
|
+
let detail;
|
|
286
|
+
if (all.length === 0) {
|
|
287
|
+
detail =
|
|
288
|
+
"No IDE bridges found. Make sure at least one IDE is running with the extension installed.";
|
|
289
|
+
}
|
|
290
|
+
else if (warming.length > 0) {
|
|
291
|
+
const warmingDesc = warming
|
|
292
|
+
.map((b) => `${b.ideName} port ${b.port} (warming up, ${Math.round((Date.now() - b.discoveredAt) / 1000)}s elapsed)`)
|
|
293
|
+
.join(", ");
|
|
294
|
+
detail = `IDE bridge(s) are starting up: ${warmingDesc}. Retry in a few seconds.`;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
detail = `Known bridges (all unhealthy): ${all.map((b) => `${b.ideName} port ${b.port} (${b.consecutiveFailures} failures)`).join(", ")}`;
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
content: [
|
|
301
|
+
{
|
|
302
|
+
type: "text",
|
|
303
|
+
text: `[ORCHESTRATOR ERROR] No healthy bridge available to handle tool "${toolName}".\n${detail}`,
|
|
304
|
+
},
|
|
305
|
+
],
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
const client = this.clients.get(targetPort);
|
|
309
|
+
if (!client) {
|
|
310
|
+
return {
|
|
311
|
+
content: [
|
|
312
|
+
{
|
|
313
|
+
type: "text",
|
|
314
|
+
text: `[ORCHESTRATOR ERROR] Internal error: no client for bridge port ${targetPort}`,
|
|
315
|
+
},
|
|
316
|
+
],
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
try {
|
|
320
|
+
return await client.callTool(toolName, args, signal);
|
|
321
|
+
}
|
|
322
|
+
catch (err) {
|
|
323
|
+
const isBridgeError = err instanceof Error &&
|
|
324
|
+
err.code === ErrorCodes.BRIDGE_UNAVAILABLE;
|
|
325
|
+
this.logger.warn(`Tool "${toolName}" failed on bridge port ${targetPort}: ${err instanceof Error ? err.message : String(err)}`);
|
|
326
|
+
if (isBridgeError && session?.stickyBridgePort === targetPort) {
|
|
327
|
+
// Clear sticky affinity — bridge is dead
|
|
328
|
+
session.stickyBridgePort = null;
|
|
329
|
+
}
|
|
330
|
+
// Hard error — do not silently re-route (session state may be inconsistent)
|
|
331
|
+
const bridgeInfo = this.registry.get(targetPort);
|
|
332
|
+
return {
|
|
333
|
+
content: [
|
|
334
|
+
{
|
|
335
|
+
type: "text",
|
|
336
|
+
text: [
|
|
337
|
+
`[BRIDGE_UNAVAILABLE] Child bridge on port ${targetPort} (${bridgeInfo?.ideName ?? "unknown"}) is unavailable.`,
|
|
338
|
+
`Tool "${toolName}" was not executed.`,
|
|
339
|
+
`Last successful workspace: ${bridgeInfo?.workspace ?? "unknown"}`,
|
|
340
|
+
`Reason: ${err instanceof Error ? err.message : String(err)}`,
|
|
341
|
+
"",
|
|
342
|
+
"Call listBridges to see current bridge status, or switchWorkspace to target a different IDE.",
|
|
343
|
+
].join("\n"),
|
|
344
|
+
},
|
|
345
|
+
],
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
buildInstructions() {
|
|
350
|
+
const healthy = this.registry.getHealthy();
|
|
351
|
+
const warming = this.registry.getWarmingUp();
|
|
352
|
+
const dupes = this.registry.getDuplicateWorkspaces();
|
|
353
|
+
const lines = [`claude-ide-bridge orchestrator v${PACKAGE_VERSION}`];
|
|
354
|
+
if (healthy.length === 0 && warming.length === 0) {
|
|
355
|
+
lines.push("STATUS: no IDE workspaces connected. Call listWorkspaces to check.");
|
|
356
|
+
}
|
|
357
|
+
else {
|
|
358
|
+
if (healthy.length > 0) {
|
|
359
|
+
lines.push("WORKSPACES:");
|
|
360
|
+
healthy.forEach((b, i) => {
|
|
361
|
+
lines.push(` ws${i + 1}: ${b.workspace} (${b.ideName})`);
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
if (warming.length > 0) {
|
|
365
|
+
lines.push("STARTING:");
|
|
366
|
+
for (const b of warming) {
|
|
367
|
+
const elapsed = Math.round((Date.now() - b.discoveredAt) / 1000);
|
|
368
|
+
lines.push(` ${b.workspace} (${b.ideName}) — ${elapsed}s`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
if (healthy.length > 1) {
|
|
372
|
+
lines.push("MULTI-IDE: conflicting tool names have a __<IDE> suffix. Tools prefixed [ws1]/[ws2] belong to that workspace.");
|
|
373
|
+
lines.push("Use switchWorkspace to pin a workspace for a session.");
|
|
374
|
+
}
|
|
375
|
+
if (dupes.size > 0) {
|
|
376
|
+
lines.push("CAUTION: duplicate workspaces — use switchWorkspace(port) to target a specific IDE:");
|
|
377
|
+
for (const [ws, bridges] of dupes) {
|
|
378
|
+
lines.push(` ${ws} → ${bridges.map((b) => `${b.ideName}:${b.port}`).join(", ")}`);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
lines.push("RULE: this summary is current — do NOT call getOrchestratorStatus/listWorkspaces/listBridges at session start.");
|
|
382
|
+
}
|
|
383
|
+
lines.push("");
|
|
384
|
+
lines.push("CONTEXT PLATFORM:");
|
|
385
|
+
lines.push(" Use ctx tools for issue/PR/error context — not gh or githubViewPR.");
|
|
386
|
+
lines.push(" ctxGetTaskContext(ref) — unified context for any issue, PR, commit, or error");
|
|
387
|
+
lines.push(" ctxQueryTraces(query) — search past decisions");
|
|
388
|
+
lines.push(" ctxSaveTrace(ref, problem, solution) — record fix after resolving a task");
|
|
389
|
+
lines.push("");
|
|
390
|
+
lines.push(...buildEnforcementReminder());
|
|
391
|
+
return lines.join("\n");
|
|
392
|
+
}
|
|
393
|
+
setupShutdownHandlers() {
|
|
394
|
+
const shutdown = async () => {
|
|
395
|
+
this.logger.info("Orchestrator shutting down...");
|
|
396
|
+
if (this.healthTimer) {
|
|
397
|
+
clearInterval(this.healthTimer);
|
|
398
|
+
}
|
|
399
|
+
this.registry.stop();
|
|
400
|
+
// Close all child sessions
|
|
401
|
+
await Promise.all(Array.from(this.clients.values()).map((c) => c.closeSession().catch(() => { })));
|
|
402
|
+
for (const c of this.clients.values())
|
|
403
|
+
c.destroy();
|
|
404
|
+
this.lockFile.delete();
|
|
405
|
+
this.server.close();
|
|
406
|
+
process.exit(0);
|
|
407
|
+
};
|
|
408
|
+
process.once("SIGTERM", () => void shutdown());
|
|
409
|
+
process.once("SIGINT", () => void shutdown());
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=orchestratorBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestratorBridge.js","sourceRoot":"","sources":["../../src/orchestrator/orchestratorBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAYjE,MAAM,OAAO,kBAAkB;IAWT;IAVZ,MAAM,CAAS;IACf,MAAM,CAAS;IACf,QAAQ,CAAkB;IAC1B,QAAQ,CAAsB;IAC9B,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC/C,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAC;IAClD,SAAS,CAAS;IAClB,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,WAAW,GAA0C,IAAI,CAAC;IAElE,YAAoB,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;QAC5C,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,GAAG,IAAI,mBAAmB,CACrC,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,gBAAgB,EACvB,MAAM,CAAC,IAAI,CACZ,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU,IAAI,UAAU,EAAE,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,wCAAwC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAC3D,CAAC;QAEF,yBAAyB;QACzB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAEtB,uBAAuB;QACvB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEtB,0BAA0B;QAC1B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACxC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEzB,uBAAuB;QACvB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,EAAa,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3E,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAEpE,0CAA0C;QAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,cAAc,EAAE;YACxE,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,qCAAqC,IAAI,CAAC,MAAM,CAAC,IAAI,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAClG,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,cAAc,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,kBAAkB,CAC9D,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,QAAQ;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACvC,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACtB,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,IAAI,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;gBACpD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC;YAC5C,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,IAAI,OAAO,GAAG,MAAM,CAAC;YAEhD,IAAI,KAAK,EAAE,CAAC;gBACV,wEAAwE;gBACxE,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;oBAChB,MAAM,CAAC,YAAY,EAAE,CAAC;gBACxB,CAAC;gBACD,6EAA6E;gBAC7E,6EAA6E;gBAC7E,uEAAuE;gBACvE,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3D,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;gBAEvC,+EAA+E;gBAC/E,iFAAiF;gBACjF,yDAAyD;gBACzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;oBACrC,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,eAAe,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,2DAA2D,CAC/F,CAAC;oBACF,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;oBAC/B,OAAO;gBACT,CAAC;gBAED,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAEzC,IAAI,aAAa,KAAK,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,qCAAqC,CAAC,CAAC,IAAI,iBAAiB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,CAC5F,CAAC;oBACF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;wBAC7C,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;wBAC5C,IAAI,OAAO,CAAC,EAAE,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;4BAC3C,YAAY,CAAC,gBAAgB,CAC3B,OAAO,CAAC,EAAE,EACV,kCAAkC,EAClC,SAAS,EACT,IAAI,CAAC,MAAM,CACZ,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,gEAAgE;gBAChE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,eAAe,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,kBAAkB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAC3F,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,yEAAyE;gBACzE,IAAI,CAAC,CAAC,SAAS;oBAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,EAAa;QACpC,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhD,gDAAgD;QAChD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC9C,SAAS,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;QAExC,qEAAqE;QACrE,+DAA+D;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,iBAAiB,GACrB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEvE,qCAAqC;QACrC,MAAM,KAAK,GAAG,uBAAuB,CAAC;YACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI;YAC3C,eAAe,EAAE,CAAC,IAAI,EAAE,EAAE;gBACxB,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACvC,IAAI,CAAC,EAAE,CAAC;oBACN,CAAC,CAAC,gBAAgB,GAAG,IAAI,CAAC;oBAC1B,qDAAqD;oBACrD,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC;oBACtC,IAAI,CAAC,CAAC,EAAE,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;wBACrC,YAAY,CAAC,gBAAgB,CAC3B,CAAC,CAAC,EAAE,EACJ,kCAAkC,EAClC,SAAS,EACT,IAAI,CAAC,MAAM,CACZ,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,OAAO,GAAwB;YACnC,EAAE,EAAE,SAAS;YACb,EAAE;YACF,SAAS;YACT,gBAAgB,EAAE,iBAAiB;YACnC,oBAAoB,EAAE,IAAI,GAAG,EAAE;YAC/B,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;SACxB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAEtC,uEAAuE;QACvE,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;QAE5C,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrB,oEAAoE;QACpE,oEAAoE;QACpE,wEAAwE;QACxE,8DAA8D;QAC9D,SAAS,CAAC,eAAe,EAAE,CAAC;QAE5B,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED;;;;;;;;;;OAUG;IACK,6BAA6B,CAAC,OAA4B;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;QAExE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QAEnC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,mDAAmD;YACnD,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YACrD,IAAI,CAAC,EAAE,CAAC;gBACN,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC3B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,SAAS;oBACjD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxB,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC;oBACnC,OAAO,CAAC,SAAS,CAAC,WAAW,CAC3B,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,EAC1C,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CACrB,IAAI,CAAC,aAAa,CAChB,gBAAgB,EAChB,IAAI,EACJ,OAAO,EACP,MAAM,EACN,YAAY,CACb,CACJ,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,yEAAyE;YACzE,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;YAChD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC3B,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;YAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;YAC/C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACtE,CAAC;YAED,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;gBACtD,MAAM,gBAAgB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAChE,MAAM,MAAM,GACV,OAAO,CAAC,MAAM,GAAG,CAAC;oBAChB,CAAC,CAAC,KAAK,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;oBACtD,CAAC,CAAC,EAAE,CAAC;gBAET,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC;gBAErE,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC3B,MAAM,WAAW,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC5D,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBACpE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC;wBAAE,SAAS;oBAEjD,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACxB,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC5B,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC;oBAEnC,OAAO,CAAC,SAAS,CAAC,WAAW,CAC3B;wBACE,GAAG,IAAI;wBACP,IAAI,EAAE,SAAS;wBACf,WAAW,EAAE,GAAG,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE;qBAChD,EACD,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CACrB,IAAI,CAAC,aAAa,CAChB,gBAAgB,EAChB,IAAI,EACJ,OAAO,EACP,MAAM,EACN,YAAY,CACb,CACJ,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,2EAA2E;QAC3E,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QACD,OAAO,CAAC,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,QAAgB,EAChB,IAA6B,EAC7B,OAAmC,EACnC,MAAoB,EACpB,aAAsB;QAEtB,0BAA0B;QAC1B,IAAI,UAAU,GAAG,aAAa,IAAI,OAAO,EAAE,gBAAgB,IAAI,IAAI,CAAC;QAEpE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,0BAA0B;YAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC;YAC9D,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;gBAC5D,IAAI,MAAM;oBAAE,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;YACvC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtC,IAAI,IAAI,EAAE,CAAC;gBACT,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvB,gDAAgD;gBAChD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBACzC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC7C,IAAI,MAAc,CAAC;YACnB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM;oBACJ,2FAA2F,CAAC;YAChG,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,WAAW,GAAG,OAAO;qBACxB,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,IAAI,iBAAiB,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,YAAY,CAC3G;qBACA,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM,GAAG,kCAAkC,WAAW,2BAA2B,CAAC;YACpF,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,kCAAkC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,mBAAmB,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5I,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,oEAAoE,QAAQ,OAAO,MAAM,EAAE;qBAClG;iBACF;aACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,kEAAkE,UAAU,EAAE;qBACrF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,aAAa,GACjB,GAAG,YAAY,KAAK;gBACnB,GAA0B,CAAC,IAAI,KAAK,UAAU,CAAC,kBAAkB,CAAC;YAErE,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,SAAS,QAAQ,2BAA2B,UAAU,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAC9G,CAAC;YAEF,IAAI,aAAa,IAAI,OAAO,EAAE,gBAAgB,KAAK,UAAU,EAAE,CAAC;gBAC9D,yCAAyC;gBACzC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAClC,CAAC;YAED,4EAA4E;YAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE;4BACJ,6CAA6C,UAAU,KAAK,UAAU,EAAE,OAAO,IAAI,SAAS,mBAAmB;4BAC/G,SAAS,QAAQ,qBAAqB;4BACtC,8BAA8B,UAAU,EAAE,SAAS,IAAI,SAAS,EAAE;4BAClE,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;4BAC7D,EAAE;4BACF,8FAA8F;yBAC/F,CAAC,IAAI,CAAC,IAAI,CAAC;qBACb;iBACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,iBAAiB;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,sBAAsB,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,CAAC,mCAAmC,eAAe,EAAE,CAAC,CAAC;QAErE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CACR,oEAAoE,CACrE,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;oBACvB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;gBAC5D,CAAC,CAAC,CAAC;YACL,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;oBACjE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,OAAO,OAAO,OAAO,GAAG,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CACR,+GAA+G,CAChH,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACtE,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACnB,KAAK,CAAC,IAAI,CACR,qFAAqF,CACtF,CAAC;gBACF,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;oBAClC,KAAK,CAAC,IAAI,CACR,KAAK,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACvE,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,KAAK,CAAC,IAAI,CACR,gHAAgH,CACjH,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,CACR,sEAAsE,CACvE,CAAC;QACF,KAAK,CAAC,IAAI,CACR,gFAAgF,CACjF,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC9D,KAAK,CAAC,IAAI,CACR,4EAA4E,CAC7E,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,wBAAwB,EAAE,CAAC,CAAC;QAE1C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAEO,qBAAqB;QAC3B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAElD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAClC,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAErB,2BAA2B;YAC3B,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC1C,CAAC,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CACjC,CACF,CAAC;YAEF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;gBAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YAEnD,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface OrchestratorConfig {
|
|
2
|
+
port: number;
|
|
3
|
+
bindAddress: string;
|
|
4
|
+
lockDir: string;
|
|
5
|
+
healthIntervalMs: number;
|
|
6
|
+
verbose: boolean;
|
|
7
|
+
jsonl: boolean;
|
|
8
|
+
fixedToken: string | null;
|
|
9
|
+
watch: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function parseOrchestratorArgs(argv: string[]): OrchestratorConfig;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import os from "node:os";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const DEFAULT_PORT = 4746;
|
|
4
|
+
export function parseOrchestratorArgs(argv) {
|
|
5
|
+
// argv is process.argv — subcommand is argv[2] = "orchestrator", flags start at argv[3]
|
|
6
|
+
const args = argv.slice(3);
|
|
7
|
+
const config = {
|
|
8
|
+
port: DEFAULT_PORT,
|
|
9
|
+
bindAddress: "127.0.0.1",
|
|
10
|
+
lockDir: path.join(process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude"), "ide"),
|
|
11
|
+
healthIntervalMs: 10_000,
|
|
12
|
+
verbose: false,
|
|
13
|
+
jsonl: false,
|
|
14
|
+
fixedToken: null,
|
|
15
|
+
watch: false,
|
|
16
|
+
};
|
|
17
|
+
for (let i = 0; i < args.length; i++) {
|
|
18
|
+
const arg = args[i];
|
|
19
|
+
const next = args[i + 1];
|
|
20
|
+
switch (arg) {
|
|
21
|
+
case "--port": {
|
|
22
|
+
const p = Number.parseInt(next ?? "", 10);
|
|
23
|
+
if (!Number.isFinite(p) || p < 1024 || p > 65535) {
|
|
24
|
+
process.stderr.write("Error: --port must be a number between 1024 and 65535\n");
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
config.port = p;
|
|
28
|
+
i++;
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
case "--bind": {
|
|
32
|
+
if (!next) {
|
|
33
|
+
process.stderr.write("Error: --bind requires an address\n");
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
config.bindAddress = next;
|
|
37
|
+
i++;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
case "--lock-dir": {
|
|
41
|
+
if (!next) {
|
|
42
|
+
process.stderr.write("Error: --lock-dir requires a path\n");
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
config.lockDir = next;
|
|
46
|
+
i++;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case "--health-interval": {
|
|
50
|
+
const ms = Number.parseInt(next ?? "", 10);
|
|
51
|
+
if (!Number.isFinite(ms) || ms < 1000) {
|
|
52
|
+
process.stderr.write("Error: --health-interval must be >= 1000 ms\n");
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
config.healthIntervalMs = ms;
|
|
56
|
+
i++;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case "--fixed-token": {
|
|
60
|
+
if (!next) {
|
|
61
|
+
process.stderr.write("Error: --fixed-token requires a value\n");
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
config.fixedToken = next;
|
|
65
|
+
i++;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
case "--verbose":
|
|
69
|
+
config.verbose = true;
|
|
70
|
+
break;
|
|
71
|
+
case "--jsonl":
|
|
72
|
+
config.jsonl = true;
|
|
73
|
+
break;
|
|
74
|
+
case "--watch":
|
|
75
|
+
config.watch = true;
|
|
76
|
+
break;
|
|
77
|
+
default:
|
|
78
|
+
if (arg.startsWith("--")) {
|
|
79
|
+
process.stderr.write(`Warning: unknown orchestrator flag: ${arg}\n`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return config;
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=orchestratorConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestratorConfig.js","sourceRoot":"","sources":["../../src/orchestrator/orchestratorConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ToolHandler, ToolSchema } from "../transport.js";
|
|
2
|
+
import type { ChildBridgeRegistry } from "./childBridgeRegistry.js";
|
|
3
|
+
import type { OrchestratorConfig } from "./orchestratorConfig.js";
|
|
4
|
+
interface OrchestratorToolDeps {
|
|
5
|
+
registry: ChildBridgeRegistry;
|
|
6
|
+
config: OrchestratorConfig;
|
|
7
|
+
startedAt: number;
|
|
8
|
+
getActiveSessions: () => number;
|
|
9
|
+
setStickyBridge: (port: number) => void;
|
|
10
|
+
}
|
|
11
|
+
export interface OrchestratorTool {
|
|
12
|
+
schema: ToolSchema;
|
|
13
|
+
handler: ToolHandler;
|
|
14
|
+
}
|
|
15
|
+
export declare function createOrchestratorTools(deps: OrchestratorToolDeps): OrchestratorTool[];
|
|
16
|
+
export {};
|