patchwork-os 0.2.0-beta.1 → 0.2.0-beta.10.canary.95
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 +202 -25
- 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/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 +110 -0
- package/dist/commands/recipe.js +512 -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.js +2 -2
- 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/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 +866 -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 +63 -0
- package/dist/connectors/connectorRegistry.js +354 -0
- package/dist/connectors/connectorRegistry.js.map +1 -0
- package/dist/connectors/datadog.js +33 -4
- 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 +227 -1
- 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/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/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 +571 -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 +615 -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.js +15 -6
- 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 +5 -4
- 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 +22 -3
- 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 +17 -0
- package/dist/drivers/local/index.js +99 -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 +217 -82
- 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 +29 -1
- 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 +1053 -76
- package/dist/index.js.map +1 -1
- package/dist/installGuard.js +6 -2
- package/dist/installGuard.js.map +1 -1
- 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/childBridgeRegistry.js +29 -11
- package/dist/orchestrator/childBridgeRegistry.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 +142 -5
- package/dist/recipes/chainedRunner.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.js +13 -5
- package/dist/recipes/dependencyGraph.js.map +1 -1
- package/dist/recipes/githubInstallSource.d.ts +128 -0
- package/dist/recipes/githubInstallSource.js +206 -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 +134 -0
- package/dist/recipes/idempotencyKey.js +322 -0
- package/dist/recipes/idempotencyKey.js.map +1 -0
- package/dist/recipes/installer.js +48 -2
- 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 +88 -5
- 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 +36 -0
- package/dist/recipes/schemaGenerator.js +103 -5
- 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 +20 -3
- package/dist/recipes/toolRegistry.js.map +1 -1
- 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 +2 -0
- package/dist/recipes/tools/index.js +2 -0
- package/dist/recipes/tools/index.js.map +1 -1
- package/dist/recipes/tools/slack.js +1 -1
- package/dist/recipes/validation.d.ts +17 -0
- package/dist/recipes/validation.js +29 -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 +182 -8
- package/dist/recipes/yamlRunner.js +877 -217
- 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 +885 -196
- 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 +19 -12
- 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/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 +79 -202
- 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 +3 -0
- package/dist/tools/github/issues.d.ts +4 -0
- package/dist/tools/github/pr.d.ts +7 -0
- 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/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 +15 -4
- 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 +17 -7
- package/dist/tools/searchAndReplace.js.map +1 -1
- package/dist/tools/searchTools.js +20 -19
- 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 +4 -0
- package/dist/tools/transaction.js +4 -1
- package/dist/tools/transaction.js.map +1 -1
- package/dist/tools/typeHierarchy.d.ts +1 -0
- package/dist/tools/utils.d.ts +18 -0
- package/dist/tools/utils.js +103 -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 +103 -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
|
@@ -36,7 +36,7 @@ export interface AutomationState {
|
|
|
36
36
|
readonly taskTimestamps: readonly number[];
|
|
37
37
|
/**
|
|
38
38
|
* Per-content-signature dedup timestamps (keyed: `dedup:${hookKey}:${sig}`).
|
|
39
|
-
* Bounded at 5_000 entries
|
|
39
|
+
* Bounded at 5_000 entries via LRU eviction in `recordDedup`.
|
|
40
40
|
*/
|
|
41
41
|
readonly deduplicationWindow: ReadonlyMap<string, number>;
|
|
42
42
|
/**
|
|
@@ -59,6 +59,14 @@ export interface AutomationState {
|
|
|
59
59
|
* Last known test runner outcome (pass/fail) for evaluateWhen checks.
|
|
60
60
|
*/
|
|
61
61
|
readonly lastTestRunnerStatusByRunner: ReadonlyMap<string, "pass" | "fail">;
|
|
62
|
+
/**
|
|
63
|
+
* Last successful webhook fan-out time (ms since epoch) per hook key.
|
|
64
|
+
* Recorded after `Backend.postWebhook` resolves regardless of `ok` —
|
|
65
|
+
* the timestamp marks "we attempted to deliver", which is what an
|
|
66
|
+
* operator wants when debugging webhook health. Merged via max-per-key
|
|
67
|
+
* in `mergeAutomationStates`.
|
|
68
|
+
*/
|
|
69
|
+
readonly lastWebhookFiredAt: ReadonlyMap<string, number>;
|
|
62
70
|
}
|
|
63
71
|
export declare const EMPTY_AUTOMATION_STATE: AutomationState;
|
|
64
72
|
/**
|
|
@@ -123,13 +131,24 @@ export declare function clearPendingRetry(state: AutomationState, key: string):
|
|
|
123
131
|
*/
|
|
124
132
|
export declare function setLatestDiagnostics(state: AutomationState, file: string, severity: number, count: number): AutomationState;
|
|
125
133
|
/**
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
134
|
+
* @deprecated Not called from production code. Parallel was rewritten to be
|
|
135
|
+
* sequential (see automationInterpreter.ts case "Parallel") so that branches
|
|
136
|
+
* see each other's cooldown/dedup writes — the merge-max semantics here lost
|
|
137
|
+
* those guarantees. Function + tests retained as a reference for any future
|
|
138
|
+
* truly-concurrent execution model. NOTE: `unionMap` of `activeTasks` is
|
|
139
|
+
* last-write-wins, which silently drops one taskId when both branches record
|
|
140
|
+
* the same key — restore as union-of-arrays before re-introducing parallelism.
|
|
130
141
|
*/
|
|
131
142
|
export declare function mergeAutomationStates(a: AutomationState, b: AutomationState): AutomationState;
|
|
132
143
|
/**
|
|
133
144
|
* Update the last known test runner outcome for `runner`.
|
|
134
145
|
*/
|
|
135
146
|
export declare function setTestRunnerStatus(state: AutomationState, runner: string, outcome: "pass" | "fail"): AutomationState;
|
|
147
|
+
/**
|
|
148
|
+
* Record that an automation webhook fan-out attempt for `key` resolved at
|
|
149
|
+
* `now`. Used for telemetry / dashboards — does NOT gate future fires on its
|
|
150
|
+
* own (cooldown is already enforced by WithCooldown around the parent hook).
|
|
151
|
+
*
|
|
152
|
+
* Bounded at 5_000 entries, FIFO eviction.
|
|
153
|
+
*/
|
|
154
|
+
export declare function recordWebhookFired(state: AutomationState, key: string, now: number): AutomationState;
|
|
@@ -19,6 +19,7 @@ export const EMPTY_AUTOMATION_STATE = {
|
|
|
19
19
|
pendingRetries: new Map(),
|
|
20
20
|
latestDiagnosticsByFile: new Map(),
|
|
21
21
|
lastTestRunnerStatusByRunner: new Map(),
|
|
22
|
+
lastWebhookFiredAt: new Map(),
|
|
22
23
|
};
|
|
23
24
|
// ── Cooldown helpers ──────────────────────────────────────────────────────────
|
|
24
25
|
/**
|
|
@@ -41,14 +42,32 @@ export function isOnCooldown(state, key, now, cooldownMs) {
|
|
|
41
42
|
*/
|
|
42
43
|
export function recordTrigger(state, key, taskId, now) {
|
|
43
44
|
const MAX_TASK_TIMESTAMPS = 10_000;
|
|
45
|
+
const MAX_TRIGGER_KEYS = 5_000;
|
|
46
|
+
// LRU: delete-then-set so the key moves to the end of insertion order.
|
|
47
|
+
// When the map exceeds the cap, drop entries from the front (oldest).
|
|
44
48
|
const newLastTrigger = new Map(state.lastTrigger);
|
|
49
|
+
newLastTrigger.delete(key);
|
|
45
50
|
newLastTrigger.set(key, now);
|
|
51
|
+
while (newLastTrigger.size > MAX_TRIGGER_KEYS) {
|
|
52
|
+
const oldestKey = newLastTrigger.keys().next().value;
|
|
53
|
+
if (oldestKey === undefined)
|
|
54
|
+
break;
|
|
55
|
+
newLastTrigger.delete(oldestKey);
|
|
56
|
+
}
|
|
46
57
|
const newActiveTasks = new Map(state.activeTasks);
|
|
47
58
|
newActiveTasks.set(key, taskId);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
59
|
+
// Prune entries older than 1 hour while building the new array — keeps the
|
|
60
|
+
// array small so tasksInLastHour() scans only recent entries.
|
|
61
|
+
const cutoff = now - 3_600_000;
|
|
62
|
+
const pruned = [];
|
|
63
|
+
for (const t of state.taskTimestamps) {
|
|
64
|
+
if (t > cutoff)
|
|
65
|
+
pruned.push(t);
|
|
66
|
+
}
|
|
67
|
+
pruned.push(now);
|
|
68
|
+
const newTaskTimestamps = pruned.length > MAX_TASK_TIMESTAMPS
|
|
69
|
+
? pruned.slice(pruned.length - MAX_TASK_TIMESTAMPS)
|
|
70
|
+
: pruned;
|
|
52
71
|
return {
|
|
53
72
|
...state,
|
|
54
73
|
lastTrigger: newLastTrigger,
|
|
@@ -100,7 +119,12 @@ export function setLastTestOutcome(state, runner, outcome) {
|
|
|
100
119
|
*/
|
|
101
120
|
export function tasksInLastHour(state, now) {
|
|
102
121
|
const cutoff = now - 3_600_000;
|
|
103
|
-
|
|
122
|
+
let count = 0;
|
|
123
|
+
for (const t of state.taskTimestamps) {
|
|
124
|
+
if (t > cutoff)
|
|
125
|
+
count++;
|
|
126
|
+
}
|
|
127
|
+
return count;
|
|
104
128
|
}
|
|
105
129
|
// ── Deduplication helpers ─────────────────────────────────────────────────────
|
|
106
130
|
const DEDUP_MAX_SIZE = 5_000;
|
|
@@ -165,10 +189,13 @@ export function setLatestDiagnostics(state, file, severity, count) {
|
|
|
165
189
|
}
|
|
166
190
|
// ── Merge helper (for Parallel node) ──────────────────────────────────────────
|
|
167
191
|
/**
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
171
|
-
*
|
|
192
|
+
* @deprecated Not called from production code. Parallel was rewritten to be
|
|
193
|
+
* sequential (see automationInterpreter.ts case "Parallel") so that branches
|
|
194
|
+
* see each other's cooldown/dedup writes — the merge-max semantics here lost
|
|
195
|
+
* those guarantees. Function + tests retained as a reference for any future
|
|
196
|
+
* truly-concurrent execution model. NOTE: `unionMap` of `activeTasks` is
|
|
197
|
+
* last-write-wins, which silently drops one taskId when both branches record
|
|
198
|
+
* the same key — restore as union-of-arrays before re-introducing parallelism.
|
|
172
199
|
*/
|
|
173
200
|
export function mergeAutomationStates(a, b) {
|
|
174
201
|
const maxNumMap = (x, y) => {
|
|
@@ -195,6 +222,7 @@ export function mergeAutomationStates(a, b) {
|
|
|
195
222
|
pendingRetries: unionMap(a.pendingRetries, b.pendingRetries),
|
|
196
223
|
latestDiagnosticsByFile: unionMap(a.latestDiagnosticsByFile, b.latestDiagnosticsByFile),
|
|
197
224
|
lastTestRunnerStatusByRunner: unionMap(a.lastTestRunnerStatusByRunner, b.lastTestRunnerStatusByRunner),
|
|
225
|
+
lastWebhookFiredAt: maxNumMap(a.lastWebhookFiredAt, b.lastWebhookFiredAt),
|
|
198
226
|
};
|
|
199
227
|
}
|
|
200
228
|
// ── Test runner status helpers ────────────────────────────────────────────────
|
|
@@ -206,4 +234,23 @@ export function setTestRunnerStatus(state, runner, outcome) {
|
|
|
206
234
|
newMap.set(runner, outcome);
|
|
207
235
|
return { ...state, lastTestRunnerStatusByRunner: newMap };
|
|
208
236
|
}
|
|
237
|
+
// ── Webhook helpers ───────────────────────────────────────────────────────────
|
|
238
|
+
const WEBHOOK_FIRED_MAX_SIZE = 5_000;
|
|
239
|
+
/**
|
|
240
|
+
* Record that an automation webhook fan-out attempt for `key` resolved at
|
|
241
|
+
* `now`. Used for telemetry / dashboards — does NOT gate future fires on its
|
|
242
|
+
* own (cooldown is already enforced by WithCooldown around the parent hook).
|
|
243
|
+
*
|
|
244
|
+
* Bounded at 5_000 entries, FIFO eviction.
|
|
245
|
+
*/
|
|
246
|
+
export function recordWebhookFired(state, key, now) {
|
|
247
|
+
const newMap = new Map(state.lastWebhookFiredAt);
|
|
248
|
+
newMap.delete(key);
|
|
249
|
+
newMap.set(key, now);
|
|
250
|
+
if (newMap.size > WEBHOOK_FIRED_MAX_SIZE) {
|
|
251
|
+
const firstKey = newMap.keys().next().value;
|
|
252
|
+
newMap.delete(firstKey);
|
|
253
|
+
}
|
|
254
|
+
return { ...state, lastWebhookFiredAt: newMap };
|
|
255
|
+
}
|
|
209
256
|
//# sourceMappingURL=automationState.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automationState.js","sourceRoot":"","sources":["../../src/fp/automationState.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"automationState.js","sourceRoot":"","sources":["../../src/fp/automationState.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ export function untrustedBlock(label, value, nonce) {
|
|
|
18
18
|
// Use literal string replacement (not RegExp) — nonce is an opaque ID that
|
|
19
19
|
// may contain regex metacharacters (e.g. "[", "+", "."). RegExp would throw
|
|
20
20
|
// SyntaxError for those inputs, enabling a DoS on every hook trigger.
|
|
21
|
-
const safe = value.
|
|
21
|
+
const safe = value.replaceAll(nonce, "");
|
|
22
22
|
return `\n--- BEGIN ${label} [${nonce}] (untrusted) ---\n${safe}\n--- END ${label} [${nonce}] ---\n`;
|
|
23
23
|
}
|
|
24
24
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automationUtils.js","sourceRoot":"","sources":["../../src/fp/automationUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qFAAqF;AACrF,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE9C,kEAAkE;AAClE,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,KAAa,EACb,KAAa;IAEb,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,uDAAuD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAC/E,CAAC;IACJ,CAAC;IACD,2EAA2E;IAC3E,6EAA6E;IAC7E,sEAAsE;IACtE,MAAM,IAAI,GAAG,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"automationUtils.js","sourceRoot":"","sources":["../../src/fp/automationUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qFAAqF;AACrF,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAE9C,kEAAkE;AAClE,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,KAAa,EACb,KAAa;IAEb,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CACb,uDAAuD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAC/E,CAAC;IACJ,CAAC;IACD,2EAA2E;IAC3E,6EAA6E;IAC7E,sEAAsE;IACtE,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,eAAe,KAAK,KAAK,KAAK,sBAAsB,IAAI,aAAa,KAAK,KAAK,KAAK,SAAS,CAAC;AACvG,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,sEAAsE;IACtE,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,uBAAuB;QAC9D,OAAO,MAAM,CAAC;IAEhB,yEAAyE;IACzE,+DAA+D;IAC/D,IAAI,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;SACxC,QAAQ,CAAC,CAAC,EAAE,uBAAuB,CAAC;SACpC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAEpB,oEAAoE;IACpE,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,GAAG,SAAS,yCAAyC,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,MAAc,EACd,IAAa;IAEb,MAAM,QAAQ,GAAG,IAAI;QACnB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;QACpE,CAAC,CAAC,KAAK,CAAC;IACV,OAAO,YAAY,QAAQ,YAAY,QAAQ,UAAU,MAAM,OAAO,CAAC;AACzE,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* All allowlist/blocklist/path-traversal security checks live here.
|
|
4
4
|
* No side effects, no fs.*, no process.* (except INTERPRETER_COMMANDS import).
|
|
5
5
|
*/
|
|
6
|
+
import path from "node:path";
|
|
6
7
|
import { INTERPRETER_COMMANDS } from "../config.js";
|
|
7
8
|
import { optionalInt, optionalString, requireString, resolveFilePath, } from "../tools/utils.js";
|
|
8
9
|
const MAX_ARGS = 100;
|
|
@@ -96,7 +97,12 @@ function validateCommandArgs(args, command, workspace) {
|
|
|
96
97
|
if (DANGEROUS_FLAGS_FOR_COMMAND[command]?.has(flag)) {
|
|
97
98
|
throw new Error(`Flag "${flag}" is blocked for command "${command}" — it can redirect command execution outside the workspace`);
|
|
98
99
|
}
|
|
99
|
-
|
|
100
|
+
// Workspace containment check for any absolute or home-relative path.
|
|
101
|
+
// path.isAbsolute catches Windows drive-letter forms (`C:\foo`, `\\srv\sh`)
|
|
102
|
+
// that startsWith("/") would miss — without this the containment check
|
|
103
|
+
// was a no-op on Windows.
|
|
104
|
+
if (!arg.startsWith("-") &&
|
|
105
|
+
(path.isAbsolute(arg) || arg.startsWith("~/"))) {
|
|
100
106
|
try {
|
|
101
107
|
resolveFilePath(arg, workspace);
|
|
102
108
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandDescription.js","sourceRoot":"","sources":["../../src/fp/commandDescription.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"commandDescription.js","sourceRoot":"","sources":["../../src/fp/commandDescription.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,11 +2,17 @@
|
|
|
2
2
|
// A notification arriving after snapshot creation would mutate the
|
|
3
3
|
// underlying Map if we just alias it.
|
|
4
4
|
export function snapshotExtension(client) {
|
|
5
|
+
const diagnostics = new Map();
|
|
6
|
+
for (const [k, v] of client.latestDiagnostics)
|
|
7
|
+
diagnostics.set(k, [...v]);
|
|
8
|
+
const aiComments = new Map();
|
|
9
|
+
for (const [k, v] of client.latestAIComments)
|
|
10
|
+
aiComments.set(k, [...v]);
|
|
5
11
|
return {
|
|
6
|
-
diagnostics
|
|
12
|
+
diagnostics,
|
|
7
13
|
selection: client.latestSelection,
|
|
8
14
|
activeFile: client.latestActiveFile,
|
|
9
|
-
aiComments
|
|
15
|
+
aiComments,
|
|
10
16
|
debugState: client.latestDebugState,
|
|
11
17
|
capturedAt: Date.now(),
|
|
12
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensionSnapshot.js","sourceRoot":"","sources":["../../src/fp/extensionSnapshot.ts"],"names":[],"mappings":"AAiBA,yEAAyE;AACzE,mEAAmE;AACnE,sCAAsC;AACtC,MAAM,UAAU,iBAAiB,CAAC,MAAuB;IACvD,
|
|
1
|
+
{"version":3,"file":"extensionSnapshot.js","sourceRoot":"","sources":["../../src/fp/extensionSnapshot.ts"],"names":[],"mappings":"AAiBA,yEAAyE;AACzE,mEAAmE;AACnE,sCAAsC;AACtC,MAAM,UAAU,iBAAiB,CAAC,MAAuB;IACvD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC7D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,iBAAiB;QAAE,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC3D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,gBAAgB;QAAE,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO;QACL,WAAW;QACX,SAAS,EAAE,MAAM,CAAC,eAAe;QACjC,UAAU,EAAE,MAAM,CAAC,gBAAgB;QACnC,UAAU;QACV,UAAU,EAAE,MAAM,CAAC,gBAAgB;QACnC,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -13,6 +13,32 @@ export interface BackendEnqueueOpts {
|
|
|
13
13
|
effort?: "low" | "medium" | "high" | "max";
|
|
14
14
|
systemPrompt?: string;
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Options for an outbound webhook fired by an automation hook.
|
|
18
|
+
*
|
|
19
|
+
* `body` is the JSON-serializable payload. Backends serialize and set
|
|
20
|
+
* Content-Type if not already in `headers`. SSRF guarding is the backend's
|
|
21
|
+
* responsibility (production: loopback-only by default; tests: collect).
|
|
22
|
+
*/
|
|
23
|
+
export interface BackendWebhookOpts {
|
|
24
|
+
url: string;
|
|
25
|
+
method: "POST" | "PUT" | "PATCH";
|
|
26
|
+
headers: Readonly<Record<string, string>>;
|
|
27
|
+
body: Readonly<Record<string, unknown>>;
|
|
28
|
+
/** Hook key for diagnostic logging (e.g. "precompact"). */
|
|
29
|
+
hookKey: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Result of a webhook call. Always resolves — never throws — so a failed
|
|
33
|
+
* webhook does not block the rest of the interpreter run.
|
|
34
|
+
*/
|
|
35
|
+
export interface BackendWebhookResult {
|
|
36
|
+
ok: boolean;
|
|
37
|
+
/** HTTP status code on a completed request; absent on network error / timeout. */
|
|
38
|
+
status?: number;
|
|
39
|
+
/** Reason on failure — surfaced in the interpreter error list and logs. */
|
|
40
|
+
error?: string;
|
|
41
|
+
}
|
|
16
42
|
export interface Backend {
|
|
17
43
|
/** Enqueue a task and return the task ID. */
|
|
18
44
|
enqueueTask(opts: BackendEnqueueOpts): Promise<string>;
|
|
@@ -20,6 +46,12 @@ export interface Backend {
|
|
|
20
46
|
scheduleRetry(key: string, delayMs: number, fn: () => void): () => void;
|
|
21
47
|
/** Emit an informational notification (fire-and-forget). */
|
|
22
48
|
notify(msg: string): void;
|
|
49
|
+
/**
|
|
50
|
+
* Fire an outbound webhook. Always resolves — never rejects — so failures
|
|
51
|
+
* never block other hooks. Production impl applies a 10s timeout and SSRF
|
|
52
|
+
* guard. Test impl pushes to `webhookCalls`.
|
|
53
|
+
*/
|
|
54
|
+
postWebhook(opts: BackendWebhookOpts): Promise<BackendWebhookResult>;
|
|
23
55
|
}
|
|
24
56
|
export interface InterpreterContext {
|
|
25
57
|
readonly state: AutomationState;
|
|
@@ -29,6 +61,30 @@ export interface InterpreterContext {
|
|
|
29
61
|
readonly eventData: Readonly<Record<string, string>>;
|
|
30
62
|
readonly backend: Backend;
|
|
31
63
|
readonly log: (msg: string) => void;
|
|
64
|
+
/**
|
|
65
|
+
* Optional accessor for the live AutomationState at retry-fire time. If
|
|
66
|
+
* present, WithRetry uses this instead of the snapshot taken when the retry
|
|
67
|
+
* was scheduled — preventing retries from re-firing hooks that have since
|
|
68
|
+
* entered cooldown / dedup. AutomationHooks supplies a function that returns
|
|
69
|
+
* `this._automationState`; tests may omit.
|
|
70
|
+
*/
|
|
71
|
+
readonly getLiveState?: () => AutomationState;
|
|
72
|
+
/**
|
|
73
|
+
* Optional atomic-retry executor. Receives a function that, given the
|
|
74
|
+
* truly-current `AutomationState` at lock-acquisition time, returns the
|
|
75
|
+
* post-retry state. AutomationHooks runs this through `_enqueueMutation`
|
|
76
|
+
* so the read-run-write happens atomically with respect to other
|
|
77
|
+
* `_runInterpreter` calls (the same chain that prevents two concurrent
|
|
78
|
+
* events from clobbering each other's writes).
|
|
79
|
+
*
|
|
80
|
+
* Replaces the older `mergeRetryState` setter API, which let a retry
|
|
81
|
+
* publish stale absolute state and clobber writes from concurrent runs
|
|
82
|
+
* that landed between scheduling and merge. Now the retry's interpret()
|
|
83
|
+
* is itself executed inside the lock against fresh live state.
|
|
84
|
+
*
|
|
85
|
+
* Tests may omit (TestBackend doesn't fire retries by default).
|
|
86
|
+
*/
|
|
87
|
+
readonly runRetryUnderLock?: (work: (live: AutomationState) => Promise<AutomationState>) => void;
|
|
32
88
|
}
|
|
33
89
|
export interface InterpreterResult {
|
|
34
90
|
readonly taskIds: ReadonlyArray<string>;
|
|
@@ -45,12 +101,14 @@ export interface InterpreterResult {
|
|
|
45
101
|
export declare class VsCodeBackend implements Backend {
|
|
46
102
|
private readonly orchestrator;
|
|
47
103
|
private readonly logger?;
|
|
104
|
+
private readonly allowPrivateWebhooks;
|
|
48
105
|
constructor(orchestrator: ClaudeOrchestrator, logger?: {
|
|
49
106
|
info: (msg: string) => void;
|
|
50
|
-
} | undefined);
|
|
107
|
+
} | undefined, allowPrivateWebhooks?: boolean);
|
|
51
108
|
enqueueTask(opts: BackendEnqueueOpts): Promise<string>;
|
|
52
109
|
scheduleRetry(key: string, delayMs: number, fn: () => void): () => void;
|
|
53
110
|
notify(msg: string): void;
|
|
111
|
+
postWebhook(opts: BackendWebhookOpts): Promise<BackendWebhookResult>;
|
|
54
112
|
}
|
|
55
113
|
export interface TestBackendCollector {
|
|
56
114
|
enqueuedTasks: BackendEnqueueOpts[];
|
|
@@ -59,11 +117,18 @@ export interface TestBackendCollector {
|
|
|
59
117
|
delayMs: number;
|
|
60
118
|
}>;
|
|
61
119
|
notifications: string[];
|
|
120
|
+
webhookCalls: BackendWebhookOpts[];
|
|
62
121
|
}
|
|
63
122
|
export declare class TestBackend implements Backend {
|
|
64
123
|
readonly collector: TestBackendCollector;
|
|
124
|
+
/**
|
|
125
|
+
* Optional override for the webhook result a test wants to simulate.
|
|
126
|
+
* When unset, postWebhook returns `{ ok: true, status: 200 }`.
|
|
127
|
+
*/
|
|
128
|
+
webhookResponse: BackendWebhookResult;
|
|
65
129
|
enqueueTask(opts: BackendEnqueueOpts): Promise<string>;
|
|
66
130
|
scheduleRetry(key: string, delayMs: number, _fn: () => void): () => void;
|
|
67
131
|
notify(msg: string): void;
|
|
132
|
+
postWebhook(opts: BackendWebhookOpts): Promise<BackendWebhookResult>;
|
|
68
133
|
reset(): void;
|
|
69
134
|
}
|
|
@@ -1,10 +1,34 @@
|
|
|
1
|
+
import { isPrivateNonLoopbackHost } from "../ssrfGuard.js";
|
|
1
2
|
// ── VsCodeBackend ─────────────────────────────────────────────────────────────
|
|
3
|
+
/**
|
|
4
|
+
* SSRF guard for automation webhooks.
|
|
5
|
+
*
|
|
6
|
+
* Default policy (`allowPrivate=false`):
|
|
7
|
+
* - Loopback (127.0.0.0/8, ::1, localhost, *.localhost) → ALLOWED.
|
|
8
|
+
* Automation hooks fire INTO the same machine on the common path;
|
|
9
|
+
* the bridge itself listens on 127.0.0.1, and recipe-6 webhooks
|
|
10
|
+
* target `http://127.0.0.1:${BRIDGE_PORT}/...`.
|
|
11
|
+
* - Other RFC 1918 / link-local / ULA / CGNAT / 0.0.0.0/8 → BLOCKED.
|
|
12
|
+
* - Public hosts → ALLOWED.
|
|
13
|
+
*
|
|
14
|
+
* Opt-in (`allowPrivate=true`) drops the private-range check entirely.
|
|
15
|
+
*
|
|
16
|
+
* This is a deliberate divergence from `sendHttpRequest` which blocks ALL
|
|
17
|
+
* private addresses by default (loopback included). The reasoning: a
|
|
18
|
+
* MCP-tool-driven HTTP request is potentially attacker-controlled (a
|
|
19
|
+
* compromised LLM session could craft URLs); an automation webhook URL
|
|
20
|
+
* comes from a trusted policy file that the operator wrote. Loopback is
|
|
21
|
+
* the common case there, not the exceptional one.
|
|
22
|
+
*/
|
|
23
|
+
const WEBHOOK_TIMEOUT_MS = 10_000;
|
|
2
24
|
export class VsCodeBackend {
|
|
3
25
|
orchestrator;
|
|
4
26
|
logger;
|
|
5
|
-
|
|
27
|
+
allowPrivateWebhooks;
|
|
28
|
+
constructor(orchestrator, logger, allowPrivateWebhooks = false) {
|
|
6
29
|
this.orchestrator = orchestrator;
|
|
7
30
|
this.logger = logger;
|
|
31
|
+
this.allowPrivateWebhooks = allowPrivateWebhooks;
|
|
8
32
|
}
|
|
9
33
|
async enqueueTask(opts) {
|
|
10
34
|
const taskId = this.orchestrator.enqueue({
|
|
@@ -28,13 +52,73 @@ export class VsCodeBackend {
|
|
|
28
52
|
notify(msg) {
|
|
29
53
|
this.logger?.info(msg);
|
|
30
54
|
}
|
|
55
|
+
async postWebhook(opts) {
|
|
56
|
+
let parsed;
|
|
57
|
+
try {
|
|
58
|
+
parsed = new URL(opts.url);
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
const error = `invalid url: ${e instanceof Error ? e.message : String(e)}`;
|
|
62
|
+
this.logger?.info(`[automation-webhook] ${opts.hookKey} blocked: ${error}`);
|
|
63
|
+
return { ok: false, error };
|
|
64
|
+
}
|
|
65
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
66
|
+
const error = `unsupported protocol "${parsed.protocol}"`;
|
|
67
|
+
this.logger?.info(`[automation-webhook] ${opts.hookKey} blocked: ${error}`);
|
|
68
|
+
return { ok: false, error };
|
|
69
|
+
}
|
|
70
|
+
if (!this.allowPrivateWebhooks &&
|
|
71
|
+
isPrivateNonLoopbackHost(parsed.hostname)) {
|
|
72
|
+
const error = `private/non-loopback host "${parsed.hostname}" blocked (use --automation-allow-private-webhooks to enable)`;
|
|
73
|
+
this.logger?.info(`[automation-webhook] ${opts.hookKey} blocked: ${error}`);
|
|
74
|
+
return { ok: false, error };
|
|
75
|
+
}
|
|
76
|
+
const headers = { ...opts.headers };
|
|
77
|
+
const hasContentType = Object.keys(headers).some((k) => k.toLowerCase() === "content-type");
|
|
78
|
+
if (!hasContentType)
|
|
79
|
+
headers["Content-Type"] = "application/json";
|
|
80
|
+
const controller = new AbortController();
|
|
81
|
+
const timer = setTimeout(() => controller.abort(), WEBHOOK_TIMEOUT_MS);
|
|
82
|
+
try {
|
|
83
|
+
const res = await fetch(opts.url, {
|
|
84
|
+
method: opts.method,
|
|
85
|
+
headers,
|
|
86
|
+
body: JSON.stringify(opts.body),
|
|
87
|
+
signal: controller.signal,
|
|
88
|
+
});
|
|
89
|
+
clearTimeout(timer);
|
|
90
|
+
if (!res.ok) {
|
|
91
|
+
const error = `non-2xx response: ${res.status}`;
|
|
92
|
+
this.logger?.info(`[automation-webhook] ${opts.hookKey} ${opts.method} ${opts.url} → ${res.status}`);
|
|
93
|
+
return { ok: false, status: res.status, error };
|
|
94
|
+
}
|
|
95
|
+
this.logger?.info(`[automation-webhook] ${opts.hookKey} ${opts.method} ${opts.url} → ${res.status}`);
|
|
96
|
+
return { ok: true, status: res.status };
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
clearTimeout(timer);
|
|
100
|
+
const error = e instanceof Error
|
|
101
|
+
? e.name === "AbortError"
|
|
102
|
+
? `timeout after ${WEBHOOK_TIMEOUT_MS}ms`
|
|
103
|
+
: e.message
|
|
104
|
+
: String(e);
|
|
105
|
+
this.logger?.info(`[automation-webhook] ${opts.hookKey} ${opts.method} ${opts.url} failed: ${error}`);
|
|
106
|
+
return { ok: false, error };
|
|
107
|
+
}
|
|
108
|
+
}
|
|
31
109
|
}
|
|
32
110
|
export class TestBackend {
|
|
33
111
|
collector = {
|
|
34
112
|
enqueuedTasks: [],
|
|
35
113
|
scheduledRetries: [],
|
|
36
114
|
notifications: [],
|
|
115
|
+
webhookCalls: [],
|
|
37
116
|
};
|
|
117
|
+
/**
|
|
118
|
+
* Optional override for the webhook result a test wants to simulate.
|
|
119
|
+
* When unset, postWebhook returns `{ ok: true, status: 200 }`.
|
|
120
|
+
*/
|
|
121
|
+
webhookResponse = { ok: true, status: 200 };
|
|
38
122
|
async enqueueTask(opts) {
|
|
39
123
|
this.collector.enqueuedTasks.push(opts);
|
|
40
124
|
return `task-${this.collector.enqueuedTasks.length}`;
|
|
@@ -47,10 +131,16 @@ export class TestBackend {
|
|
|
47
131
|
notify(msg) {
|
|
48
132
|
this.collector.notifications.push(msg);
|
|
49
133
|
}
|
|
134
|
+
async postWebhook(opts) {
|
|
135
|
+
this.collector.webhookCalls.push(opts);
|
|
136
|
+
return this.webhookResponse;
|
|
137
|
+
}
|
|
50
138
|
reset() {
|
|
51
139
|
this.collector.enqueuedTasks = [];
|
|
52
140
|
this.collector.scheduledRetries = [];
|
|
53
141
|
this.collector.notifications = [];
|
|
142
|
+
this.collector.webhookCalls = [];
|
|
143
|
+
this.webhookResponse = { ok: true, status: 200 };
|
|
54
144
|
}
|
|
55
145
|
}
|
|
56
146
|
//# sourceMappingURL=interpreterContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interpreterContext.js","sourceRoot":"","sources":["../../src/fp/interpreterContext.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"interpreterContext.js","sourceRoot":"","sources":["../../src/fp/interpreterContext.ts"],"names":[],"mappings":"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"}
|
package/dist/fp/policyParser.js
CHANGED
|
@@ -59,7 +59,13 @@ function buildPromptSource(src) {
|
|
|
59
59
|
promptArgs: src.promptArgs,
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
|
-
|
|
62
|
+
// Webhook-only hook (e.g. recipe-6 compaction triggers): no inline prompt,
|
|
63
|
+
// no named prompt, just a webhook fan-out. Caller is responsible for
|
|
64
|
+
// ensuring `webhook` is configured — `validatePromptSource` enforces this.
|
|
65
|
+
if (src.webhook !== undefined) {
|
|
66
|
+
return ok({ kind: "none" });
|
|
67
|
+
}
|
|
68
|
+
return err("invalid_arg", "Hook must specify either `prompt`, `promptName`, or `webhook`");
|
|
63
69
|
}
|
|
64
70
|
// ── WhenCondition mapping ─────────────────────────────────────────────────────
|
|
65
71
|
function buildWhen(src) {
|
|
@@ -78,10 +84,31 @@ function buildWhen(src) {
|
|
|
78
84
|
: undefined;
|
|
79
85
|
}
|
|
80
86
|
// ── Hook builder ──────────────────────────────────────────────────────────────
|
|
87
|
+
/**
|
|
88
|
+
* Hook types that opt into webhook fan-out as of v1. Other types parse the
|
|
89
|
+
* `webhook` field successfully (per validatePromptSource) but the parser
|
|
90
|
+
* silently drops it — keeps the schema forward-compatible without enabling
|
|
91
|
+
* fan-out where it hasn't been thought through yet.
|
|
92
|
+
*/
|
|
93
|
+
const WEBHOOK_ENABLED_HOOK_TYPES = new Set([
|
|
94
|
+
"onPreCompact",
|
|
95
|
+
"onPostCompact",
|
|
96
|
+
]);
|
|
81
97
|
function buildHook(hookType, src, enabled, cooldownMs, condition, patterns, extras, model, effort, systemPrompt) {
|
|
82
98
|
const promptSourceResult = buildPromptSource(src);
|
|
83
99
|
if (!promptSourceResult.ok)
|
|
84
100
|
return promptSourceResult;
|
|
101
|
+
// Wire `webhook` into the HookNode only for opted-in hook types. This keeps
|
|
102
|
+
// the v1 surface area focused on `onCompaction` (recipe-6 unblock) while
|
|
103
|
+
// letting the schema parse the field everywhere — adding a new hook type
|
|
104
|
+
// later is a one-line change to WEBHOOK_ENABLED_HOOK_TYPES.
|
|
105
|
+
const webhook = src.webhook && WEBHOOK_ENABLED_HOOK_TYPES.has(hookType)
|
|
106
|
+
? {
|
|
107
|
+
url: src.webhook.url,
|
|
108
|
+
method: src.webhook.method,
|
|
109
|
+
headers: src.webhook.headers,
|
|
110
|
+
}
|
|
111
|
+
: undefined;
|
|
85
112
|
const hookNode = hook({
|
|
86
113
|
hookType,
|
|
87
114
|
enabled,
|
|
@@ -93,6 +120,7 @@ function buildHook(hookType, src, enabled, cooldownMs, condition, patterns, extr
|
|
|
93
120
|
effort,
|
|
94
121
|
systemPrompt,
|
|
95
122
|
extras,
|
|
123
|
+
webhook,
|
|
96
124
|
});
|
|
97
125
|
const key = cooldownKey(hookType, condition);
|
|
98
126
|
// When dedupeByContent is active, the content-based dedup provides its own
|