patchwork-os 0.2.0-beta.9.canary.92 → 1.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.bridge.md +15 -16
- package/README.md +46 -458
- package/dist/activationMetrics.js +2 -3
- package/dist/activationMetrics.js.map +1 -1
- package/dist/activityLog.d.ts +1 -0
- package/dist/activityLog.js +8 -3
- package/dist/activityLog.js.map +1 -1
- package/dist/adapters/gemini.js +2 -2
- package/dist/adapters/gemini.js.map +1 -1
- package/dist/adapters/grok.js +6 -1
- package/dist/adapters/grok.js.map +1 -1
- package/dist/adapters/openai.js +4 -0
- package/dist/adapters/openai.js.map +1 -1
- package/dist/approvalHttp.d.ts +9 -0
- package/dist/approvalHttp.js +210 -171
- package/dist/approvalHttp.js.map +1 -1
- package/dist/approvalKpi.d.ts +102 -0
- package/dist/approvalKpi.js +282 -0
- package/dist/approvalKpi.js.map +1 -0
- package/dist/approvalQueue.d.ts +1 -1
- package/dist/approvalQueue.js.map +1 -1
- package/dist/automation.d.ts +45 -4
- package/dist/automation.js +123 -15
- package/dist/automation.js.map +1 -1
- package/dist/bridge.d.ts +10 -0
- package/dist/bridge.js +225 -46
- package/dist/bridge.js.map +1 -1
- package/dist/bridgeLockDiscovery.d.ts +16 -1
- package/dist/bridgeLockDiscovery.js +38 -4
- package/dist/bridgeLockDiscovery.js.map +1 -1
- package/dist/bridgeToolsRules.js +3 -18
- package/dist/bridgeToolsRules.js.map +1 -1
- package/dist/claudeAuthHttp.d.ts +25 -0
- package/dist/claudeAuthHttp.js +219 -0
- package/dist/claudeAuthHttp.js.map +1 -0
- package/dist/claudeDriver.js +4 -1
- package/dist/claudeDriver.js.map +1 -1
- package/dist/claudeOrchestrator.d.ts +15 -0
- package/dist/claudeOrchestrator.js +44 -0
- package/dist/claudeOrchestrator.js.map +1 -1
- package/dist/commands/connect.d.ts +47 -0
- package/dist/commands/connect.js +419 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/install.js +3 -10
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/launchd.d.ts +7 -0
- package/dist/commands/launchd.js +20 -2
- package/dist/commands/launchd.js.map +1 -1
- package/dist/commands/patchworkInit.d.ts +7 -0
- package/dist/commands/patchworkInit.js +26 -0
- package/dist/commands/patchworkInit.js.map +1 -1
- package/dist/commands/recipe.d.ts +59 -4
- package/dist/commands/recipe.js +206 -5
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipeInstall.d.ts +9 -0
- package/dist/commands/recipeInstall.js +56 -3
- package/dist/commands/recipeInstall.js.map +1 -1
- package/dist/commands/task.d.ts +25 -0
- package/dist/commands/task.js +61 -41
- package/dist/commands/task.js.map +1 -1
- package/dist/commands/tokenEfficiency.d.ts +4 -0
- package/dist/commands/tokenEfficiency.js +23 -26
- package/dist/commands/tokenEfficiency.js.map +1 -1
- package/dist/commands/tracesExport.d.ts +15 -1
- package/dist/commands/tracesExport.js +39 -5
- package/dist/commands/tracesExport.js.map +1 -1
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -1
- package/dist/connectorRoutes.js +613 -62
- package/dist/connectorRoutes.js.map +1 -1
- package/dist/connectors/asana.js +9 -3
- package/dist/connectors/asana.js.map +1 -1
- package/dist/connectors/baseConnector.d.ts +16 -0
- package/dist/connectors/baseConnector.js +2 -0
- package/dist/connectors/baseConnector.js.map +1 -1
- package/dist/connectors/caldiy.js +34 -0
- package/dist/connectors/caldiy.js.map +1 -1
- package/dist/connectors/confluence.js +9 -2
- package/dist/connectors/confluence.js.map +1 -1
- package/dist/connectors/connectorActivity.d.ts +24 -0
- package/dist/connectors/connectorActivity.js +32 -0
- package/dist/connectors/connectorActivity.js.map +1 -0
- package/dist/connectors/connectorRedirectUri.js +22 -2
- package/dist/connectors/connectorRedirectUri.js.map +1 -1
- package/dist/connectors/connectorRegistry.d.ts +0 -3
- package/dist/connectors/connectorRegistry.js +8 -8
- package/dist/connectors/connectorRegistry.js.map +1 -1
- package/dist/connectors/datadog.js +8 -1
- package/dist/connectors/datadog.js.map +1 -1
- package/dist/connectors/discord.js +4 -3
- package/dist/connectors/discord.js.map +1 -1
- package/dist/connectors/elasticsearch.js +22 -0
- package/dist/connectors/elasticsearch.js.map +1 -1
- package/dist/connectors/github.d.ts +38 -0
- package/dist/connectors/github.js +91 -5
- package/dist/connectors/github.js.map +1 -1
- package/dist/connectors/gitlab.js +19 -16
- package/dist/connectors/gitlab.js.map +1 -1
- package/dist/connectors/gmail.d.ts +5 -0
- package/dist/connectors/gmail.js +53 -11
- package/dist/connectors/gmail.js.map +1 -1
- package/dist/connectors/googleCalendar.js +5 -4
- package/dist/connectors/googleCalendar.js.map +1 -1
- package/dist/connectors/googleDocs.js +7 -6
- package/dist/connectors/googleDocs.js.map +1 -1
- package/dist/connectors/googleDrive.js +15 -8
- package/dist/connectors/googleDrive.js.map +1 -1
- package/dist/connectors/grafana.js +39 -3
- package/dist/connectors/grafana.js.map +1 -1
- package/dist/connectors/jira.d.ts +1 -1
- package/dist/connectors/jira.js +19 -4
- package/dist/connectors/jira.js.map +1 -1
- package/dist/connectors/linear.js +2 -2
- package/dist/connectors/linear.js.map +1 -1
- package/dist/connectors/mcpClient.d.ts +29 -1
- package/dist/connectors/mcpClient.js +114 -44
- package/dist/connectors/mcpClient.js.map +1 -1
- package/dist/connectors/mcpOAuth.d.ts +1 -0
- package/dist/connectors/mcpOAuth.js +49 -4
- package/dist/connectors/mcpOAuth.js.map +1 -1
- package/dist/connectors/monday.js +5 -4
- package/dist/connectors/monday.js.map +1 -1
- package/dist/connectors/mongodb.js +32 -5
- package/dist/connectors/mongodb.js.map +1 -1
- package/dist/connectors/notion.d.ts +1 -1
- package/dist/connectors/notion.js +22 -6
- package/dist/connectors/notion.js.map +1 -1
- package/dist/connectors/oauthError.d.ts +17 -0
- package/dist/connectors/oauthError.js +50 -0
- package/dist/connectors/oauthError.js.map +1 -0
- package/dist/connectors/postgres.d.ts +7 -0
- package/dist/connectors/postgres.js +32 -2
- package/dist/connectors/postgres.js.map +1 -1
- package/dist/connectors/posthog.js +26 -0
- package/dist/connectors/posthog.js.map +1 -1
- package/dist/connectors/redis.d.ts +1 -0
- package/dist/connectors/redis.js +47 -20
- package/dist/connectors/redis.js.map +1 -1
- package/dist/connectors/salesforce.js +66 -5
- package/dist/connectors/salesforce.js.map +1 -1
- package/dist/connectors/sentry.js +2 -2
- package/dist/connectors/sentry.js.map +1 -1
- package/dist/connectors/slack.js +37 -14
- package/dist/connectors/slack.js.map +1 -1
- package/dist/connectors/snowflake.js +24 -0
- package/dist/connectors/snowflake.js.map +1 -1
- package/dist/connectors/stripe.js +9 -2
- package/dist/connectors/stripe.js.map +1 -1
- package/dist/connectors/supabase.js +34 -0
- package/dist/connectors/supabase.js.map +1 -1
- package/dist/connectors/tokenStorage.d.ts +20 -0
- package/dist/connectors/tokenStorage.js +196 -64
- package/dist/connectors/tokenStorage.js.map +1 -1
- package/dist/connectors/woocommerce.js +34 -0
- package/dist/connectors/woocommerce.js.map +1 -1
- package/dist/copilot/parseIntent.d.ts +58 -0
- package/dist/copilot/parseIntent.js +149 -0
- package/dist/copilot/parseIntent.js.map +1 -0
- package/dist/decisionReplay.d.ts +8 -6
- package/dist/decisionReplay.js +35 -11
- package/dist/decisionReplay.js.map +1 -1
- package/dist/decisionTraceLog.d.ts +9 -0
- package/dist/decisionTraceLog.js +6 -0
- package/dist/decisionTraceLog.js.map +1 -1
- package/dist/drivers/claude/api.js +49 -7
- package/dist/drivers/claude/api.js.map +1 -1
- package/dist/drivers/claude/envSanitizer.d.ts +9 -1
- package/dist/drivers/claude/envSanitizer.js +41 -3
- package/dist/drivers/claude/envSanitizer.js.map +1 -1
- package/dist/drivers/claude/streamParser.d.ts +13 -0
- package/dist/drivers/claude/streamParser.js.map +1 -1
- package/dist/drivers/claude/subprocess.js +131 -16
- package/dist/drivers/claude/subprocess.js.map +1 -1
- package/dist/drivers/claude/subprocessSettings.d.ts +1 -1
- package/dist/drivers/claude/subprocessSettings.js +18 -4
- package/dist/drivers/claude/subprocessSettings.js.map +1 -1
- package/dist/drivers/gemini/index.d.ts +13 -0
- package/dist/drivers/gemini/index.js +211 -67
- package/dist/drivers/gemini/index.js.map +1 -1
- package/dist/drivers/local/index.d.ts +2 -17
- package/dist/drivers/local/index.js +5 -92
- package/dist/drivers/local/index.js.map +1 -1
- package/dist/drivers/openai/index.js +69 -9
- package/dist/drivers/openai/index.js.map +1 -1
- package/dist/drivers/outputCap.d.ts +27 -0
- package/dist/drivers/outputCap.js +50 -0
- package/dist/drivers/outputCap.js.map +1 -0
- package/dist/embeddings/cosine.d.ts +23 -0
- package/dist/embeddings/cosine.js +59 -0
- package/dist/embeddings/cosine.js.map +1 -0
- package/dist/embeddings/index.d.ts +19 -0
- package/dist/embeddings/index.js +35 -0
- package/dist/embeddings/index.js.map +1 -0
- package/dist/embeddings/localEmbeddings.d.ts +29 -0
- package/dist/embeddings/localEmbeddings.js +103 -0
- package/dist/embeddings/localEmbeddings.js.map +1 -0
- package/dist/embeddings/localEndpoints.d.ts +24 -0
- package/dist/embeddings/localEndpoints.js +37 -0
- package/dist/embeddings/localEndpoints.js.map +1 -0
- package/dist/embeddings/types.d.ts +32 -0
- package/dist/embeddings/types.js +12 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/featureFlags.d.ts +18 -0
- package/dist/featureFlags.js +32 -0
- package/dist/featureFlags.js.map +1 -1
- package/dist/fp/automationInterpreter.js +118 -39
- package/dist/fp/automationInterpreter.js.map +1 -1
- package/dist/fp/automationProgram.d.ts +10 -0
- package/dist/fp/automationProgram.js.map +1 -1
- package/dist/fp/automationState.d.ts +6 -0
- package/dist/fp/automationState.js +38 -0
- package/dist/fp/automationState.js.map +1 -1
- package/dist/fp/commandDescription.d.ts +6 -0
- package/dist/fp/commandDescription.js +18 -5
- package/dist/fp/commandDescription.js.map +1 -1
- package/dist/fp/interpreterContext.d.ts +16 -5
- package/dist/fp/interpreterContext.js +59 -3
- package/dist/fp/interpreterContext.js.map +1 -1
- package/dist/fp/policyParser.js +18 -8
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/haltPushDispatch.d.ts +4 -0
- package/dist/haltPushDispatch.js +7 -22
- package/dist/haltPushDispatch.js.map +1 -1
- package/dist/inboxRoutes.js +2 -2
- package/dist/inboxRoutes.js.map +1 -1
- package/dist/index.js +672 -135
- package/dist/index.js.map +1 -1
- package/dist/installGuard.js +6 -0
- package/dist/installGuard.js.map +1 -1
- package/dist/localEndpointGuard.d.ts +25 -0
- package/dist/localEndpointGuard.js +101 -0
- package/dist/localEndpointGuard.js.map +1 -0
- package/dist/mcpRoutes.js +1 -1
- package/dist/mcpRoutes.js.map +1 -1
- package/dist/oauth.d.ts +13 -0
- package/dist/oauth.js +53 -9
- package/dist/oauth.js.map +1 -1
- package/dist/orchestrator/childBridgeClient.d.ts +7 -0
- package/dist/orchestrator/childBridgeClient.js +42 -1
- package/dist/orchestrator/childBridgeClient.js.map +1 -1
- package/dist/orchestrator/orchestratorBridge.d.ts +33 -0
- package/dist/orchestrator/orchestratorBridge.js +75 -9
- package/dist/orchestrator/orchestratorBridge.js.map +1 -1
- package/dist/patchworkConfig.d.ts +4 -0
- package/dist/patchworkConfig.js +33 -4
- package/dist/patchworkConfig.js.map +1 -1
- package/dist/probe.js +39 -5
- package/dist/probe.js.map +1 -1
- package/dist/recipeOrchestration.d.ts +59 -0
- package/dist/recipeOrchestration.js +314 -60
- package/dist/recipeOrchestration.js.map +1 -1
- package/dist/recipeRoutes.d.ts +93 -0
- package/dist/recipeRoutes.js +664 -27
- package/dist/recipeRoutes.js.map +1 -1
- package/dist/recipes/RecipeOrchestrator.d.ts +14 -0
- package/dist/recipes/RecipeOrchestrator.js +42 -2
- package/dist/recipes/RecipeOrchestrator.js.map +1 -1
- package/dist/recipes/agentExecutor.d.ts +51 -2
- package/dist/recipes/agentExecutor.js +86 -13
- package/dist/recipes/agentExecutor.js.map +1 -1
- package/dist/recipes/chainedRunner.d.ts +111 -3
- package/dist/recipes/chainedRunner.js +440 -45
- package/dist/recipes/chainedRunner.js.map +1 -1
- package/dist/recipes/compiler.js +42 -29
- package/dist/recipes/compiler.js.map +1 -1
- package/dist/recipes/connectorPreflight.js +31 -0
- package/dist/recipes/connectorPreflight.js.map +1 -1
- package/dist/recipes/dependencyGraph.d.ts +16 -0
- package/dist/recipes/dependencyGraph.js +37 -2
- package/dist/recipes/dependencyGraph.js.map +1 -1
- package/dist/recipes/eventTriggerPrograms.d.ts +36 -0
- package/dist/recipes/eventTriggerPrograms.js +158 -0
- package/dist/recipes/eventTriggerPrograms.js.map +1 -0
- package/dist/recipes/githubInstallSource.d.ts +9 -2
- package/dist/recipes/githubInstallSource.js +36 -6
- package/dist/recipes/githubInstallSource.js.map +1 -1
- package/dist/recipes/haltCategory.d.ts +10 -0
- package/dist/recipes/haltCategory.js +11 -1
- package/dist/recipes/haltCategory.js.map +1 -1
- package/dist/recipes/idempotencyKey.d.ts +30 -3
- package/dist/recipes/idempotencyKey.js +89 -5
- package/dist/recipes/idempotencyKey.js.map +1 -1
- package/dist/recipes/installer.js +12 -35
- package/dist/recipes/installer.js.map +1 -1
- package/dist/recipes/judgeVerdict.d.ts +11 -1
- package/dist/recipes/judgeVerdict.js +47 -7
- package/dist/recipes/judgeVerdict.js.map +1 -1
- package/dist/recipes/names.d.ts +5 -0
- package/dist/recipes/names.js +10 -5
- package/dist/recipes/names.js.map +1 -1
- package/dist/recipes/parser.js +74 -10
- package/dist/recipes/parser.js.map +1 -1
- package/dist/recipes/pricing/costRouter.d.ts +43 -0
- package/dist/recipes/pricing/costRouter.js +44 -0
- package/dist/recipes/pricing/costRouter.js.map +1 -0
- package/dist/recipes/pricing/priceTable.d.ts +76 -0
- package/dist/recipes/pricing/priceTable.js +144 -0
- package/dist/recipes/pricing/priceTable.js.map +1 -0
- package/dist/recipes/replayRun.js +5 -2
- package/dist/recipes/replayRun.js.map +1 -1
- package/dist/recipes/resolveRecipePath.js +15 -1
- package/dist/recipes/resolveRecipePath.js.map +1 -1
- package/dist/recipes/runBudget.d.ts +93 -32
- package/dist/recipes/runBudget.js +213 -49
- package/dist/recipes/runBudget.js.map +1 -1
- package/dist/recipes/runRegistry.d.ts +32 -0
- package/dist/recipes/runRegistry.js +54 -0
- package/dist/recipes/runRegistry.js.map +1 -0
- package/dist/recipes/scheduler.js +6 -2
- package/dist/recipes/scheduler.js.map +1 -1
- package/dist/recipes/schema.d.ts +59 -6
- package/dist/recipes/schemaGenerator.d.ts +9 -0
- package/dist/recipes/schemaGenerator.js +446 -77
- package/dist/recipes/schemaGenerator.js.map +1 -1
- package/dist/recipes/simulation/aggregateRunRisk.d.ts +46 -0
- package/dist/recipes/simulation/aggregateRunRisk.js +120 -0
- package/dist/recipes/simulation/aggregateRunRisk.js.map +1 -0
- package/dist/recipes/simulation/costProjector.d.ts +32 -0
- package/dist/recipes/simulation/costProjector.js +194 -0
- package/dist/recipes/simulation/costProjector.js.map +1 -0
- package/dist/recipes/simulation/sideEffects.d.ts +32 -0
- package/dist/recipes/simulation/sideEffects.js +62 -0
- package/dist/recipes/simulation/sideEffects.js.map +1 -0
- package/dist/recipes/simulation/simulate.d.ts +36 -0
- package/dist/recipes/simulation/simulate.js +264 -0
- package/dist/recipes/simulation/simulate.js.map +1 -0
- package/dist/recipes/simulation/simulateMockedRun.d.ts +52 -0
- package/dist/recipes/simulation/simulateMockedRun.js +84 -0
- package/dist/recipes/simulation/simulateMockedRun.js.map +1 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.d.ts +31 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.js +50 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.js.map +1 -0
- package/dist/recipes/simulation/types.d.ts +198 -0
- package/dist/recipes/simulation/types.js +30 -0
- package/dist/recipes/simulation/types.js.map +1 -0
- package/dist/recipes/stepObservation.d.ts +12 -0
- package/dist/recipes/stepObservation.js +21 -1
- package/dist/recipes/stepObservation.js.map +1 -1
- package/dist/recipes/toolRegistry.js +61 -24
- package/dist/recipes/toolRegistry.js.map +1 -1
- package/dist/recipes/tools/airtable.d.ts +15 -0
- package/dist/recipes/tools/airtable.js +240 -0
- package/dist/recipes/tools/airtable.js.map +1 -0
- package/dist/recipes/tools/caldiy.d.ts +13 -0
- package/dist/recipes/tools/caldiy.js +215 -0
- package/dist/recipes/tools/caldiy.js.map +1 -0
- package/dist/recipes/tools/circleci.d.ts +10 -0
- package/dist/recipes/tools/circleci.js +204 -0
- package/dist/recipes/tools/circleci.js.map +1 -0
- package/dist/recipes/tools/cloudflare.d.ts +13 -0
- package/dist/recipes/tools/cloudflare.js +211 -0
- package/dist/recipes/tools/cloudflare.js.map +1 -0
- package/dist/recipes/tools/confluence.js +11 -10
- package/dist/recipes/tools/confluence.js.map +1 -1
- package/dist/recipes/tools/datadog.js +13 -12
- package/dist/recipes/tools/datadog.js.map +1 -1
- package/dist/recipes/tools/docs.d.ts +18 -0
- package/dist/recipes/tools/docs.js +95 -0
- package/dist/recipes/tools/docs.js.map +1 -0
- package/dist/recipes/tools/elasticsearch.d.ts +11 -0
- package/dist/recipes/tools/elasticsearch.js +157 -0
- package/dist/recipes/tools/elasticsearch.js.map +1 -0
- package/dist/recipes/tools/fanOut.js +4 -4
- package/dist/recipes/tools/fanOut.js.map +1 -1
- package/dist/recipes/tools/figma.d.ts +12 -0
- package/dist/recipes/tools/figma.js +195 -0
- package/dist/recipes/tools/figma.js.map +1 -0
- package/dist/recipes/tools/file.js +43 -22
- package/dist/recipes/tools/file.js.map +1 -1
- package/dist/recipes/tools/github.js +162 -5
- package/dist/recipes/tools/github.js.map +1 -1
- package/dist/recipes/tools/gmail.js +45 -33
- package/dist/recipes/tools/gmail.js.map +1 -1
- package/dist/recipes/tools/grafana.d.ts +11 -0
- package/dist/recipes/tools/grafana.js +216 -0
- package/dist/recipes/tools/grafana.js.map +1 -0
- package/dist/recipes/tools/http.d.ts +1 -1
- package/dist/recipes/tools/http.js +10 -28
- package/dist/recipes/tools/http.js.map +1 -1
- package/dist/recipes/tools/hubspot.js +13 -12
- package/dist/recipes/tools/hubspot.js.map +1 -1
- package/dist/recipes/tools/index.d.ts +28 -0
- package/dist/recipes/tools/index.js +28 -0
- package/dist/recipes/tools/index.js.map +1 -1
- package/dist/recipes/tools/intercom.js +11 -10
- package/dist/recipes/tools/intercom.js.map +1 -1
- package/dist/recipes/tools/jira.js +13 -0
- package/dist/recipes/tools/jira.js.map +1 -1
- package/dist/recipes/tools/meetingNotes.js +2 -2
- package/dist/recipes/tools/monday.d.ts +22 -0
- package/dist/recipes/tools/monday.js +242 -0
- package/dist/recipes/tools/monday.js.map +1 -0
- package/dist/recipes/tools/mongodb.d.ts +19 -0
- package/dist/recipes/tools/mongodb.js +194 -0
- package/dist/recipes/tools/mongodb.js.map +1 -0
- package/dist/recipes/tools/notion.js +11 -10
- package/dist/recipes/tools/notion.js.map +1 -1
- package/dist/recipes/tools/obsidian.d.ts +15 -0
- package/dist/recipes/tools/obsidian.js +173 -0
- package/dist/recipes/tools/obsidian.js.map +1 -0
- package/dist/recipes/tools/outcomes.d.ts +15 -0
- package/dist/recipes/tools/outcomes.js +111 -0
- package/dist/recipes/tools/outcomes.js.map +1 -0
- package/dist/recipes/tools/paystack.d.ts +11 -0
- package/dist/recipes/tools/paystack.js +212 -0
- package/dist/recipes/tools/paystack.js.map +1 -0
- package/dist/recipes/tools/pipedrive.d.ts +16 -0
- package/dist/recipes/tools/pipedrive.js +234 -0
- package/dist/recipes/tools/pipedrive.js.map +1 -0
- package/dist/recipes/tools/postgres.d.ts +15 -0
- package/dist/recipes/tools/postgres.js +186 -0
- package/dist/recipes/tools/postgres.js.map +1 -0
- package/dist/recipes/tools/posthog.d.ts +16 -0
- package/dist/recipes/tools/posthog.js +219 -0
- package/dist/recipes/tools/posthog.js.map +1 -0
- package/dist/recipes/tools/redis.d.ts +9 -0
- package/dist/recipes/tools/redis.js +141 -0
- package/dist/recipes/tools/redis.js.map +1 -0
- package/dist/recipes/tools/resend.d.ts +8 -0
- package/dist/recipes/tools/resend.js +153 -0
- package/dist/recipes/tools/resend.js.map +1 -0
- package/dist/recipes/tools/salesforce.d.ts +16 -0
- package/dist/recipes/tools/salesforce.js +184 -0
- package/dist/recipes/tools/salesforce.js.map +1 -0
- package/dist/recipes/tools/sendgrid.d.ts +9 -0
- package/dist/recipes/tools/sendgrid.js +175 -0
- package/dist/recipes/tools/sendgrid.js.map +1 -0
- package/dist/recipes/tools/shopify.d.ts +16 -0
- package/dist/recipes/tools/shopify.js +266 -0
- package/dist/recipes/tools/shopify.js.map +1 -0
- package/dist/recipes/tools/snowflake.d.ts +16 -0
- package/dist/recipes/tools/snowflake.js +173 -0
- package/dist/recipes/tools/snowflake.js.map +1 -0
- package/dist/recipes/tools/stripe.js +13 -12
- package/dist/recipes/tools/stripe.js.map +1 -1
- package/dist/recipes/tools/supabase.d.ts +9 -0
- package/dist/recipes/tools/supabase.js +133 -0
- package/dist/recipes/tools/supabase.js.map +1 -0
- package/dist/recipes/tools/todoist.d.ts +15 -0
- package/dist/recipes/tools/todoist.js +228 -0
- package/dist/recipes/tools/todoist.js.map +1 -0
- package/dist/recipes/tools/twilio.d.ts +11 -0
- package/dist/recipes/tools/twilio.js +180 -0
- package/dist/recipes/tools/twilio.js.map +1 -0
- package/dist/recipes/tools/vercel.d.ts +9 -0
- package/dist/recipes/tools/vercel.js +146 -0
- package/dist/recipes/tools/vercel.js.map +1 -0
- package/dist/recipes/tools/webflow.d.ts +11 -0
- package/dist/recipes/tools/webflow.js +244 -0
- package/dist/recipes/tools/webflow.js.map +1 -0
- package/dist/recipes/tools/woocommerce.d.ts +18 -0
- package/dist/recipes/tools/woocommerce.js +260 -0
- package/dist/recipes/tools/woocommerce.js.map +1 -0
- package/dist/recipes/tools/wrapConnectorExecute.d.ts +25 -0
- package/dist/recipes/tools/wrapConnectorExecute.js +37 -0
- package/dist/recipes/tools/wrapConnectorExecute.js.map +1 -0
- package/dist/recipes/tools/zendesk.js +11 -10
- package/dist/recipes/tools/zendesk.js.map +1 -1
- package/dist/recipes/triggerVars.d.ts +15 -0
- package/dist/recipes/triggerVars.js +57 -0
- package/dist/recipes/triggerVars.js.map +1 -0
- package/dist/recipes/validation.d.ts +1 -1
- package/dist/recipes/validation.js +536 -12
- package/dist/recipes/validation.js.map +1 -1
- package/dist/recipes/yamlPositions.d.ts +1 -1
- package/dist/recipes/yamlPositions.js +7 -2
- package/dist/recipes/yamlPositions.js.map +1 -1
- package/dist/recipes/yamlRunner.d.ts +216 -4
- package/dist/recipes/yamlRunner.js +1030 -96
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/recipesHttp.d.ts +5 -0
- package/dist/recipesHttp.js +68 -6
- package/dist/recipesHttp.js.map +1 -1
- package/dist/resources.js +14 -1
- package/dist/resources.js.map +1 -1
- package/dist/riskSignals.d.ts +42 -0
- package/dist/riskSignals.js +197 -0
- package/dist/riskSignals.js.map +1 -0
- package/dist/riskTier.d.ts +9 -0
- package/dist/riskTier.js +48 -0
- package/dist/riskTier.js.map +1 -1
- package/dist/runLog.d.ts +53 -0
- package/dist/runLog.js +75 -16
- package/dist/runLog.js.map +1 -1
- package/dist/schemas/recipe.v1.json +360 -16
- package/dist/server.d.ts +60 -0
- package/dist/server.js +192 -31
- package/dist/server.js.map +1 -1
- package/dist/sessionCheckpoint.js +4 -1
- package/dist/sessionCheckpoint.js.map +1 -1
- package/dist/sessionDetail.d.ts +43 -0
- package/dist/sessionDetail.js +59 -0
- package/dist/sessionDetail.js.map +1 -0
- package/dist/settingsEnv.d.ts +47 -0
- package/dist/settingsEnv.js +88 -0
- package/dist/settingsEnv.js.map +1 -0
- package/dist/streamableHttp.js +44 -10
- package/dist/streamableHttp.js.map +1 -1
- package/dist/ta/backtest/abnday.d.ts +53 -0
- package/dist/ta/backtest/abnday.js +123 -0
- package/dist/ta/backtest/abnday.js.map +1 -0
- package/dist/ta/backtest/directional.d.ts +48 -0
- package/dist/ta/backtest/directional.js +103 -0
- package/dist/ta/backtest/directional.js.map +1 -0
- package/dist/ta/backtest/fundx.d.ts +67 -0
- package/dist/ta/backtest/fundx.js +264 -0
- package/dist/ta/backtest/fundx.js.map +1 -0
- package/dist/ta/backtest/fvg.d.ts +62 -0
- package/dist/ta/backtest/fvg.js +236 -0
- package/dist/ta/backtest/fvg.js.map +1 -0
- package/dist/ta/backtest/ichimoku.d.ts +41 -0
- package/dist/ta/backtest/ichimoku.js +146 -0
- package/dist/ta/backtest/ichimoku.js.map +1 -0
- package/dist/ta/backtest/ingest.d.ts +20 -0
- package/dist/ta/backtest/ingest.js +104 -0
- package/dist/ta/backtest/ingest.js.map +1 -0
- package/dist/ta/backtest/msb.d.ts +49 -0
- package/dist/ta/backtest/msb.js +162 -0
- package/dist/ta/backtest/msb.js.map +1 -0
- package/dist/ta/backtest/scoring.d.ts +33 -0
- package/dist/ta/backtest/scoring.js +82 -0
- package/dist/ta/backtest/scoring.js.map +1 -0
- package/dist/ta/backtest/summary.d.ts +20 -0
- package/dist/ta/backtest/summary.js +42 -0
- package/dist/ta/backtest/summary.js.map +1 -0
- package/dist/ta/backtest/tsmom.d.ts +72 -0
- package/dist/ta/backtest/tsmom.js +202 -0
- package/dist/ta/backtest/tsmom.js.map +1 -0
- package/dist/ta/backtest/volsq.d.ts +34 -0
- package/dist/ta/backtest/volsq.js +154 -0
- package/dist/ta/backtest/volsq.js.map +1 -0
- package/dist/ta/backtest/walkForward.d.ts +45 -0
- package/dist/ta/backtest/walkForward.js +136 -0
- package/dist/ta/backtest/walkForward.js.map +1 -0
- package/dist/ta/cycles.d.ts +15 -0
- package/dist/ta/cycles.js +31 -0
- package/dist/ta/cycles.js.map +1 -0
- package/dist/ta/desk/accrualEmitter.d.ts +59 -0
- package/dist/ta/desk/accrualEmitter.js +136 -0
- package/dist/ta/desk/accrualEmitter.js.map +1 -0
- package/dist/ta/desk/cellBacktest.d.ts +179 -0
- package/dist/ta/desk/cellBacktest.js +514 -0
- package/dist/ta/desk/cellBacktest.js.map +1 -0
- package/dist/ta/desk/cells/wpMaRejection.d.ts +49 -0
- package/dist/ta/desk/cells/wpMaRejection.js +141 -0
- package/dist/ta/desk/cells/wpMaRejection.js.map +1 -0
- package/dist/ta/desk/cells/wpVolumeClimax.d.ts +57 -0
- package/dist/ta/desk/cells/wpVolumeClimax.js +193 -0
- package/dist/ta/desk/cells/wpVolumeClimax.js.map +1 -0
- package/dist/ta/desk/collectors.d.ts +18 -0
- package/dist/ta/desk/collectors.js +450 -0
- package/dist/ta/desk/collectors.js.map +1 -0
- package/dist/ta/desk/contract.d.ts +51 -0
- package/dist/ta/desk/contract.js +261 -0
- package/dist/ta/desk/contract.js.map +1 -0
- package/dist/ta/desk/deskLedger.d.ts +36 -0
- package/dist/ta/desk/deskLedger.js +239 -0
- package/dist/ta/desk/deskLedger.js.map +1 -0
- package/dist/ta/desk/liqTape.d.ts +37 -0
- package/dist/ta/desk/liqTape.js +99 -0
- package/dist/ta/desk/liqTape.js.map +1 -0
- package/dist/ta/desk/post.d.ts +20 -0
- package/dist/ta/desk/post.js +65 -0
- package/dist/ta/desk/post.js.map +1 -0
- package/dist/ta/desk/render.d.ts +25 -0
- package/dist/ta/desk/render.js +398 -0
- package/dist/ta/desk/render.js.map +1 -0
- package/dist/ta/desk/surfaces.d.ts +216 -0
- package/dist/ta/desk/surfaces.js +472 -0
- package/dist/ta/desk/surfaces.js.map +1 -0
- package/dist/ta/desk/types.d.ts +174 -0
- package/dist/ta/desk/types.js +104 -0
- package/dist/ta/desk/types.js.map +1 -0
- package/dist/ta/index.d.ts +23 -0
- package/dist/ta/index.js +54 -0
- package/dist/ta/index.js.map +1 -0
- package/dist/ta/ledger.d.ts +44 -0
- package/dist/ta/ledger.js +95 -0
- package/dist/ta/ledger.js.map +1 -0
- package/dist/ta/levels.d.ts +21 -0
- package/dist/ta/levels.js +41 -0
- package/dist/ta/levels.js.map +1 -0
- package/dist/ta/swings.d.ts +30 -0
- package/dist/ta/swings.js +83 -0
- package/dist/ta/swings.js.map +1 -0
- package/dist/ta/types.d.ts +81 -0
- package/dist/ta/types.js +20 -0
- package/dist/ta/types.js.map +1 -0
- package/dist/telemetry.js +20 -9
- package/dist/telemetry.js.map +1 -1
- package/dist/tokenUsageTracker.d.ts +2 -1
- package/dist/tokenUsageTracker.js +38 -20
- package/dist/tokenUsageTracker.js.map +1 -1
- package/dist/tools/contextBundle.js +13 -9
- package/dist/tools/contextBundle.js.map +1 -1
- package/dist/tools/ctxGetTaskContext.js +8 -3
- package/dist/tools/ctxGetTaskContext.js.map +1 -1
- package/dist/tools/ctxQueryTraces.d.ts +18 -1
- package/dist/tools/ctxQueryTraces.js +176 -27
- package/dist/tools/ctxQueryTraces.js.map +1 -1
- package/dist/tools/enrichCommit.js +5 -2
- package/dist/tools/enrichCommit.js.map +1 -1
- package/dist/tools/getDependencyTree.js +2 -2
- package/dist/tools/getDependencyTree.js.map +1 -1
- package/dist/tools/getDiagnostics.js +3 -0
- package/dist/tools/getDiagnostics.js.map +1 -1
- package/dist/tools/getDocumentSymbols.js +5 -1
- package/dist/tools/getDocumentSymbols.js.map +1 -1
- package/dist/tools/getGitHotspots.js +12 -1
- package/dist/tools/getGitHotspots.js.map +1 -1
- package/dist/tools/getGitLog.js +5 -2
- package/dist/tools/getGitLog.js.map +1 -1
- package/dist/tools/getGitStatus.js +6 -1
- package/dist/tools/getGitStatus.js.map +1 -1
- package/dist/tools/getProjectContext.js +3 -1
- package/dist/tools/getProjectContext.js.map +1 -1
- package/dist/tools/getToolCapabilities.js +39 -4
- package/dist/tools/getToolCapabilities.js.map +1 -1
- package/dist/tools/gitWrite.js +12 -3
- package/dist/tools/gitWrite.js.map +1 -1
- package/dist/tools/github/composite.d.ts +1 -1
- package/dist/tools/github/composite.js +7 -7
- package/dist/tools/github/composite.js.map +1 -1
- package/dist/tools/github/pr.d.ts +6 -6
- package/dist/tools/github/pr.js +18 -11
- package/dist/tools/github/pr.js.map +1 -1
- package/dist/tools/httpClient.js +55 -3
- package/dist/tools/httpClient.js.map +1 -1
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.js +19 -12
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/lsp.d.ts +6 -0
- package/dist/tools/lsp.js +81 -12
- package/dist/tools/lsp.js.map +1 -1
- package/dist/tools/previewEdit.js +16 -1
- package/dist/tools/previewEdit.js.map +1 -1
- package/dist/tools/resumeClaudeTask.js +17 -0
- package/dist/tools/resumeClaudeTask.js.map +1 -1
- package/dist/tools/searchAndReplace.js +9 -5
- package/dist/tools/searchAndReplace.js.map +1 -1
- package/dist/tools/searchTools.d.ts +26 -0
- package/dist/tools/searchTools.js +42 -2
- package/dist/tools/searchTools.js.map +1 -1
- package/dist/tools/terminal.js +23 -51
- package/dist/tools/terminal.js.map +1 -1
- package/dist/tools/transaction.d.ts +9 -1
- package/dist/tools/transaction.js +59 -4
- package/dist/tools/transaction.js.map +1 -1
- package/dist/tools/utils.d.ts +16 -0
- package/dist/tools/utils.js +77 -7
- package/dist/tools/utils.js.map +1 -1
- package/dist/transport.d.ts +31 -0
- package/dist/transport.js +117 -14
- package/dist/transport.js.map +1 -1
- package/dist/wireHaltPushDispatch.js +12 -0
- package/dist/wireHaltPushDispatch.js.map +1 -1
- package/dist/workerGateDecisionLog.d.ts +141 -0
- package/dist/workerGateDecisionLog.js +361 -0
- package/dist/workerGateDecisionLog.js.map +1 -0
- package/dist/workers/actionClass.d.ts +38 -0
- package/dist/workers/actionClass.js +155 -0
- package/dist/workers/actionClass.js.map +1 -0
- package/dist/workers/backtest.d.ts +68 -0
- package/dist/workers/backtest.js +113 -0
- package/dist/workers/backtest.js.map +1 -0
- package/dist/workers/contextRisk.d.ts +35 -0
- package/dist/workers/contextRisk.js +20 -0
- package/dist/workers/contextRisk.js.map +1 -0
- package/dist/workers/contextRiskScorer.d.ts +48 -0
- package/dist/workers/contextRiskScorer.js +94 -0
- package/dist/workers/contextRiskScorer.js.map +1 -0
- package/dist/workers/graduation.d.ts +61 -0
- package/dist/workers/graduation.js +112 -0
- package/dist/workers/graduation.js.map +1 -0
- package/dist/workers/outcomeStore.d.ts +98 -0
- package/dist/workers/outcomeStore.js +146 -0
- package/dist/workers/outcomeStore.js.map +1 -0
- package/dist/workers/outcomesCli.d.ts +34 -0
- package/dist/workers/outcomesCli.js +91 -0
- package/dist/workers/outcomesCli.js.map +1 -0
- package/dist/workers/runWorkerShadow.d.ts +90 -0
- package/dist/workers/runWorkerShadow.js +323 -0
- package/dist/workers/runWorkerShadow.js.map +1 -0
- package/dist/workers/shadowGate.d.ts +30 -0
- package/dist/workers/shadowGate.js +58 -0
- package/dist/workers/shadowGate.js.map +1 -0
- package/dist/workers/shadowObserver.d.ts +165 -0
- package/dist/workers/shadowObserver.js +203 -0
- package/dist/workers/shadowObserver.js.map +1 -0
- package/dist/workers/shadowReport.d.ts +16 -0
- package/dist/workers/shadowReport.js +61 -0
- package/dist/workers/shadowReport.js.map +1 -0
- package/dist/workers/shadowRun.d.ts +38 -0
- package/dist/workers/shadowRun.js +44 -0
- package/dist/workers/shadowRun.js.map +1 -0
- package/dist/workers/trustLevel.d.ts +82 -0
- package/dist/workers/trustLevel.js +100 -0
- package/dist/workers/trustLevel.js.map +1 -0
- package/dist/workers/worker.d.ts +49 -0
- package/dist/workers/worker.js +88 -0
- package/dist/workers/worker.js.map +1 -0
- package/dist/workers/workerGate.d.ts +101 -0
- package/dist/workers/workerGate.js +210 -0
- package/dist/workers/workerGate.js.map +1 -0
- package/dist/workers/workerLevelStore.d.ts +33 -0
- package/dist/workers/workerLevelStore.js +87 -0
- package/dist/workers/workerLevelStore.js.map +1 -0
- package/dist/workers/workerLoader.d.ts +7 -0
- package/dist/workers/workerLoader.js +31 -0
- package/dist/workers/workerLoader.js.map +1 -0
- package/dist/writeFileAtomic.js +40 -13
- package/dist/writeFileAtomic.js.map +1 -1
- package/package.json +14 -6
- package/scripts/mcp-stdio-shim.cjs +247 -87
- package/templates/CLAUDE.bridge.md +1 -1
- package/templates/recipes/dependency-bump.yaml +33 -0
- package/templates/recipes/incident-to-pr.yaml +187 -0
- package/templates/recipes/outcome-ingester.yaml +53 -0
- package/templates/recipes/release-notes.yaml +30 -0
- package/templates/recipes/triage-failing-tests-autofile.yaml +152 -0
- package/templates/recipes/triage-failing-tests.yaml +38 -0
- package/templates/workers/dependency-upkeep.worker.yaml +26 -0
- package/templates/workers/release-notes.worker.yaml +17 -0
- package/templates/workers/test-guardian.worker.yaml +24 -0
- package/deploy/README.md +0 -172
- package/deploy/bootstrap-new-vps.sh +0 -364
- package/deploy/bootstrap-vps.sh +0 -192
- package/deploy/claude-ide-bridge.service.template +0 -67
- package/deploy/claude-ide-bridge@.service +0 -31
- package/deploy/deploy-dashboard.sh +0 -198
- package/deploy/deploy-landing.sh +0 -136
- package/deploy/ecosystem.config.js.example +0 -36
- package/deploy/install-vps-service.sh +0 -240
- package/deploy/macos/README.md +0 -153
- package/deploy/macos/com.patchwork.bridge.plist.template +0 -54
- package/deploy/macos/com.patchwork.tunnel.plist.template +0 -76
- package/deploy/macos/install-mac-bridge.sh +0 -244
- package/deploy/macos/uninstall-mac-bridge.sh +0 -22
- package/deploy/nginx-claude-bridge.conf.template +0 -129
|
@@ -1,40 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
|
|
1
|
+
import { mkdirSync, readFileSync } from "node:fs";
|
|
3
2
|
import path from "node:path";
|
|
4
3
|
import { parse as parseYaml } from "yaml";
|
|
4
|
+
import { writeFileAtomicSync } from "../writeFileAtomic.js";
|
|
5
5
|
import { compileRecipeFull } from "./compiler.js";
|
|
6
6
|
import { parseRecipe } from "./parser.js";
|
|
7
|
-
/**
|
|
8
|
-
* Atomic temp+rename for the default install write. Audit 2026-05-17:
|
|
9
|
-
* two concurrent installs of the same recipe (cross-process, e.g.
|
|
10
|
-
* dashboard + CLI racing) used to interleave bytes within the JSON
|
|
11
|
-
* payload because the previous `writeFileSync(destPath, ...)` is not
|
|
12
|
-
* atomic for sub-page writes. A torn JSON file fails to parse and the
|
|
13
|
-
* recipe becomes invisible to the scheduler.
|
|
14
|
-
*
|
|
15
|
-
* `rename` is atomic at the FS layer on every platform we ship on
|
|
16
|
-
* (apfs / ext4 / ntfs / xfs). With temp+rename, two concurrent writers
|
|
17
|
-
* each end up with their own intact file → last `rename` wins, but
|
|
18
|
-
* the file on disk is ALWAYS a valid JSON document.
|
|
19
|
-
*/
|
|
20
|
-
function atomicWriteSync(target, content) {
|
|
21
|
-
const tmp = `${target}.tmp.${process.pid}.${crypto
|
|
22
|
-
.randomBytes(6)
|
|
23
|
-
.toString("hex")}`;
|
|
24
|
-
try {
|
|
25
|
-
writeFileSync(tmp, content);
|
|
26
|
-
renameSync(tmp, target);
|
|
27
|
-
}
|
|
28
|
-
catch (err) {
|
|
29
|
-
try {
|
|
30
|
-
unlinkSync(tmp);
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
/* already gone or never created */
|
|
34
|
-
}
|
|
35
|
-
throw err;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
7
|
export function installRecipeFromFile(sourcePath, opts) {
|
|
39
8
|
const ext = path.extname(sourcePath).toLowerCase();
|
|
40
9
|
if (ext !== ".json" && ext !== ".yaml" && ext !== ".yml") {
|
|
@@ -45,7 +14,8 @@ export function installRecipeFromFile(sourcePath, opts) {
|
|
|
45
14
|
// Default writer is atomic (temp+rename). Callers may inject their
|
|
46
15
|
// own writeFile (tests, in-memory fs); they are responsible for
|
|
47
16
|
// their own atomicity guarantees.
|
|
48
|
-
const writeFile = fs.writeFile ??
|
|
17
|
+
const writeFile = fs.writeFile ??
|
|
18
|
+
((target, content) => writeFileAtomicSync(target, content));
|
|
49
19
|
const mkdir = fs.mkdir ?? ((p) => mkdirSync(p, { recursive: true }));
|
|
50
20
|
const text = readFile(sourcePath);
|
|
51
21
|
const raw = ext === ".json"
|
|
@@ -60,9 +30,16 @@ export function installRecipeFromFile(sourcePath, opts) {
|
|
|
60
30
|
// they fire via the CLI, RecipeScheduler, and POST /hooks/* endpoint
|
|
61
31
|
// respectively. Synthesize an empty CompiledRecipe stub so the caller API
|
|
62
32
|
// stays uniform; file_watch and git_hook still run through compile.
|
|
33
|
+
//
|
|
34
|
+
// `chained` is a runtime-only trigger (ChainedRecipeRunner / yamlRunner) the
|
|
35
|
+
// recipe→AutomationProgram compiler does not model, so it bypasses compile.
|
|
36
|
+
// `on_file_save` / `on_test_run` DO compile now — mapTrigger maps them to
|
|
37
|
+
// onFileSave / onTestRun / onTestPassAfterFailure — so they install with a
|
|
38
|
+
// real AutomationProgram + suggestedPermissions instead of a bypass stub.
|
|
63
39
|
const bypassCompile = recipe.trigger.type === "manual" ||
|
|
64
40
|
recipe.trigger.type === "cron" ||
|
|
65
|
-
recipe.trigger.type === "webhook"
|
|
41
|
+
recipe.trigger.type === "webhook" ||
|
|
42
|
+
recipe.trigger.type === "chained";
|
|
66
43
|
const compiled = bypassCompile
|
|
67
44
|
? {
|
|
68
45
|
program: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/recipes/installer.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/recipes/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,16 @@
|
|
|
20
20
|
* `status: "ok"` with a stashed verdict, never `status: "error"`.
|
|
21
21
|
* That separation is what prevents the judge step from quietly
|
|
22
22
|
* becoming a gate.
|
|
23
|
+
*
|
|
24
|
+
* ⚠️ OPT-IN DEPARTURE (judge→refine loop) — when a judge step sets the
|
|
25
|
+
* opt-in `agent.max_revisions > 0` (with `kind: "judge"` + `reviews`),
|
|
26
|
+
* the runner DELIBERATELY departs the augment-only invariant: a
|
|
27
|
+
* `request_changes` verdict drives a bounded revise→re-judge loop and
|
|
28
|
+
* MAY end with `status: "error"` (`on_exhausted: "halt"`). This is the
|
|
29
|
+
* single sanctioned exception and is reachable ONLY through those opt-in
|
|
30
|
+
* fields. When they're absent, the augment-only contract above holds
|
|
31
|
+
* byte-for-byte. The loop itself lives in `runJudgeRefineLoop` inside
|
|
32
|
+
* yamlRunner.ts; this parser is unchanged and still never gates.
|
|
23
33
|
*/
|
|
24
34
|
export type JudgeVerdictKind = "approve" | "request_changes" | "unparseable";
|
|
25
35
|
export interface JudgeVerdict {
|
|
@@ -35,7 +45,7 @@ export interface JudgeVerdict {
|
|
|
35
45
|
* Append to the judge prompt to elicit the structured tail. Kept short
|
|
36
46
|
* so it doesn't crowd out the user-provided prompt body.
|
|
37
47
|
*/
|
|
38
|
-
export declare const JUDGE_PROMPT_SUFFIX = "\n\nYou are a cold-eyes reviewer.
|
|
48
|
+
export declare const JUDGE_PROMPT_SUFFIX = "\n\nYou are a cold-eyes reviewer. Reply with ONLY a single JSON object \u2014 no prose,\nno markdown fences \u2014 of exactly this shape:\n\n{\"verdict\": \"approve\" | \"request_changes\", \"reasons\": [\"...\"], \"fixList\": [\"...\"]}\n\nRules:\n- \"verdict\" MUST be exactly \"approve\" or \"request_changes\" (lowercase).\n- \"reasons\": short bullet strings explaining the call.\n- \"fixList\": include ONLY when requesting changes; omit it otherwise.\nOutput nothing except that JSON object.";
|
|
39
49
|
/**
|
|
40
50
|
* Build the artefact-injection block for a judge step that has a
|
|
41
51
|
* `reviews: <stepId>` reference. Returns an empty string when no
|
|
@@ -20,6 +20,16 @@
|
|
|
20
20
|
* `status: "ok"` with a stashed verdict, never `status: "error"`.
|
|
21
21
|
* That separation is what prevents the judge step from quietly
|
|
22
22
|
* becoming a gate.
|
|
23
|
+
*
|
|
24
|
+
* ⚠️ OPT-IN DEPARTURE (judge→refine loop) — when a judge step sets the
|
|
25
|
+
* opt-in `agent.max_revisions > 0` (with `kind: "judge"` + `reviews`),
|
|
26
|
+
* the runner DELIBERATELY departs the augment-only invariant: a
|
|
27
|
+
* `request_changes` verdict drives a bounded revise→re-judge loop and
|
|
28
|
+
* MAY end with `status: "error"` (`on_exhausted: "halt"`). This is the
|
|
29
|
+
* single sanctioned exception and is reachable ONLY through those opt-in
|
|
30
|
+
* fields. When they're absent, the augment-only contract above holds
|
|
31
|
+
* byte-for-byte. The loop itself lives in `runJudgeRefineLoop` inside
|
|
32
|
+
* yamlRunner.ts; this parser is unchanged and still never gates.
|
|
23
33
|
*/
|
|
24
34
|
/**
|
|
25
35
|
* Append to the judge prompt to elicit the structured tail. Kept short
|
|
@@ -27,13 +37,16 @@
|
|
|
27
37
|
*/
|
|
28
38
|
export const JUDGE_PROMPT_SUFFIX = `
|
|
29
39
|
|
|
30
|
-
You are a cold-eyes reviewer.
|
|
31
|
-
|
|
40
|
+
You are a cold-eyes reviewer. Reply with ONLY a single JSON object — no prose,
|
|
41
|
+
no markdown fences — of exactly this shape:
|
|
32
42
|
|
|
33
43
|
{"verdict": "approve" | "request_changes", "reasons": ["..."], "fixList": ["..."]}
|
|
34
44
|
|
|
35
|
-
|
|
36
|
-
|
|
45
|
+
Rules:
|
|
46
|
+
- "verdict" MUST be exactly "approve" or "request_changes" (lowercase).
|
|
47
|
+
- "reasons": short bullet strings explaining the call.
|
|
48
|
+
- "fixList": include ONLY when requesting changes; omit it otherwise.
|
|
49
|
+
Output nothing except that JSON object.`;
|
|
37
50
|
/**
|
|
38
51
|
* Build the artefact-injection block for a judge step that has a
|
|
39
52
|
* `reviews: <stepId>` reference. Returns an empty string when no
|
|
@@ -121,6 +134,33 @@ function findBalancedObjectRanges(text) {
|
|
|
121
134
|
}
|
|
122
135
|
return ranges;
|
|
123
136
|
}
|
|
137
|
+
/**
|
|
138
|
+
* Normalise a model-supplied verdict value to the canonical enum. Smaller /
|
|
139
|
+
* local models frequently deviate on case, spacing, hyphenation, or tense
|
|
140
|
+
* ("Approved", "request changes", "request-changes") — accepting those instead
|
|
141
|
+
* of failing to `unparseable` cuts judge→refine halts WITHOUT semantic guessing
|
|
142
|
+
* (genuinely ambiguous values still fall through). Conservative on purpose: no
|
|
143
|
+
* "reject"/"pass"/"lgtm" mapping, only spelling/format variants of the two
|
|
144
|
+
* canonical verbs.
|
|
145
|
+
*/
|
|
146
|
+
function normalizeVerdict(raw) {
|
|
147
|
+
if (typeof raw !== "string")
|
|
148
|
+
return undefined;
|
|
149
|
+
const v = raw
|
|
150
|
+
.trim()
|
|
151
|
+
.toLowerCase()
|
|
152
|
+
.replace(/[\s-]+/g, "_");
|
|
153
|
+
if (v === "approve" || v === "approved" || v === "approval")
|
|
154
|
+
return "approve";
|
|
155
|
+
if (v === "request_changes" ||
|
|
156
|
+
v === "request_change" ||
|
|
157
|
+
v === "changes_requested" ||
|
|
158
|
+
v === "needs_changes" ||
|
|
159
|
+
v === "needs_change") {
|
|
160
|
+
return "request_changes";
|
|
161
|
+
}
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
124
164
|
/**
|
|
125
165
|
* Parse an agent response into a `JudgeVerdict`. Never throws.
|
|
126
166
|
*/
|
|
@@ -153,8 +193,8 @@ export function parseJudgeVerdict(text) {
|
|
|
153
193
|
if (!parsed || typeof parsed !== "object")
|
|
154
194
|
continue;
|
|
155
195
|
const obj = parsed;
|
|
156
|
-
const
|
|
157
|
-
if (
|
|
196
|
+
const verdict = normalizeVerdict(obj.verdict);
|
|
197
|
+
if (!verdict) {
|
|
158
198
|
continue;
|
|
159
199
|
}
|
|
160
200
|
const reasons = Array.isArray(obj.reasons)
|
|
@@ -164,7 +204,7 @@ export function parseJudgeVerdict(text) {
|
|
|
164
204
|
? obj.fixList.filter((r) => typeof r === "string")
|
|
165
205
|
: undefined;
|
|
166
206
|
return {
|
|
167
|
-
verdict
|
|
207
|
+
verdict,
|
|
168
208
|
reasons,
|
|
169
209
|
...(fixList && fixList.length > 0 && { fixList }),
|
|
170
210
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"judgeVerdict.js","sourceRoot":"","sources":["../../src/recipes/judgeVerdict.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"judgeVerdict.js","sourceRoot":"","sources":["../../src/recipes/judgeVerdict.ts"],"names":[],"mappings":"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"}
|
package/dist/recipes/names.d.ts
CHANGED
|
@@ -56,5 +56,10 @@ export declare const RECIPE_VAR_NAME_RE: RegExp;
|
|
|
56
56
|
* data silently. The simple-identifier subset of
|
|
57
57
|
* `registerRecipeContextKeys` + `extractTemplateExpressions builtinKeys`
|
|
58
58
|
* (see `src/recipes/validation.ts`).
|
|
59
|
+
*
|
|
60
|
+
* Entries are stored LOWERCASE: the validator (and the dashboard mirror)
|
|
61
|
+
* look up `name.toLowerCase()`, so the date-format keys (`yyyy`, `iso_now`,
|
|
62
|
+
* `hh`, `mm`, `ss`) must be lowercase here or they would never match —
|
|
63
|
+
* letting a `yyyy`/`YYYY` var silently shadow the built-in date key.
|
|
59
64
|
*/
|
|
60
65
|
export declare const RESERVED_VAR_NAMES: ReadonlySet<string>;
|
package/dist/recipes/names.js
CHANGED
|
@@ -61,15 +61,20 @@ export const RECIPE_VAR_NAME_RE = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
|
|
|
61
61
|
* data silently. The simple-identifier subset of
|
|
62
62
|
* `registerRecipeContextKeys` + `extractTemplateExpressions builtinKeys`
|
|
63
63
|
* (see `src/recipes/validation.ts`).
|
|
64
|
+
*
|
|
65
|
+
* Entries are stored LOWERCASE: the validator (and the dashboard mirror)
|
|
66
|
+
* look up `name.toLowerCase()`, so the date-format keys (`yyyy`, `iso_now`,
|
|
67
|
+
* `hh`, `mm`, `ss`) must be lowercase here or they would never match —
|
|
68
|
+
* letting a `yyyy`/`YYYY` var silently shadow the built-in date key.
|
|
64
69
|
*/
|
|
65
70
|
export const RESERVED_VAR_NAMES = new Set([
|
|
66
71
|
"date",
|
|
67
72
|
"time",
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
+
"yyyy",
|
|
74
|
+
"iso_now",
|
|
75
|
+
"hh",
|
|
76
|
+
"mm",
|
|
77
|
+
"ss",
|
|
73
78
|
"this",
|
|
74
79
|
"hash",
|
|
75
80
|
"message",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/recipes/names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAE1D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAA+B,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/recipes/names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAE1D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAA+B,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IAC7D,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,SAAS;IACT,iBAAiB;IACjB,WAAW;IACX,cAAc;IACd,MAAM;IACN,UAAU;IACV,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,UAAU;IACV,OAAO;CACR,CAAC,CAAC"}
|
package/dist/recipes/parser.js
CHANGED
|
@@ -33,7 +33,19 @@ export function parseRecipe(raw) {
|
|
|
33
33
|
if (!RECIPE_NAME_RE.test(name)) {
|
|
34
34
|
throw new RecipeParseError(`name must match ${RECIPE_NAME_RE} (kebab-case, 1-64 chars, alphanumeric or hyphen, starts with [a-z0-9])`, ["name"]);
|
|
35
35
|
}
|
|
36
|
-
|
|
36
|
+
// version is optional at the parse boundary: the JSON schema marks it
|
|
37
|
+
// optional with default "1.0.0", and neither validateRecipeDefinition
|
|
38
|
+
// nor the yaml runner require it. Hard-rejecting a version-less recipe
|
|
39
|
+
// here meant a recipe that lints + runs still failed at install with a
|
|
40
|
+
// confusing "missing or empty 'version'". Default to "1.0.0" to match.
|
|
41
|
+
// Coerce a numeric YAML version (`version: 1.2` parses to the JS number 1.2,
|
|
42
|
+
// not the string "1.2") so the author's version metadata isn't silently
|
|
43
|
+
// dropped and defaulted to "1.0.0" (audit 2026-06-10 recipe-validation-3).
|
|
44
|
+
const version = typeof r.version === "string" && r.version
|
|
45
|
+
? r.version
|
|
46
|
+
: typeof r.version === "number" && Number.isFinite(r.version)
|
|
47
|
+
? String(r.version)
|
|
48
|
+
: "1.0.0";
|
|
37
49
|
const trigger = parseTrigger(r.trigger);
|
|
38
50
|
const stepsRaw = r.steps;
|
|
39
51
|
if (!Array.isArray(stepsRaw) || stepsRaw.length === 0) {
|
|
@@ -63,6 +75,13 @@ export function parseRecipe(raw) {
|
|
|
63
75
|
on_error: typeof r.on_error === "object" && r.on_error !== null
|
|
64
76
|
? r.on_error
|
|
65
77
|
: undefined,
|
|
78
|
+
// Pass the recipe-level budget through. Without this the normalizer
|
|
79
|
+
// silently dropped `budget`, so any recipe round-tripped through
|
|
80
|
+
// parseRecipe (the installer's validation path) lost its token budget —
|
|
81
|
+
// RunBudget(recipe.budget) then saw undefined and enforced nothing.
|
|
82
|
+
budget: typeof r.budget === "object" && r.budget !== null
|
|
83
|
+
? r.budget
|
|
84
|
+
: undefined,
|
|
66
85
|
};
|
|
67
86
|
}
|
|
68
87
|
function requireString(o, key) {
|
|
@@ -83,23 +102,39 @@ function parseTrigger(raw) {
|
|
|
83
102
|
"path",
|
|
84
103
|
]);
|
|
85
104
|
return { type: "webhook", path: t.path };
|
|
86
|
-
case "cron":
|
|
87
|
-
|
|
88
|
-
|
|
105
|
+
case "cron": {
|
|
106
|
+
// Audit 2026-06-03 (HIGH #9): accept both `schedule` and the schema-
|
|
107
|
+
// documented `at` field. validateRecipeDefinition reads `trigger.at`
|
|
108
|
+
// (post-normalization) so a recipe authored with `at:` lints fine; the
|
|
109
|
+
// install path goes through here, so without this alias it threw
|
|
110
|
+
// `cron.schedule required` and lint-passing recipes failed to install.
|
|
111
|
+
const cronExpr = typeof t.schedule === "string" && t.schedule.trim()
|
|
112
|
+
? t.schedule
|
|
113
|
+
: typeof t.at === "string" && t.at.trim()
|
|
114
|
+
? t.at
|
|
115
|
+
: null;
|
|
116
|
+
if (!cronExpr)
|
|
117
|
+
throw new RecipeParseError("cron.schedule (or cron.at) required", [
|
|
89
118
|
"trigger",
|
|
90
119
|
"schedule",
|
|
91
120
|
]);
|
|
92
|
-
return { type: "cron", schedule:
|
|
93
|
-
|
|
121
|
+
return { type: "cron", schedule: cronExpr };
|
|
122
|
+
}
|
|
123
|
+
case "file_watch": {
|
|
94
124
|
if (!Array.isArray(t.patterns) || t.patterns.length === 0)
|
|
95
125
|
throw new RecipeParseError("file_watch.patterns required", [
|
|
96
126
|
"trigger",
|
|
97
127
|
"patterns",
|
|
98
128
|
]);
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
129
|
+
const patterns = t.patterns.filter((p) => typeof p === "string");
|
|
130
|
+
// Audit 2026-06-03 (MEDIUM): a patterns array containing only non-strings
|
|
131
|
+
// passed the length check above but filtered to []. The trigger then
|
|
132
|
+
// silently watched NOTHING — install/lint succeeded but the recipe never
|
|
133
|
+
// fired. Require at least one usable string pattern.
|
|
134
|
+
if (patterns.length === 0)
|
|
135
|
+
throw new RecipeParseError("file_watch.patterns must contain at least one string glob", ["trigger", "patterns"]);
|
|
136
|
+
return { type: "file_watch", patterns };
|
|
137
|
+
}
|
|
103
138
|
case "git_hook":
|
|
104
139
|
if (t.event !== "post-commit" &&
|
|
105
140
|
t.event !== "pre-push" &&
|
|
@@ -111,6 +146,35 @@ function parseTrigger(raw) {
|
|
|
111
146
|
return { type: "git_hook", event: t.event };
|
|
112
147
|
case "manual":
|
|
113
148
|
return { type: "manual" };
|
|
149
|
+
case "chained":
|
|
150
|
+
// Chained recipes route to the ChainedRecipeRunner (dispatchRecipe).
|
|
151
|
+
// No required trigger fields — step-level awaits/parallel/vars drive
|
|
152
|
+
// execution. Parity with validateRecipeDefinition + the JSON schema
|
|
153
|
+
// so a recipe that lints + runs can also be installed.
|
|
154
|
+
return { type: "chained" };
|
|
155
|
+
case "on_file_save":
|
|
156
|
+
// Runtime file-save trigger. `glob`/`filter` are optional; preserve
|
|
157
|
+
// them when present so the on-disk JSON round-trip keeps the author's
|
|
158
|
+
// intent.
|
|
159
|
+
return {
|
|
160
|
+
type: "on_file_save",
|
|
161
|
+
...(typeof t.glob === "string" ? { glob: t.glob } : {}),
|
|
162
|
+
...(typeof t.filter === "string" ? { filter: t.filter } : {}),
|
|
163
|
+
};
|
|
164
|
+
case "on_test_run": {
|
|
165
|
+
// Runtime test-run trigger. `filter` must be one of the valid enum values
|
|
166
|
+
// when present; an unknown value silently does nothing at runtime, so
|
|
167
|
+
// surface the error at parse time.
|
|
168
|
+
const ON_TEST_RUN_FILTER = ["any", "failure", "pass-after-fail"];
|
|
169
|
+
if (typeof t.filter === "string" &&
|
|
170
|
+
!ON_TEST_RUN_FILTER.includes(t.filter)) {
|
|
171
|
+
throw new RecipeParseError(`on_test_run trigger filter must be one of: ${ON_TEST_RUN_FILTER.join(", ")} (got "${t.filter}")`, ["trigger", "filter"]);
|
|
172
|
+
}
|
|
173
|
+
return {
|
|
174
|
+
type: "on_test_run",
|
|
175
|
+
...(typeof t.filter === "string" ? { filter: t.filter } : {}),
|
|
176
|
+
};
|
|
177
|
+
}
|
|
114
178
|
default:
|
|
115
179
|
throw new RecipeParseError(`unknown trigger type '${String(t.type)}'`, [
|
|
116
180
|
"trigger",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/recipes/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9D;;;;;GAKG;AAEH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAGhC;IAFT,YACE,OAAe,EACR,OAAiB,EAAE;QAE1B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAFxD,SAAI,GAAJ,IAAI,CAAe;QAG1B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CAAC,GAAY;IACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,CAAC,GAAG,GAA8B,CAAC;IACzC,uDAAuD;IACvD,mEAAmE;IACnE,oEAAoE;IACpE,mEAAmE;IACnE,yDAAyD;IACzD,MAAM,IAAI,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,yEAAyE;IACzE,4EAA4E;IAC5E,0EAA0E;IAC1E,gFAAgF;IAChF,wEAAwE;IACxE,iFAAiF;IACjF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,gBAAgB,CACxB,mBAAmB,cAAc,yEAAyE,EAC1G,CAAC,MAAM,CAAC,CACT,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/recipes/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost-aware model routing — cost-routing Phase 4 (pure selection).
|
|
3
|
+
*
|
|
4
|
+
* Opt-in, author-controlled "gearbox" on top of the `usdMax` brake (Phase 3):
|
|
5
|
+
* a per-step `downshift` list lets a recipe drop to a cheaper model as the USD
|
|
6
|
+
* budget tightens, instead of either blowing the cap or halting outright. The
|
|
7
|
+
* recipe author asserts each fallback is "good enough" for the step — the
|
|
8
|
+
* engine does NOT reason about model quality, only affordability.
|
|
9
|
+
*
|
|
10
|
+
* This module is the pure decision: given the preferred (driver, model), the
|
|
11
|
+
* author's ordered downshift candidates, and a quote() that estimates each
|
|
12
|
+
* candidate's USD cost, pick the most-preferred candidate that still fits the
|
|
13
|
+
* remaining budget. It loads nothing and has no side effects — the runner
|
|
14
|
+
* supplies remainingUsd + quote from RunBudget.
|
|
15
|
+
*
|
|
16
|
+
* Absent / empty `downshift` ⇒ returns `preferred` unchanged (byte-identical
|
|
17
|
+
* to no routing). Routing only runs when a USD cap is set (the runner passes
|
|
18
|
+
* remainingUsd only then).
|
|
19
|
+
*/
|
|
20
|
+
export interface RouteCandidate {
|
|
21
|
+
driver?: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface RouteContext {
|
|
25
|
+
/** USD left before `budget.usdMax`. The router runs only when a cap is set. */
|
|
26
|
+
remainingUsd: number;
|
|
27
|
+
/**
|
|
28
|
+
* Pre-dispatch USD estimate for a prospective (driver, model) call, or
|
|
29
|
+
* `undefined` when that call is NOT USD-enforced — a non-billable driver
|
|
30
|
+
* (local / subscription) or an unpriced model. An unenforced candidate is
|
|
31
|
+
* treated as always affordable (it costs nothing against the cap), so it is
|
|
32
|
+
* a valid "free" downshift target.
|
|
33
|
+
*/
|
|
34
|
+
quote: (driver: string | undefined, model: string | undefined) => number | undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Pick the most-preferred candidate whose estimated cost fits `remainingUsd`.
|
|
38
|
+
* Candidates are tried in order `[preferred, ...downshift]`; a downshift entry
|
|
39
|
+
* inherits the preferred driver/model for any field it omits. If none fit, the
|
|
40
|
+
* last (cheapest listed) is returned and the admit()/reconcile() gate decides
|
|
41
|
+
* whether to halt — downshift slows the spend rate, it never overrides a breach.
|
|
42
|
+
*/
|
|
43
|
+
export declare function costRouter(preferred: RouteCandidate, downshift: RouteCandidate[] | undefined, ctx: RouteContext): RouteCandidate;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost-aware model routing — cost-routing Phase 4 (pure selection).
|
|
3
|
+
*
|
|
4
|
+
* Opt-in, author-controlled "gearbox" on top of the `usdMax` brake (Phase 3):
|
|
5
|
+
* a per-step `downshift` list lets a recipe drop to a cheaper model as the USD
|
|
6
|
+
* budget tightens, instead of either blowing the cap or halting outright. The
|
|
7
|
+
* recipe author asserts each fallback is "good enough" for the step — the
|
|
8
|
+
* engine does NOT reason about model quality, only affordability.
|
|
9
|
+
*
|
|
10
|
+
* This module is the pure decision: given the preferred (driver, model), the
|
|
11
|
+
* author's ordered downshift candidates, and a quote() that estimates each
|
|
12
|
+
* candidate's USD cost, pick the most-preferred candidate that still fits the
|
|
13
|
+
* remaining budget. It loads nothing and has no side effects — the runner
|
|
14
|
+
* supplies remainingUsd + quote from RunBudget.
|
|
15
|
+
*
|
|
16
|
+
* Absent / empty `downshift` ⇒ returns `preferred` unchanged (byte-identical
|
|
17
|
+
* to no routing). Routing only runs when a USD cap is set (the runner passes
|
|
18
|
+
* remainingUsd only then).
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Pick the most-preferred candidate whose estimated cost fits `remainingUsd`.
|
|
22
|
+
* Candidates are tried in order `[preferred, ...downshift]`; a downshift entry
|
|
23
|
+
* inherits the preferred driver/model for any field it omits. If none fit, the
|
|
24
|
+
* last (cheapest listed) is returned and the admit()/reconcile() gate decides
|
|
25
|
+
* whether to halt — downshift slows the spend rate, it never overrides a breach.
|
|
26
|
+
*/
|
|
27
|
+
export function costRouter(preferred, downshift, ctx) {
|
|
28
|
+
if (!downshift || downshift.length === 0)
|
|
29
|
+
return preferred;
|
|
30
|
+
const candidates = [preferred, ...downshift].map((c) => ({
|
|
31
|
+
driver: c.driver ?? preferred.driver,
|
|
32
|
+
model: c.model ?? preferred.model,
|
|
33
|
+
}));
|
|
34
|
+
for (const cand of candidates) {
|
|
35
|
+
const q = ctx.quote(cand.driver, cand.model);
|
|
36
|
+
// undefined quote = unenforced (free / unpriced) → always affordable.
|
|
37
|
+
if (q === undefined || q <= ctx.remainingUsd)
|
|
38
|
+
return cand;
|
|
39
|
+
}
|
|
40
|
+
// None fit — fall back to the cheapest listed; the budget gate halts if even
|
|
41
|
+
// that exceeds the cap on the next admission check.
|
|
42
|
+
return candidates[candidates.length - 1] ?? preferred;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=costRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"costRouter.js","sourceRoot":"","sources":["../../../src/recipes/pricing/costRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAuBH;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACxB,SAAyB,EACzB,SAAuC,EACvC,GAAiB;IAEjB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3D,MAAM,UAAU,GAAqB,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM;QACpC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK;KAClC,CAAC,CAAC,CAAC;IAEJ,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,sEAAsE;QACtE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,GAAG,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;IAC5D,CAAC;IACD,6EAA6E;IAC7E,oDAAoD;IACpD,OAAO,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model price table — cost-aware routing Phase 2 (dormant data).
|
|
3
|
+
*
|
|
4
|
+
* A `(model id) → USD-per-million-tokens` table plus a loader. Nothing
|
|
5
|
+
* consumes it yet; Phase 3 wires `costUsd()` into RunBudget so `budget.usdMax`
|
|
6
|
+
* can be enforced for *measured* (API) drivers. Lands separately so the price
|
|
7
|
+
* data can be reviewed for accuracy on its own.
|
|
8
|
+
*
|
|
9
|
+
* Design notes (docs/design/cost-aware-routing.md):
|
|
10
|
+
* - Prices are DATA, not code, and OVERRIDABLE without a release:
|
|
11
|
+
* precedence env `PATCHWORK_PRICE_TABLE` (path) >
|
|
12
|
+
* `~/.patchwork/prices.json` >
|
|
13
|
+
* the built-in table below.
|
|
14
|
+
* - FAIL-OPEN everywhere: an unknown model, a malformed override, or a
|
|
15
|
+
* missing file never throws — `costUsd` just returns `undefined` (and the
|
|
16
|
+
* budget layer treats that as "unpriceable → don't enforce").
|
|
17
|
+
* - The built-in default lives here as a TS const (compiled into dist, so it
|
|
18
|
+
* is always available at runtime); overrides are JSON read from disk.
|
|
19
|
+
* - NO runtime network calls. Prices drift; refresh the const below and bump
|
|
20
|
+
* `_generatedAt`. `isPriceTableStale()` is provided for a scheduled check.
|
|
21
|
+
*/
|
|
22
|
+
/** USD per 1,000,000 tokens, split by input vs output. */
|
|
23
|
+
export interface ModelPrice {
|
|
24
|
+
input: number;
|
|
25
|
+
output: number;
|
|
26
|
+
}
|
|
27
|
+
export interface PriceTableMeta {
|
|
28
|
+
/** ISO date (YYYY-MM-DD) the built-in prices were last reviewed. */
|
|
29
|
+
_generatedAt: string;
|
|
30
|
+
_unit: "usd_per_million_tokens";
|
|
31
|
+
_source: string;
|
|
32
|
+
_note: string;
|
|
33
|
+
/** Set by the loader when an override file was merged in. */
|
|
34
|
+
_override?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface PriceTable {
|
|
37
|
+
_meta: PriceTableMeta;
|
|
38
|
+
/** Keyed by exact model id (e.g. "gpt-4o", "claude-haiku-4-5-20251001"). */
|
|
39
|
+
prices: Record<string, ModelPrice>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Built-in default prices. **Approximate public list prices** (USD / 1M tokens)
|
|
43
|
+
* as of `_generatedAt` — VERIFY before relying on a USD cap; they drift, and a
|
|
44
|
+
* subscription/CLI driver's spend is notional, not real money out. Override via
|
|
45
|
+
* `~/.patchwork/prices.json` or `PATCHWORK_PRICE_TABLE`.
|
|
46
|
+
*/
|
|
47
|
+
export declare const BUILTIN_PRICE_TABLE: PriceTable;
|
|
48
|
+
/**
|
|
49
|
+
* Load the effective price table: the built-in default with any override file
|
|
50
|
+
* merged over its `prices`. Fail-open — an unreadable / malformed override is
|
|
51
|
+
* ignored and the built-in is returned unchanged.
|
|
52
|
+
*
|
|
53
|
+
* Override file shape: `{ "prices": { "<model>": { "input": N, "output": N } } }`
|
|
54
|
+
* (a bare `{ "<model>": { ... } }` map is also accepted for convenience).
|
|
55
|
+
*/
|
|
56
|
+
export declare function loadPriceTable(opts?: {
|
|
57
|
+
env?: NodeJS.ProcessEnv;
|
|
58
|
+
homeDir?: string;
|
|
59
|
+
}): PriceTable;
|
|
60
|
+
/** Price for one model, or undefined if the table does not list it. */
|
|
61
|
+
export declare function priceFor(model: string, table?: PriceTable): ModelPrice | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* USD cost of a call given its token usage, or `undefined` when the model is
|
|
64
|
+
* not priced (fail-open: the budget layer then declines to enforce on it).
|
|
65
|
+
*/
|
|
66
|
+
export declare function costUsd(model: string, usage: {
|
|
67
|
+
inputTokens: number;
|
|
68
|
+
outputTokens: number;
|
|
69
|
+
}, table?: PriceTable): number | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* True when the table's `_generatedAt` is unparseable, in the future, or older
|
|
72
|
+
* than `maxAgeDays` (default 548 ≈ 18 months). Pure — caller supplies `now` —
|
|
73
|
+
* so a scheduled job can fail loudly without baking a wall-clock time-bomb into
|
|
74
|
+
* every PR's test run.
|
|
75
|
+
*/
|
|
76
|
+
export declare function isPriceTableStale(generatedAt: string, now: number, maxAgeDays?: number): boolean;
|