patchwork-os 0.2.0-beta.1 → 0.2.0-beta.10.canary.100
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 +14 -14
- package/README.md +201 -34
- package/deploy/README.md +1 -1
- package/deploy/bootstrap-vps.sh +14 -9
- package/deploy/deploy-dashboard.sh +25 -1
- package/deploy/macos/README.md +153 -0
- package/deploy/macos/com.patchwork.bridge.plist.template +54 -0
- package/deploy/macos/com.patchwork.tunnel.plist.template +76 -0
- package/deploy/macos/install-mac-bridge.sh +244 -0
- package/deploy/macos/uninstall-mac-bridge.sh +22 -0
- package/dist/activityLog.d.ts +6 -0
- package/dist/activityLog.js +63 -26
- package/dist/activityLog.js.map +1 -1
- package/dist/adapters/claude.js +22 -16
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/gemini.js +15 -11
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/openai.js +9 -9
- package/dist/adapters/openai.js.map +1 -1
- package/dist/ajv2020.d.ts +25 -0
- package/dist/ajv2020.js +33 -0
- package/dist/ajv2020.js.map +1 -0
- package/dist/analyticsAggregator.js +1 -1
- package/dist/analyticsAggregator.js.map +1 -1
- package/dist/analyticsConfig.d.ts +29 -0
- package/dist/analyticsConfig.js +102 -0
- package/dist/analyticsConfig.js.map +1 -0
- package/dist/analyticsPrefs.d.ts +38 -2
- package/dist/analyticsPrefs.js +148 -23
- package/dist/analyticsPrefs.js.map +1 -1
- package/dist/analyticsSend.d.ts +17 -1
- package/dist/analyticsSend.js +67 -5
- package/dist/analyticsSend.js.map +1 -1
- package/dist/approvalHttp.d.ts +14 -0
- package/dist/approvalHttp.js +212 -9
- package/dist/approvalHttp.js.map +1 -1
- package/dist/approvalInsights.js +13 -5
- package/dist/approvalInsights.js.map +1 -1
- package/dist/approvalQueue.d.ts +97 -3
- package/dist/approvalQueue.js +193 -19
- package/dist/approvalQueue.js.map +1 -1
- package/dist/approvalSignals.js +19 -11
- package/dist/approvalSignals.js.map +1 -1
- package/dist/automation.d.ts +35 -10
- package/dist/automation.js +133 -37
- package/dist/automation.js.map +1 -1
- package/dist/automationSuggestions.js +10 -8
- package/dist/automationSuggestions.js.map +1 -1
- package/dist/bridge.d.ts +2 -0
- package/dist/bridge.js +219 -35
- package/dist/bridge.js.map +1 -1
- package/dist/bridgeLockDiscovery.d.ts +27 -1
- package/dist/bridgeLockDiscovery.js +38 -11
- package/dist/bridgeLockDiscovery.js.map +1 -1
- package/dist/bridgeToken.js +3 -2
- package/dist/bridgeToken.js.map +1 -1
- package/dist/claudeDriver.js +23 -8
- package/dist/claudeDriver.js.map +1 -1
- package/dist/claudeOrchestrator.d.ts +1 -1
- package/dist/claudeOrchestrator.js +87 -44
- package/dist/claudeOrchestrator.js.map +1 -1
- package/dist/commands/analytics.d.ts +8 -0
- package/dist/commands/analytics.js +134 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/auditEnv.d.ts +36 -0
- package/dist/commands/auditEnv.js +202 -0
- package/dist/commands/auditEnv.js.map +1 -0
- 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/dashboard.js +8 -1
- package/dist/commands/dashboard.js.map +1 -1
- package/dist/commands/doctor.d.ts +35 -0
- package/dist/commands/doctor.js +51 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/install.js +3 -0
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/launchd.js +15 -16
- package/dist/commands/launchd.js.map +1 -1
- package/dist/commands/patchworkInit.d.ts +5 -0
- package/dist/commands/patchworkInit.js +89 -7
- package/dist/commands/patchworkInit.js.map +1 -1
- package/dist/commands/recipe.d.ts +151 -0
- package/dist/commands/recipe.js +649 -9
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipeInstall.js +11 -4
- package/dist/commands/recipeInstall.js.map +1 -1
- package/dist/commands/shadowScan.d.ts +34 -0
- package/dist/commands/shadowScan.js +142 -0
- package/dist/commands/shadowScan.js.map +1 -0
- package/dist/commands/task.d.ts +25 -0
- package/dist/commands/task.js +62 -42
- package/dist/commands/task.js.map +1 -1
- package/dist/commands/tools.d.ts +20 -1
- package/dist/commands/tools.js +112 -3
- package/dist/commands/tools.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/commands/tracesImport.js +21 -4
- package/dist/commands/tracesImport.js.map +1 -1
- package/dist/commitIssueLinkLog.d.ts +16 -0
- package/dist/commitIssueLinkLog.js +110 -24
- package/dist/commitIssueLinkLog.js.map +1 -1
- package/dist/companions/registry.js +15 -7
- package/dist/companions/registry.js.map +1 -1
- package/dist/config.d.ts +47 -3
- package/dist/config.js +111 -21
- package/dist/config.js.map +1 -1
- package/dist/connectorRoutes.js +1422 -57
- package/dist/connectorRoutes.js.map +1 -1
- package/dist/connectors/airtable.d.ts +230 -0
- package/dist/connectors/airtable.js +700 -0
- package/dist/connectors/airtable.js.map +1 -0
- package/dist/connectors/asana.js +13 -9
- package/dist/connectors/asana.js.map +1 -1
- package/dist/connectors/baseConnector.js +25 -3
- package/dist/connectors/baseConnector.js.map +1 -1
- package/dist/connectors/caldiy.d.ts +137 -0
- package/dist/connectors/caldiy.js +424 -0
- package/dist/connectors/caldiy.js.map +1 -0
- package/dist/connectors/circleci.d.ts +162 -0
- package/dist/connectors/circleci.js +576 -0
- package/dist/connectors/circleci.js.map +1 -0
- package/dist/connectors/cloudflare.d.ts +132 -0
- package/dist/connectors/cloudflare.js +622 -0
- package/dist/connectors/cloudflare.js.map +1 -0
- package/dist/connectors/confluence.js +35 -0
- package/dist/connectors/confluence.js.map +1 -1
- package/dist/connectors/connectorRedirectUri.d.ts +30 -0
- package/dist/connectors/connectorRedirectUri.js +38 -0
- package/dist/connectors/connectorRedirectUri.js.map +1 -0
- package/dist/connectors/connectorRegistry.d.ts +60 -0
- package/dist/connectors/connectorRegistry.js +354 -0
- package/dist/connectors/connectorRegistry.js.map +1 -0
- package/dist/connectors/datadog.js +41 -5
- package/dist/connectors/datadog.js.map +1 -1
- package/dist/connectors/discord.js +14 -10
- package/dist/connectors/discord.js.map +1 -1
- package/dist/connectors/elasticsearch.d.ts +141 -0
- package/dist/connectors/elasticsearch.js +601 -0
- package/dist/connectors/elasticsearch.js.map +1 -0
- package/dist/connectors/figma.d.ts +130 -0
- package/dist/connectors/figma.js +387 -0
- package/dist/connectors/figma.js.map +1 -0
- package/dist/connectors/github.d.ts +17 -0
- package/dist/connectors/github.js +53 -2
- package/dist/connectors/github.js.map +1 -1
- package/dist/connectors/gitlab.js +12 -6
- package/dist/connectors/gitlab.js.map +1 -1
- package/dist/connectors/gmail.js +72 -21
- package/dist/connectors/gmail.js.map +1 -1
- package/dist/connectors/googleCalendar.js +8 -8
- package/dist/connectors/googleCalendar.js.map +1 -1
- package/dist/connectors/googleDocs.d.ts +103 -0
- package/dist/connectors/googleDocs.js +409 -0
- package/dist/connectors/googleDocs.js.map +1 -0
- package/dist/connectors/googleDrive.d.ts +12 -0
- package/dist/connectors/googleDrive.js +35 -8
- package/dist/connectors/googleDrive.js.map +1 -1
- package/dist/connectors/grafana.d.ts +133 -0
- package/dist/connectors/grafana.js +478 -0
- package/dist/connectors/grafana.js.map +1 -0
- package/dist/connectors/jira.d.ts +25 -0
- package/dist/connectors/jira.js +234 -3
- package/dist/connectors/jira.js.map +1 -1
- package/dist/connectors/linear.js +1 -1
- package/dist/connectors/linear.js.map +1 -1
- package/dist/connectors/mcpClient.js +37 -23
- package/dist/connectors/mcpClient.js.map +1 -1
- package/dist/connectors/mcpOAuth.js +78 -16
- package/dist/connectors/mcpOAuth.js.map +1 -1
- package/dist/connectors/monday.d.ts +217 -0
- package/dist/connectors/monday.js +655 -0
- package/dist/connectors/monday.js.map +1 -0
- package/dist/connectors/mongodb.d.ts +139 -0
- package/dist/connectors/mongodb.js +455 -0
- package/dist/connectors/mongodb.js.map +1 -0
- package/dist/connectors/notion.d.ts +1 -1
- package/dist/connectors/notion.js +13 -4
- package/dist/connectors/notion.js.map +1 -1
- package/dist/connectors/oauthStateStore.d.ts +20 -0
- package/dist/connectors/oauthStateStore.js +94 -4
- package/dist/connectors/oauthStateStore.js.map +1 -1
- package/dist/connectors/obsidian.d.ts +83 -0
- package/dist/connectors/obsidian.js +441 -0
- package/dist/connectors/obsidian.js.map +1 -0
- package/dist/connectors/paystack.d.ts +159 -0
- package/dist/connectors/paystack.js +607 -0
- package/dist/connectors/paystack.js.map +1 -0
- package/dist/connectors/pipedrive.d.ts +189 -0
- package/dist/connectors/pipedrive.js +559 -0
- package/dist/connectors/pipedrive.js.map +1 -0
- package/dist/connectors/postgres.d.ts +127 -0
- package/dist/connectors/postgres.js +512 -0
- package/dist/connectors/postgres.js.map +1 -0
- package/dist/connectors/posthog.d.ts +119 -0
- package/dist/connectors/posthog.js +479 -0
- package/dist/connectors/posthog.js.map +1 -0
- package/dist/connectors/redis.d.ts +140 -0
- package/dist/connectors/redis.js +579 -0
- package/dist/connectors/redis.js.map +1 -0
- package/dist/connectors/resend.d.ts +131 -0
- package/dist/connectors/resend.js +529 -0
- package/dist/connectors/resend.js.map +1 -0
- package/dist/connectors/salesforce.d.ts +136 -0
- package/dist/connectors/salesforce.js +603 -0
- package/dist/connectors/salesforce.js.map +1 -0
- package/dist/connectors/secrets.d.ts +51 -0
- package/dist/connectors/secrets.js +102 -0
- package/dist/connectors/secrets.js.map +1 -0
- package/dist/connectors/sendgrid.d.ts +102 -0
- package/dist/connectors/sendgrid.js +423 -0
- package/dist/connectors/sendgrid.js.map +1 -0
- package/dist/connectors/shopify.d.ts +145 -0
- package/dist/connectors/shopify.js +502 -0
- package/dist/connectors/shopify.js.map +1 -0
- package/dist/connectors/slack.d.ts +1 -1
- package/dist/connectors/slack.js +61 -9
- package/dist/connectors/slack.js.map +1 -1
- package/dist/connectors/snowflake.d.ts +119 -0
- package/dist/connectors/snowflake.js +633 -0
- package/dist/connectors/snowflake.js.map +1 -0
- package/dist/connectors/supabase.d.ts +92 -0
- package/dist/connectors/supabase.js +630 -0
- package/dist/connectors/supabase.js.map +1 -0
- package/dist/connectors/todoist.d.ts +117 -0
- package/dist/connectors/todoist.js +485 -0
- package/dist/connectors/todoist.js.map +1 -0
- package/dist/connectors/tokenStorage.js +56 -14
- package/dist/connectors/tokenStorage.js.map +1 -1
- package/dist/connectors/twilio.d.ts +118 -0
- package/dist/connectors/twilio.js +475 -0
- package/dist/connectors/twilio.js.map +1 -0
- package/dist/connectors/vercel.d.ts +110 -0
- package/dist/connectors/vercel.js +479 -0
- package/dist/connectors/vercel.js.map +1 -0
- package/dist/connectors/webflow.d.ts +118 -0
- package/dist/connectors/webflow.js +393 -0
- package/dist/connectors/webflow.js.map +1 -0
- package/dist/connectors/woocommerce.d.ts +220 -0
- package/dist/connectors/woocommerce.js +464 -0
- package/dist/connectors/woocommerce.js.map +1 -0
- package/dist/crypto.js +7 -2
- package/dist/crypto.js.map +1 -1
- package/dist/decisionReplay.d.ts +8 -6
- package/dist/decisionReplay.js +50 -17
- package/dist/decisionReplay.js.map +1 -1
- package/dist/decisionTraceLog.d.ts +28 -0
- package/dist/decisionTraceLog.js +156 -29
- package/dist/decisionTraceLog.js.map +1 -1
- package/dist/drivers/claude/api.js +33 -9
- package/dist/drivers/claude/api.js.map +1 -1
- package/dist/drivers/claude/envSanitizer.d.ts +0 -6
- package/dist/drivers/claude/envSanitizer.js +17 -2
- package/dist/drivers/claude/envSanitizer.js.map +1 -1
- package/dist/drivers/claude/streamParser.js +5 -4
- package/dist/drivers/claude/streamParser.js.map +1 -1
- package/dist/drivers/claude/subprocess.js +69 -16
- package/dist/drivers/claude/subprocess.js.map +1 -1
- package/dist/drivers/gemini/index.d.ts +22 -0
- package/dist/drivers/gemini/index.js +256 -129
- package/dist/drivers/gemini/index.js.map +1 -1
- package/dist/drivers/local/index.d.ts +2 -0
- package/dist/drivers/local/index.js +12 -0
- package/dist/drivers/local/index.js.map +1 -1
- package/dist/drivers/openai/index.js +30 -2
- package/dist/drivers/openai/index.js.map +1 -1
- package/dist/extensionClient.d.ts +37 -4
- package/dist/extensionClient.js +58 -16
- package/dist/extensionClient.js.map +1 -1
- package/dist/featureFlags.d.ts +91 -0
- package/dist/featureFlags.js +174 -3
- package/dist/featureFlags.js.map +1 -1
- package/dist/fileLock.js +21 -12
- package/dist/fileLock.js.map +1 -1
- package/dist/fileLockSync.d.ts +67 -0
- package/dist/fileLockSync.js +126 -0
- package/dist/fileLockSync.js.map +1 -0
- package/dist/fp/activityAnalytics.js +26 -12
- package/dist/fp/activityAnalytics.js.map +1 -1
- package/dist/fp/automationInterpreter.d.ts +15 -1
- package/dist/fp/automationInterpreter.js +267 -87
- package/dist/fp/automationInterpreter.js.map +1 -1
- package/dist/fp/automationProgram.d.ts +30 -0
- package/dist/fp/automationProgram.js.map +1 -1
- package/dist/fp/automationState.d.ts +24 -5
- package/dist/fp/automationState.js +56 -9
- package/dist/fp/automationState.js.map +1 -1
- package/dist/fp/automationUtils.js +1 -1
- package/dist/fp/automationUtils.js.map +1 -1
- package/dist/fp/commandDescription.js +7 -1
- package/dist/fp/commandDescription.js.map +1 -1
- package/dist/fp/extensionSnapshot.js +8 -2
- package/dist/fp/extensionSnapshot.js.map +1 -1
- package/dist/fp/interpreterContext.d.ts +66 -1
- package/dist/fp/interpreterContext.js +91 -1
- package/dist/fp/interpreterContext.js.map +1 -1
- package/dist/fp/policyParser.js +34 -2
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/fsWatchWithFallback.d.ts +36 -0
- package/dist/fsWatchWithFallback.js +128 -0
- package/dist/fsWatchWithFallback.js.map +1 -0
- package/dist/haltPushDispatch.d.ts +33 -0
- package/dist/haltPushDispatch.js +103 -0
- package/dist/haltPushDispatch.js.map +1 -0
- package/dist/httpBodyValidation.d.ts +41 -0
- package/dist/httpBodyValidation.js +45 -0
- package/dist/httpBodyValidation.js.map +1 -0
- package/dist/inboxRoutes.d.ts +22 -0
- package/dist/inboxRoutes.js +61 -1
- package/dist/inboxRoutes.js.map +1 -1
- package/dist/index.js +1206 -158
- package/dist/index.js.map +1 -1
- package/dist/installGuard.js +6 -2
- 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/lockfile.js +31 -4
- package/dist/lockfile.js.map +1 -1
- package/dist/oauth.d.ts +9 -0
- package/dist/oauth.js +33 -0
- package/dist/oauth.js.map +1 -1
- package/dist/oauthRoutes.d.ts +1 -1
- package/dist/oauthRoutes.js +5 -3
- package/dist/oauthRoutes.js.map +1 -1
- package/dist/orchestrator/childBridgeClient.d.ts +5 -0
- package/dist/orchestrator/childBridgeClient.js +28 -1
- package/dist/orchestrator/childBridgeClient.js.map +1 -1
- package/dist/orchestrator/childBridgeRegistry.js +29 -11
- package/dist/orchestrator/childBridgeRegistry.js.map +1 -1
- package/dist/orchestrator/orchestratorBridge.d.ts +33 -0
- package/dist/orchestrator/orchestratorBridge.js +70 -9
- package/dist/orchestrator/orchestratorBridge.js.map +1 -1
- package/dist/patchworkConfig.d.ts +44 -1
- package/dist/patchworkConfig.js +28 -3
- package/dist/patchworkConfig.js.map +1 -1
- package/dist/pluginLoader.js +10 -1
- package/dist/pluginLoader.js.map +1 -1
- package/dist/pluginWatcher.js +12 -14
- package/dist/pluginWatcher.js.map +1 -1
- package/dist/preToolUseHook.js +3 -2
- package/dist/preToolUseHook.js.map +1 -1
- package/dist/processTree.d.ts +34 -0
- package/dist/processTree.js +105 -0
- package/dist/processTree.js.map +1 -0
- package/dist/prompts.js +3 -3
- package/dist/prompts.js.map +1 -1
- package/dist/recipeOrchestration.d.ts +9 -0
- package/dist/recipeOrchestration.js +341 -24
- package/dist/recipeOrchestration.js.map +1 -1
- package/dist/recipeRoutes.d.ts +58 -2
- package/dist/recipeRoutes.js +744 -115
- package/dist/recipeRoutes.js.map +1 -1
- package/dist/recipes/RecipeOrchestrator.d.ts +2 -0
- package/dist/recipes/RecipeOrchestrator.js +6 -1
- package/dist/recipes/RecipeOrchestrator.js.map +1 -1
- package/dist/recipes/agentExecutor.d.ts +25 -5
- package/dist/recipes/agentExecutor.js.map +1 -1
- package/dist/recipes/chainedRunner.d.ts +2 -0
- package/dist/recipes/chainedRunner.js +156 -9
- package/dist/recipes/chainedRunner.js.map +1 -1
- package/dist/recipes/compiler.js +9 -5
- package/dist/recipes/compiler.js.map +1 -1
- package/dist/recipes/connectorPreflight.d.ts +66 -0
- package/dist/recipes/connectorPreflight.js +169 -0
- package/dist/recipes/connectorPreflight.js.map +1 -0
- package/dist/recipes/dependencyGraph.d.ts +9 -0
- package/dist/recipes/dependencyGraph.js +32 -7
- package/dist/recipes/dependencyGraph.js.map +1 -1
- package/dist/recipes/githubInstallSource.d.ts +135 -0
- package/dist/recipes/githubInstallSource.js +236 -0
- package/dist/recipes/githubInstallSource.js.map +1 -0
- package/dist/recipes/haltCategory.d.ts +119 -0
- package/dist/recipes/haltCategory.js +188 -0
- package/dist/recipes/haltCategory.js.map +1 -0
- package/dist/recipes/idempotencyKey.d.ts +154 -0
- package/dist/recipes/idempotencyKey.js +375 -0
- package/dist/recipes/idempotencyKey.js.map +1 -0
- package/dist/recipes/installer.js +58 -3
- package/dist/recipes/installer.js.map +1 -1
- package/dist/recipes/judgeSummary.d.ts +50 -0
- package/dist/recipes/judgeSummary.js +47 -0
- package/dist/recipes/judgeSummary.js.map +1 -0
- package/dist/recipes/judgeVerdict.d.ts +48 -0
- package/dist/recipes/judgeVerdict.js +174 -0
- package/dist/recipes/judgeVerdict.js.map +1 -0
- package/dist/recipes/migrations/index.d.ts +9 -0
- package/dist/recipes/migrations/index.js +133 -0
- package/dist/recipes/migrations/index.js.map +1 -1
- package/dist/recipes/names.d.ts +20 -0
- package/dist/recipes/names.js +25 -0
- package/dist/recipes/names.js.map +1 -1
- package/dist/recipes/parser.js +116 -6
- package/dist/recipes/parser.js.map +1 -1
- package/dist/recipes/replayRun.js +1 -1
- package/dist/recipes/replayRun.js.map +1 -1
- package/dist/recipes/runBudget.d.ts +70 -0
- package/dist/recipes/runBudget.js +109 -0
- package/dist/recipes/runBudget.js.map +1 -0
- package/dist/recipes/scheduler.d.ts +30 -0
- package/dist/recipes/scheduler.js +69 -19
- package/dist/recipes/scheduler.js.map +1 -1
- package/dist/recipes/schema.d.ts +65 -2
- package/dist/recipes/schemaGenerator.js +119 -7
- package/dist/recipes/schemaGenerator.js.map +1 -1
- package/dist/recipes/stepObservation.js +9 -0
- package/dist/recipes/stepObservation.js.map +1 -1
- package/dist/recipes/toolRegistry.js +33 -7
- package/dist/recipes/toolRegistry.js.map +1 -1
- package/dist/recipes/tools/airtable.d.ts +15 -0
- package/dist/recipes/tools/airtable.js +239 -0
- package/dist/recipes/tools/airtable.js.map +1 -0
- package/dist/recipes/tools/fanOut.d.ts +20 -0
- package/dist/recipes/tools/fanOut.js +199 -0
- package/dist/recipes/tools/fanOut.js.map +1 -0
- package/dist/recipes/tools/file.js +5 -2
- package/dist/recipes/tools/file.js.map +1 -1
- package/dist/recipes/tools/github.d.ts +1 -1
- package/dist/recipes/tools/github.js +75 -1
- package/dist/recipes/tools/github.js.map +1 -1
- package/dist/recipes/tools/gmail.js +27 -5
- package/dist/recipes/tools/gmail.js.map +1 -1
- package/dist/recipes/tools/googleDrive.js +64 -0
- package/dist/recipes/tools/googleDrive.js.map +1 -1
- package/dist/recipes/tools/http.d.ts +10 -0
- package/dist/recipes/tools/http.js +176 -0
- package/dist/recipes/tools/http.js.map +1 -0
- package/dist/recipes/tools/index.d.ts +7 -0
- package/dist/recipes/tools/index.js +7 -0
- package/dist/recipes/tools/index.js.map +1 -1
- package/dist/recipes/tools/resend.d.ts +8 -0
- package/dist/recipes/tools/resend.js +152 -0
- package/dist/recipes/tools/resend.js.map +1 -0
- package/dist/recipes/tools/sendgrid.d.ts +9 -0
- package/dist/recipes/tools/sendgrid.js +174 -0
- package/dist/recipes/tools/sendgrid.js.map +1 -0
- package/dist/recipes/tools/slack.js +1 -1
- package/dist/recipes/tools/twilio.d.ts +11 -0
- package/dist/recipes/tools/twilio.js +179 -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 +145 -0
- package/dist/recipes/tools/vercel.js.map +1 -0
- package/dist/recipes/validation.d.ts +17 -0
- package/dist/recipes/validation.js +141 -11
- package/dist/recipes/validation.js.map +1 -1
- package/dist/recipes/workspaceRoot.d.ts +37 -0
- package/dist/recipes/workspaceRoot.js +73 -0
- package/dist/recipes/workspaceRoot.js.map +1 -0
- package/dist/recipes/yamlPositions.d.ts +56 -0
- package/dist/recipes/yamlPositions.js +183 -0
- package/dist/recipes/yamlPositions.js.map +1 -0
- package/dist/recipes/yamlRunner.d.ts +185 -8
- package/dist/recipes/yamlRunner.js +967 -224
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/recipesHttp.d.ts +19 -3
- package/dist/recipesHttp.js +67 -11
- package/dist/recipesHttp.js.map +1 -1
- package/dist/resources.js +21 -13
- package/dist/resources.js.map +1 -1
- package/dist/runLog.d.ts +58 -5
- package/dist/runLog.js +98 -21
- package/dist/runLog.js.map +1 -1
- package/dist/sanitizeParsedJson.d.ts +39 -0
- package/dist/sanitizeParsedJson.js +55 -0
- package/dist/sanitizeParsedJson.js.map +1 -0
- package/dist/schemas/recipe.v1.json +887 -198
- package/dist/server.d.ts +160 -3
- package/dist/server.js +1099 -122
- package/dist/server.js.map +1 -1
- package/dist/sessionCheckpoint.d.ts +8 -0
- package/dist/sessionCheckpoint.js +33 -3
- package/dist/sessionCheckpoint.js.map +1 -1
- package/dist/ssrfGuard.d.ts +16 -0
- package/dist/ssrfGuard.js +87 -4
- package/dist/ssrfGuard.js.map +1 -1
- package/dist/streamableHttp.d.ts +9 -4
- package/dist/streamableHttp.js +76 -20
- package/dist/streamableHttp.js.map +1 -1
- package/dist/telemetry.js +37 -19
- package/dist/telemetry.js.map +1 -1
- package/dist/testing/shadowRun.d.ts +52 -0
- package/dist/testing/shadowRun.js +71 -0
- package/dist/testing/shadowRun.js.map +1 -0
- package/dist/tools/batchLsp.d.ts +3 -0
- package/dist/tools/bridgeDoctor.d.ts +11 -0
- package/dist/tools/bridgeDoctor.js +48 -2
- package/dist/tools/bridgeDoctor.js.map +1 -1
- package/dist/tools/bridgeStatus.d.ts +0 -12
- package/dist/tools/bridgeStatus.js +2 -28
- package/dist/tools/bridgeStatus.js.map +1 -1
- package/dist/tools/cancelClaudeTask.d.ts +1 -0
- package/dist/tools/clipboard.d.ts +2 -0
- package/dist/tools/closeTabs.d.ts +1 -0
- package/dist/tools/codeLens.d.ts +1 -0
- package/dist/tools/createIssueFromAIComment.d.ts +1 -0
- package/dist/tools/ctxGetTaskContext.d.ts +9 -0
- package/dist/tools/ctxGetTaskContext.js +50 -2
- package/dist/tools/ctxGetTaskContext.js.map +1 -1
- package/dist/tools/ctxQueryTraces.js +32 -24
- package/dist/tools/ctxQueryTraces.js.map +1 -1
- package/dist/tools/ctxSaveTrace.d.ts +1 -0
- package/dist/tools/debug.d.ts +4 -0
- package/dist/tools/decorations.d.ts +2 -0
- package/dist/tools/detectUnusedCode.js +9 -7
- package/dist/tools/detectUnusedCode.js.map +1 -1
- package/dist/tools/documentLinks.d.ts +1 -0
- package/dist/tools/editText.d.ts +1 -0
- package/dist/tools/editText.js +2 -1
- package/dist/tools/editText.js.map +1 -1
- package/dist/tools/enrichCommit.d.ts +1 -0
- package/dist/tools/enrichStackTrace.js +11 -5
- package/dist/tools/enrichStackTrace.js.map +1 -1
- package/dist/tools/explainDiagnostic.d.ts +1 -0
- package/dist/tools/explainSymbol.d.ts +1 -0
- package/dist/tools/fileOperations.d.ts +3 -0
- package/dist/tools/fileOperations.js +2 -1
- package/dist/tools/fileOperations.js.map +1 -1
- package/dist/tools/fileWatcher.d.ts +2 -0
- package/dist/tools/fileWatcher.js +8 -2
- package/dist/tools/fileWatcher.js.map +1 -1
- package/dist/tools/findFiles.d.ts +1 -0
- package/dist/tools/fixAllLintErrors.d.ts +1 -0
- package/dist/tools/fixAllLintErrors.js +10 -5
- package/dist/tools/fixAllLintErrors.js.map +1 -1
- package/dist/tools/foldingRanges.d.ts +1 -0
- package/dist/tools/formatDocument.d.ts +1 -0
- package/dist/tools/formatDocument.js +10 -5
- package/dist/tools/formatDocument.js.map +1 -1
- package/dist/tools/generateTests.d.ts +1 -0
- package/dist/tools/getAIComments.d.ts +1 -0
- package/dist/tools/getAnalyticsReport.js +5 -1
- package/dist/tools/getAnalyticsReport.js.map +1 -1
- package/dist/tools/getBufferContent.d.ts +1 -0
- package/dist/tools/getChangeImpact.d.ts +1 -0
- package/dist/tools/getChangeImpact.js +23 -14
- package/dist/tools/getChangeImpact.js.map +1 -1
- package/dist/tools/getClaudeTaskStatus.d.ts +1 -0
- package/dist/tools/getCodeCoverage.d.ts +1 -0
- package/dist/tools/getCodeCoverage.js +32 -14
- package/dist/tools/getCodeCoverage.js.map +1 -1
- package/dist/tools/getCommitsForIssue.d.ts +1 -0
- package/dist/tools/getDebugState.d.ts +1 -0
- package/dist/tools/getDiagnostics.js +32 -29
- package/dist/tools/getDiagnostics.js.map +1 -1
- package/dist/tools/getDiffFromHandoff.js +8 -2
- package/dist/tools/getDiffFromHandoff.js.map +1 -1
- package/dist/tools/getDocumentSymbols.d.ts +1 -0
- package/dist/tools/getGitHotspots.d.ts +1 -0
- package/dist/tools/getGitStatus.js +6 -1
- package/dist/tools/getGitStatus.js.map +1 -1
- package/dist/tools/getImportedSignatures.d.ts +1 -0
- package/dist/tools/getImportedSignatures.js +18 -14
- package/dist/tools/getImportedSignatures.js.map +1 -1
- package/dist/tools/getPRTemplate.d.ts +1 -0
- package/dist/tools/getProjectContext.js +23 -10
- package/dist/tools/getProjectContext.js.map +1 -1
- package/dist/tools/getSymbolHistory.d.ts +1 -0
- package/dist/tools/getToolCapabilities.d.ts +10 -5
- package/dist/tools/getToolCapabilities.js +116 -204
- package/dist/tools/getToolCapabilities.js.map +1 -1
- package/dist/tools/getTypeSignature.d.ts +1 -0
- package/dist/tools/getWorkspaceSettings.d.ts +1 -0
- package/dist/tools/gitWrite.d.ts +11 -0
- package/dist/tools/github/actions.d.ts +2 -0
- package/dist/tools/github/composite.d.ts +4 -1
- package/dist/tools/github/composite.js +7 -7
- package/dist/tools/github/composite.js.map +1 -1
- package/dist/tools/github/issues.d.ts +4 -0
- package/dist/tools/github/pr.d.ts +13 -6
- package/dist/tools/github/pr.js +18 -11
- package/dist/tools/github/pr.js.map +1 -1
- package/dist/tools/handoffNote.d.ts +1 -0
- package/dist/tools/handoffNote.js +2 -1
- package/dist/tools/handoffNote.js.map +1 -1
- package/dist/tools/headless/lspClient.js +3 -0
- package/dist/tools/headless/lspClient.js.map +1 -1
- package/dist/tools/hoverAtCursor.d.ts +1 -0
- package/dist/tools/httpClient.d.ts +2 -0
- package/dist/tools/httpClient.js +38 -71
- package/dist/tools/httpClient.js.map +1 -1
- package/dist/tools/index.js +14 -10
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/inlayHints.d.ts +1 -0
- package/dist/tools/launchQuickTask.d.ts +1 -0
- package/dist/tools/listClaudeTasks.d.ts +1 -0
- package/dist/tools/listClaudeTasks.js +10 -8
- package/dist/tools/listClaudeTasks.js.map +1 -1
- package/dist/tools/listTerminals.d.ts +1 -0
- package/dist/tools/lsp.d.ts +15 -0
- package/dist/tools/lsp.js +17 -0
- package/dist/tools/lsp.js.map +1 -1
- package/dist/tools/navigateToSymbolByName.d.ts +1 -0
- package/dist/tools/openDiff.d.ts +1 -0
- package/dist/tools/openDiff.js +4 -1
- package/dist/tools/openDiff.js.map +1 -1
- package/dist/tools/openFile.d.ts +1 -0
- package/dist/tools/openFile.js +4 -1
- package/dist/tools/openFile.js.map +1 -1
- package/dist/tools/openInBrowser.js +6 -1
- package/dist/tools/openInBrowser.js.map +1 -1
- package/dist/tools/organizeImports.d.ts +1 -0
- package/dist/tools/organizeImports.js +5 -3
- package/dist/tools/organizeImports.js.map +1 -1
- package/dist/tools/performanceReport.js +5 -3
- package/dist/tools/performanceReport.js.map +1 -1
- package/dist/tools/planPersistence.d.ts +3 -0
- package/dist/tools/planPersistence.js +4 -1
- package/dist/tools/planPersistence.js.map +1 -1
- package/dist/tools/previewEdit.d.ts +1 -0
- package/dist/tools/previewEdit.js +31 -5
- package/dist/tools/previewEdit.js.map +1 -1
- package/dist/tools/recentTracesDigest.js +54 -11
- package/dist/tools/recentTracesDigest.js.map +1 -1
- package/dist/tools/refactorAnalyze.d.ts +1 -0
- package/dist/tools/refactorExtractFunction.js +4 -1
- package/dist/tools/refactorExtractFunction.js.map +1 -1
- package/dist/tools/refactorPreview.d.ts +1 -0
- package/dist/tools/refactorPreview.js +10 -2
- package/dist/tools/refactorPreview.js.map +1 -1
- package/dist/tools/replaceBlock.d.ts +1 -0
- package/dist/tools/replaceBlock.js +2 -1
- package/dist/tools/replaceBlock.js.map +1 -1
- package/dist/tools/resumeClaudeTask.d.ts +1 -0
- package/dist/tools/runClaudeTask.d.ts +1 -0
- package/dist/tools/runTests.js +15 -4
- package/dist/tools/runTests.js.map +1 -1
- package/dist/tools/screenshot.d.ts +1 -0
- package/dist/tools/screenshotAndAnnotate.js +6 -2
- package/dist/tools/screenshotAndAnnotate.js.map +1 -1
- package/dist/tools/searchAndReplace.d.ts +1 -0
- package/dist/tools/searchAndReplace.js +21 -12
- package/dist/tools/searchAndReplace.js.map +1 -1
- package/dist/tools/searchTools.d.ts +26 -0
- package/dist/tools/searchTools.js +62 -21
- package/dist/tools/searchTools.js.map +1 -1
- package/dist/tools/searchWorkspace.d.ts +1 -0
- package/dist/tools/selectionRanges.d.ts +1 -0
- package/dist/tools/semanticTokens.d.ts +1 -0
- package/dist/tools/signatureHelp.d.ts +1 -0
- package/dist/tools/spawnWorkspace.js +15 -7
- package/dist/tools/spawnWorkspace.js.map +1 -1
- package/dist/tools/terminal.d.ts +6 -0
- package/dist/tools/testRunners/pytest.js +6 -2
- package/dist/tools/testRunners/pytest.js.map +1 -1
- package/dist/tools/testRunners/vitestJest.js +3 -1
- package/dist/tools/testRunners/vitestJest.js.map +1 -1
- package/dist/tools/testTraceToSource.d.ts +1 -0
- package/dist/tools/transaction.d.ts +13 -1
- package/dist/tools/transaction.js +63 -5
- package/dist/tools/transaction.js.map +1 -1
- package/dist/tools/typeHierarchy.d.ts +1 -0
- package/dist/tools/utils.d.ts +33 -0
- package/dist/tools/utils.js +122 -18
- package/dist/tools/utils.js.map +1 -1
- package/dist/tools/vscodeCommands.d.ts +2 -0
- package/dist/tools/vscodeTasks.d.ts +2 -0
- package/dist/tools/workspaceSettings.d.ts +1 -0
- package/dist/transport.d.ts +3 -1
- package/dist/transport.js +126 -52
- package/dist/transport.js.map +1 -1
- package/dist/winShim.d.ts +34 -0
- package/dist/winShim.js +94 -0
- package/dist/winShim.js.map +1 -0
- package/dist/wireHaltPushDispatch.d.ts +38 -0
- package/dist/wireHaltPushDispatch.js +71 -0
- package/dist/wireHaltPushDispatch.js.map +1 -0
- package/dist/writeFileAtomic.d.ts +23 -0
- package/dist/writeFileAtomic.js +121 -0
- package/dist/writeFileAtomic.js.map +1 -0
- package/package.json +23 -7
- package/scripts/postinstall.mjs +42 -2
- package/scripts/smoke/run-all.mjs +213 -0
- package/scripts/start-all.mjs +572 -0
- package/scripts/start-all.ps1 +209 -0
- package/scripts/start-all.sh +73 -17
- package/scripts/start-orchestrator.ps1 +158 -0
- package/scripts/start-remote.mjs +122 -0
- package/templates/automation-policies/recipe-authoring.json +1 -1
- package/templates/automation-policies/security-first.json +1 -1
- package/templates/automation-policies/strict-lint.json +1 -1
- package/templates/automation-policies/test-driven.json +1 -1
- package/templates/automation-policy.example.json +1 -1
- package/templates/co.patchwork-os.bridge.plist +2 -2
- package/templates/recipes/approval-queue-ui-test.yaml +1 -1
- package/templates/recipes/ctx-loop-test.yaml +1 -1
- package/templates/recipes/fix-errors-on-save.yaml +71 -0
- package/templates/recipes/morning-brief.yaml +5 -2
- package/templates/recipes/project-health-check.yaml +4 -1
- package/templates/recipes/sentry-to-linear.yaml +72 -38
- package/templates/recipes/webhook/apple-watch-health-log.yaml +145 -0
- package/templates/recipes/webhook/customer-escalation.yaml +8 -9
- package/templates/recipes/webhook/meeting-prep.yaml +11 -5
- package/dist/commands/marketplace.d.ts +0 -16
- package/dist/commands/marketplace.js +0 -32
- package/dist/commands/marketplace.js.map +0 -1
- package/dist/recipes/legacyRecipeCompat.d.ts +0 -10
- package/dist/recipes/legacyRecipeCompat.js +0 -131
- package/dist/recipes/legacyRecipeCompat.js.map +0 -1
package/dist/bridge.js
CHANGED
|
@@ -16,7 +16,7 @@ import { CommitIssueLinkLog } from "./commitIssueLinkLog.js";
|
|
|
16
16
|
import { DecisionTraceLog } from "./decisionTraceLog.js";
|
|
17
17
|
import { createDriver } from "./drivers/index.js";
|
|
18
18
|
import { ExtensionClient } from "./extensionClient.js";
|
|
19
|
-
import { lockKillSwitchEnv } from "./featureFlags.js";
|
|
19
|
+
import { lockKillSwitchEnv, watchFlags } from "./featureFlags.js";
|
|
20
20
|
import { FileLock } from "./fileLock.js";
|
|
21
21
|
import { buildEnforcementReminder } from "./instructionsUtils.js";
|
|
22
22
|
import { LockFileManager } from "./lockfile.js";
|
|
@@ -28,6 +28,8 @@ import { PluginWatcher } from "./pluginWatcher.js";
|
|
|
28
28
|
import { isPreToolUseHookRegistered } from "./preToolUseHook.js";
|
|
29
29
|
import { probeAll } from "./probe.js";
|
|
30
30
|
import { RecipeOrchestration } from "./recipeOrchestration.js";
|
|
31
|
+
import { haltSummaryToPrometheus, summariseHalts, } from "./recipes/haltCategory.js";
|
|
32
|
+
import { judgeSummaryToPrometheus, summariseJudgments, } from "./recipes/judgeSummary.js";
|
|
31
33
|
import { warnAboutLegacyPermissionsSidecars } from "./recipes/migrationWarnings.js";
|
|
32
34
|
import { RecipeOrchestrator } from "./recipes/RecipeOrchestrator.js";
|
|
33
35
|
import { classifyTool } from "./riskTier.js";
|
|
@@ -45,6 +47,7 @@ import { buildRecentTracesDigest } from "./tools/recentTracesDigest.js";
|
|
|
45
47
|
import { resolveFilePath } from "./tools/utils.js";
|
|
46
48
|
import { McpTransport } from "./transport.js";
|
|
47
49
|
import { PACKAGE_VERSION } from "./version.js";
|
|
50
|
+
import { wireHaltPushDispatch } from "./wireHaltPushDispatch.js";
|
|
48
51
|
const SHUTDOWN_TIMEOUT_MS = 5000;
|
|
49
52
|
let globalHandlersRegistered = false;
|
|
50
53
|
/** Collect the union of openedFiles across all sessions in a checkpoint. */
|
|
@@ -143,8 +146,9 @@ export class Bridge {
|
|
|
143
146
|
this.lockFile = new LockFileManager(this.logger);
|
|
144
147
|
const configDir = process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude");
|
|
145
148
|
this.authToken = config.fixedToken ?? loadOrCreateBridgeToken(configDir);
|
|
146
|
-
this.server = new Server(this.authToken, this.logger, config.corsOrigins);
|
|
149
|
+
this.server = new Server(this.authToken, this.logger, config.corsOrigins, undefined, config.trustedProxies);
|
|
147
150
|
this.server.bridgeConfigPath = config.configFilePath ?? undefined;
|
|
151
|
+
this.server.webhookSecret = config.webhookSecret ?? null;
|
|
148
152
|
if (config.issuerUrl) {
|
|
149
153
|
this.oauthServer = new OAuthServerImpl(this.authToken, config.issuerUrl, {
|
|
150
154
|
configDir,
|
|
@@ -245,7 +249,11 @@ export class Bridge {
|
|
|
245
249
|
}
|
|
246
250
|
// ─────────────────────────────────────────────────────────────────────
|
|
247
251
|
// Reject connections beyond capacity (grace-period sessions don't count)
|
|
248
|
-
|
|
252
|
+
let activeSessionCount = 0;
|
|
253
|
+
for (const s of this.sessions.values()) {
|
|
254
|
+
if (!s.graceTimer)
|
|
255
|
+
activeSessionCount++;
|
|
256
|
+
}
|
|
249
257
|
if (activeSessionCount >= this.config.maxSessions) {
|
|
250
258
|
this.logger.warn(`Session capacity reached (${this.config.maxSessions} active). Rejecting connection.`);
|
|
251
259
|
ws.close(1013, "Bridge at capacity");
|
|
@@ -493,10 +501,15 @@ export class Bridge {
|
|
|
493
501
|
// Detect false→true transition (session started)
|
|
494
502
|
if (!this._lastDebugSessionActive && state.hasActiveSession) {
|
|
495
503
|
const breakpoints = state.breakpoints ?? [];
|
|
504
|
+
let enabledBreakpoints = 0;
|
|
505
|
+
for (const b of breakpoints) {
|
|
506
|
+
if (b.enabled)
|
|
507
|
+
enabledBreakpoints++;
|
|
508
|
+
}
|
|
496
509
|
this.automationHooks?.handleDebugSessionStart({
|
|
497
510
|
sessionName: state.sessionName ?? "unknown",
|
|
498
511
|
sessionType: state.sessionType ?? "unknown",
|
|
499
|
-
breakpointCount:
|
|
512
|
+
breakpointCount: enabledBreakpoints,
|
|
500
513
|
activeFile: breakpoints[0]?.file ?? "",
|
|
501
514
|
});
|
|
502
515
|
}
|
|
@@ -534,8 +547,14 @@ export class Bridge {
|
|
|
534
547
|
let warnings = 0;
|
|
535
548
|
const errorFiles = [];
|
|
536
549
|
for (const [file, diags] of this.extensionClient.latestDiagnostics) {
|
|
537
|
-
|
|
538
|
-
|
|
550
|
+
let e = 0;
|
|
551
|
+
let w = 0;
|
|
552
|
+
for (const d of diags) {
|
|
553
|
+
if (d.severity === "error")
|
|
554
|
+
e++;
|
|
555
|
+
else if (d.severity === "warning")
|
|
556
|
+
w++;
|
|
557
|
+
}
|
|
539
558
|
errors += e;
|
|
540
559
|
warnings += w;
|
|
541
560
|
if (e > 0)
|
|
@@ -580,6 +599,8 @@ export class Bridge {
|
|
|
580
599
|
}
|
|
581
600
|
/** Write a periodic auto-snapshot while sessions are active (every 5 minutes). */
|
|
582
601
|
_periodicSnapshotTimer = null;
|
|
602
|
+
/** Cleanup handle for `watchFlags()` — set in start(), invoked in stop(). */
|
|
603
|
+
_stopFlagsWatch = null;
|
|
583
604
|
_startPeriodicSnapshots() {
|
|
584
605
|
if (this._periodicSnapshotTimer)
|
|
585
606
|
return;
|
|
@@ -721,6 +742,10 @@ export class Bridge {
|
|
|
721
742
|
// recipe steps mutating `process.env.PATCHWORK_FLAG_*` cannot disable an
|
|
722
743
|
// active emergency stop. Closes MED-2 from the 2026-04-28 audit.
|
|
723
744
|
lockKillSwitchEnv();
|
|
745
|
+
// 0a-bis. Watch flags.json for cross-process changes — picks up CLI
|
|
746
|
+
// fallback writes and sibling-bridge updates in a multi-bridge fleet.
|
|
747
|
+
// v2-S1 + v2-B2 from issue #422.
|
|
748
|
+
this._stopFlagsWatch = watchFlags();
|
|
724
749
|
// 0b. Auto-repair .claude/rules/bridge-tools.md if stale (present but missing the
|
|
725
750
|
// current version sentinel). Older package versions write stale files that may
|
|
726
751
|
// lack new tool substitution rules. Repair is silent on success; falls back to
|
|
@@ -747,6 +772,23 @@ export class Bridge {
|
|
|
747
772
|
this.logger.info(`Probed tools: ${probeList()}`);
|
|
748
773
|
this.logger.info(`Available linters: ${probeList(["tsc", "eslint", "pyright", "ruff", "cargo", "go", "biome"])}`);
|
|
749
774
|
this.logger.info(`Available test runners: ${probeList(["vitest", "jest", "pytest", "cargo", "go"])}`);
|
|
775
|
+
// Initialize Patchwork enrichment + decision-trace logs.
|
|
776
|
+
//
|
|
777
|
+
// These back the ctx tools (ctxQueryTraces / ctxGetTaskContext /
|
|
778
|
+
// ctxSaveTrace / getCommitsForIssue) which are advertised as standard
|
|
779
|
+
// full-mode tools regardless of orchestration. They MUST be created even
|
|
780
|
+
// on the default `driver: "none"` bridge — otherwise the decision-trace
|
|
781
|
+
// WRITE path and the enrichment reverse-lookup silently disappear and
|
|
782
|
+
// ctxSaveTrace returns tool-not-found.
|
|
783
|
+
const patchworkDir = path.join(os.homedir(), ".patchwork");
|
|
784
|
+
this.commitIssueLinkLog = new CommitIssueLinkLog({
|
|
785
|
+
dir: patchworkDir,
|
|
786
|
+
logger: this.logger,
|
|
787
|
+
});
|
|
788
|
+
this.decisionTraceLog = new DecisionTraceLog({
|
|
789
|
+
dir: patchworkDir,
|
|
790
|
+
logger: this.logger,
|
|
791
|
+
});
|
|
750
792
|
// 2. Initialize Claude driver and orchestrator (if configured)
|
|
751
793
|
if (this.config.driver !== "none") {
|
|
752
794
|
const driver = createDriver(this.config.driver, {
|
|
@@ -763,16 +805,6 @@ export class Bridge {
|
|
|
763
805
|
}
|
|
764
806
|
: undefined,
|
|
765
807
|
}, (msg) => this.logger.info(msg));
|
|
766
|
-
// Patchwork: enrichment link log is useful regardless of orchestrator.
|
|
767
|
-
const patchworkDir = path.join(os.homedir(), ".patchwork");
|
|
768
|
-
this.commitIssueLinkLog = new CommitIssueLinkLog({
|
|
769
|
-
dir: patchworkDir,
|
|
770
|
-
logger: this.logger,
|
|
771
|
-
});
|
|
772
|
-
this.decisionTraceLog = new DecisionTraceLog({
|
|
773
|
-
dir: patchworkDir,
|
|
774
|
-
logger: this.logger,
|
|
775
|
-
});
|
|
776
808
|
if (driver) {
|
|
777
809
|
// Recipe run-history needs the orchestrator to produce anything.
|
|
778
810
|
this.recipeRunLog = new RecipeRunLog({
|
|
@@ -849,17 +881,35 @@ export class Bridge {
|
|
|
849
881
|
});
|
|
850
882
|
// scheduler.start() deferred to after this.port is set (see below)
|
|
851
883
|
// so bridgeMcp callback has a valid port when first cron fires.
|
|
884
|
+
//
|
|
885
|
+
// Hot-reload: re-prime the scheduler whenever the recipe set
|
|
886
|
+
// changes on disk (install / save / delete). RecipeScheduler.start()
|
|
887
|
+
// is idempotent (calls this.stop() first) and reads the recipes
|
|
888
|
+
// directory fresh, so calling it again cleanly picks up the new
|
|
889
|
+
// file. Stored as a callback on the Server so route handlers can
|
|
890
|
+
// fire it post-success without owning a reference to the scheduler.
|
|
891
|
+
this.server.onRecipesChangedFn = () => {
|
|
892
|
+
if (!this.recipeScheduler)
|
|
893
|
+
return;
|
|
894
|
+
try {
|
|
895
|
+
const scheduled = this.recipeScheduler.start();
|
|
896
|
+
this.logger.info(`[patchwork] scheduler re-primed after recipe change · ${scheduled.length} cron recipe${scheduled.length === 1 ? "" : "s"} active`);
|
|
897
|
+
}
|
|
898
|
+
catch (err) {
|
|
899
|
+
this.logger.warn?.(`[patchwork] scheduler restart failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
900
|
+
}
|
|
901
|
+
};
|
|
852
902
|
}
|
|
853
903
|
}
|
|
854
904
|
if (this.config.automationEnabled) {
|
|
855
905
|
if (!this.orchestrator) {
|
|
856
|
-
throw new Error("--automation requires --
|
|
906
|
+
throw new Error("--automation requires --driver != none");
|
|
857
907
|
}
|
|
858
908
|
if (!this.config.automationPolicyPath) {
|
|
859
909
|
throw new Error("--automation requires --automation-policy <path>");
|
|
860
910
|
}
|
|
861
911
|
const policy = loadPolicy(this.config.automationPolicyPath);
|
|
862
|
-
this.automationHooks = new AutomationHooks(policy, this.orchestrator, (msg) => this.logger.info(msg), this.extensionClient, this.config.workspace);
|
|
912
|
+
this.automationHooks = new AutomationHooks(policy, this.orchestrator, (msg) => this.logger.info(msg), this.extensionClient, this.config.workspace, this.config.automationAllowPrivateWebhooks);
|
|
863
913
|
this.logger.info(`[bridge] Automation enabled (policy: ${this.config.automationPolicyPath})`);
|
|
864
914
|
}
|
|
865
915
|
// 3. Wire up /health endpoint data and /metrics
|
|
@@ -885,10 +935,37 @@ export class Bridge {
|
|
|
885
935
|
tokens: this.tokenUsageTracker.getTotals(),
|
|
886
936
|
};
|
|
887
937
|
};
|
|
888
|
-
this.server.metricsFn = () =>
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
938
|
+
this.server.metricsFn = () => {
|
|
939
|
+
const base = this.activityLog.toPrometheus({
|
|
940
|
+
rateLimitRejected: this.activityLog.getRateLimitRejections(),
|
|
941
|
+
extensionDisconnects: this.extensionDisconnectCount,
|
|
942
|
+
});
|
|
943
|
+
// Append per-category halt gauges from the runLog so users with
|
|
944
|
+
// their own Prometheus stack can dashboard halts without using
|
|
945
|
+
// Patchwork's UI. Reads everything currently in the in-memory ring
|
|
946
|
+
// (bounded by runLog memoryCap); rotation may cause the values to
|
|
947
|
+
// decrease, so we expose this as a `gauge` rather than a `counter`.
|
|
948
|
+
// Composes #441/#444/#447 — same data shape as /runs/halt-summary
|
|
949
|
+
// and `patchwork halts`, surfaced through the existing /metrics
|
|
950
|
+
// route.
|
|
951
|
+
let haltLines = [];
|
|
952
|
+
let judgeLines = [];
|
|
953
|
+
try {
|
|
954
|
+
if (this.recipeRunLog) {
|
|
955
|
+
const runs = this.recipeRunLog.query({ limit: 500 });
|
|
956
|
+
haltLines = haltSummaryToPrometheus(summariseHalts(runs));
|
|
957
|
+
// PR3b — judge verdicts are a separate channel from halts
|
|
958
|
+
// (augment-only invariant; see judgeVerdict.ts). Same window,
|
|
959
|
+
// same fail-open posture.
|
|
960
|
+
judgeLines = judgeSummaryToPrometheus(summariseJudgments(runs));
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
catch {
|
|
964
|
+
/* fail-open: prometheus must never break on log read */
|
|
965
|
+
}
|
|
966
|
+
const extras = [...haltLines, ...judgeLines];
|
|
967
|
+
return extras.length > 0 ? `${base}\n${extras.join("\n")}\n` : base;
|
|
968
|
+
};
|
|
892
969
|
this.server.perfDataFn = () => {
|
|
893
970
|
const windowMs = 60 * 60_000; // 1h window for dashboard
|
|
894
971
|
const windowedS = this.activityLog.windowedStats(windowMs);
|
|
@@ -899,10 +976,11 @@ export class Bridge {
|
|
|
899
976
|
totalCalls += s.count;
|
|
900
977
|
totalErrors += s.errors;
|
|
901
978
|
}
|
|
902
|
-
|
|
903
|
-
const overallP95Ms = p95Values.length > 0 ? Math.max(...p95Values) : 0;
|
|
979
|
+
let overallP95Ms = 0;
|
|
904
980
|
const perTool = {};
|
|
905
981
|
for (const [tool, pct] of Object.entries(allPercentiles)) {
|
|
982
|
+
if (pct.p95 > overallP95Ms)
|
|
983
|
+
overallP95Ms = pct.p95;
|
|
906
984
|
const ws = windowedS[tool];
|
|
907
985
|
perTool[tool] = {
|
|
908
986
|
p50: pct.p50,
|
|
@@ -1011,14 +1089,16 @@ export class Bridge {
|
|
|
1011
1089
|
// Count automation tasks (isAutomationTask) created within the window.
|
|
1012
1090
|
// These originate from automation hooks (onFileSave, onGitCommit, etc.)
|
|
1013
1091
|
// and accurately represent "hooks fired" rather than session lifecycle events.
|
|
1014
|
-
const
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1092
|
+
const allTasks = this.orchestrator ? this.orchestrator.list() : null;
|
|
1093
|
+
let hooksLast24h = 0;
|
|
1094
|
+
if (allTasks) {
|
|
1095
|
+
for (const t of allTasks) {
|
|
1096
|
+
if (t.isAutomationTask && t.createdAt > cutoff)
|
|
1097
|
+
hooksLast24h++;
|
|
1098
|
+
}
|
|
1099
|
+
}
|
|
1100
|
+
const recentAutomationTasks = allTasks
|
|
1101
|
+
? allTasks
|
|
1022
1102
|
.sort((a, b) => b.createdAt - a.createdAt)
|
|
1023
1103
|
.slice(0, 20)
|
|
1024
1104
|
.map((t) => ({
|
|
@@ -1049,6 +1129,23 @@ export class Bridge {
|
|
|
1049
1129
|
};
|
|
1050
1130
|
};
|
|
1051
1131
|
this.server.streamFn = (listener) => this.activityLog.subscribe(listener);
|
|
1132
|
+
// v2-I8 (#422): broadcast kind:"kill-switch" SSE when state changes.
|
|
1133
|
+
// The activityLog subscriber list fans out to all open /stream clients.
|
|
1134
|
+
this.server.broadcastKillSwitchEventFn = (engaged, reason) => {
|
|
1135
|
+
for (const listener of this.activityLog.getListeners()) {
|
|
1136
|
+
try {
|
|
1137
|
+
listener("kill-switch", {
|
|
1138
|
+
id: 0,
|
|
1139
|
+
timestamp: new Date().toISOString(),
|
|
1140
|
+
event: engaged ? "engage" : "release",
|
|
1141
|
+
metadata: { engaged, ...(reason ? { reason } : {}) },
|
|
1142
|
+
});
|
|
1143
|
+
}
|
|
1144
|
+
catch {
|
|
1145
|
+
/* listener must not crash broadcast */
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
};
|
|
1052
1149
|
this.server.cancelTaskFn = (id) => this.orchestrator?.cancel(id, "user") ?? false;
|
|
1053
1150
|
// Wire `/sessions` for the dashboard's Sessions page. The same Map is
|
|
1054
1151
|
// already iterated by `statusFn` for the bridge-status payload — exposing
|
|
@@ -1080,6 +1177,24 @@ export class Bridge {
|
|
|
1080
1177
|
}
|
|
1081
1178
|
return out;
|
|
1082
1179
|
};
|
|
1180
|
+
this.server.restartCheckFn = () => {
|
|
1181
|
+
let totalSessions = 0;
|
|
1182
|
+
let totalInFlight = 0;
|
|
1183
|
+
const busySessions = [];
|
|
1184
|
+
for (const [sid, session] of this.sessions) {
|
|
1185
|
+
totalSessions++;
|
|
1186
|
+
const stats = session.transport.getStats();
|
|
1187
|
+
if (stats.activeToolCalls > 0) {
|
|
1188
|
+
totalInFlight += stats.activeToolCalls;
|
|
1189
|
+
busySessions.push(`${sid.slice(0, 8)} (${stats.activeToolCalls} tool${stats.activeToolCalls === 1 ? "" : "s"}: ${stats.inFlightTools.join(", ")})`);
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
return {
|
|
1193
|
+
totalSessions,
|
|
1194
|
+
inFlightCalls: totalInFlight,
|
|
1195
|
+
busySessions,
|
|
1196
|
+
};
|
|
1197
|
+
};
|
|
1083
1198
|
this.server.tasksFn = () => ({
|
|
1084
1199
|
tasks: (this.orchestrator?.list() ?? []).map((t) => ({
|
|
1085
1200
|
taskId: t.id,
|
|
@@ -1121,9 +1236,33 @@ export class Bridge {
|
|
|
1121
1236
|
// ~/.patchwork/config.json's enableTimeOfDayAnomaly field.
|
|
1122
1237
|
this.server.enableTimeOfDayAnomaly =
|
|
1123
1238
|
this.config.enableTimeOfDayAnomaly ?? false;
|
|
1239
|
+
// Push / ntfy config — previously only set by /settings and lost on
|
|
1240
|
+
// restart. Now restored from ~/.patchwork/config.json on boot so the
|
|
1241
|
+
// mobile-oversight phone path survives a bridge bounce.
|
|
1242
|
+
this.server.pushServiceUrl = this.config.pushServiceUrl ?? undefined;
|
|
1243
|
+
this.server.pushServiceToken = this.config.pushServiceToken ?? undefined;
|
|
1244
|
+
this.server.pushServiceBaseUrl =
|
|
1245
|
+
this.config.pushServiceBaseUrl ?? undefined;
|
|
1246
|
+
this.server.ntfyTopic = this.config.ntfyTopic ?? undefined;
|
|
1247
|
+
this.server.ntfyServer = this.config.ntfyServer ?? undefined;
|
|
1248
|
+
// Wire recipe-halt → Web Push dispatch. The listener reads
|
|
1249
|
+
// pushServiceUrl/Token via getter each fire, so config edits
|
|
1250
|
+
// through /settings take effect without a restart. Push request
|
|
1251
|
+
// is fire-and-forget; runner is never blocked on a relay outage.
|
|
1252
|
+
wireHaltPushDispatch({
|
|
1253
|
+
activityLog: this.activityLog,
|
|
1254
|
+
getPushConfig: () => {
|
|
1255
|
+
const url = this.server.pushServiceUrl;
|
|
1256
|
+
const token = this.server.pushServiceToken;
|
|
1257
|
+
if (!url || !token)
|
|
1258
|
+
return null;
|
|
1259
|
+
return { url, token };
|
|
1260
|
+
},
|
|
1261
|
+
logger: this.logger,
|
|
1262
|
+
});
|
|
1124
1263
|
this.server.readyFn = () => {
|
|
1125
1264
|
// Count tools from the first active session (all sessions share the same tool set)
|
|
1126
|
-
const anySession =
|
|
1265
|
+
const anySession = this.sessions.values().next().value;
|
|
1127
1266
|
const toolCount = anySession?.transport.toolCount ?? 0;
|
|
1128
1267
|
return {
|
|
1129
1268
|
ready: this.ready,
|
|
@@ -1131,6 +1270,30 @@ export class Bridge {
|
|
|
1131
1270
|
extensionConnected: this.extensionClient.isConnected(),
|
|
1132
1271
|
};
|
|
1133
1272
|
};
|
|
1273
|
+
// Wire kill-switch audit-trace emit to decisionTraceLog. State
|
|
1274
|
+
// transitions become DecisionTrace entries with tags=["kill-switch",
|
|
1275
|
+
// "engage"|"release", "actor:http"]; query via ctxQueryTraces. See
|
|
1276
|
+
// step 5 of #422.
|
|
1277
|
+
if (this.decisionTraceLog) {
|
|
1278
|
+
const traceLog = this.decisionTraceLog;
|
|
1279
|
+
const workspace = this.config.workspace;
|
|
1280
|
+
this.server.recordKillSwitchTraceFn = (event) => {
|
|
1281
|
+
const direction = event.engaged ? "engage" : "release";
|
|
1282
|
+
const isoTs = new Date(event.ts).toISOString();
|
|
1283
|
+
try {
|
|
1284
|
+
traceLog.record({
|
|
1285
|
+
ref: "kill-switch.writes",
|
|
1286
|
+
problem: event.reason ?? direction,
|
|
1287
|
+
solution: `${event.engaged ? "ENGAGED" : "RELEASED"} at ${isoTs}`,
|
|
1288
|
+
workspace,
|
|
1289
|
+
tags: ["kill-switch", direction, "actor:http"],
|
|
1290
|
+
});
|
|
1291
|
+
}
|
|
1292
|
+
catch (err) {
|
|
1293
|
+
this.logger.warn(`[kill-switch] failed to record audit trace: ${err instanceof Error ? err.message : String(err)}`);
|
|
1294
|
+
}
|
|
1295
|
+
};
|
|
1296
|
+
}
|
|
1134
1297
|
this.server.statusFn = () => {
|
|
1135
1298
|
let sessionsInGrace = 0;
|
|
1136
1299
|
const sessionList = [];
|
|
@@ -1179,6 +1342,8 @@ export class Bridge {
|
|
|
1179
1342
|
pushServiceUrl: this.server.pushServiceUrl ?? null,
|
|
1180
1343
|
pushServiceToken: this.server.pushServiceToken ? "***" : null,
|
|
1181
1344
|
pushServiceBaseUrl: this.server.pushServiceBaseUrl ?? null,
|
|
1345
|
+
ntfyTopic: this.server.ntfyTopic ?? null,
|
|
1346
|
+
ntfyServer: this.server.ntfyServer ?? null,
|
|
1182
1347
|
};
|
|
1183
1348
|
})(),
|
|
1184
1349
|
};
|
|
@@ -1240,7 +1405,7 @@ export class Bridge {
|
|
|
1240
1405
|
if (result === null) {
|
|
1241
1406
|
return {
|
|
1242
1407
|
ok: false,
|
|
1243
|
-
error: "launchQuickTask not registered — requires --
|
|
1408
|
+
error: "launchQuickTask not registered — requires --driver subprocess",
|
|
1244
1409
|
};
|
|
1245
1410
|
}
|
|
1246
1411
|
const r = result;
|
|
@@ -1380,6 +1545,16 @@ export class Bridge {
|
|
|
1380
1545
|
// All process-level signal handlers are guarded by globalHandlersRegistered so
|
|
1381
1546
|
// that repeated start() calls (e.g. in tests or --watch restarts) don't
|
|
1382
1547
|
// accumulate process.once listeners and trigger MaxListenersExceededWarning.
|
|
1548
|
+
// Wire server callbacks so /restart and /shutdown invoke the bridge's
|
|
1549
|
+
// shutdown sequence directly. This is the only path that works on
|
|
1550
|
+
// Windows, where `process.kill(pid, 'SIGTERM')` is TerminateProcess
|
|
1551
|
+
// and registered handlers never fire.
|
|
1552
|
+
this.server.restartKillFn = () => {
|
|
1553
|
+
void shutdown("SIGTERM", 143);
|
|
1554
|
+
};
|
|
1555
|
+
this.server.shutdownFn = () => {
|
|
1556
|
+
void shutdown("SIGTERM", 0);
|
|
1557
|
+
};
|
|
1383
1558
|
if (!globalHandlersRegistered) {
|
|
1384
1559
|
globalHandlersRegistered = true;
|
|
1385
1560
|
process.once("SIGINT", () => shutdown("SIGINT", 130));
|
|
@@ -1477,6 +1652,15 @@ export class Bridge {
|
|
|
1477
1652
|
this.stopped = true;
|
|
1478
1653
|
this.logger.info("Shutting down...");
|
|
1479
1654
|
this._stopPeriodicSnapshots();
|
|
1655
|
+
if (this._stopFlagsWatch) {
|
|
1656
|
+
try {
|
|
1657
|
+
this._stopFlagsWatch();
|
|
1658
|
+
}
|
|
1659
|
+
catch {
|
|
1660
|
+
/* ignore */
|
|
1661
|
+
}
|
|
1662
|
+
this._stopFlagsWatch = null;
|
|
1663
|
+
}
|
|
1480
1664
|
this.tokenUsageTracker.stop();
|
|
1481
1665
|
this.automationHooks?.destroy();
|
|
1482
1666
|
this.recipeScheduler?.stop();
|
|
@@ -1521,7 +1705,7 @@ export class Bridge {
|
|
|
1521
1705
|
}
|
|
1522
1706
|
// Clean up all active sessions (cleanupSession skips the extension notification
|
|
1523
1707
|
// during shutdown because this.stopped is already true)
|
|
1524
|
-
for (const id of
|
|
1708
|
+
for (const id of this.sessions.keys()) {
|
|
1525
1709
|
this.cleanupSession(id);
|
|
1526
1710
|
}
|
|
1527
1711
|
const shutdownErrorPart = totalErrors > 0
|