patchwork-os 0.2.0-beta.9.canary.92 → 1.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.bridge.md +15 -16
- package/README.md +46 -458
- package/dist/activationMetrics.js +2 -3
- package/dist/activationMetrics.js.map +1 -1
- package/dist/activityLog.d.ts +1 -0
- package/dist/activityLog.js +8 -3
- package/dist/activityLog.js.map +1 -1
- package/dist/adapters/gemini.js +2 -2
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/grok.js +6 -1
- package/dist/adapters/grok.js.map +1 -1
- package/dist/adapters/openai.js +4 -0
- package/dist/adapters/openai.js.map +1 -1
- package/dist/approvalHttp.d.ts +9 -0
- package/dist/approvalHttp.js +210 -171
- package/dist/approvalHttp.js.map +1 -1
- package/dist/approvalKpi.d.ts +102 -0
- package/dist/approvalKpi.js +282 -0
- package/dist/approvalKpi.js.map +1 -0
- package/dist/approvalQueue.d.ts +1 -1
- package/dist/approvalQueue.js.map +1 -1
- package/dist/automation.d.ts +45 -4
- package/dist/automation.js +123 -15
- package/dist/automation.js.map +1 -1
- package/dist/bridge.d.ts +10 -0
- package/dist/bridge.js +225 -46
- package/dist/bridge.js.map +1 -1
- package/dist/bridgeLockDiscovery.d.ts +16 -1
- package/dist/bridgeLockDiscovery.js +38 -4
- package/dist/bridgeLockDiscovery.js.map +1 -1
- package/dist/bridgeToolsRules.js +3 -18
- package/dist/bridgeToolsRules.js.map +1 -1
- package/dist/claudeAuthHttp.d.ts +25 -0
- package/dist/claudeAuthHttp.js +219 -0
- package/dist/claudeAuthHttp.js.map +1 -0
- package/dist/claudeDriver.js +4 -1
- package/dist/claudeDriver.js.map +1 -1
- package/dist/claudeOrchestrator.d.ts +15 -0
- package/dist/claudeOrchestrator.js +44 -0
- package/dist/claudeOrchestrator.js.map +1 -1
- package/dist/commands/connect.d.ts +47 -0
- package/dist/commands/connect.js +419 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/install.js +3 -10
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/launchd.d.ts +7 -0
- package/dist/commands/launchd.js +20 -2
- package/dist/commands/launchd.js.map +1 -1
- package/dist/commands/patchworkInit.d.ts +7 -0
- package/dist/commands/patchworkInit.js +26 -0
- package/dist/commands/patchworkInit.js.map +1 -1
- package/dist/commands/recipe.d.ts +59 -4
- package/dist/commands/recipe.js +206 -5
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipeInstall.d.ts +9 -0
- package/dist/commands/recipeInstall.js +56 -3
- package/dist/commands/recipeInstall.js.map +1 -1
- package/dist/commands/task.d.ts +25 -0
- package/dist/commands/task.js +61 -41
- package/dist/commands/task.js.map +1 -1
- package/dist/commands/tokenEfficiency.d.ts +4 -0
- package/dist/commands/tokenEfficiency.js +23 -26
- package/dist/commands/tokenEfficiency.js.map +1 -1
- package/dist/commands/tracesExport.d.ts +15 -1
- package/dist/commands/tracesExport.js +39 -5
- package/dist/commands/tracesExport.js.map +1 -1
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -1
- package/dist/connectorRoutes.js +613 -62
- package/dist/connectorRoutes.js.map +1 -1
- package/dist/connectors/asana.js +9 -3
- package/dist/connectors/asana.js.map +1 -1
- package/dist/connectors/baseConnector.d.ts +16 -0
- package/dist/connectors/baseConnector.js +2 -0
- package/dist/connectors/baseConnector.js.map +1 -1
- package/dist/connectors/caldiy.js +34 -0
- package/dist/connectors/caldiy.js.map +1 -1
- package/dist/connectors/confluence.js +9 -2
- package/dist/connectors/confluence.js.map +1 -1
- package/dist/connectors/connectorActivity.d.ts +24 -0
- package/dist/connectors/connectorActivity.js +32 -0
- package/dist/connectors/connectorActivity.js.map +1 -0
- package/dist/connectors/connectorRedirectUri.js +22 -2
- package/dist/connectors/connectorRedirectUri.js.map +1 -1
- package/dist/connectors/connectorRegistry.d.ts +0 -3
- package/dist/connectors/connectorRegistry.js +8 -8
- package/dist/connectors/connectorRegistry.js.map +1 -1
- package/dist/connectors/datadog.js +8 -1
- package/dist/connectors/datadog.js.map +1 -1
- package/dist/connectors/discord.js +4 -3
- package/dist/connectors/discord.js.map +1 -1
- package/dist/connectors/elasticsearch.js +22 -0
- package/dist/connectors/elasticsearch.js.map +1 -1
- package/dist/connectors/github.d.ts +38 -0
- package/dist/connectors/github.js +91 -5
- package/dist/connectors/github.js.map +1 -1
- package/dist/connectors/gitlab.js +19 -16
- package/dist/connectors/gitlab.js.map +1 -1
- package/dist/connectors/gmail.d.ts +5 -0
- package/dist/connectors/gmail.js +53 -11
- package/dist/connectors/gmail.js.map +1 -1
- package/dist/connectors/googleCalendar.js +5 -4
- package/dist/connectors/googleCalendar.js.map +1 -1
- package/dist/connectors/googleDocs.js +7 -6
- package/dist/connectors/googleDocs.js.map +1 -1
- package/dist/connectors/googleDrive.js +15 -8
- package/dist/connectors/googleDrive.js.map +1 -1
- package/dist/connectors/grafana.js +39 -3
- package/dist/connectors/grafana.js.map +1 -1
- package/dist/connectors/jira.d.ts +1 -1
- package/dist/connectors/jira.js +19 -4
- package/dist/connectors/jira.js.map +1 -1
- package/dist/connectors/linear.js +2 -2
- package/dist/connectors/linear.js.map +1 -1
- package/dist/connectors/mcpClient.d.ts +29 -1
- package/dist/connectors/mcpClient.js +114 -44
- package/dist/connectors/mcpClient.js.map +1 -1
- package/dist/connectors/mcpOAuth.d.ts +1 -0
- package/dist/connectors/mcpOAuth.js +49 -4
- package/dist/connectors/mcpOAuth.js.map +1 -1
- package/dist/connectors/monday.js +5 -4
- package/dist/connectors/monday.js.map +1 -1
- package/dist/connectors/mongodb.js +32 -5
- package/dist/connectors/mongodb.js.map +1 -1
- package/dist/connectors/notion.d.ts +1 -1
- package/dist/connectors/notion.js +22 -6
- package/dist/connectors/notion.js.map +1 -1
- package/dist/connectors/oauthError.d.ts +17 -0
- package/dist/connectors/oauthError.js +50 -0
- package/dist/connectors/oauthError.js.map +1 -0
- package/dist/connectors/postgres.d.ts +7 -0
- package/dist/connectors/postgres.js +32 -2
- package/dist/connectors/postgres.js.map +1 -1
- package/dist/connectors/posthog.js +26 -0
- package/dist/connectors/posthog.js.map +1 -1
- package/dist/connectors/redis.d.ts +1 -0
- package/dist/connectors/redis.js +47 -20
- package/dist/connectors/redis.js.map +1 -1
- package/dist/connectors/salesforce.js +66 -5
- package/dist/connectors/salesforce.js.map +1 -1
- package/dist/connectors/sentry.js +2 -2
- package/dist/connectors/sentry.js.map +1 -1
- package/dist/connectors/slack.js +37 -14
- package/dist/connectors/slack.js.map +1 -1
- package/dist/connectors/snowflake.js +24 -0
- package/dist/connectors/snowflake.js.map +1 -1
- package/dist/connectors/stripe.js +9 -2
- package/dist/connectors/stripe.js.map +1 -1
- package/dist/connectors/supabase.js +34 -0
- package/dist/connectors/supabase.js.map +1 -1
- package/dist/connectors/tokenStorage.d.ts +20 -0
- package/dist/connectors/tokenStorage.js +196 -64
- package/dist/connectors/tokenStorage.js.map +1 -1
- package/dist/connectors/woocommerce.js +34 -0
- package/dist/connectors/woocommerce.js.map +1 -1
- package/dist/copilot/parseIntent.d.ts +58 -0
- package/dist/copilot/parseIntent.js +149 -0
- package/dist/copilot/parseIntent.js.map +1 -0
- package/dist/decisionReplay.d.ts +8 -6
- package/dist/decisionReplay.js +35 -11
- package/dist/decisionReplay.js.map +1 -1
- package/dist/decisionTraceLog.d.ts +9 -0
- package/dist/decisionTraceLog.js +6 -0
- package/dist/decisionTraceLog.js.map +1 -1
- package/dist/drivers/claude/api.js +49 -7
- package/dist/drivers/claude/api.js.map +1 -1
- package/dist/drivers/claude/envSanitizer.d.ts +9 -1
- package/dist/drivers/claude/envSanitizer.js +41 -3
- package/dist/drivers/claude/envSanitizer.js.map +1 -1
- package/dist/drivers/claude/streamParser.d.ts +13 -0
- package/dist/drivers/claude/streamParser.js.map +1 -1
- package/dist/drivers/claude/subprocess.js +131 -16
- package/dist/drivers/claude/subprocess.js.map +1 -1
- package/dist/drivers/claude/subprocessSettings.d.ts +1 -1
- package/dist/drivers/claude/subprocessSettings.js +18 -4
- package/dist/drivers/claude/subprocessSettings.js.map +1 -1
- package/dist/drivers/gemini/index.d.ts +13 -0
- package/dist/drivers/gemini/index.js +211 -67
- package/dist/drivers/gemini/index.js.map +1 -1
- package/dist/drivers/local/index.d.ts +2 -17
- package/dist/drivers/local/index.js +5 -92
- package/dist/drivers/local/index.js.map +1 -1
- package/dist/drivers/openai/index.js +69 -9
- package/dist/drivers/openai/index.js.map +1 -1
- package/dist/drivers/outputCap.d.ts +27 -0
- package/dist/drivers/outputCap.js +50 -0
- package/dist/drivers/outputCap.js.map +1 -0
- package/dist/embeddings/cosine.d.ts +23 -0
- package/dist/embeddings/cosine.js +59 -0
- package/dist/embeddings/cosine.js.map +1 -0
- package/dist/embeddings/index.d.ts +19 -0
- package/dist/embeddings/index.js +35 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/localEmbeddings.d.ts +29 -0
- package/dist/embeddings/localEmbeddings.js +103 -0
- package/dist/embeddings/localEmbeddings.js.map +1 -0
- package/dist/embeddings/localEndpoints.d.ts +24 -0
- package/dist/embeddings/localEndpoints.js +37 -0
- package/dist/embeddings/localEndpoints.js.map +1 -0
- package/dist/embeddings/types.d.ts +32 -0
- package/dist/embeddings/types.js +12 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/featureFlags.d.ts +18 -0
- package/dist/featureFlags.js +32 -0
- package/dist/featureFlags.js.map +1 -1
- package/dist/fp/automationInterpreter.js +118 -39
- package/dist/fp/automationInterpreter.js.map +1 -1
- package/dist/fp/automationProgram.d.ts +10 -0
- package/dist/fp/automationProgram.js.map +1 -1
- package/dist/fp/automationState.d.ts +6 -0
- package/dist/fp/automationState.js +38 -0
- package/dist/fp/automationState.js.map +1 -1
- package/dist/fp/commandDescription.d.ts +6 -0
- package/dist/fp/commandDescription.js +18 -5
- package/dist/fp/commandDescription.js.map +1 -1
- package/dist/fp/interpreterContext.d.ts +16 -5
- package/dist/fp/interpreterContext.js +59 -3
- package/dist/fp/interpreterContext.js.map +1 -1
- package/dist/fp/policyParser.js +18 -8
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/haltPushDispatch.d.ts +4 -0
- package/dist/haltPushDispatch.js +7 -22
- package/dist/haltPushDispatch.js.map +1 -1
- package/dist/inboxRoutes.js +2 -2
- package/dist/inboxRoutes.js.map +1 -1
- package/dist/index.js +672 -135
- package/dist/index.js.map +1 -1
- package/dist/installGuard.js +6 -0
- package/dist/installGuard.js.map +1 -1
- package/dist/localEndpointGuard.d.ts +25 -0
- package/dist/localEndpointGuard.js +101 -0
- package/dist/localEndpointGuard.js.map +1 -0
- package/dist/mcpRoutes.js +1 -1
- package/dist/mcpRoutes.js.map +1 -1
- package/dist/oauth.d.ts +13 -0
- package/dist/oauth.js +53 -9
- package/dist/oauth.js.map +1 -1
- package/dist/orchestrator/childBridgeClient.d.ts +7 -0
- package/dist/orchestrator/childBridgeClient.js +42 -1
- package/dist/orchestrator/childBridgeClient.js.map +1 -1
- package/dist/orchestrator/orchestratorBridge.d.ts +33 -0
- package/dist/orchestrator/orchestratorBridge.js +75 -9
- package/dist/orchestrator/orchestratorBridge.js.map +1 -1
- package/dist/patchworkConfig.d.ts +4 -0
- package/dist/patchworkConfig.js +33 -4
- package/dist/patchworkConfig.js.map +1 -1
- package/dist/probe.js +39 -5
- package/dist/probe.js.map +1 -1
- package/dist/recipeOrchestration.d.ts +59 -0
- package/dist/recipeOrchestration.js +314 -60
- package/dist/recipeOrchestration.js.map +1 -1
- package/dist/recipeRoutes.d.ts +93 -0
- package/dist/recipeRoutes.js +664 -27
- package/dist/recipeRoutes.js.map +1 -1
- package/dist/recipes/RecipeOrchestrator.d.ts +14 -0
- package/dist/recipes/RecipeOrchestrator.js +42 -2
- package/dist/recipes/RecipeOrchestrator.js.map +1 -1
- package/dist/recipes/agentExecutor.d.ts +51 -2
- package/dist/recipes/agentExecutor.js +86 -13
- package/dist/recipes/agentExecutor.js.map +1 -1
- package/dist/recipes/chainedRunner.d.ts +111 -3
- package/dist/recipes/chainedRunner.js +440 -45
- package/dist/recipes/chainedRunner.js.map +1 -1
- package/dist/recipes/compiler.js +42 -29
- package/dist/recipes/compiler.js.map +1 -1
- package/dist/recipes/connectorPreflight.js +31 -0
- package/dist/recipes/connectorPreflight.js.map +1 -1
- package/dist/recipes/dependencyGraph.d.ts +16 -0
- package/dist/recipes/dependencyGraph.js +37 -2
- package/dist/recipes/dependencyGraph.js.map +1 -1
- package/dist/recipes/eventTriggerPrograms.d.ts +36 -0
- package/dist/recipes/eventTriggerPrograms.js +158 -0
- package/dist/recipes/eventTriggerPrograms.js.map +1 -0
- package/dist/recipes/githubInstallSource.d.ts +9 -2
- package/dist/recipes/githubInstallSource.js +36 -6
- package/dist/recipes/githubInstallSource.js.map +1 -1
- package/dist/recipes/haltCategory.d.ts +10 -0
- package/dist/recipes/haltCategory.js +11 -1
- package/dist/recipes/haltCategory.js.map +1 -1
- package/dist/recipes/idempotencyKey.d.ts +30 -3
- package/dist/recipes/idempotencyKey.js +89 -5
- package/dist/recipes/idempotencyKey.js.map +1 -1
- package/dist/recipes/installer.js +12 -35
- package/dist/recipes/installer.js.map +1 -1
- package/dist/recipes/judgeVerdict.d.ts +11 -1
- package/dist/recipes/judgeVerdict.js +47 -7
- package/dist/recipes/judgeVerdict.js.map +1 -1
- package/dist/recipes/names.d.ts +5 -0
- package/dist/recipes/names.js +10 -5
- package/dist/recipes/names.js.map +1 -1
- package/dist/recipes/parser.js +74 -10
- package/dist/recipes/parser.js.map +1 -1
- package/dist/recipes/pricing/costRouter.d.ts +43 -0
- package/dist/recipes/pricing/costRouter.js +44 -0
- package/dist/recipes/pricing/costRouter.js.map +1 -0
- package/dist/recipes/pricing/priceTable.d.ts +76 -0
- package/dist/recipes/pricing/priceTable.js +144 -0
- package/dist/recipes/pricing/priceTable.js.map +1 -0
- package/dist/recipes/replayRun.js +5 -2
- package/dist/recipes/replayRun.js.map +1 -1
- package/dist/recipes/resolveRecipePath.js +15 -1
- package/dist/recipes/resolveRecipePath.js.map +1 -1
- package/dist/recipes/runBudget.d.ts +93 -32
- package/dist/recipes/runBudget.js +213 -49
- package/dist/recipes/runBudget.js.map +1 -1
- package/dist/recipes/runRegistry.d.ts +32 -0
- package/dist/recipes/runRegistry.js +54 -0
- package/dist/recipes/runRegistry.js.map +1 -0
- package/dist/recipes/scheduler.js +6 -2
- package/dist/recipes/scheduler.js.map +1 -1
- package/dist/recipes/schema.d.ts +59 -6
- package/dist/recipes/schemaGenerator.d.ts +9 -0
- package/dist/recipes/schemaGenerator.js +446 -77
- package/dist/recipes/schemaGenerator.js.map +1 -1
- package/dist/recipes/simulation/aggregateRunRisk.d.ts +46 -0
- package/dist/recipes/simulation/aggregateRunRisk.js +120 -0
- package/dist/recipes/simulation/aggregateRunRisk.js.map +1 -0
- package/dist/recipes/simulation/costProjector.d.ts +32 -0
- package/dist/recipes/simulation/costProjector.js +194 -0
- package/dist/recipes/simulation/costProjector.js.map +1 -0
- package/dist/recipes/simulation/sideEffects.d.ts +32 -0
- package/dist/recipes/simulation/sideEffects.js +62 -0
- package/dist/recipes/simulation/sideEffects.js.map +1 -0
- package/dist/recipes/simulation/simulate.d.ts +36 -0
- package/dist/recipes/simulation/simulate.js +264 -0
- package/dist/recipes/simulation/simulate.js.map +1 -0
- package/dist/recipes/simulation/simulateMockedRun.d.ts +52 -0
- package/dist/recipes/simulation/simulateMockedRun.js +84 -0
- package/dist/recipes/simulation/simulateMockedRun.js.map +1 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.d.ts +31 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.js +50 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.js.map +1 -0
- package/dist/recipes/simulation/types.d.ts +198 -0
- package/dist/recipes/simulation/types.js +30 -0
- package/dist/recipes/simulation/types.js.map +1 -0
- package/dist/recipes/stepObservation.d.ts +12 -0
- package/dist/recipes/stepObservation.js +21 -1
- package/dist/recipes/stepObservation.js.map +1 -1
- package/dist/recipes/toolRegistry.js +61 -24
- package/dist/recipes/toolRegistry.js.map +1 -1
- package/dist/recipes/tools/airtable.d.ts +15 -0
- package/dist/recipes/tools/airtable.js +240 -0
- package/dist/recipes/tools/airtable.js.map +1 -0
- package/dist/recipes/tools/caldiy.d.ts +13 -0
- package/dist/recipes/tools/caldiy.js +215 -0
- package/dist/recipes/tools/caldiy.js.map +1 -0
- package/dist/recipes/tools/circleci.d.ts +10 -0
- package/dist/recipes/tools/circleci.js +204 -0
- package/dist/recipes/tools/circleci.js.map +1 -0
- package/dist/recipes/tools/cloudflare.d.ts +13 -0
- package/dist/recipes/tools/cloudflare.js +211 -0
- package/dist/recipes/tools/cloudflare.js.map +1 -0
- package/dist/recipes/tools/confluence.js +11 -10
- package/dist/recipes/tools/confluence.js.map +1 -1
- package/dist/recipes/tools/datadog.js +13 -12
- package/dist/recipes/tools/datadog.js.map +1 -1
- package/dist/recipes/tools/docs.d.ts +18 -0
- package/dist/recipes/tools/docs.js +95 -0
- package/dist/recipes/tools/docs.js.map +1 -0
- package/dist/recipes/tools/elasticsearch.d.ts +11 -0
- package/dist/recipes/tools/elasticsearch.js +157 -0
- package/dist/recipes/tools/elasticsearch.js.map +1 -0
- package/dist/recipes/tools/fanOut.js +4 -4
- package/dist/recipes/tools/fanOut.js.map +1 -1
- package/dist/recipes/tools/figma.d.ts +12 -0
- package/dist/recipes/tools/figma.js +195 -0
- package/dist/recipes/tools/figma.js.map +1 -0
- package/dist/recipes/tools/file.js +43 -22
- package/dist/recipes/tools/file.js.map +1 -1
- package/dist/recipes/tools/github.js +162 -5
- package/dist/recipes/tools/github.js.map +1 -1
- package/dist/recipes/tools/gmail.js +45 -33
- package/dist/recipes/tools/gmail.js.map +1 -1
- package/dist/recipes/tools/grafana.d.ts +11 -0
- package/dist/recipes/tools/grafana.js +216 -0
- package/dist/recipes/tools/grafana.js.map +1 -0
- package/dist/recipes/tools/http.d.ts +1 -1
- package/dist/recipes/tools/http.js +10 -28
- package/dist/recipes/tools/http.js.map +1 -1
- package/dist/recipes/tools/hubspot.js +13 -12
- package/dist/recipes/tools/hubspot.js.map +1 -1
- package/dist/recipes/tools/index.d.ts +28 -0
- package/dist/recipes/tools/index.js +28 -0
- package/dist/recipes/tools/index.js.map +1 -1
- package/dist/recipes/tools/intercom.js +11 -10
- package/dist/recipes/tools/intercom.js.map +1 -1
- package/dist/recipes/tools/jira.js +13 -0
- package/dist/recipes/tools/jira.js.map +1 -1
- package/dist/recipes/tools/meetingNotes.js +2 -2
- package/dist/recipes/tools/monday.d.ts +22 -0
- package/dist/recipes/tools/monday.js +242 -0
- package/dist/recipes/tools/monday.js.map +1 -0
- package/dist/recipes/tools/mongodb.d.ts +19 -0
- package/dist/recipes/tools/mongodb.js +194 -0
- package/dist/recipes/tools/mongodb.js.map +1 -0
- package/dist/recipes/tools/notion.js +11 -10
- package/dist/recipes/tools/notion.js.map +1 -1
- package/dist/recipes/tools/obsidian.d.ts +15 -0
- package/dist/recipes/tools/obsidian.js +173 -0
- package/dist/recipes/tools/obsidian.js.map +1 -0
- package/dist/recipes/tools/outcomes.d.ts +15 -0
- package/dist/recipes/tools/outcomes.js +111 -0
- package/dist/recipes/tools/outcomes.js.map +1 -0
- package/dist/recipes/tools/paystack.d.ts +11 -0
- package/dist/recipes/tools/paystack.js +212 -0
- package/dist/recipes/tools/paystack.js.map +1 -0
- package/dist/recipes/tools/pipedrive.d.ts +16 -0
- package/dist/recipes/tools/pipedrive.js +234 -0
- package/dist/recipes/tools/pipedrive.js.map +1 -0
- package/dist/recipes/tools/postgres.d.ts +15 -0
- package/dist/recipes/tools/postgres.js +186 -0
- package/dist/recipes/tools/postgres.js.map +1 -0
- package/dist/recipes/tools/posthog.d.ts +16 -0
- package/dist/recipes/tools/posthog.js +219 -0
- package/dist/recipes/tools/posthog.js.map +1 -0
- package/dist/recipes/tools/redis.d.ts +9 -0
- package/dist/recipes/tools/redis.js +141 -0
- package/dist/recipes/tools/redis.js.map +1 -0
- package/dist/recipes/tools/resend.d.ts +8 -0
- package/dist/recipes/tools/resend.js +153 -0
- package/dist/recipes/tools/resend.js.map +1 -0
- package/dist/recipes/tools/salesforce.d.ts +16 -0
- package/dist/recipes/tools/salesforce.js +184 -0
- package/dist/recipes/tools/salesforce.js.map +1 -0
- package/dist/recipes/tools/sendgrid.d.ts +9 -0
- package/dist/recipes/tools/sendgrid.js +175 -0
- package/dist/recipes/tools/sendgrid.js.map +1 -0
- package/dist/recipes/tools/shopify.d.ts +16 -0
- package/dist/recipes/tools/shopify.js +266 -0
- package/dist/recipes/tools/shopify.js.map +1 -0
- package/dist/recipes/tools/snowflake.d.ts +16 -0
- package/dist/recipes/tools/snowflake.js +173 -0
- package/dist/recipes/tools/snowflake.js.map +1 -0
- package/dist/recipes/tools/stripe.js +13 -12
- package/dist/recipes/tools/stripe.js.map +1 -1
- package/dist/recipes/tools/supabase.d.ts +9 -0
- package/dist/recipes/tools/supabase.js +133 -0
- package/dist/recipes/tools/supabase.js.map +1 -0
- package/dist/recipes/tools/todoist.d.ts +15 -0
- package/dist/recipes/tools/todoist.js +228 -0
- package/dist/recipes/tools/todoist.js.map +1 -0
- package/dist/recipes/tools/twilio.d.ts +11 -0
- package/dist/recipes/tools/twilio.js +180 -0
- package/dist/recipes/tools/twilio.js.map +1 -0
- package/dist/recipes/tools/vercel.d.ts +9 -0
- package/dist/recipes/tools/vercel.js +146 -0
- package/dist/recipes/tools/vercel.js.map +1 -0
- package/dist/recipes/tools/webflow.d.ts +11 -0
- package/dist/recipes/tools/webflow.js +244 -0
- package/dist/recipes/tools/webflow.js.map +1 -0
- package/dist/recipes/tools/woocommerce.d.ts +18 -0
- package/dist/recipes/tools/woocommerce.js +260 -0
- package/dist/recipes/tools/woocommerce.js.map +1 -0
- package/dist/recipes/tools/wrapConnectorExecute.d.ts +25 -0
- package/dist/recipes/tools/wrapConnectorExecute.js +37 -0
- package/dist/recipes/tools/wrapConnectorExecute.js.map +1 -0
- package/dist/recipes/tools/zendesk.js +11 -10
- package/dist/recipes/tools/zendesk.js.map +1 -1
- package/dist/recipes/triggerVars.d.ts +15 -0
- package/dist/recipes/triggerVars.js +57 -0
- package/dist/recipes/triggerVars.js.map +1 -0
- package/dist/recipes/validation.d.ts +1 -1
- package/dist/recipes/validation.js +536 -12
- package/dist/recipes/validation.js.map +1 -1
- package/dist/recipes/yamlPositions.d.ts +1 -1
- package/dist/recipes/yamlPositions.js +7 -2
- package/dist/recipes/yamlPositions.js.map +1 -1
- package/dist/recipes/yamlRunner.d.ts +216 -4
- package/dist/recipes/yamlRunner.js +1030 -96
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/recipesHttp.d.ts +5 -0
- package/dist/recipesHttp.js +68 -6
- package/dist/recipesHttp.js.map +1 -1
- package/dist/resources.js +14 -1
- package/dist/resources.js.map +1 -1
- package/dist/riskSignals.d.ts +42 -0
- package/dist/riskSignals.js +197 -0
- package/dist/riskSignals.js.map +1 -0
- package/dist/riskTier.d.ts +9 -0
- package/dist/riskTier.js +48 -0
- package/dist/riskTier.js.map +1 -1
- package/dist/runLog.d.ts +53 -0
- package/dist/runLog.js +75 -16
- package/dist/runLog.js.map +1 -1
- package/dist/schemas/recipe.v1.json +360 -16
- package/dist/server.d.ts +60 -0
- package/dist/server.js +192 -31
- package/dist/server.js.map +1 -1
- package/dist/sessionCheckpoint.js +4 -1
- package/dist/sessionCheckpoint.js.map +1 -1
- package/dist/sessionDetail.d.ts +43 -0
- package/dist/sessionDetail.js +59 -0
- package/dist/sessionDetail.js.map +1 -0
- package/dist/settingsEnv.d.ts +47 -0
- package/dist/settingsEnv.js +88 -0
- package/dist/settingsEnv.js.map +1 -0
- package/dist/streamableHttp.js +44 -10
- package/dist/streamableHttp.js.map +1 -1
- package/dist/ta/backtest/abnday.d.ts +53 -0
- package/dist/ta/backtest/abnday.js +123 -0
- package/dist/ta/backtest/abnday.js.map +1 -0
- package/dist/ta/backtest/directional.d.ts +48 -0
- package/dist/ta/backtest/directional.js +103 -0
- package/dist/ta/backtest/directional.js.map +1 -0
- package/dist/ta/backtest/fundx.d.ts +67 -0
- package/dist/ta/backtest/fundx.js +264 -0
- package/dist/ta/backtest/fundx.js.map +1 -0
- package/dist/ta/backtest/fvg.d.ts +62 -0
- package/dist/ta/backtest/fvg.js +236 -0
- package/dist/ta/backtest/fvg.js.map +1 -0
- package/dist/ta/backtest/ichimoku.d.ts +41 -0
- package/dist/ta/backtest/ichimoku.js +146 -0
- package/dist/ta/backtest/ichimoku.js.map +1 -0
- package/dist/ta/backtest/ingest.d.ts +20 -0
- package/dist/ta/backtest/ingest.js +104 -0
- package/dist/ta/backtest/ingest.js.map +1 -0
- package/dist/ta/backtest/msb.d.ts +49 -0
- package/dist/ta/backtest/msb.js +162 -0
- package/dist/ta/backtest/msb.js.map +1 -0
- package/dist/ta/backtest/scoring.d.ts +33 -0
- package/dist/ta/backtest/scoring.js +82 -0
- package/dist/ta/backtest/scoring.js.map +1 -0
- package/dist/ta/backtest/summary.d.ts +20 -0
- package/dist/ta/backtest/summary.js +42 -0
- package/dist/ta/backtest/summary.js.map +1 -0
- package/dist/ta/backtest/tsmom.d.ts +72 -0
- package/dist/ta/backtest/tsmom.js +202 -0
- package/dist/ta/backtest/tsmom.js.map +1 -0
- package/dist/ta/backtest/volsq.d.ts +34 -0
- package/dist/ta/backtest/volsq.js +154 -0
- package/dist/ta/backtest/volsq.js.map +1 -0
- package/dist/ta/backtest/walkForward.d.ts +45 -0
- package/dist/ta/backtest/walkForward.js +136 -0
- package/dist/ta/backtest/walkForward.js.map +1 -0
- package/dist/ta/cycles.d.ts +15 -0
- package/dist/ta/cycles.js +31 -0
- package/dist/ta/cycles.js.map +1 -0
- package/dist/ta/desk/accrualEmitter.d.ts +59 -0
- package/dist/ta/desk/accrualEmitter.js +136 -0
- package/dist/ta/desk/accrualEmitter.js.map +1 -0
- package/dist/ta/desk/cellBacktest.d.ts +179 -0
- package/dist/ta/desk/cellBacktest.js +514 -0
- package/dist/ta/desk/cellBacktest.js.map +1 -0
- package/dist/ta/desk/cells/wpMaRejection.d.ts +49 -0
- package/dist/ta/desk/cells/wpMaRejection.js +141 -0
- package/dist/ta/desk/cells/wpMaRejection.js.map +1 -0
- package/dist/ta/desk/cells/wpVolumeClimax.d.ts +57 -0
- package/dist/ta/desk/cells/wpVolumeClimax.js +193 -0
- package/dist/ta/desk/cells/wpVolumeClimax.js.map +1 -0
- package/dist/ta/desk/collectors.d.ts +18 -0
- package/dist/ta/desk/collectors.js +450 -0
- package/dist/ta/desk/collectors.js.map +1 -0
- package/dist/ta/desk/contract.d.ts +51 -0
- package/dist/ta/desk/contract.js +261 -0
- package/dist/ta/desk/contract.js.map +1 -0
- package/dist/ta/desk/deskLedger.d.ts +36 -0
- package/dist/ta/desk/deskLedger.js +239 -0
- package/dist/ta/desk/deskLedger.js.map +1 -0
- package/dist/ta/desk/liqTape.d.ts +37 -0
- package/dist/ta/desk/liqTape.js +99 -0
- package/dist/ta/desk/liqTape.js.map +1 -0
- package/dist/ta/desk/post.d.ts +20 -0
- package/dist/ta/desk/post.js +65 -0
- package/dist/ta/desk/post.js.map +1 -0
- package/dist/ta/desk/render.d.ts +25 -0
- package/dist/ta/desk/render.js +398 -0
- package/dist/ta/desk/render.js.map +1 -0
- package/dist/ta/desk/surfaces.d.ts +216 -0
- package/dist/ta/desk/surfaces.js +472 -0
- package/dist/ta/desk/surfaces.js.map +1 -0
- package/dist/ta/desk/types.d.ts +174 -0
- package/dist/ta/desk/types.js +104 -0
- package/dist/ta/desk/types.js.map +1 -0
- package/dist/ta/index.d.ts +23 -0
- package/dist/ta/index.js +54 -0
- package/dist/ta/index.js.map +1 -0
- package/dist/ta/ledger.d.ts +44 -0
- package/dist/ta/ledger.js +95 -0
- package/dist/ta/ledger.js.map +1 -0
- package/dist/ta/levels.d.ts +21 -0
- package/dist/ta/levels.js +41 -0
- package/dist/ta/levels.js.map +1 -0
- package/dist/ta/swings.d.ts +30 -0
- package/dist/ta/swings.js +83 -0
- package/dist/ta/swings.js.map +1 -0
- package/dist/ta/types.d.ts +81 -0
- package/dist/ta/types.js +20 -0
- package/dist/ta/types.js.map +1 -0
- package/dist/telemetry.js +20 -9
- package/dist/telemetry.js.map +1 -1
- package/dist/tokenUsageTracker.d.ts +2 -1
- package/dist/tokenUsageTracker.js +38 -20
- package/dist/tokenUsageTracker.js.map +1 -1
- package/dist/tools/contextBundle.js +13 -9
- package/dist/tools/contextBundle.js.map +1 -1
- package/dist/tools/ctxGetTaskContext.js +8 -3
- package/dist/tools/ctxGetTaskContext.js.map +1 -1
- package/dist/tools/ctxQueryTraces.d.ts +18 -1
- package/dist/tools/ctxQueryTraces.js +176 -27
- package/dist/tools/ctxQueryTraces.js.map +1 -1
- package/dist/tools/enrichCommit.js +5 -2
- package/dist/tools/enrichCommit.js.map +1 -1
- package/dist/tools/getDependencyTree.js +2 -2
- package/dist/tools/getDependencyTree.js.map +1 -1
- package/dist/tools/getDiagnostics.js +3 -0
- package/dist/tools/getDiagnostics.js.map +1 -1
- package/dist/tools/getDocumentSymbols.js +5 -1
- package/dist/tools/getDocumentSymbols.js.map +1 -1
- package/dist/tools/getGitHotspots.js +12 -1
- package/dist/tools/getGitHotspots.js.map +1 -1
- package/dist/tools/getGitLog.js +5 -2
- package/dist/tools/getGitLog.js.map +1 -1
- package/dist/tools/getGitStatus.js +6 -1
- package/dist/tools/getGitStatus.js.map +1 -1
- package/dist/tools/getProjectContext.js +3 -1
- package/dist/tools/getProjectContext.js.map +1 -1
- package/dist/tools/getToolCapabilities.js +39 -4
- package/dist/tools/getToolCapabilities.js.map +1 -1
- package/dist/tools/gitWrite.js +12 -3
- package/dist/tools/gitWrite.js.map +1 -1
- package/dist/tools/github/composite.d.ts +1 -1
- package/dist/tools/github/composite.js +7 -7
- package/dist/tools/github/composite.js.map +1 -1
- package/dist/tools/github/pr.d.ts +6 -6
- package/dist/tools/github/pr.js +18 -11
- package/dist/tools/github/pr.js.map +1 -1
- package/dist/tools/httpClient.js +55 -3
- package/dist/tools/httpClient.js.map +1 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.js +19 -12
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lsp.d.ts +6 -0
- package/dist/tools/lsp.js +81 -12
- package/dist/tools/lsp.js.map +1 -1
- package/dist/tools/previewEdit.js +16 -1
- package/dist/tools/previewEdit.js.map +1 -1
- package/dist/tools/resumeClaudeTask.js +17 -0
- package/dist/tools/resumeClaudeTask.js.map +1 -1
- package/dist/tools/searchAndReplace.js +9 -5
- package/dist/tools/searchAndReplace.js.map +1 -1
- package/dist/tools/searchTools.d.ts +26 -0
- package/dist/tools/searchTools.js +42 -2
- package/dist/tools/searchTools.js.map +1 -1
- package/dist/tools/terminal.js +23 -51
- package/dist/tools/terminal.js.map +1 -1
- package/dist/tools/transaction.d.ts +9 -1
- package/dist/tools/transaction.js +59 -4
- package/dist/tools/transaction.js.map +1 -1
- package/dist/tools/utils.d.ts +16 -0
- package/dist/tools/utils.js +77 -7
- package/dist/tools/utils.js.map +1 -1
- package/dist/transport.d.ts +31 -0
- package/dist/transport.js +117 -14
- package/dist/transport.js.map +1 -1
- package/dist/wireHaltPushDispatch.js +12 -0
- package/dist/wireHaltPushDispatch.js.map +1 -1
- package/dist/workerGateDecisionLog.d.ts +141 -0
- package/dist/workerGateDecisionLog.js +361 -0
- package/dist/workerGateDecisionLog.js.map +1 -0
- package/dist/workers/actionClass.d.ts +38 -0
- package/dist/workers/actionClass.js +155 -0
- package/dist/workers/actionClass.js.map +1 -0
- package/dist/workers/backtest.d.ts +68 -0
- package/dist/workers/backtest.js +113 -0
- package/dist/workers/backtest.js.map +1 -0
- package/dist/workers/contextRisk.d.ts +35 -0
- package/dist/workers/contextRisk.js +20 -0
- package/dist/workers/contextRisk.js.map +1 -0
- package/dist/workers/contextRiskScorer.d.ts +48 -0
- package/dist/workers/contextRiskScorer.js +94 -0
- package/dist/workers/contextRiskScorer.js.map +1 -0
- package/dist/workers/graduation.d.ts +61 -0
- package/dist/workers/graduation.js +112 -0
- package/dist/workers/graduation.js.map +1 -0
- package/dist/workers/outcomeStore.d.ts +98 -0
- package/dist/workers/outcomeStore.js +146 -0
- package/dist/workers/outcomeStore.js.map +1 -0
- package/dist/workers/outcomesCli.d.ts +34 -0
- package/dist/workers/outcomesCli.js +91 -0
- package/dist/workers/outcomesCli.js.map +1 -0
- package/dist/workers/runWorkerShadow.d.ts +90 -0
- package/dist/workers/runWorkerShadow.js +323 -0
- package/dist/workers/runWorkerShadow.js.map +1 -0
- package/dist/workers/shadowGate.d.ts +30 -0
- package/dist/workers/shadowGate.js +58 -0
- package/dist/workers/shadowGate.js.map +1 -0
- package/dist/workers/shadowObserver.d.ts +165 -0
- package/dist/workers/shadowObserver.js +203 -0
- package/dist/workers/shadowObserver.js.map +1 -0
- package/dist/workers/shadowReport.d.ts +16 -0
- package/dist/workers/shadowReport.js +61 -0
- package/dist/workers/shadowReport.js.map +1 -0
- package/dist/workers/shadowRun.d.ts +38 -0
- package/dist/workers/shadowRun.js +44 -0
- package/dist/workers/shadowRun.js.map +1 -0
- package/dist/workers/trustLevel.d.ts +82 -0
- package/dist/workers/trustLevel.js +100 -0
- package/dist/workers/trustLevel.js.map +1 -0
- package/dist/workers/worker.d.ts +49 -0
- package/dist/workers/worker.js +88 -0
- package/dist/workers/worker.js.map +1 -0
- package/dist/workers/workerGate.d.ts +101 -0
- package/dist/workers/workerGate.js +210 -0
- package/dist/workers/workerGate.js.map +1 -0
- package/dist/workers/workerLevelStore.d.ts +33 -0
- package/dist/workers/workerLevelStore.js +87 -0
- package/dist/workers/workerLevelStore.js.map +1 -0
- package/dist/workers/workerLoader.d.ts +7 -0
- package/dist/workers/workerLoader.js +31 -0
- package/dist/workers/workerLoader.js.map +1 -0
- package/dist/writeFileAtomic.js +40 -13
- package/dist/writeFileAtomic.js.map +1 -1
- package/package.json +14 -6
- package/scripts/mcp-stdio-shim.cjs +247 -87
- package/templates/CLAUDE.bridge.md +1 -1
- package/templates/recipes/dependency-bump.yaml +33 -0
- package/templates/recipes/incident-to-pr.yaml +187 -0
- package/templates/recipes/outcome-ingester.yaml +53 -0
- package/templates/recipes/release-notes.yaml +30 -0
- package/templates/recipes/triage-failing-tests-autofile.yaml +152 -0
- package/templates/recipes/triage-failing-tests.yaml +38 -0
- package/templates/workers/dependency-upkeep.worker.yaml +26 -0
- package/templates/workers/release-notes.worker.yaml +17 -0
- package/templates/workers/test-guardian.worker.yaml +24 -0
- package/deploy/README.md +0 -172
- package/deploy/bootstrap-new-vps.sh +0 -364
- package/deploy/bootstrap-vps.sh +0 -192
- package/deploy/claude-ide-bridge.service.template +0 -67
- package/deploy/claude-ide-bridge@.service +0 -31
- package/deploy/deploy-dashboard.sh +0 -198
- package/deploy/deploy-landing.sh +0 -136
- package/deploy/ecosystem.config.js.example +0 -36
- package/deploy/install-vps-service.sh +0 -240
- package/deploy/macos/README.md +0 -153
- package/deploy/macos/com.patchwork.bridge.plist.template +0 -54
- package/deploy/macos/com.patchwork.tunnel.plist.template +0 -76
- package/deploy/macos/install-mac-bridge.sh +0 -244
- package/deploy/macos/uninstall-mac-bridge.sh +0 -22
- package/deploy/nginx-claude-bridge.conf.template +0 -129
package/dist/bridge.js
CHANGED
|
@@ -15,6 +15,7 @@ import { ClaudeOrchestrator } from "./claudeOrchestrator.js";
|
|
|
15
15
|
import { CommitIssueLinkLog } from "./commitIssueLinkLog.js";
|
|
16
16
|
import { DecisionTraceLog } from "./decisionTraceLog.js";
|
|
17
17
|
import { createDriver } from "./drivers/index.js";
|
|
18
|
+
import { getLocalEmbedFn } from "./embeddings/index.js";
|
|
18
19
|
import { ExtensionClient } from "./extensionClient.js";
|
|
19
20
|
import { lockKillSwitchEnv, watchFlags } from "./featureFlags.js";
|
|
20
21
|
import { FileLock } from "./fileLock.js";
|
|
@@ -28,14 +29,16 @@ import { PluginWatcher } from "./pluginWatcher.js";
|
|
|
28
29
|
import { isPreToolUseHookRegistered } from "./preToolUseHook.js";
|
|
29
30
|
import { probeAll } from "./probe.js";
|
|
30
31
|
import { RecipeOrchestration } from "./recipeOrchestration.js";
|
|
32
|
+
import { collectEventTriggerPrograms, shouldAutoEnableAutomation, } from "./recipes/eventTriggerPrograms.js";
|
|
31
33
|
import { haltSummaryToPrometheus, summariseHalts, } from "./recipes/haltCategory.js";
|
|
32
34
|
import { judgeSummaryToPrometheus, summariseJudgments, } from "./recipes/judgeSummary.js";
|
|
33
35
|
import { warnAboutLegacyPermissionsSidecars } from "./recipes/migrationWarnings.js";
|
|
34
36
|
import { RecipeOrchestrator } from "./recipes/RecipeOrchestrator.js";
|
|
35
|
-
import {
|
|
37
|
+
import { evaluateInProcessGate } from "./riskSignals.js";
|
|
36
38
|
import { RecipeRunLog } from "./runLog.js";
|
|
37
39
|
import { Server } from "./server.js";
|
|
38
40
|
import { SessionCheckpoint } from "./sessionCheckpoint.js";
|
|
41
|
+
import { buildSessionDetail } from "./sessionDetail.js";
|
|
39
42
|
import { StreamableHttpHandler } from "./streamableHttp.js";
|
|
40
43
|
import { initTelemetry, shutdownTelemetry } from "./telemetry.js";
|
|
41
44
|
import { TokenUsageTracker } from "./tokenUsageTracker.js";
|
|
@@ -48,8 +51,9 @@ import { resolveFilePath } from "./tools/utils.js";
|
|
|
48
51
|
import { McpTransport } from "./transport.js";
|
|
49
52
|
import { PACKAGE_VERSION } from "./version.js";
|
|
50
53
|
import { wireHaltPushDispatch } from "./wireHaltPushDispatch.js";
|
|
54
|
+
import { WorkerGateDecisionLog } from "./workerGateDecisionLog.js";
|
|
51
55
|
const SHUTDOWN_TIMEOUT_MS = 5000;
|
|
52
|
-
let
|
|
56
|
+
let activeSignalHandlers = null;
|
|
53
57
|
/** Collect the union of openedFiles across all sessions in a checkpoint. */
|
|
54
58
|
export function extractRestoredFiles(checkpoint, workspace) {
|
|
55
59
|
const all = new Set();
|
|
@@ -126,6 +130,7 @@ export class Bridge {
|
|
|
126
130
|
recipeOrchestrator = null;
|
|
127
131
|
commitIssueLinkLog = null;
|
|
128
132
|
decisionTraceLog = null;
|
|
133
|
+
workerGateDecisionLog = null;
|
|
129
134
|
/** Pre-computed digest of recent decisions, refreshed on each session connect. */
|
|
130
135
|
recentTracesDigest = [];
|
|
131
136
|
httpMcpHandler = null;
|
|
@@ -149,6 +154,10 @@ export class Bridge {
|
|
|
149
154
|
this.server = new Server(this.authToken, this.logger, config.corsOrigins, undefined, config.trustedProxies);
|
|
150
155
|
this.server.bridgeConfigPath = config.configFilePath ?? undefined;
|
|
151
156
|
this.server.webhookSecret = config.webhookSecret ?? null;
|
|
157
|
+
// Audit 2026-06-08 (server-3): workspace-relative routes (decision replay,
|
|
158
|
+
// CC permission attribution, approval routing) must use the configured
|
|
159
|
+
// workspace, not the bridge process's cwd.
|
|
160
|
+
this.server.workspace = config.workspace;
|
|
152
161
|
if (config.issuerUrl) {
|
|
153
162
|
this.oauthServer = new OAuthServerImpl(this.authToken, config.issuerUrl, {
|
|
154
163
|
configDir,
|
|
@@ -289,20 +298,24 @@ export class Bridge {
|
|
|
289
298
|
catch {
|
|
290
299
|
// Best-effort warning — never block startup on a hook check failure.
|
|
291
300
|
}
|
|
292
|
-
transport.setApprovalGate(async ({ toolName, params, sessionId }) => {
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
301
|
+
transport.setApprovalGate(async ({ toolName, params, sessionId, onPending }) => {
|
|
302
|
+
const gate = evaluateInProcessGate({
|
|
303
|
+
toolName,
|
|
304
|
+
params,
|
|
305
|
+
gate: this.server.approvalGate,
|
|
306
|
+
workspace: this.config.workspace,
|
|
307
|
+
});
|
|
308
|
+
if (gate.decision === "bypass")
|
|
297
309
|
return "bypass";
|
|
298
310
|
const queue = getApprovalQueue();
|
|
299
|
-
const { promise } = queue.request({
|
|
311
|
+
const { promise, callId } = queue.request({
|
|
300
312
|
toolName,
|
|
301
313
|
params,
|
|
302
|
-
tier,
|
|
314
|
+
tier: gate.tier,
|
|
303
315
|
sessionId: sessionId ?? undefined,
|
|
304
|
-
riskSignals:
|
|
316
|
+
riskSignals: gate.riskSignals,
|
|
305
317
|
});
|
|
318
|
+
onPending?.(callId);
|
|
306
319
|
return promise;
|
|
307
320
|
});
|
|
308
321
|
}
|
|
@@ -375,7 +388,7 @@ export class Bridge {
|
|
|
375
388
|
}), (generatedAt) => {
|
|
376
389
|
this._lastContextCachedAt = generatedAt;
|
|
377
390
|
this._emitLiveState();
|
|
378
|
-
}, () => this.extensionDisconnectCount, this.commitIssueLinkLog ?? undefined, this.recipeRunLog ?? undefined, this.decisionTraceLog ?? undefined);
|
|
391
|
+
}, () => this.extensionDisconnectCount, this.commitIssueLinkLog ?? undefined, this.recipeRunLog ?? undefined, this.decisionTraceLog ?? undefined, this.workerGateDecisionLog ?? undefined);
|
|
379
392
|
transport.attach(ws);
|
|
380
393
|
this.sessions.set(sessionId, session);
|
|
381
394
|
this.logger.info(`Claude Code connected (session ${sessionId.slice(0, 8)}) — ${this.sessions.size} active session${this.sessions.size === 1 ? "" : "s"}`);
|
|
@@ -558,7 +571,7 @@ export class Bridge {
|
|
|
558
571
|
errors += e;
|
|
559
572
|
warnings += w;
|
|
560
573
|
if (e > 0)
|
|
561
|
-
errorFiles.push(
|
|
574
|
+
errorFiles.push(path.basename(file) || file);
|
|
562
575
|
}
|
|
563
576
|
lines.push(`Diagnostics: ${errors} errors, ${warnings} warnings`);
|
|
564
577
|
if (errorFiles.length > 0) {
|
|
@@ -735,6 +748,30 @@ export class Bridge {
|
|
|
735
748
|
getAuthToken() {
|
|
736
749
|
return this.authToken;
|
|
737
750
|
}
|
|
751
|
+
/**
|
|
752
|
+
* Compile installed recipe triggers (file_watch / git_hook) and register them
|
|
753
|
+
* into the live AutomationHooks so they actually fire on the corresponding
|
|
754
|
+
* events. Without this, such recipes are parsed + installed but decorative
|
|
755
|
+
* (see docs/dogfood/recipe-dogfood-2026-05-01/C-triggers.md). Idempotent and
|
|
756
|
+
* fail-soft: safe to call at startup and on every recipe hot-reload; a no-op
|
|
757
|
+
* when automation is disabled.
|
|
758
|
+
*/
|
|
759
|
+
registerRecipeTriggerPrograms() {
|
|
760
|
+
if (!this.automationHooks)
|
|
761
|
+
return;
|
|
762
|
+
try {
|
|
763
|
+
const recipesDir = path.join(os.homedir(), ".patchwork", "recipes");
|
|
764
|
+
const collected = collectEventTriggerPrograms(recipesDir, {
|
|
765
|
+
logger: this.logger,
|
|
766
|
+
});
|
|
767
|
+
this.automationHooks.registerRecipePrograms(collected.programs);
|
|
768
|
+
const n = collected.programs.length;
|
|
769
|
+
this.logger.info(`[bridge] Recipe triggers registered · ${n} event-driven recipe${n === 1 ? "" : "s"}${collected.recipeNames.length ? ` (${collected.recipeNames.join(", ")})` : ""}`);
|
|
770
|
+
}
|
|
771
|
+
catch (err) {
|
|
772
|
+
this.logger.warn?.(`[bridge] recipe trigger registration failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
773
|
+
}
|
|
774
|
+
}
|
|
738
775
|
async start() {
|
|
739
776
|
// 0. Initialize OpenTelemetry (no-op when OTEL_EXPORTER_OTLP_ENDPOINT is unset)
|
|
740
777
|
initTelemetry();
|
|
@@ -772,6 +809,29 @@ export class Bridge {
|
|
|
772
809
|
this.logger.info(`Probed tools: ${probeList()}`);
|
|
773
810
|
this.logger.info(`Available linters: ${probeList(["tsc", "eslint", "pyright", "ruff", "cargo", "go", "biome"])}`);
|
|
774
811
|
this.logger.info(`Available test runners: ${probeList(["vitest", "jest", "pytest", "cargo", "go"])}`);
|
|
812
|
+
// Initialize Patchwork enrichment + decision-trace logs.
|
|
813
|
+
//
|
|
814
|
+
// These back the ctx tools (ctxQueryTraces / ctxGetTaskContext /
|
|
815
|
+
// ctxSaveTrace / getCommitsForIssue) which are advertised as standard
|
|
816
|
+
// full-mode tools regardless of orchestration. They MUST be created even
|
|
817
|
+
// on the default `driver: "none"` bridge — otherwise the decision-trace
|
|
818
|
+
// WRITE path and the enrichment reverse-lookup silently disappear and
|
|
819
|
+
// ctxSaveTrace returns tool-not-found.
|
|
820
|
+
const patchworkDir = path.join(os.homedir(), ".patchwork");
|
|
821
|
+
this.commitIssueLinkLog = new CommitIssueLinkLog({
|
|
822
|
+
dir: patchworkDir,
|
|
823
|
+
logger: this.logger,
|
|
824
|
+
});
|
|
825
|
+
this.decisionTraceLog = new DecisionTraceLog({
|
|
826
|
+
dir: patchworkDir,
|
|
827
|
+
logger: this.logger,
|
|
828
|
+
});
|
|
829
|
+
// Decision Record store — every worker-gate decision + inputs (replayable
|
|
830
|
+
// audit trail). Always available so the gate's decisions are never discarded.
|
|
831
|
+
this.workerGateDecisionLog = new WorkerGateDecisionLog({
|
|
832
|
+
dir: patchworkDir,
|
|
833
|
+
logger: this.logger,
|
|
834
|
+
});
|
|
775
835
|
// 2. Initialize Claude driver and orchestrator (if configured)
|
|
776
836
|
if (this.config.driver !== "none") {
|
|
777
837
|
const driver = createDriver(this.config.driver, {
|
|
@@ -788,16 +848,6 @@ export class Bridge {
|
|
|
788
848
|
}
|
|
789
849
|
: undefined,
|
|
790
850
|
}, (msg) => this.logger.info(msg));
|
|
791
|
-
// Patchwork: enrichment link log is useful regardless of orchestrator.
|
|
792
|
-
const patchworkDir = path.join(os.homedir(), ".patchwork");
|
|
793
|
-
this.commitIssueLinkLog = new CommitIssueLinkLog({
|
|
794
|
-
dir: patchworkDir,
|
|
795
|
-
logger: this.logger,
|
|
796
|
-
});
|
|
797
|
-
this.decisionTraceLog = new DecisionTraceLog({
|
|
798
|
-
dir: patchworkDir,
|
|
799
|
-
logger: this.logger,
|
|
800
|
-
});
|
|
801
851
|
if (driver) {
|
|
802
852
|
// Recipe run-history needs the orchestrator to produce anything.
|
|
803
853
|
this.recipeRunLog = new RecipeRunLog({
|
|
@@ -862,6 +912,7 @@ export class Bridge {
|
|
|
862
912
|
recipeOrchestrator: this.recipeOrchestrator,
|
|
863
913
|
recipeRunLog: this.recipeRunLog,
|
|
864
914
|
activityLog: this.activityLog,
|
|
915
|
+
workerGateDecisionLog: this.workerGateDecisionLog,
|
|
865
916
|
workdir: this.config.workspace,
|
|
866
917
|
logger: this.logger,
|
|
867
918
|
});
|
|
@@ -891,6 +942,10 @@ export class Bridge {
|
|
|
891
942
|
catch (err) {
|
|
892
943
|
this.logger.warn?.(`[patchwork] scheduler restart failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
893
944
|
}
|
|
945
|
+
// Re-sync recipe-derived event triggers (file_watch / git_hook) on
|
|
946
|
+
// every install / save / delete. registerRecipePrograms() replaces the
|
|
947
|
+
// prior recipe set, so this is idempotent.
|
|
948
|
+
this.registerRecipeTriggerPrograms();
|
|
894
949
|
};
|
|
895
950
|
}
|
|
896
951
|
}
|
|
@@ -902,8 +957,64 @@ export class Bridge {
|
|
|
902
957
|
throw new Error("--automation requires --automation-policy <path>");
|
|
903
958
|
}
|
|
904
959
|
const policy = loadPolicy(this.config.automationPolicyPath);
|
|
905
|
-
this.automationHooks = new AutomationHooks(policy, this.orchestrator, (msg) => this.logger.info(msg), this.extensionClient, this.config.workspace, this.config.automationAllowPrivateWebhooks
|
|
960
|
+
this.automationHooks = new AutomationHooks(policy, this.orchestrator, (msg) => this.logger.info(msg), this.extensionClient, this.config.workspace, this.config.automationAllowPrivateWebhooks, this.recipeOrchestration
|
|
961
|
+
? (opts) =>
|
|
962
|
+
// biome-ignore lint/style/noNonNullAssertion: guarded by outer ternary
|
|
963
|
+
this.recipeOrchestration.fireYamlRecipe({
|
|
964
|
+
filePath: path.join(os.homedir(), ".patchwork", "recipes", `${opts.recipeName}.yaml`),
|
|
965
|
+
name: opts.recipeName,
|
|
966
|
+
taskIdPrefix: `automation-recipe-${opts.recipeName}`,
|
|
967
|
+
triggerSourceSuffix: `automation:${opts.triggerSource}`,
|
|
968
|
+
logLabel: `automation "${opts.recipeName}"`,
|
|
969
|
+
seedContext: Object.fromEntries(Object.entries(opts.eventData)),
|
|
970
|
+
}).then((r) => {
|
|
971
|
+
if (!r.ok)
|
|
972
|
+
throw new Error(r.error ?? "recipe fire failed");
|
|
973
|
+
return r.taskId ?? "";
|
|
974
|
+
})
|
|
975
|
+
: undefined);
|
|
906
976
|
this.logger.info(`[bridge] Automation enabled (policy: ${this.config.automationPolicyPath})`);
|
|
977
|
+
// Wire installed recipe triggers (file_watch / git_hook) into the live
|
|
978
|
+
// interpreter — they compile to hooks the bridge already fires, but were
|
|
979
|
+
// never registered until now (decorative). See C-triggers.md.
|
|
980
|
+
this.registerRecipeTriggerPrograms();
|
|
981
|
+
}
|
|
982
|
+
else if (this.orchestrator) {
|
|
983
|
+
// Auto-enable (no --automation policy): when installed recipes declare
|
|
984
|
+
// event triggers AND a subprocess driver is active, stand up a policy-less
|
|
985
|
+
// AutomationHooks so those triggers actually fire. The `this.orchestrator`
|
|
986
|
+
// guard is the safety floor — we never spawn tasks unless the operator
|
|
987
|
+
// already enabled a driver. Pass --automation --automation-policy to add
|
|
988
|
+
// policy-file hooks on top of the recipe triggers.
|
|
989
|
+
const recipesDir = path.join(os.homedir(), ".patchwork", "recipes");
|
|
990
|
+
const collected = collectEventTriggerPrograms(recipesDir, {
|
|
991
|
+
logger: this.logger,
|
|
992
|
+
});
|
|
993
|
+
if (shouldAutoEnableAutomation({
|
|
994
|
+
automationEnabled: this.config.automationEnabled,
|
|
995
|
+
hasDriver: true,
|
|
996
|
+
eventProgramCount: collected.programs.length,
|
|
997
|
+
})) {
|
|
998
|
+
this.automationHooks = new AutomationHooks({}, this.orchestrator, (msg) => this.logger.info(msg), this.extensionClient, this.config.workspace, this.config.automationAllowPrivateWebhooks, this.recipeOrchestration
|
|
999
|
+
? (opts) =>
|
|
1000
|
+
// biome-ignore lint/style/noNonNullAssertion: guarded by outer ternary
|
|
1001
|
+
this.recipeOrchestration.fireYamlRecipe({
|
|
1002
|
+
filePath: path.join(os.homedir(), ".patchwork", "recipes", `${opts.recipeName}.yaml`),
|
|
1003
|
+
name: opts.recipeName,
|
|
1004
|
+
taskIdPrefix: `automation-recipe-${opts.recipeName}`,
|
|
1005
|
+
triggerSourceSuffix: `automation:${opts.triggerSource}`,
|
|
1006
|
+
logLabel: `automation "${opts.recipeName}"`,
|
|
1007
|
+
seedContext: Object.fromEntries(Object.entries(opts.eventData)),
|
|
1008
|
+
}).then((r) => {
|
|
1009
|
+
if (!r.ok)
|
|
1010
|
+
throw new Error(r.error ?? "recipe fire failed");
|
|
1011
|
+
return r.taskId ?? "";
|
|
1012
|
+
})
|
|
1013
|
+
: undefined);
|
|
1014
|
+
this.automationHooks.registerRecipePrograms(collected.programs);
|
|
1015
|
+
const n = collected.programs.length;
|
|
1016
|
+
this.logger.info(`[bridge] Automation auto-enabled for ${n} event-driven recipe${n === 1 ? "" : "s"} (${collected.recipeNames.join(", ")}) — no --automation policy; pass --automation --automation-policy to add policy hooks`);
|
|
1017
|
+
}
|
|
907
1018
|
}
|
|
908
1019
|
// 3. Wire up /health endpoint data and /metrics
|
|
909
1020
|
this.server.healthDataFn = () => {
|
|
@@ -1035,20 +1146,42 @@ export class Bridge {
|
|
|
1035
1146
|
nearby: nearby,
|
|
1036
1147
|
};
|
|
1037
1148
|
};
|
|
1149
|
+
// Build the traces tool + embeddings provider ONCE at startup. The
|
|
1150
|
+
// dashboard polls /traces every few seconds; re-constructing the tool and
|
|
1151
|
+
// re-allocating the embeddings provider on every request was pure waste
|
|
1152
|
+
// (audit sem-4). The log references and embed fn are stable for the
|
|
1153
|
+
// bridge's lifetime.
|
|
1154
|
+
const tracesTool = createCtxQueryTracesTool({
|
|
1155
|
+
activityLog: this.activityLog,
|
|
1156
|
+
commitIssueLinkLog: this.commitIssueLinkLog,
|
|
1157
|
+
recipeRunLog: this.recipeRunLog,
|
|
1158
|
+
decisionTraceLog: this.decisionTraceLog,
|
|
1159
|
+
workerGateDecisionLog: this.workerGateDecisionLog,
|
|
1160
|
+
embedFn: getLocalEmbedFn(),
|
|
1161
|
+
});
|
|
1162
|
+
// POST /traces/decision — HTTP twin of the ctxSaveTrace MCP tool, same
|
|
1163
|
+
// DecisionTraceLog.record() writer/validation. null when the bridge has
|
|
1164
|
+
// no decisionTraceLog configured (route responds 503 in that case).
|
|
1165
|
+
this.server.saveDecisionTraceFn = this.decisionTraceLog
|
|
1166
|
+
? (input) => this.decisionTraceLog.record({
|
|
1167
|
+
ref: input.ref,
|
|
1168
|
+
problem: input.problem,
|
|
1169
|
+
solution: input.solution,
|
|
1170
|
+
workspace: input.workspace ?? this.config.workspace,
|
|
1171
|
+
...(input.tags && { tags: input.tags }),
|
|
1172
|
+
...(input.sessionId && { sessionId: input.sessionId }),
|
|
1173
|
+
...(input.source && { source: input.source }),
|
|
1174
|
+
})
|
|
1175
|
+
: null;
|
|
1038
1176
|
this.server.tracesFn = async (query) => {
|
|
1039
|
-
const
|
|
1040
|
-
activityLog: this.activityLog,
|
|
1041
|
-
commitIssueLinkLog: this.commitIssueLinkLog,
|
|
1042
|
-
recipeRunLog: this.recipeRunLog,
|
|
1043
|
-
decisionTraceLog: this.decisionTraceLog,
|
|
1044
|
-
});
|
|
1045
|
-
const result = await tool.handler({
|
|
1177
|
+
const result = await tracesTool.handler({
|
|
1046
1178
|
...(query.traceType && { traceType: query.traceType }),
|
|
1047
1179
|
...(query.key && { key: query.key }),
|
|
1048
1180
|
...(query.q && { q: query.q }),
|
|
1049
1181
|
...(query.tag && { tag: query.tag }),
|
|
1050
1182
|
...(query.since !== undefined && { since: query.since }),
|
|
1051
1183
|
...(query.limit !== undefined && { limit: query.limit }),
|
|
1184
|
+
...(query.semantic && { semantic: true }),
|
|
1052
1185
|
});
|
|
1053
1186
|
const structured = result
|
|
1054
1187
|
.structuredContent;
|
|
@@ -1069,13 +1202,20 @@ export class Bridge {
|
|
|
1069
1202
|
this.server.analyticsFn = async (windowHours) => {
|
|
1070
1203
|
const wh = typeof windowHours === "number" && windowHours >= 1 ? windowHours : 24;
|
|
1071
1204
|
const cutoff = Date.now() - wh * 3_600 * 1_000;
|
|
1072
|
-
|
|
1205
|
+
// Respect the requested window for tool counts (was all-time `stats()`).
|
|
1206
|
+
const statsMap = this.activityLog.windowedStats(wh * 3_600 * 1_000);
|
|
1207
|
+
// Per-tool latency percentiles. `percentiles()` is computed over the
|
|
1208
|
+
// bounded duration-sample buffer (not windowed) and omits any tool with
|
|
1209
|
+
// <2 samples — default those to 0 so the dashboard ToolStat shape is
|
|
1210
|
+
// always satisfied.
|
|
1211
|
+
const pctMap = this.activityLog.percentiles();
|
|
1073
1212
|
const topTools = Object.entries(statsMap)
|
|
1074
1213
|
.map(([tool, s]) => ({
|
|
1075
1214
|
tool,
|
|
1076
1215
|
calls: s.count,
|
|
1077
1216
|
errors: s.errors,
|
|
1078
|
-
|
|
1217
|
+
p50Ms: pctMap[tool]?.p50 ?? 0,
|
|
1218
|
+
p95Ms: pctMap[tool]?.p95 ?? 0,
|
|
1079
1219
|
}))
|
|
1080
1220
|
.sort((a, b) => b.calls - a.calls)
|
|
1081
1221
|
.slice(0, 10);
|
|
@@ -1104,6 +1244,8 @@ export class Bridge {
|
|
|
1104
1244
|
t.doneAt !== undefined && {
|
|
1105
1245
|
durationMs: t.doneAt - t.startedAt,
|
|
1106
1246
|
}),
|
|
1247
|
+
...(t.startedAt !== undefined && { startedAt: t.startedAt }),
|
|
1248
|
+
...(t.doneAt !== undefined && { completedAt: t.doneAt }),
|
|
1107
1249
|
createdAt: new Date(t.createdAt).toISOString(),
|
|
1108
1250
|
...(t.output !== undefined && {
|
|
1109
1251
|
output: t.output.slice(0, 2000),
|
|
@@ -1170,6 +1312,13 @@ export class Bridge {
|
|
|
1170
1312
|
}
|
|
1171
1313
|
return out;
|
|
1172
1314
|
};
|
|
1315
|
+
// Wire `/sessions/:id` for the dashboard's session-detail page. Audit
|
|
1316
|
+
// 2026-06-08 HIGH (server-1): sessionDetailFn was declared in server.ts but
|
|
1317
|
+
// never assigned, so GET /sessions/:id returned 404 forever and the page
|
|
1318
|
+
// was permanently blank. The dashboard navigates with the 8-char prefix
|
|
1319
|
+
// sessionsFn emits (`s.id.slice(0,8)`), so resolve that (or a full id) to
|
|
1320
|
+
// the active session, then slice the per-session activity from the log.
|
|
1321
|
+
this.server.sessionDetailFn = (id) => buildSessionDetail(id, this.sessions.values(), this.activityLog, getApprovalQueue().list());
|
|
1173
1322
|
this.server.restartCheckFn = () => {
|
|
1174
1323
|
let totalSessions = 0;
|
|
1175
1324
|
let totalInFlight = 0;
|
|
@@ -1290,6 +1439,12 @@ export class Bridge {
|
|
|
1290
1439
|
this.server.statusFn = () => {
|
|
1291
1440
|
let sessionsInGrace = 0;
|
|
1292
1441
|
const sessionList = [];
|
|
1442
|
+
// Rate-limit state isn't a single bridge-wide value (each session has
|
|
1443
|
+
// its own token bucket, or a shared one for HTTP session cycling — see
|
|
1444
|
+
// McpTransport.setSharedToolRateLimitBucket) but the dashboard vitals
|
|
1445
|
+
// pane isn't session-scoped, so surface the most-constrained session's
|
|
1446
|
+
// remaining budget as a single aggregate rather than an arbitrary one.
|
|
1447
|
+
let toolRateLimit = null;
|
|
1293
1448
|
for (const s of this.sessions.values()) {
|
|
1294
1449
|
if (s.graceTimer)
|
|
1295
1450
|
sessionsInGrace++;
|
|
@@ -1300,11 +1455,17 @@ export class Bridge {
|
|
|
1300
1455
|
openedFiles: s.openedFiles.size,
|
|
1301
1456
|
terminalPrefix: s.terminalPrefix,
|
|
1302
1457
|
});
|
|
1458
|
+
const state = s.transport.getToolRateLimitState();
|
|
1459
|
+
if (state &&
|
|
1460
|
+
(!toolRateLimit || state.remaining < toolRateLimit.remaining)) {
|
|
1461
|
+
toolRateLimit = state;
|
|
1462
|
+
}
|
|
1303
1463
|
}
|
|
1304
1464
|
return {
|
|
1305
1465
|
claudeCode: this.sessions.size > 0,
|
|
1306
1466
|
activeSessions: this.sessions.size,
|
|
1307
1467
|
sessionsInGrace,
|
|
1468
|
+
toolRateLimit,
|
|
1308
1469
|
gracePeriodMs: this.config.gracePeriodMs,
|
|
1309
1470
|
lastConnectAt: this.lastConnectAt,
|
|
1310
1471
|
lastDisconnectAt: this.lastDisconnectAt,
|
|
@@ -1449,6 +1610,9 @@ export class Bridge {
|
|
|
1449
1610
|
...(this.decisionTraceLog && {
|
|
1450
1611
|
decisionTraceLog: this.decisionTraceLog,
|
|
1451
1612
|
}),
|
|
1613
|
+
...(this.workerGateDecisionLog && {
|
|
1614
|
+
workerGateDecisionLog: this.workerGateDecisionLog,
|
|
1615
|
+
}),
|
|
1452
1616
|
});
|
|
1453
1617
|
this.server.httpMcpHandler = (req, res) => this.httpMcpHandler?.handle(req, res) ?? Promise.resolve();
|
|
1454
1618
|
// 3. Check for stale lock files
|
|
@@ -1535,9 +1699,6 @@ export class Bridge {
|
|
|
1535
1699
|
await shutdownTelemetry();
|
|
1536
1700
|
process.exit(exitCode);
|
|
1537
1701
|
};
|
|
1538
|
-
// All process-level signal handlers are guarded by globalHandlersRegistered so
|
|
1539
|
-
// that repeated start() calls (e.g. in tests or --watch restarts) don't
|
|
1540
|
-
// accumulate process.once listeners and trigger MaxListenersExceededWarning.
|
|
1541
1702
|
// Wire server callbacks so /restart and /shutdown invoke the bridge's
|
|
1542
1703
|
// shutdown sequence directly. This is the only path that works on
|
|
1543
1704
|
// Windows, where `process.kill(pid, 'SIGTERM')` is TerminateProcess
|
|
@@ -1548,12 +1709,24 @@ export class Bridge {
|
|
|
1548
1709
|
this.server.shutdownFn = () => {
|
|
1549
1710
|
void shutdown("SIGTERM", 0);
|
|
1550
1711
|
};
|
|
1551
|
-
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1712
|
+
// core-infra-4: take ownership of the process signal handlers. Detach any
|
|
1713
|
+
// previously-registered set (from an earlier bridge in this process) first
|
|
1714
|
+
// so we never accumulate listeners (MaxListenersExceededWarning) AND the
|
|
1715
|
+
// most-recently-started bridge — whose `shutdown` closure references this
|
|
1716
|
+
// bridge's sessions/logger — is the one that actually runs on teardown.
|
|
1717
|
+
if (activeSignalHandlers) {
|
|
1718
|
+
const prev = activeSignalHandlers;
|
|
1719
|
+
process.removeListener("SIGINT", prev.sigint);
|
|
1720
|
+
process.removeListener("SIGTERM", prev.sigterm);
|
|
1721
|
+
process.removeListener("SIGHUP", prev.sighup);
|
|
1722
|
+
process.removeListener("unhandledRejection", prev.unhandledRejection);
|
|
1723
|
+
process.removeListener("uncaughtException", prev.uncaughtException);
|
|
1724
|
+
}
|
|
1725
|
+
const handlers = {
|
|
1726
|
+
sigint: () => void shutdown("SIGINT", 130),
|
|
1727
|
+
sigterm: () => void shutdown("SIGTERM", 143),
|
|
1728
|
+
sighup: () => void shutdown("SIGHUP", 143),
|
|
1729
|
+
unhandledRejection: (reason) => {
|
|
1557
1730
|
for (const [sid, session] of this.sessions) {
|
|
1558
1731
|
const stats = session.transport.getStats();
|
|
1559
1732
|
if (stats.inFlightTools.length > 0) {
|
|
@@ -1561,8 +1734,8 @@ export class Bridge {
|
|
|
1561
1734
|
}
|
|
1562
1735
|
}
|
|
1563
1736
|
this.logger.error(`Unhandled rejection: ${reason instanceof Error ? (reason.stack ?? reason.message) : String(reason)}`);
|
|
1564
|
-
}
|
|
1565
|
-
|
|
1737
|
+
},
|
|
1738
|
+
uncaughtException: (err) => {
|
|
1566
1739
|
for (const [sid, session] of this.sessions) {
|
|
1567
1740
|
const stats = session.transport.getStats();
|
|
1568
1741
|
if (stats.inFlightTools.length > 0) {
|
|
@@ -1570,9 +1743,15 @@ export class Bridge {
|
|
|
1570
1743
|
}
|
|
1571
1744
|
}
|
|
1572
1745
|
this.logger.error(`Uncaught exception: ${err.stack ?? err.message}`);
|
|
1573
|
-
shutdown("uncaughtException", 1);
|
|
1574
|
-
}
|
|
1575
|
-
}
|
|
1746
|
+
void shutdown("uncaughtException", 1);
|
|
1747
|
+
},
|
|
1748
|
+
};
|
|
1749
|
+
process.on("SIGINT", handlers.sigint);
|
|
1750
|
+
process.on("SIGTERM", handlers.sigterm);
|
|
1751
|
+
process.on("SIGHUP", handlers.sighup);
|
|
1752
|
+
process.on("unhandledRejection", handlers.unhandledRejection);
|
|
1753
|
+
process.on("uncaughtException", handlers.uncaughtException);
|
|
1754
|
+
activeSignalHandlers = handlers;
|
|
1576
1755
|
// Startup banner to stderr (not stdout) to avoid capture by parent processes
|
|
1577
1756
|
this.logger.info("claude-ide-bridge ready");
|
|
1578
1757
|
this.logger.info(` Port: ${port}`);
|