patchwork-os 0.2.0-beta.9.canary.93 → 1.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.bridge.md +15 -16
- package/README.md +46 -458
- package/dist/activationMetrics.js +2 -3
- package/dist/activationMetrics.js.map +1 -1
- package/dist/activityLog.d.ts +1 -0
- package/dist/activityLog.js +8 -3
- package/dist/activityLog.js.map +1 -1
- package/dist/adapters/gemini.js +2 -2
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/grok.js +6 -1
- package/dist/adapters/grok.js.map +1 -1
- package/dist/adapters/openai.js +4 -0
- package/dist/adapters/openai.js.map +1 -1
- package/dist/approvalHttp.d.ts +9 -0
- package/dist/approvalHttp.js +210 -171
- package/dist/approvalHttp.js.map +1 -1
- package/dist/approvalKpi.d.ts +102 -0
- package/dist/approvalKpi.js +282 -0
- package/dist/approvalKpi.js.map +1 -0
- package/dist/approvalQueue.d.ts +1 -1
- package/dist/approvalQueue.js.map +1 -1
- package/dist/automation.d.ts +45 -4
- package/dist/automation.js +123 -15
- package/dist/automation.js.map +1 -1
- package/dist/bridge.d.ts +10 -0
- package/dist/bridge.js +225 -46
- package/dist/bridge.js.map +1 -1
- package/dist/bridgeLockDiscovery.d.ts +16 -1
- package/dist/bridgeLockDiscovery.js +38 -4
- package/dist/bridgeLockDiscovery.js.map +1 -1
- package/dist/bridgeToolsRules.js +3 -18
- package/dist/bridgeToolsRules.js.map +1 -1
- package/dist/claudeAuthHttp.d.ts +25 -0
- package/dist/claudeAuthHttp.js +219 -0
- package/dist/claudeAuthHttp.js.map +1 -0
- package/dist/claudeDriver.js +4 -1
- package/dist/claudeDriver.js.map +1 -1
- package/dist/claudeOrchestrator.d.ts +15 -0
- package/dist/claudeOrchestrator.js +44 -0
- package/dist/claudeOrchestrator.js.map +1 -1
- package/dist/commands/connect.d.ts +47 -0
- package/dist/commands/connect.js +419 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/install.js +3 -10
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/launchd.d.ts +7 -0
- package/dist/commands/launchd.js +20 -2
- package/dist/commands/launchd.js.map +1 -1
- package/dist/commands/patchworkInit.d.ts +7 -0
- package/dist/commands/patchworkInit.js +26 -0
- package/dist/commands/patchworkInit.js.map +1 -1
- package/dist/commands/recipe.d.ts +59 -4
- package/dist/commands/recipe.js +206 -5
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipeInstall.d.ts +9 -0
- package/dist/commands/recipeInstall.js +56 -3
- package/dist/commands/recipeInstall.js.map +1 -1
- package/dist/commands/task.d.ts +25 -0
- package/dist/commands/task.js +61 -41
- package/dist/commands/task.js.map +1 -1
- package/dist/commands/tokenEfficiency.d.ts +4 -0
- package/dist/commands/tokenEfficiency.js +23 -26
- package/dist/commands/tokenEfficiency.js.map +1 -1
- package/dist/commands/tracesExport.d.ts +15 -1
- package/dist/commands/tracesExport.js +39 -5
- package/dist/commands/tracesExport.js.map +1 -1
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -1
- package/dist/connectorRoutes.js +613 -62
- package/dist/connectorRoutes.js.map +1 -1
- package/dist/connectors/asana.js +9 -3
- package/dist/connectors/asana.js.map +1 -1
- package/dist/connectors/baseConnector.d.ts +16 -0
- package/dist/connectors/baseConnector.js +2 -0
- package/dist/connectors/baseConnector.js.map +1 -1
- package/dist/connectors/caldiy.js +34 -0
- package/dist/connectors/caldiy.js.map +1 -1
- package/dist/connectors/confluence.js +9 -2
- package/dist/connectors/confluence.js.map +1 -1
- package/dist/connectors/connectorActivity.d.ts +24 -0
- package/dist/connectors/connectorActivity.js +32 -0
- package/dist/connectors/connectorActivity.js.map +1 -0
- package/dist/connectors/connectorRedirectUri.js +22 -2
- package/dist/connectors/connectorRedirectUri.js.map +1 -1
- package/dist/connectors/connectorRegistry.d.ts +0 -3
- package/dist/connectors/connectorRegistry.js +8 -8
- package/dist/connectors/connectorRegistry.js.map +1 -1
- package/dist/connectors/datadog.js +8 -1
- package/dist/connectors/datadog.js.map +1 -1
- package/dist/connectors/discord.js +4 -3
- package/dist/connectors/discord.js.map +1 -1
- package/dist/connectors/elasticsearch.js +22 -0
- package/dist/connectors/elasticsearch.js.map +1 -1
- package/dist/connectors/github.d.ts +38 -0
- package/dist/connectors/github.js +91 -5
- package/dist/connectors/github.js.map +1 -1
- package/dist/connectors/gitlab.js +19 -16
- package/dist/connectors/gitlab.js.map +1 -1
- package/dist/connectors/gmail.d.ts +5 -0
- package/dist/connectors/gmail.js +53 -11
- package/dist/connectors/gmail.js.map +1 -1
- package/dist/connectors/googleCalendar.js +5 -4
- package/dist/connectors/googleCalendar.js.map +1 -1
- package/dist/connectors/googleDocs.js +7 -6
- package/dist/connectors/googleDocs.js.map +1 -1
- package/dist/connectors/googleDrive.js +15 -8
- package/dist/connectors/googleDrive.js.map +1 -1
- package/dist/connectors/grafana.js +39 -3
- package/dist/connectors/grafana.js.map +1 -1
- package/dist/connectors/jira.d.ts +1 -1
- package/dist/connectors/jira.js +19 -4
- package/dist/connectors/jira.js.map +1 -1
- package/dist/connectors/linear.js +2 -2
- package/dist/connectors/linear.js.map +1 -1
- package/dist/connectors/mcpClient.d.ts +29 -1
- package/dist/connectors/mcpClient.js +114 -44
- package/dist/connectors/mcpClient.js.map +1 -1
- package/dist/connectors/mcpOAuth.d.ts +1 -0
- package/dist/connectors/mcpOAuth.js +49 -4
- package/dist/connectors/mcpOAuth.js.map +1 -1
- package/dist/connectors/monday.js +5 -4
- package/dist/connectors/monday.js.map +1 -1
- package/dist/connectors/mongodb.js +32 -5
- package/dist/connectors/mongodb.js.map +1 -1
- package/dist/connectors/notion.d.ts +1 -1
- package/dist/connectors/notion.js +22 -6
- package/dist/connectors/notion.js.map +1 -1
- package/dist/connectors/oauthError.d.ts +17 -0
- package/dist/connectors/oauthError.js +50 -0
- package/dist/connectors/oauthError.js.map +1 -0
- package/dist/connectors/postgres.d.ts +7 -0
- package/dist/connectors/postgres.js +32 -2
- package/dist/connectors/postgres.js.map +1 -1
- package/dist/connectors/posthog.js +26 -0
- package/dist/connectors/posthog.js.map +1 -1
- package/dist/connectors/redis.d.ts +1 -0
- package/dist/connectors/redis.js +47 -20
- package/dist/connectors/redis.js.map +1 -1
- package/dist/connectors/salesforce.js +66 -5
- package/dist/connectors/salesforce.js.map +1 -1
- package/dist/connectors/sentry.js +2 -2
- package/dist/connectors/sentry.js.map +1 -1
- package/dist/connectors/slack.js +37 -14
- package/dist/connectors/slack.js.map +1 -1
- package/dist/connectors/snowflake.js +24 -0
- package/dist/connectors/snowflake.js.map +1 -1
- package/dist/connectors/stripe.js +9 -2
- package/dist/connectors/stripe.js.map +1 -1
- package/dist/connectors/supabase.js +34 -0
- package/dist/connectors/supabase.js.map +1 -1
- package/dist/connectors/tokenStorage.d.ts +20 -0
- package/dist/connectors/tokenStorage.js +196 -64
- package/dist/connectors/tokenStorage.js.map +1 -1
- package/dist/connectors/woocommerce.js +34 -0
- package/dist/connectors/woocommerce.js.map +1 -1
- package/dist/copilot/parseIntent.d.ts +58 -0
- package/dist/copilot/parseIntent.js +149 -0
- package/dist/copilot/parseIntent.js.map +1 -0
- package/dist/decisionReplay.d.ts +8 -6
- package/dist/decisionReplay.js +35 -11
- package/dist/decisionReplay.js.map +1 -1
- package/dist/decisionTraceLog.d.ts +9 -0
- package/dist/decisionTraceLog.js +6 -0
- package/dist/decisionTraceLog.js.map +1 -1
- package/dist/drivers/claude/api.js +49 -7
- package/dist/drivers/claude/api.js.map +1 -1
- package/dist/drivers/claude/envSanitizer.d.ts +9 -1
- package/dist/drivers/claude/envSanitizer.js +41 -3
- package/dist/drivers/claude/envSanitizer.js.map +1 -1
- package/dist/drivers/claude/streamParser.d.ts +13 -0
- package/dist/drivers/claude/streamParser.js.map +1 -1
- package/dist/drivers/claude/subprocess.js +131 -16
- package/dist/drivers/claude/subprocess.js.map +1 -1
- package/dist/drivers/claude/subprocessSettings.d.ts +1 -1
- package/dist/drivers/claude/subprocessSettings.js +18 -4
- package/dist/drivers/claude/subprocessSettings.js.map +1 -1
- package/dist/drivers/gemini/index.d.ts +13 -0
- package/dist/drivers/gemini/index.js +211 -67
- package/dist/drivers/gemini/index.js.map +1 -1
- package/dist/drivers/local/index.d.ts +2 -17
- package/dist/drivers/local/index.js +5 -92
- package/dist/drivers/local/index.js.map +1 -1
- package/dist/drivers/openai/index.js +69 -9
- package/dist/drivers/openai/index.js.map +1 -1
- package/dist/drivers/outputCap.d.ts +27 -0
- package/dist/drivers/outputCap.js +50 -0
- package/dist/drivers/outputCap.js.map +1 -0
- package/dist/embeddings/cosine.d.ts +23 -0
- package/dist/embeddings/cosine.js +59 -0
- package/dist/embeddings/cosine.js.map +1 -0
- package/dist/embeddings/index.d.ts +19 -0
- package/dist/embeddings/index.js +35 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/localEmbeddings.d.ts +29 -0
- package/dist/embeddings/localEmbeddings.js +103 -0
- package/dist/embeddings/localEmbeddings.js.map +1 -0
- package/dist/embeddings/localEndpoints.d.ts +24 -0
- package/dist/embeddings/localEndpoints.js +37 -0
- package/dist/embeddings/localEndpoints.js.map +1 -0
- package/dist/embeddings/types.d.ts +32 -0
- package/dist/embeddings/types.js +12 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/featureFlags.d.ts +18 -0
- package/dist/featureFlags.js +32 -0
- package/dist/featureFlags.js.map +1 -1
- package/dist/fp/automationInterpreter.js +118 -39
- package/dist/fp/automationInterpreter.js.map +1 -1
- package/dist/fp/automationProgram.d.ts +10 -0
- package/dist/fp/automationProgram.js.map +1 -1
- package/dist/fp/automationState.d.ts +6 -0
- package/dist/fp/automationState.js +38 -0
- package/dist/fp/automationState.js.map +1 -1
- package/dist/fp/commandDescription.d.ts +6 -0
- package/dist/fp/commandDescription.js +18 -5
- package/dist/fp/commandDescription.js.map +1 -1
- package/dist/fp/interpreterContext.d.ts +16 -5
- package/dist/fp/interpreterContext.js +59 -3
- package/dist/fp/interpreterContext.js.map +1 -1
- package/dist/fp/policyParser.js +18 -8
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/haltPushDispatch.d.ts +4 -0
- package/dist/haltPushDispatch.js +7 -22
- package/dist/haltPushDispatch.js.map +1 -1
- package/dist/inboxRoutes.js +2 -2
- package/dist/inboxRoutes.js.map +1 -1
- package/dist/index.js +672 -135
- package/dist/index.js.map +1 -1
- package/dist/installGuard.js +6 -0
- package/dist/installGuard.js.map +1 -1
- package/dist/localEndpointGuard.d.ts +25 -0
- package/dist/localEndpointGuard.js +101 -0
- package/dist/localEndpointGuard.js.map +1 -0
- package/dist/mcpRoutes.js +1 -1
- package/dist/mcpRoutes.js.map +1 -1
- package/dist/oauth.d.ts +13 -0
- package/dist/oauth.js +53 -9
- package/dist/oauth.js.map +1 -1
- package/dist/orchestrator/childBridgeClient.d.ts +7 -0
- package/dist/orchestrator/childBridgeClient.js +42 -1
- package/dist/orchestrator/childBridgeClient.js.map +1 -1
- package/dist/orchestrator/orchestratorBridge.d.ts +33 -0
- package/dist/orchestrator/orchestratorBridge.js +75 -9
- package/dist/orchestrator/orchestratorBridge.js.map +1 -1
- package/dist/patchworkConfig.d.ts +4 -0
- package/dist/patchworkConfig.js +33 -4
- package/dist/patchworkConfig.js.map +1 -1
- package/dist/probe.js +39 -5
- package/dist/probe.js.map +1 -1
- package/dist/recipeOrchestration.d.ts +59 -0
- package/dist/recipeOrchestration.js +314 -60
- package/dist/recipeOrchestration.js.map +1 -1
- package/dist/recipeRoutes.d.ts +93 -0
- package/dist/recipeRoutes.js +664 -27
- package/dist/recipeRoutes.js.map +1 -1
- package/dist/recipes/RecipeOrchestrator.d.ts +14 -0
- package/dist/recipes/RecipeOrchestrator.js +42 -2
- package/dist/recipes/RecipeOrchestrator.js.map +1 -1
- package/dist/recipes/agentExecutor.d.ts +51 -2
- package/dist/recipes/agentExecutor.js +86 -13
- package/dist/recipes/agentExecutor.js.map +1 -1
- package/dist/recipes/chainedRunner.d.ts +111 -3
- package/dist/recipes/chainedRunner.js +440 -45
- package/dist/recipes/chainedRunner.js.map +1 -1
- package/dist/recipes/compiler.js +42 -29
- package/dist/recipes/compiler.js.map +1 -1
- package/dist/recipes/connectorPreflight.js +31 -0
- package/dist/recipes/connectorPreflight.js.map +1 -1
- package/dist/recipes/dependencyGraph.d.ts +16 -0
- package/dist/recipes/dependencyGraph.js +37 -2
- package/dist/recipes/dependencyGraph.js.map +1 -1
- package/dist/recipes/eventTriggerPrograms.d.ts +36 -0
- package/dist/recipes/eventTriggerPrograms.js +158 -0
- package/dist/recipes/eventTriggerPrograms.js.map +1 -0
- package/dist/recipes/githubInstallSource.d.ts +9 -2
- package/dist/recipes/githubInstallSource.js +36 -6
- package/dist/recipes/githubInstallSource.js.map +1 -1
- package/dist/recipes/haltCategory.d.ts +10 -0
- package/dist/recipes/haltCategory.js +11 -1
- package/dist/recipes/haltCategory.js.map +1 -1
- package/dist/recipes/idempotencyKey.d.ts +30 -3
- package/dist/recipes/idempotencyKey.js +89 -5
- package/dist/recipes/idempotencyKey.js.map +1 -1
- package/dist/recipes/installer.js +12 -35
- package/dist/recipes/installer.js.map +1 -1
- package/dist/recipes/judgeVerdict.d.ts +11 -1
- package/dist/recipes/judgeVerdict.js +47 -7
- package/dist/recipes/judgeVerdict.js.map +1 -1
- package/dist/recipes/names.d.ts +5 -0
- package/dist/recipes/names.js +10 -5
- package/dist/recipes/names.js.map +1 -1
- package/dist/recipes/parser.js +74 -10
- package/dist/recipes/parser.js.map +1 -1
- package/dist/recipes/pricing/costRouter.d.ts +43 -0
- package/dist/recipes/pricing/costRouter.js +44 -0
- package/dist/recipes/pricing/costRouter.js.map +1 -0
- package/dist/recipes/pricing/priceTable.d.ts +76 -0
- package/dist/recipes/pricing/priceTable.js +144 -0
- package/dist/recipes/pricing/priceTable.js.map +1 -0
- package/dist/recipes/replayRun.js +5 -2
- package/dist/recipes/replayRun.js.map +1 -1
- package/dist/recipes/resolveRecipePath.js +15 -1
- package/dist/recipes/resolveRecipePath.js.map +1 -1
- package/dist/recipes/runBudget.d.ts +93 -32
- package/dist/recipes/runBudget.js +213 -49
- package/dist/recipes/runBudget.js.map +1 -1
- package/dist/recipes/runRegistry.d.ts +32 -0
- package/dist/recipes/runRegistry.js +54 -0
- package/dist/recipes/runRegistry.js.map +1 -0
- package/dist/recipes/scheduler.js +6 -2
- package/dist/recipes/scheduler.js.map +1 -1
- package/dist/recipes/schema.d.ts +59 -6
- package/dist/recipes/schemaGenerator.d.ts +9 -0
- package/dist/recipes/schemaGenerator.js +446 -77
- package/dist/recipes/schemaGenerator.js.map +1 -1
- package/dist/recipes/simulation/aggregateRunRisk.d.ts +46 -0
- package/dist/recipes/simulation/aggregateRunRisk.js +120 -0
- package/dist/recipes/simulation/aggregateRunRisk.js.map +1 -0
- package/dist/recipes/simulation/costProjector.d.ts +32 -0
- package/dist/recipes/simulation/costProjector.js +194 -0
- package/dist/recipes/simulation/costProjector.js.map +1 -0
- package/dist/recipes/simulation/sideEffects.d.ts +32 -0
- package/dist/recipes/simulation/sideEffects.js +62 -0
- package/dist/recipes/simulation/sideEffects.js.map +1 -0
- package/dist/recipes/simulation/simulate.d.ts +36 -0
- package/dist/recipes/simulation/simulate.js +264 -0
- package/dist/recipes/simulation/simulate.js.map +1 -0
- package/dist/recipes/simulation/simulateMockedRun.d.ts +52 -0
- package/dist/recipes/simulation/simulateMockedRun.js +84 -0
- package/dist/recipes/simulation/simulateMockedRun.js.map +1 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.d.ts +31 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.js +50 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.js.map +1 -0
- package/dist/recipes/simulation/types.d.ts +198 -0
- package/dist/recipes/simulation/types.js +30 -0
- package/dist/recipes/simulation/types.js.map +1 -0
- package/dist/recipes/stepObservation.d.ts +12 -0
- package/dist/recipes/stepObservation.js +21 -1
- package/dist/recipes/stepObservation.js.map +1 -1
- package/dist/recipes/toolRegistry.js +61 -24
- package/dist/recipes/toolRegistry.js.map +1 -1
- package/dist/recipes/tools/airtable.d.ts +15 -0
- package/dist/recipes/tools/airtable.js +240 -0
- package/dist/recipes/tools/airtable.js.map +1 -0
- package/dist/recipes/tools/caldiy.d.ts +13 -0
- package/dist/recipes/tools/caldiy.js +215 -0
- package/dist/recipes/tools/caldiy.js.map +1 -0
- package/dist/recipes/tools/circleci.d.ts +10 -0
- package/dist/recipes/tools/circleci.js +204 -0
- package/dist/recipes/tools/circleci.js.map +1 -0
- package/dist/recipes/tools/cloudflare.d.ts +13 -0
- package/dist/recipes/tools/cloudflare.js +211 -0
- package/dist/recipes/tools/cloudflare.js.map +1 -0
- package/dist/recipes/tools/confluence.js +11 -10
- package/dist/recipes/tools/confluence.js.map +1 -1
- package/dist/recipes/tools/datadog.js +13 -12
- package/dist/recipes/tools/datadog.js.map +1 -1
- package/dist/recipes/tools/docs.d.ts +18 -0
- package/dist/recipes/tools/docs.js +95 -0
- package/dist/recipes/tools/docs.js.map +1 -0
- package/dist/recipes/tools/elasticsearch.d.ts +11 -0
- package/dist/recipes/tools/elasticsearch.js +157 -0
- package/dist/recipes/tools/elasticsearch.js.map +1 -0
- package/dist/recipes/tools/fanOut.js +4 -4
- package/dist/recipes/tools/fanOut.js.map +1 -1
- package/dist/recipes/tools/figma.d.ts +12 -0
- package/dist/recipes/tools/figma.js +195 -0
- package/dist/recipes/tools/figma.js.map +1 -0
- package/dist/recipes/tools/file.js +43 -22
- package/dist/recipes/tools/file.js.map +1 -1
- package/dist/recipes/tools/github.js +162 -5
- package/dist/recipes/tools/github.js.map +1 -1
- package/dist/recipes/tools/gmail.js +45 -33
- package/dist/recipes/tools/gmail.js.map +1 -1
- package/dist/recipes/tools/grafana.d.ts +11 -0
- package/dist/recipes/tools/grafana.js +216 -0
- package/dist/recipes/tools/grafana.js.map +1 -0
- package/dist/recipes/tools/http.d.ts +1 -1
- package/dist/recipes/tools/http.js +10 -28
- package/dist/recipes/tools/http.js.map +1 -1
- package/dist/recipes/tools/hubspot.js +13 -12
- package/dist/recipes/tools/hubspot.js.map +1 -1
- package/dist/recipes/tools/index.d.ts +28 -0
- package/dist/recipes/tools/index.js +28 -0
- package/dist/recipes/tools/index.js.map +1 -1
- package/dist/recipes/tools/intercom.js +11 -10
- package/dist/recipes/tools/intercom.js.map +1 -1
- package/dist/recipes/tools/jira.js +13 -0
- package/dist/recipes/tools/jira.js.map +1 -1
- package/dist/recipes/tools/meetingNotes.js +2 -2
- package/dist/recipes/tools/monday.d.ts +22 -0
- package/dist/recipes/tools/monday.js +242 -0
- package/dist/recipes/tools/monday.js.map +1 -0
- package/dist/recipes/tools/mongodb.d.ts +19 -0
- package/dist/recipes/tools/mongodb.js +194 -0
- package/dist/recipes/tools/mongodb.js.map +1 -0
- package/dist/recipes/tools/notion.js +11 -10
- package/dist/recipes/tools/notion.js.map +1 -1
- package/dist/recipes/tools/obsidian.d.ts +15 -0
- package/dist/recipes/tools/obsidian.js +173 -0
- package/dist/recipes/tools/obsidian.js.map +1 -0
- package/dist/recipes/tools/outcomes.d.ts +15 -0
- package/dist/recipes/tools/outcomes.js +111 -0
- package/dist/recipes/tools/outcomes.js.map +1 -0
- package/dist/recipes/tools/paystack.d.ts +11 -0
- package/dist/recipes/tools/paystack.js +212 -0
- package/dist/recipes/tools/paystack.js.map +1 -0
- package/dist/recipes/tools/pipedrive.d.ts +16 -0
- package/dist/recipes/tools/pipedrive.js +234 -0
- package/dist/recipes/tools/pipedrive.js.map +1 -0
- package/dist/recipes/tools/postgres.d.ts +15 -0
- package/dist/recipes/tools/postgres.js +186 -0
- package/dist/recipes/tools/postgres.js.map +1 -0
- package/dist/recipes/tools/posthog.d.ts +16 -0
- package/dist/recipes/tools/posthog.js +219 -0
- package/dist/recipes/tools/posthog.js.map +1 -0
- package/dist/recipes/tools/redis.d.ts +9 -0
- package/dist/recipes/tools/redis.js +141 -0
- package/dist/recipes/tools/redis.js.map +1 -0
- package/dist/recipes/tools/resend.d.ts +8 -0
- package/dist/recipes/tools/resend.js +153 -0
- package/dist/recipes/tools/resend.js.map +1 -0
- package/dist/recipes/tools/salesforce.d.ts +16 -0
- package/dist/recipes/tools/salesforce.js +184 -0
- package/dist/recipes/tools/salesforce.js.map +1 -0
- package/dist/recipes/tools/sendgrid.d.ts +9 -0
- package/dist/recipes/tools/sendgrid.js +175 -0
- package/dist/recipes/tools/sendgrid.js.map +1 -0
- package/dist/recipes/tools/shopify.d.ts +16 -0
- package/dist/recipes/tools/shopify.js +266 -0
- package/dist/recipes/tools/shopify.js.map +1 -0
- package/dist/recipes/tools/snowflake.d.ts +16 -0
- package/dist/recipes/tools/snowflake.js +173 -0
- package/dist/recipes/tools/snowflake.js.map +1 -0
- package/dist/recipes/tools/stripe.js +13 -12
- package/dist/recipes/tools/stripe.js.map +1 -1
- package/dist/recipes/tools/supabase.d.ts +9 -0
- package/dist/recipes/tools/supabase.js +133 -0
- package/dist/recipes/tools/supabase.js.map +1 -0
- package/dist/recipes/tools/todoist.d.ts +15 -0
- package/dist/recipes/tools/todoist.js +228 -0
- package/dist/recipes/tools/todoist.js.map +1 -0
- package/dist/recipes/tools/twilio.d.ts +11 -0
- package/dist/recipes/tools/twilio.js +180 -0
- package/dist/recipes/tools/twilio.js.map +1 -0
- package/dist/recipes/tools/vercel.d.ts +9 -0
- package/dist/recipes/tools/vercel.js +146 -0
- package/dist/recipes/tools/vercel.js.map +1 -0
- package/dist/recipes/tools/webflow.d.ts +11 -0
- package/dist/recipes/tools/webflow.js +244 -0
- package/dist/recipes/tools/webflow.js.map +1 -0
- package/dist/recipes/tools/woocommerce.d.ts +18 -0
- package/dist/recipes/tools/woocommerce.js +260 -0
- package/dist/recipes/tools/woocommerce.js.map +1 -0
- package/dist/recipes/tools/wrapConnectorExecute.d.ts +25 -0
- package/dist/recipes/tools/wrapConnectorExecute.js +37 -0
- package/dist/recipes/tools/wrapConnectorExecute.js.map +1 -0
- package/dist/recipes/tools/zendesk.js +11 -10
- package/dist/recipes/tools/zendesk.js.map +1 -1
- package/dist/recipes/triggerVars.d.ts +15 -0
- package/dist/recipes/triggerVars.js +57 -0
- package/dist/recipes/triggerVars.js.map +1 -0
- package/dist/recipes/validation.d.ts +1 -1
- package/dist/recipes/validation.js +536 -12
- package/dist/recipes/validation.js.map +1 -1
- package/dist/recipes/yamlPositions.d.ts +1 -1
- package/dist/recipes/yamlPositions.js +7 -2
- package/dist/recipes/yamlPositions.js.map +1 -1
- package/dist/recipes/yamlRunner.d.ts +216 -4
- package/dist/recipes/yamlRunner.js +1030 -96
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/recipesHttp.d.ts +5 -0
- package/dist/recipesHttp.js +68 -6
- package/dist/recipesHttp.js.map +1 -1
- package/dist/resources.js +14 -1
- package/dist/resources.js.map +1 -1
- package/dist/riskSignals.d.ts +42 -0
- package/dist/riskSignals.js +197 -0
- package/dist/riskSignals.js.map +1 -0
- package/dist/riskTier.d.ts +9 -0
- package/dist/riskTier.js +48 -0
- package/dist/riskTier.js.map +1 -1
- package/dist/runLog.d.ts +53 -0
- package/dist/runLog.js +75 -16
- package/dist/runLog.js.map +1 -1
- package/dist/schemas/recipe.v1.json +360 -16
- package/dist/server.d.ts +60 -0
- package/dist/server.js +192 -31
- package/dist/server.js.map +1 -1
- package/dist/sessionCheckpoint.js +4 -1
- package/dist/sessionCheckpoint.js.map +1 -1
- package/dist/sessionDetail.d.ts +43 -0
- package/dist/sessionDetail.js +59 -0
- package/dist/sessionDetail.js.map +1 -0
- package/dist/settingsEnv.d.ts +47 -0
- package/dist/settingsEnv.js +88 -0
- package/dist/settingsEnv.js.map +1 -0
- package/dist/streamableHttp.js +44 -10
- package/dist/streamableHttp.js.map +1 -1
- package/dist/ta/backtest/abnday.d.ts +53 -0
- package/dist/ta/backtest/abnday.js +123 -0
- package/dist/ta/backtest/abnday.js.map +1 -0
- package/dist/ta/backtest/directional.d.ts +48 -0
- package/dist/ta/backtest/directional.js +103 -0
- package/dist/ta/backtest/directional.js.map +1 -0
- package/dist/ta/backtest/fundx.d.ts +67 -0
- package/dist/ta/backtest/fundx.js +264 -0
- package/dist/ta/backtest/fundx.js.map +1 -0
- package/dist/ta/backtest/fvg.d.ts +62 -0
- package/dist/ta/backtest/fvg.js +236 -0
- package/dist/ta/backtest/fvg.js.map +1 -0
- package/dist/ta/backtest/ichimoku.d.ts +41 -0
- package/dist/ta/backtest/ichimoku.js +146 -0
- package/dist/ta/backtest/ichimoku.js.map +1 -0
- package/dist/ta/backtest/ingest.d.ts +20 -0
- package/dist/ta/backtest/ingest.js +104 -0
- package/dist/ta/backtest/ingest.js.map +1 -0
- package/dist/ta/backtest/msb.d.ts +49 -0
- package/dist/ta/backtest/msb.js +162 -0
- package/dist/ta/backtest/msb.js.map +1 -0
- package/dist/ta/backtest/scoring.d.ts +33 -0
- package/dist/ta/backtest/scoring.js +82 -0
- package/dist/ta/backtest/scoring.js.map +1 -0
- package/dist/ta/backtest/summary.d.ts +20 -0
- package/dist/ta/backtest/summary.js +42 -0
- package/dist/ta/backtest/summary.js.map +1 -0
- package/dist/ta/backtest/tsmom.d.ts +72 -0
- package/dist/ta/backtest/tsmom.js +202 -0
- package/dist/ta/backtest/tsmom.js.map +1 -0
- package/dist/ta/backtest/volsq.d.ts +34 -0
- package/dist/ta/backtest/volsq.js +154 -0
- package/dist/ta/backtest/volsq.js.map +1 -0
- package/dist/ta/backtest/walkForward.d.ts +45 -0
- package/dist/ta/backtest/walkForward.js +136 -0
- package/dist/ta/backtest/walkForward.js.map +1 -0
- package/dist/ta/cycles.d.ts +15 -0
- package/dist/ta/cycles.js +31 -0
- package/dist/ta/cycles.js.map +1 -0
- package/dist/ta/desk/accrualEmitter.d.ts +59 -0
- package/dist/ta/desk/accrualEmitter.js +136 -0
- package/dist/ta/desk/accrualEmitter.js.map +1 -0
- package/dist/ta/desk/cellBacktest.d.ts +179 -0
- package/dist/ta/desk/cellBacktest.js +514 -0
- package/dist/ta/desk/cellBacktest.js.map +1 -0
- package/dist/ta/desk/cells/wpMaRejection.d.ts +49 -0
- package/dist/ta/desk/cells/wpMaRejection.js +141 -0
- package/dist/ta/desk/cells/wpMaRejection.js.map +1 -0
- package/dist/ta/desk/cells/wpVolumeClimax.d.ts +57 -0
- package/dist/ta/desk/cells/wpVolumeClimax.js +193 -0
- package/dist/ta/desk/cells/wpVolumeClimax.js.map +1 -0
- package/dist/ta/desk/collectors.d.ts +18 -0
- package/dist/ta/desk/collectors.js +450 -0
- package/dist/ta/desk/collectors.js.map +1 -0
- package/dist/ta/desk/contract.d.ts +51 -0
- package/dist/ta/desk/contract.js +261 -0
- package/dist/ta/desk/contract.js.map +1 -0
- package/dist/ta/desk/deskLedger.d.ts +36 -0
- package/dist/ta/desk/deskLedger.js +239 -0
- package/dist/ta/desk/deskLedger.js.map +1 -0
- package/dist/ta/desk/liqTape.d.ts +37 -0
- package/dist/ta/desk/liqTape.js +99 -0
- package/dist/ta/desk/liqTape.js.map +1 -0
- package/dist/ta/desk/post.d.ts +20 -0
- package/dist/ta/desk/post.js +65 -0
- package/dist/ta/desk/post.js.map +1 -0
- package/dist/ta/desk/render.d.ts +25 -0
- package/dist/ta/desk/render.js +398 -0
- package/dist/ta/desk/render.js.map +1 -0
- package/dist/ta/desk/surfaces.d.ts +216 -0
- package/dist/ta/desk/surfaces.js +472 -0
- package/dist/ta/desk/surfaces.js.map +1 -0
- package/dist/ta/desk/types.d.ts +174 -0
- package/dist/ta/desk/types.js +104 -0
- package/dist/ta/desk/types.js.map +1 -0
- package/dist/ta/index.d.ts +23 -0
- package/dist/ta/index.js +54 -0
- package/dist/ta/index.js.map +1 -0
- package/dist/ta/ledger.d.ts +44 -0
- package/dist/ta/ledger.js +95 -0
- package/dist/ta/ledger.js.map +1 -0
- package/dist/ta/levels.d.ts +21 -0
- package/dist/ta/levels.js +41 -0
- package/dist/ta/levels.js.map +1 -0
- package/dist/ta/swings.d.ts +30 -0
- package/dist/ta/swings.js +83 -0
- package/dist/ta/swings.js.map +1 -0
- package/dist/ta/types.d.ts +81 -0
- package/dist/ta/types.js +20 -0
- package/dist/ta/types.js.map +1 -0
- package/dist/telemetry.js +20 -9
- package/dist/telemetry.js.map +1 -1
- package/dist/tokenUsageTracker.d.ts +2 -1
- package/dist/tokenUsageTracker.js +38 -20
- package/dist/tokenUsageTracker.js.map +1 -1
- package/dist/tools/contextBundle.js +13 -9
- package/dist/tools/contextBundle.js.map +1 -1
- package/dist/tools/ctxGetTaskContext.js +8 -3
- package/dist/tools/ctxGetTaskContext.js.map +1 -1
- package/dist/tools/ctxQueryTraces.d.ts +18 -1
- package/dist/tools/ctxQueryTraces.js +176 -27
- package/dist/tools/ctxQueryTraces.js.map +1 -1
- package/dist/tools/enrichCommit.js +5 -2
- package/dist/tools/enrichCommit.js.map +1 -1
- package/dist/tools/getDependencyTree.js +2 -2
- package/dist/tools/getDependencyTree.js.map +1 -1
- package/dist/tools/getDiagnostics.js +3 -0
- package/dist/tools/getDiagnostics.js.map +1 -1
- package/dist/tools/getDocumentSymbols.js +5 -1
- package/dist/tools/getDocumentSymbols.js.map +1 -1
- package/dist/tools/getGitHotspots.js +12 -1
- package/dist/tools/getGitHotspots.js.map +1 -1
- package/dist/tools/getGitLog.js +5 -2
- package/dist/tools/getGitLog.js.map +1 -1
- package/dist/tools/getGitStatus.js +6 -1
- package/dist/tools/getGitStatus.js.map +1 -1
- package/dist/tools/getProjectContext.js +3 -1
- package/dist/tools/getProjectContext.js.map +1 -1
- package/dist/tools/getToolCapabilities.js +39 -4
- package/dist/tools/getToolCapabilities.js.map +1 -1
- package/dist/tools/gitWrite.js +12 -3
- package/dist/tools/gitWrite.js.map +1 -1
- package/dist/tools/github/composite.d.ts +1 -1
- package/dist/tools/github/composite.js +7 -7
- package/dist/tools/github/composite.js.map +1 -1
- package/dist/tools/github/pr.d.ts +6 -6
- package/dist/tools/github/pr.js +18 -11
- package/dist/tools/github/pr.js.map +1 -1
- package/dist/tools/httpClient.js +55 -3
- package/dist/tools/httpClient.js.map +1 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.js +19 -12
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lsp.d.ts +6 -0
- package/dist/tools/lsp.js +81 -12
- package/dist/tools/lsp.js.map +1 -1
- package/dist/tools/previewEdit.js +16 -1
- package/dist/tools/previewEdit.js.map +1 -1
- package/dist/tools/resumeClaudeTask.js +17 -0
- package/dist/tools/resumeClaudeTask.js.map +1 -1
- package/dist/tools/searchAndReplace.js +9 -5
- package/dist/tools/searchAndReplace.js.map +1 -1
- package/dist/tools/searchTools.d.ts +26 -0
- package/dist/tools/searchTools.js +42 -2
- package/dist/tools/searchTools.js.map +1 -1
- package/dist/tools/terminal.js +23 -51
- package/dist/tools/terminal.js.map +1 -1
- package/dist/tools/transaction.d.ts +9 -1
- package/dist/tools/transaction.js +59 -4
- package/dist/tools/transaction.js.map +1 -1
- package/dist/tools/utils.d.ts +16 -0
- package/dist/tools/utils.js +77 -7
- package/dist/tools/utils.js.map +1 -1
- package/dist/transport.d.ts +31 -0
- package/dist/transport.js +117 -14
- package/dist/transport.js.map +1 -1
- package/dist/wireHaltPushDispatch.js +12 -0
- package/dist/wireHaltPushDispatch.js.map +1 -1
- package/dist/workerGateDecisionLog.d.ts +141 -0
- package/dist/workerGateDecisionLog.js +361 -0
- package/dist/workerGateDecisionLog.js.map +1 -0
- package/dist/workers/actionClass.d.ts +38 -0
- package/dist/workers/actionClass.js +155 -0
- package/dist/workers/actionClass.js.map +1 -0
- package/dist/workers/backtest.d.ts +68 -0
- package/dist/workers/backtest.js +113 -0
- package/dist/workers/backtest.js.map +1 -0
- package/dist/workers/contextRisk.d.ts +35 -0
- package/dist/workers/contextRisk.js +20 -0
- package/dist/workers/contextRisk.js.map +1 -0
- package/dist/workers/contextRiskScorer.d.ts +48 -0
- package/dist/workers/contextRiskScorer.js +94 -0
- package/dist/workers/contextRiskScorer.js.map +1 -0
- package/dist/workers/graduation.d.ts +61 -0
- package/dist/workers/graduation.js +112 -0
- package/dist/workers/graduation.js.map +1 -0
- package/dist/workers/outcomeStore.d.ts +98 -0
- package/dist/workers/outcomeStore.js +146 -0
- package/dist/workers/outcomeStore.js.map +1 -0
- package/dist/workers/outcomesCli.d.ts +34 -0
- package/dist/workers/outcomesCli.js +91 -0
- package/dist/workers/outcomesCli.js.map +1 -0
- package/dist/workers/runWorkerShadow.d.ts +90 -0
- package/dist/workers/runWorkerShadow.js +323 -0
- package/dist/workers/runWorkerShadow.js.map +1 -0
- package/dist/workers/shadowGate.d.ts +30 -0
- package/dist/workers/shadowGate.js +58 -0
- package/dist/workers/shadowGate.js.map +1 -0
- package/dist/workers/shadowObserver.d.ts +165 -0
- package/dist/workers/shadowObserver.js +203 -0
- package/dist/workers/shadowObserver.js.map +1 -0
- package/dist/workers/shadowReport.d.ts +16 -0
- package/dist/workers/shadowReport.js +61 -0
- package/dist/workers/shadowReport.js.map +1 -0
- package/dist/workers/shadowRun.d.ts +38 -0
- package/dist/workers/shadowRun.js +44 -0
- package/dist/workers/shadowRun.js.map +1 -0
- package/dist/workers/trustLevel.d.ts +82 -0
- package/dist/workers/trustLevel.js +100 -0
- package/dist/workers/trustLevel.js.map +1 -0
- package/dist/workers/worker.d.ts +49 -0
- package/dist/workers/worker.js +88 -0
- package/dist/workers/worker.js.map +1 -0
- package/dist/workers/workerGate.d.ts +101 -0
- package/dist/workers/workerGate.js +210 -0
- package/dist/workers/workerGate.js.map +1 -0
- package/dist/workers/workerLevelStore.d.ts +33 -0
- package/dist/workers/workerLevelStore.js +87 -0
- package/dist/workers/workerLevelStore.js.map +1 -0
- package/dist/workers/workerLoader.d.ts +7 -0
- package/dist/workers/workerLoader.js +31 -0
- package/dist/workers/workerLoader.js.map +1 -0
- package/dist/writeFileAtomic.js +40 -13
- package/dist/writeFileAtomic.js.map +1 -1
- package/package.json +14 -6
- package/scripts/mcp-stdio-shim.cjs +247 -87
- package/templates/CLAUDE.bridge.md +1 -1
- package/templates/recipes/dependency-bump.yaml +33 -0
- package/templates/recipes/incident-to-pr.yaml +187 -0
- package/templates/recipes/outcome-ingester.yaml +53 -0
- package/templates/recipes/release-notes.yaml +30 -0
- package/templates/recipes/triage-failing-tests-autofile.yaml +152 -0
- package/templates/recipes/triage-failing-tests.yaml +38 -0
- package/templates/workers/dependency-upkeep.worker.yaml +26 -0
- package/templates/workers/release-notes.worker.yaml +17 -0
- package/templates/workers/test-guardian.worker.yaml +24 -0
- package/deploy/README.md +0 -172
- package/deploy/bootstrap-new-vps.sh +0 -364
- package/deploy/bootstrap-vps.sh +0 -192
- package/deploy/claude-ide-bridge.service.template +0 -67
- package/deploy/claude-ide-bridge@.service +0 -31
- package/deploy/deploy-dashboard.sh +0 -198
- package/deploy/deploy-landing.sh +0 -136
- package/deploy/ecosystem.config.js.example +0 -36
- package/deploy/install-vps-service.sh +0 -240
- package/deploy/macos/README.md +0 -153
- package/deploy/macos/com.patchwork.bridge.plist.template +0 -54
- package/deploy/macos/com.patchwork.tunnel.plist.template +0 -76
- package/deploy/macos/install-mac-bridge.sh +0 -244
- package/deploy/macos/uninstall-mac-bridge.sh +0 -22
- package/deploy/nginx-claude-bridge.conf.template +0 -129
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import type { Logger } from "./logger.js";
|
|
2
|
+
import type { Reversibility } from "./workers/actionClass.js";
|
|
3
|
+
/**
|
|
4
|
+
* WorkerGateDecisionLog — the immutable record of every worker-autonomy gate
|
|
5
|
+
* decision, with the INPUTS that produced it.
|
|
6
|
+
*
|
|
7
|
+
* The first concrete slice of the "Decision Record" north star
|
|
8
|
+
* (docs/worker-autonomy-policy-gate.md): `decideWorkerAction` computes a rich
|
|
9
|
+
* `WorkerGateDecision` (earned level, ceiling, context-risk de-rate, reason)
|
|
10
|
+
* and — before this log — discarded it, persisting only a human-readable
|
|
11
|
+
* `summary` string into the approval queue. So an autonomous `allow` left NO
|
|
12
|
+
* trail at all, and a `gate` kept only its summary; a decision could not be
|
|
13
|
+
* replayed or explained from the log.
|
|
14
|
+
*
|
|
15
|
+
* This captures the decision + its inputs on BOTH paths (allow AND gate) so an
|
|
16
|
+
* operator can answer "why did the worker (auto-)act / gate here, on what
|
|
17
|
+
* evidence, under which policy version?" — explainable from stored evidence
|
|
18
|
+
* (replay ≠ bit-exact re-execution; the world drifts). Retention is bounded by
|
|
19
|
+
* the rotation caps below (most-recent 10k rows / 1 MB), like the sibling logs;
|
|
20
|
+
* a longer/archival horizon for compliance is a deliberate follow-up, not a
|
|
21
|
+
* promise this file makes today.
|
|
22
|
+
*
|
|
23
|
+
* Same battle-tested JSONL machinery as DecisionTraceLog / RecipeRunLog:
|
|
24
|
+
* append-only + cross-process flock (ADR-0007 torn-row guard) + bounded
|
|
25
|
+
* in-memory ring + size/line rotation + tail-on-read so a sibling bridge's
|
|
26
|
+
* appends become visible. Schema is additive.
|
|
27
|
+
*/
|
|
28
|
+
export type GateAction = "allow" | "gate";
|
|
29
|
+
export interface GateDecisionRecord {
|
|
30
|
+
/** Monotonic sequence id within the process — stable for pagination. */
|
|
31
|
+
seq: number;
|
|
32
|
+
/** ms epoch when the decision was made. */
|
|
33
|
+
decidedAt: number;
|
|
34
|
+
recipeName: string;
|
|
35
|
+
workerId: string;
|
|
36
|
+
toolName: string;
|
|
37
|
+
action: GateAction;
|
|
38
|
+
/** `${domain}:${reversibility}:${blastTier}` — the trust unit. */
|
|
39
|
+
classKey: string;
|
|
40
|
+
domain: string;
|
|
41
|
+
owned: boolean;
|
|
42
|
+
/** "low" | "medium" | "high" (RiskTier, kept as string to decouple). */
|
|
43
|
+
blastTier: string;
|
|
44
|
+
reversibility: Reversibility;
|
|
45
|
+
/** Trust earned on this class as of the decision. */
|
|
46
|
+
earnedLevel: number;
|
|
47
|
+
autonomyCeiling: number;
|
|
48
|
+
/** min(earned, ceiling, contextCeiling), 0 if unowned — what the gate acted on. */
|
|
49
|
+
effectiveLevel: number;
|
|
50
|
+
/** Descending ceiling from live context-risk (present only when supplied). */
|
|
51
|
+
contextCeiling?: number;
|
|
52
|
+
/** Context-risk score 0..1 (present only when a context-risk was resolved). */
|
|
53
|
+
contextRiskScore?: number;
|
|
54
|
+
/** Human reasons the situation was risky (e.g. "huge uncommitted diff"). */
|
|
55
|
+
contextRiskReasons?: string[];
|
|
56
|
+
/** Human-readable rationale for the action. */
|
|
57
|
+
reason: string;
|
|
58
|
+
/** The gate-policy version (thresholds/constants) that produced this row.
|
|
59
|
+
* Replay is not reproducible without knowing which policy decided. */
|
|
60
|
+
gatePolicyVersion: string;
|
|
61
|
+
}
|
|
62
|
+
export type RecordGateDecisionInput = Omit<GateDecisionRecord, "seq" | "decidedAt">;
|
|
63
|
+
export interface WorkerGateDecisionLogOptions {
|
|
64
|
+
dir: string;
|
|
65
|
+
logger?: Logger;
|
|
66
|
+
memoryCap?: number;
|
|
67
|
+
now?: () => number;
|
|
68
|
+
}
|
|
69
|
+
export interface GateDecisionQuery {
|
|
70
|
+
workerId?: string;
|
|
71
|
+
classKey?: string;
|
|
72
|
+
recipeName?: string;
|
|
73
|
+
action?: GateAction;
|
|
74
|
+
/** Only return rows with seq > after. */
|
|
75
|
+
after?: number;
|
|
76
|
+
/** Only return rows with decidedAt >= since. */
|
|
77
|
+
since?: number;
|
|
78
|
+
limit?: number;
|
|
79
|
+
}
|
|
80
|
+
export declare class WorkerGateDecisionLog {
|
|
81
|
+
private readonly opts;
|
|
82
|
+
private records;
|
|
83
|
+
private seq;
|
|
84
|
+
private readonly file;
|
|
85
|
+
private readonly memoryCap;
|
|
86
|
+
private readonly now;
|
|
87
|
+
/** Byte offset up to which `file` has been loaded (ADR-0007 tail-on-read). */
|
|
88
|
+
private lastReadOffset;
|
|
89
|
+
constructor(opts: WorkerGateDecisionLogOptions);
|
|
90
|
+
/**
|
|
91
|
+
* Record one gate decision. Validates the required identity fields and clips
|
|
92
|
+
* free-form text so a runaway reason can't bloat the audit log. Returns the
|
|
93
|
+
* stored record. The caller appends this fail-soft (a logging failure must
|
|
94
|
+
* never block the gate) — so this throws only on programmer error (missing
|
|
95
|
+
* required fields), which the caller catches.
|
|
96
|
+
*/
|
|
97
|
+
record(input: RecordGateDecisionInput): GateDecisionRecord;
|
|
98
|
+
query(q?: GateDecisionQuery): GateDecisionRecord[];
|
|
99
|
+
size(): number;
|
|
100
|
+
private append;
|
|
101
|
+
/** Trim to the most recent MAX_PERSIST_LINES / MAX_PERSIST_BYTES. Best-effort. */
|
|
102
|
+
private rotateDisk;
|
|
103
|
+
private loadExisting;
|
|
104
|
+
/** Read rows appended since `lastReadOffset` and merge them (ADR-0007). */
|
|
105
|
+
private tailDisk;
|
|
106
|
+
private consumeRawJsonl;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Render one `GateDecisionRecord` as plain-English prose — the "explain this
|
|
110
|
+
* decision" formatter behind `patchwork gate explain`. Every field it prints
|
|
111
|
+
* is already on the record (no new data, no gate-logic change); this exists
|
|
112
|
+
* because today the only way to read a decision is to know the JSONL schema
|
|
113
|
+
* and grep the file by hand.
|
|
114
|
+
*/
|
|
115
|
+
export declare function formatGateDecision(rec: GateDecisionRecord): string;
|
|
116
|
+
/** Render a most-recent-first list of decisions (e.g. `query()`'s output) as
|
|
117
|
+
* a simple chronological history — the same formatter, one entry per record,
|
|
118
|
+
* separated for readability. Empty input renders an empty string; callers
|
|
119
|
+
* print their own "no decisions found" message. */
|
|
120
|
+
export declare function formatGateDecisionHistory(recs: GateDecisionRecord[]): string;
|
|
121
|
+
/** One field that changed between two decisions on the same worker × class. */
|
|
122
|
+
export interface GateDecisionFieldDiff {
|
|
123
|
+
field: string;
|
|
124
|
+
from: string;
|
|
125
|
+
to: string;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Compare two decisions on the same worker × action-class and report what
|
|
129
|
+
* changed — Tier 2 of the "explain trust movement" legibility layer. Pure
|
|
130
|
+
* over two already-persisted records; no new gate logic, no I/O.
|
|
131
|
+
*
|
|
132
|
+
* Field order is oldest→newest-agnostic: callers pass whichever record they
|
|
133
|
+
* consider "newer"/"older" (typically `query()`'s [0] and [1], since it
|
|
134
|
+
* sorts most-recent-first); the diff reports `from` (older) → `to` (newer).
|
|
135
|
+
*/
|
|
136
|
+
export declare function diffGateDecisions(newer: GateDecisionRecord, older: GateDecisionRecord): GateDecisionFieldDiff[];
|
|
137
|
+
/** Render `diffGateDecisions`' output as prose: a header identifying both
|
|
138
|
+
* decisions being compared, then one line per changed field, or an explicit
|
|
139
|
+
* "no change" line when nothing differs (e.g. two identical gates in a row —
|
|
140
|
+
* itself a meaningful, if unexciting, answer). */
|
|
141
|
+
export declare function formatGateDecisionDiff(newer: GateDecisionRecord, older: GateDecisionRecord): string;
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { appendFileSync, closeSync, mkdirSync, openSync, readFileSync, readSync, renameSync, statSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { withFileLockSync } from "./fileLockSync.js";
|
|
4
|
+
const DEFAULT_MEMORY_CAP = 2_000;
|
|
5
|
+
const MAX_PERSIST_BYTES = 1024 * 1024; // 1 MB
|
|
6
|
+
const MAX_PERSIST_LINES = 10_000;
|
|
7
|
+
const MAX_REASON_LEN = 1_000;
|
|
8
|
+
const MAX_CONTEXT_REASONS = 16;
|
|
9
|
+
export class WorkerGateDecisionLog {
|
|
10
|
+
opts;
|
|
11
|
+
records = [];
|
|
12
|
+
seq = 0;
|
|
13
|
+
file;
|
|
14
|
+
memoryCap;
|
|
15
|
+
now;
|
|
16
|
+
/** Byte offset up to which `file` has been loaded (ADR-0007 tail-on-read). */
|
|
17
|
+
lastReadOffset = 0;
|
|
18
|
+
constructor(opts) {
|
|
19
|
+
this.opts = opts;
|
|
20
|
+
this.file = path.join(opts.dir, "worker_gate_decisions.jsonl");
|
|
21
|
+
this.memoryCap = opts.memoryCap ?? DEFAULT_MEMORY_CAP;
|
|
22
|
+
this.now = opts.now ?? Date.now;
|
|
23
|
+
try {
|
|
24
|
+
mkdirSync(opts.dir, { recursive: true, mode: 0o700 });
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
opts.logger?.warn?.(`[gate-decision-log] could not create ${opts.dir}: ${err instanceof Error ? err.message : String(err)}`);
|
|
28
|
+
}
|
|
29
|
+
this.loadExisting();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Record one gate decision. Validates the required identity fields and clips
|
|
33
|
+
* free-form text so a runaway reason can't bloat the audit log. Returns the
|
|
34
|
+
* stored record. The caller appends this fail-soft (a logging failure must
|
|
35
|
+
* never block the gate) — so this throws only on programmer error (missing
|
|
36
|
+
* required fields), which the caller catches.
|
|
37
|
+
*/
|
|
38
|
+
record(input) {
|
|
39
|
+
const recipeName = input.recipeName.trim();
|
|
40
|
+
const workerId = input.workerId.trim();
|
|
41
|
+
const toolName = input.toolName.trim();
|
|
42
|
+
const classKey = input.classKey.trim();
|
|
43
|
+
if (!recipeName)
|
|
44
|
+
throw new Error("recipeName is required");
|
|
45
|
+
if (!workerId)
|
|
46
|
+
throw new Error("workerId is required");
|
|
47
|
+
if (!toolName)
|
|
48
|
+
throw new Error("toolName is required");
|
|
49
|
+
if (!classKey)
|
|
50
|
+
throw new Error("classKey is required");
|
|
51
|
+
if (input.action !== "allow" && input.action !== "gate") {
|
|
52
|
+
throw new Error(`invalid action: ${String(input.action)}`);
|
|
53
|
+
}
|
|
54
|
+
const reasons = (input.contextRiskReasons ?? [])
|
|
55
|
+
.map((r) => String(r).trim())
|
|
56
|
+
.filter((r) => r.length > 0)
|
|
57
|
+
.slice(0, MAX_CONTEXT_REASONS);
|
|
58
|
+
this.seq += 1;
|
|
59
|
+
const rec = {
|
|
60
|
+
seq: this.seq,
|
|
61
|
+
decidedAt: this.now(),
|
|
62
|
+
recipeName,
|
|
63
|
+
workerId,
|
|
64
|
+
toolName,
|
|
65
|
+
action: input.action,
|
|
66
|
+
classKey,
|
|
67
|
+
domain: input.domain,
|
|
68
|
+
owned: input.owned,
|
|
69
|
+
blastTier: input.blastTier,
|
|
70
|
+
reversibility: input.reversibility,
|
|
71
|
+
earnedLevel: input.earnedLevel,
|
|
72
|
+
autonomyCeiling: input.autonomyCeiling,
|
|
73
|
+
effectiveLevel: input.effectiveLevel,
|
|
74
|
+
...(input.contextCeiling !== undefined && {
|
|
75
|
+
contextCeiling: input.contextCeiling,
|
|
76
|
+
}),
|
|
77
|
+
...(input.contextRiskScore !== undefined && {
|
|
78
|
+
contextRiskScore: input.contextRiskScore,
|
|
79
|
+
}),
|
|
80
|
+
...(reasons.length > 0 && { contextRiskReasons: reasons }),
|
|
81
|
+
reason: input.reason.slice(0, MAX_REASON_LEN),
|
|
82
|
+
gatePolicyVersion: input.gatePolicyVersion,
|
|
83
|
+
};
|
|
84
|
+
this.records.push(rec);
|
|
85
|
+
if (this.records.length > this.memoryCap) {
|
|
86
|
+
this.records.splice(0, this.records.length - this.memoryCap);
|
|
87
|
+
}
|
|
88
|
+
this.append(rec);
|
|
89
|
+
return rec;
|
|
90
|
+
}
|
|
91
|
+
query(q = {}) {
|
|
92
|
+
this.tailDisk();
|
|
93
|
+
const out = [];
|
|
94
|
+
for (const r of this.records) {
|
|
95
|
+
if (q.workerId && r.workerId !== q.workerId)
|
|
96
|
+
continue;
|
|
97
|
+
if (q.classKey && r.classKey !== q.classKey)
|
|
98
|
+
continue;
|
|
99
|
+
if (q.recipeName && r.recipeName !== q.recipeName)
|
|
100
|
+
continue;
|
|
101
|
+
if (q.action && r.action !== q.action)
|
|
102
|
+
continue;
|
|
103
|
+
if (q.after !== undefined && r.seq <= q.after)
|
|
104
|
+
continue;
|
|
105
|
+
if (q.since !== undefined && r.decidedAt < q.since)
|
|
106
|
+
continue;
|
|
107
|
+
out.push(r);
|
|
108
|
+
}
|
|
109
|
+
out.sort((a, b) => b.seq - a.seq);
|
|
110
|
+
const limit = Math.min(Math.max(q.limit ?? 100, 1), 1_000);
|
|
111
|
+
return out.slice(0, limit);
|
|
112
|
+
}
|
|
113
|
+
size() {
|
|
114
|
+
return this.records.length;
|
|
115
|
+
}
|
|
116
|
+
append(rec) {
|
|
117
|
+
try {
|
|
118
|
+
try {
|
|
119
|
+
const st = statSync(this.file);
|
|
120
|
+
if (st.size > MAX_PERSIST_BYTES)
|
|
121
|
+
this.rotateDisk();
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
const code = err.code;
|
|
125
|
+
if (code !== "ENOENT")
|
|
126
|
+
throw err;
|
|
127
|
+
}
|
|
128
|
+
// Cross-process flock around the append (ADR-0007): two bridges sharing
|
|
129
|
+
// $HOME can interleave bytes within one JSONL row; the torn line then
|
|
130
|
+
// fails JSON.parse and is silently skipped on every reader.
|
|
131
|
+
withFileLockSync(this.file, () => {
|
|
132
|
+
appendFileSync(this.file, `${JSON.stringify(rec)}\n`, { mode: 0o600 });
|
|
133
|
+
// Advance the tail offset past our own write so the next query() doesn't
|
|
134
|
+
// re-read this row (we already pushed it in `record`).
|
|
135
|
+
try {
|
|
136
|
+
this.lastReadOffset = statSync(this.file).size;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
/* the next tailDisk() reloads cleanly if this ever fails */
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
this.opts.logger?.warn?.(`[gate-decision-log] append failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
/** Trim to the most recent MAX_PERSIST_LINES / MAX_PERSIST_BYTES. Best-effort. */
|
|
148
|
+
rotateDisk() {
|
|
149
|
+
try {
|
|
150
|
+
const raw = readFileSync(this.file, "utf-8");
|
|
151
|
+
let lines = raw.split("\n").filter((l) => l.trim());
|
|
152
|
+
if (lines.length > MAX_PERSIST_LINES)
|
|
153
|
+
lines = lines.slice(-MAX_PERSIST_LINES);
|
|
154
|
+
let joined = lines.join("\n");
|
|
155
|
+
while (joined.length + 1 > MAX_PERSIST_BYTES && lines.length > 1) {
|
|
156
|
+
lines = lines.slice(-Math.max(1, Math.floor(lines.length / 2)));
|
|
157
|
+
joined = lines.join("\n");
|
|
158
|
+
}
|
|
159
|
+
if (lines.length === 1 && joined.length + 1 > MAX_PERSIST_BYTES) {
|
|
160
|
+
this.opts.logger?.warn?.(`[gate-decision-log] rotate dropped 1 oversized row (${joined.length} bytes)`);
|
|
161
|
+
lines = [];
|
|
162
|
+
joined = "";
|
|
163
|
+
}
|
|
164
|
+
const tmp = `${this.file}.tmp`;
|
|
165
|
+
writeFileSync(tmp, joined.length > 0 ? `${joined}\n` : "", {
|
|
166
|
+
mode: 0o600,
|
|
167
|
+
});
|
|
168
|
+
try {
|
|
169
|
+
renameSync(tmp, this.file);
|
|
170
|
+
}
|
|
171
|
+
catch (renameErr) {
|
|
172
|
+
if (process.platform === "win32" &&
|
|
173
|
+
renameErr.code === "EEXIST") {
|
|
174
|
+
try {
|
|
175
|
+
unlinkSync(this.file);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
/* best-effort */
|
|
179
|
+
}
|
|
180
|
+
renameSync(tmp, this.file);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
throw renameErr;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
this.opts.logger?.warn?.(`[gate-decision-log] rotate failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
loadExisting() {
|
|
192
|
+
let size;
|
|
193
|
+
try {
|
|
194
|
+
size = statSync(this.file).size;
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
this.lastReadOffset = 0;
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
let raw;
|
|
201
|
+
try {
|
|
202
|
+
raw = readFileSync(this.file, "utf-8");
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
this.opts.logger?.warn?.(`[gate-decision-log] read failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
this.consumeRawJsonl(raw);
|
|
209
|
+
this.lastReadOffset = size;
|
|
210
|
+
if (this.records.length > this.memoryCap) {
|
|
211
|
+
this.records.splice(0, this.records.length - this.memoryCap);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/** Read rows appended since `lastReadOffset` and merge them (ADR-0007). */
|
|
215
|
+
tailDisk() {
|
|
216
|
+
let size;
|
|
217
|
+
try {
|
|
218
|
+
size = statSync(this.file).size;
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (size === this.lastReadOffset)
|
|
224
|
+
return;
|
|
225
|
+
if (size < this.lastReadOffset) {
|
|
226
|
+
// Rotated/truncated by a sibling — full reload.
|
|
227
|
+
this.records.length = 0;
|
|
228
|
+
this.lastReadOffset = 0;
|
|
229
|
+
this.loadExisting();
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
let buf;
|
|
233
|
+
try {
|
|
234
|
+
const fd = openSync(this.file, "r");
|
|
235
|
+
try {
|
|
236
|
+
const len = size - this.lastReadOffset;
|
|
237
|
+
buf = Buffer.alloc(len);
|
|
238
|
+
readSync(fd, buf, 0, len, this.lastReadOffset);
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
closeSync(fd);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch (err) {
|
|
245
|
+
this.opts.logger?.warn?.(`[gate-decision-log] tail read failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
this.consumeRawJsonl(buf.toString("utf-8"));
|
|
249
|
+
this.lastReadOffset = size;
|
|
250
|
+
if (this.records.length > this.memoryCap) {
|
|
251
|
+
this.records.splice(0, this.records.length - this.memoryCap);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
consumeRawJsonl(raw) {
|
|
255
|
+
for (const line of raw.split("\n")) {
|
|
256
|
+
if (!line)
|
|
257
|
+
continue;
|
|
258
|
+
try {
|
|
259
|
+
const parsed = JSON.parse(line);
|
|
260
|
+
if (typeof parsed.seq !== "number" ||
|
|
261
|
+
typeof parsed.workerId !== "string" ||
|
|
262
|
+
typeof parsed.toolName !== "string" ||
|
|
263
|
+
(parsed.action !== "allow" && parsed.action !== "gate")) {
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
this.records.push(parsed);
|
|
267
|
+
if (parsed.seq > this.seq)
|
|
268
|
+
this.seq = parsed.seq;
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
// skip malformed row
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Render one `GateDecisionRecord` as plain-English prose — the "explain this
|
|
278
|
+
* decision" formatter behind `patchwork gate explain`. Every field it prints
|
|
279
|
+
* is already on the record (no new data, no gate-logic change); this exists
|
|
280
|
+
* because today the only way to read a decision is to know the JSONL schema
|
|
281
|
+
* and grep the file by hand.
|
|
282
|
+
*/
|
|
283
|
+
export function formatGateDecision(rec) {
|
|
284
|
+
const when = new Date(rec.decidedAt).toISOString();
|
|
285
|
+
const verb = rec.action === "allow" ? "ALLOWED" : "GATED (asked for approval)";
|
|
286
|
+
const lines = [
|
|
287
|
+
`${when} — ${rec.workerId} → ${rec.toolName} (${rec.classKey})`,
|
|
288
|
+
` Result: ${verb}`,
|
|
289
|
+
` Owned by this worker: ${rec.owned ? "yes" : "no"}`,
|
|
290
|
+
` Earned trust level: L${rec.earnedLevel} (autonomy ceiling L${rec.autonomyCeiling})`,
|
|
291
|
+
];
|
|
292
|
+
if (rec.contextCeiling !== undefined) {
|
|
293
|
+
const score = rec.contextRiskScore !== undefined
|
|
294
|
+
? ` (risk score ${rec.contextRiskScore.toFixed(2)})`
|
|
295
|
+
: "";
|
|
296
|
+
lines.push(` Situational risk ceiling: L${rec.contextCeiling}${score}`);
|
|
297
|
+
if (rec.contextRiskReasons?.length) {
|
|
298
|
+
lines.push(` Reasons: ${rec.contextRiskReasons.join(", ")}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
lines.push(` Effective level used for this decision: L${rec.effectiveLevel}`, ` Why: ${rec.reason}`, ` Recipe: ${rec.recipeName} · Policy: ${rec.gatePolicyVersion}`);
|
|
302
|
+
return lines.join("\n");
|
|
303
|
+
}
|
|
304
|
+
/** Render a most-recent-first list of decisions (e.g. `query()`'s output) as
|
|
305
|
+
* a simple chronological history — the same formatter, one entry per record,
|
|
306
|
+
* separated for readability. Empty input renders an empty string; callers
|
|
307
|
+
* print their own "no decisions found" message. */
|
|
308
|
+
export function formatGateDecisionHistory(recs) {
|
|
309
|
+
return recs.map(formatGateDecision).join("\n\n");
|
|
310
|
+
}
|
|
311
|
+
/** Fields compared by `diffGateDecisions`/`formatGateDecisionDiff`, in the
|
|
312
|
+
* order they're reported. `contextCeiling` renders "—" when absent so an
|
|
313
|
+
* appear/disappear transition still shows a readable from/to pair rather
|
|
314
|
+
* than "undefined". */
|
|
315
|
+
const DIFF_FIELDS = [
|
|
316
|
+
{ field: "action", read: (r) => r.action },
|
|
317
|
+
{ field: "owned", read: (r) => String(r.owned) },
|
|
318
|
+
{ field: "earnedLevel", read: (r) => `L${r.earnedLevel}` },
|
|
319
|
+
{ field: "autonomyCeiling", read: (r) => `L${r.autonomyCeiling}` },
|
|
320
|
+
{
|
|
321
|
+
field: "contextCeiling",
|
|
322
|
+
read: (r) => r.contextCeiling !== undefined ? `L${r.contextCeiling}` : "—",
|
|
323
|
+
},
|
|
324
|
+
{ field: "effectiveLevel", read: (r) => `L${r.effectiveLevel}` },
|
|
325
|
+
{ field: "reason", read: (r) => r.reason },
|
|
326
|
+
];
|
|
327
|
+
/**
|
|
328
|
+
* Compare two decisions on the same worker × action-class and report what
|
|
329
|
+
* changed — Tier 2 of the "explain trust movement" legibility layer. Pure
|
|
330
|
+
* over two already-persisted records; no new gate logic, no I/O.
|
|
331
|
+
*
|
|
332
|
+
* Field order is oldest→newest-agnostic: callers pass whichever record they
|
|
333
|
+
* consider "newer"/"older" (typically `query()`'s [0] and [1], since it
|
|
334
|
+
* sorts most-recent-first); the diff reports `from` (older) → `to` (newer).
|
|
335
|
+
*/
|
|
336
|
+
export function diffGateDecisions(newer, older) {
|
|
337
|
+
const diffs = [];
|
|
338
|
+
for (const { field, read } of DIFF_FIELDS) {
|
|
339
|
+
const from = read(older);
|
|
340
|
+
const to = read(newer);
|
|
341
|
+
if (from !== to)
|
|
342
|
+
diffs.push({ field, from, to });
|
|
343
|
+
}
|
|
344
|
+
return diffs;
|
|
345
|
+
}
|
|
346
|
+
/** Render `diffGateDecisions`' output as prose: a header identifying both
|
|
347
|
+
* decisions being compared, then one line per changed field, or an explicit
|
|
348
|
+
* "no change" line when nothing differs (e.g. two identical gates in a row —
|
|
349
|
+
* itself a meaningful, if unexciting, answer). */
|
|
350
|
+
export function formatGateDecisionDiff(newer, older) {
|
|
351
|
+
const fmtWhen = (r) => new Date(r.decidedAt).toISOString();
|
|
352
|
+
const header = `Comparing decision seq ${older.seq} (${fmtWhen(older)}) → ` +
|
|
353
|
+
`seq ${newer.seq} (${fmtWhen(newer)}) for ${newer.workerId} on ${newer.classKey}`;
|
|
354
|
+
const diffs = diffGateDecisions(newer, older);
|
|
355
|
+
if (diffs.length === 0) {
|
|
356
|
+
return `${header}\n No change — identical decision.`;
|
|
357
|
+
}
|
|
358
|
+
const lines = diffs.map((d) => ` ${d.field}: ${d.from} → ${d.to}`);
|
|
359
|
+
return [header, ...lines].join("\n");
|
|
360
|
+
}
|
|
361
|
+
//# sourceMappingURL=workerGateDecisionLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workerGateDecisionLog.js","sourceRoot":"","sources":["../src/workerGateDecisionLog.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type RiskTier } from "../riskTier.js";
|
|
2
|
+
/**
|
|
3
|
+
* Worker trust is scoped per (worker × action-class), never globally. An
|
|
4
|
+
* action-class is the unit that accumulates evidence. It is intentionally
|
|
5
|
+
* COARSE enough to graduate (a worker touches only a handful) yet keyed on
|
|
6
|
+
* blast-tier so that a rarer, higher-blast action in the same domain is a
|
|
7
|
+
* DISTINCT, less-trusted class — competence on routine `git status` can never
|
|
8
|
+
* transfer to `git push --force`. (worker-ramp-v0)
|
|
9
|
+
*/
|
|
10
|
+
export type Reversibility = "reversible" | "compensable" | "irreversible";
|
|
11
|
+
export interface ActionClass {
|
|
12
|
+
/** Stable identity: `${domain}:${reversibility}:${blastTier}`. */
|
|
13
|
+
key: string;
|
|
14
|
+
domain: string;
|
|
15
|
+
reversibility: Reversibility;
|
|
16
|
+
blastTier: RiskTier;
|
|
17
|
+
/**
|
|
18
|
+
* Brand/reputational exposure — a DISTINCT gating dimension from safety blast
|
|
19
|
+
* radius (cf. Arts & Media: low safety risk, high reputational risk). An
|
|
20
|
+
* externally-visible action (outbound message, public PR/push, issue) whose
|
|
21
|
+
* failure damages reputation rather than (or as well as) systems. Folds into
|
|
22
|
+
* the failure weight so reputational mistakes demote trust harder.
|
|
23
|
+
*/
|
|
24
|
+
brandExposed: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The tool names this module can classify (MCP names + recipe-tool ids). Exposed
|
|
28
|
+
* so the worker-agent sandbox can enumerate every risky tool to consider
|
|
29
|
+
* blocking. NOT exhaustive of the whole MCP surface — any unknown tool classifies
|
|
30
|
+
* as `other:irreversible` and is gated at the per-step gate regardless.
|
|
31
|
+
*/
|
|
32
|
+
export declare function knownActionTools(): string[];
|
|
33
|
+
export declare function classifyActionClass(toolName: string, _params?: Record<string, unknown>): ActionClass;
|
|
34
|
+
export declare function outcomeWeight(actionClass: ActionClass, good: boolean): number;
|
|
35
|
+
/** Which ramp rungs are reachable for a class. Irreversible classes skip the
|
|
36
|
+
* safety-net rungs L2/L3 (no compensating action exists), so they must clear a
|
|
37
|
+
* higher bar to reach L4. */
|
|
38
|
+
export declare function reachableLevels(actionClass: ActionClass): number[];
|