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
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directional / tradeable test for the retracement levels.
|
|
3
|
+
*
|
|
4
|
+
* The pre-registered backtest only asked "does a level get TOUCHED more than a
|
|
5
|
+
* random level" (answer: barely — touching is near-universal in a range). This
|
|
6
|
+
* asks the question that actually matters for trading: when price reaches the
|
|
7
|
+
* level, does it HOLD (bounce away in the approach-implied direction with
|
|
8
|
+
* tradeable R:R) more often than at a random level?
|
|
9
|
+
*
|
|
10
|
+
* Approach direction is read from the bar before the touch: approaching from
|
|
11
|
+
* above → support (held = bounces up); from below → resistance (held = rejects
|
|
12
|
+
* down). An outcome is counted only if it resolves to hold or break within K
|
|
13
|
+
* bars — undecided touches are excluded, not scored as misses.
|
|
14
|
+
*/
|
|
15
|
+
import { computeLevels } from "../levels.js";
|
|
16
|
+
import { detectSwings, latestSwing } from "../swings.js";
|
|
17
|
+
import { firstTouchIndex, mulberry32, OUTCOME_WINDOW } from "./scoring.js";
|
|
18
|
+
const RESOLVE_BARS = 10;
|
|
19
|
+
const MOVE_PCT = 0.015;
|
|
20
|
+
/**
|
|
21
|
+
* Classify how price behaved at a level touch: held (bounced in the
|
|
22
|
+
* approach-implied direction), broke through, or did not resolve within K bars.
|
|
23
|
+
* Shared by the directional backtest and the live ledger scorer so both use one
|
|
24
|
+
* definition of "the level held".
|
|
25
|
+
*/
|
|
26
|
+
export function resolveTouch(candles, f, level) {
|
|
27
|
+
if (f < 1)
|
|
28
|
+
return "none";
|
|
29
|
+
const support = candles[f - 1].close > level; // approached from above
|
|
30
|
+
const up = level * (1 + MOVE_PCT);
|
|
31
|
+
const down = level * (1 - MOVE_PCT);
|
|
32
|
+
const end = Math.min(candles.length - 1, f + RESOLVE_BARS);
|
|
33
|
+
for (let k = f + 1; k <= end; k++) {
|
|
34
|
+
const c = candles[k];
|
|
35
|
+
if (support) {
|
|
36
|
+
if (c.low <= down)
|
|
37
|
+
return "break"; // fell through support
|
|
38
|
+
if (c.high >= up)
|
|
39
|
+
return "hold"; // bounced
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
if (c.high >= up)
|
|
43
|
+
return "break"; // broke through resistance
|
|
44
|
+
if (c.low <= down)
|
|
45
|
+
return "hold"; // rejected down
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return "none";
|
|
49
|
+
}
|
|
50
|
+
export function runDirectional(candles, opts) {
|
|
51
|
+
const fractalN = opts.fractalN ?? 2;
|
|
52
|
+
const warmup = opts.warmup ?? 60;
|
|
53
|
+
const rng = mulberry32(opts.seed ?? 0x5eed);
|
|
54
|
+
const out = [];
|
|
55
|
+
const emitted = new Set();
|
|
56
|
+
const allSwings = detectSwings(candles, fractalN);
|
|
57
|
+
const lastCursor = candles.length - 1 - OUTCOME_WINDOW;
|
|
58
|
+
for (let t = warmup; t <= lastCursor; t++) {
|
|
59
|
+
const avail = allSwings.filter((s) => s.index <= t - fractalN);
|
|
60
|
+
const hi = latestSwing(avail, "high");
|
|
61
|
+
const lo = latestSwing(avail, "low");
|
|
62
|
+
if (!hi || !lo)
|
|
63
|
+
continue;
|
|
64
|
+
const levels = computeLevels(lo.price, hi.price);
|
|
65
|
+
if (!levels)
|
|
66
|
+
continue;
|
|
67
|
+
const rangeKey = `${lo.time}:${hi.time}`;
|
|
68
|
+
const from = t + 1;
|
|
69
|
+
const to = t + OUTCOME_WINDOW;
|
|
70
|
+
const targets = [
|
|
71
|
+
{ type: "price-third", level: levels.ladder[1].price },
|
|
72
|
+
{ type: "price-third", level: levels.ladder[2].price },
|
|
73
|
+
{ type: "price-fifty", level: levels.fifty },
|
|
74
|
+
];
|
|
75
|
+
for (let i = 0; i < targets.length; i++) {
|
|
76
|
+
const { type, level } = targets[i];
|
|
77
|
+
const key = `${type}:${i}:${rangeKey}`;
|
|
78
|
+
if (emitted.has(key))
|
|
79
|
+
continue;
|
|
80
|
+
const touch = firstTouchIndex(level, candles, from, to);
|
|
81
|
+
if (touch === -1)
|
|
82
|
+
continue;
|
|
83
|
+
const res = resolveTouch(candles, touch, level);
|
|
84
|
+
if (res === "none")
|
|
85
|
+
continue; // method undecided → not a sample
|
|
86
|
+
emitted.add(key);
|
|
87
|
+
// baseline: a random in-range level, scored on the SAME conditional basis
|
|
88
|
+
const randLevel = lo.price + rng() * levels.range;
|
|
89
|
+
const rt = firstTouchIndex(randLevel, candles, from, to);
|
|
90
|
+
const rres = rt === -1 ? "none" : resolveTouch(candles, rt, randLevel);
|
|
91
|
+
out.push({
|
|
92
|
+
asset: opts.asset,
|
|
93
|
+
timeframe: opts.timeframe,
|
|
94
|
+
type,
|
|
95
|
+
methodHold: res === "hold",
|
|
96
|
+
baselineResolved: rres !== "none",
|
|
97
|
+
baselineHold: rres === "hold",
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=directional.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directional.js","sourceRoot":"","sources":["../../../src/ta/backtest/directional.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fundx-1 — funding-rate extremes backtest (Phase 1b).
|
|
3
|
+
*
|
|
4
|
+
* Frozen by docs/phase1b-precommit.md. Two legs: LONG (sustained crowded
|
|
5
|
+
* shorts → forward returns vs a matched-neutral baseline) and RISK (crowded-
|
|
6
|
+
* long p90 crossings → deeper forward drawdowns vs the same construction).
|
|
7
|
+
* Baselines are CONDITIONAL: neutral-funding days matched on trailing 14d
|
|
8
|
+
* return, so the long leg must beat post-crash mean reversion, not drift.
|
|
9
|
+
* Deterministic — Mann–Whitney is closed-form, no RNG.
|
|
10
|
+
*/
|
|
11
|
+
import type { Candle } from "../types.js";
|
|
12
|
+
export interface FundingPrint {
|
|
13
|
+
fundingTime: number;
|
|
14
|
+
fundingRate: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* F7(t) per candle: mean of funding rates with fundingTime in
|
|
18
|
+
* [openTime(t) − 7d, openTime(t)) — strictly before the day's open.
|
|
19
|
+
* null when fewer than 15 prints fall in the window.
|
|
20
|
+
*/
|
|
21
|
+
export declare function f7Series(candles: Candle[], prints: FundingPrint[]): (number | null)[];
|
|
22
|
+
/**
|
|
23
|
+
* Trailing percentile of the usable F7 values for days [t−365, t−1]
|
|
24
|
+
* (bar-indexed on the daily series — daily candles are calendar days).
|
|
25
|
+
* null when fewer than 200 usable trailing values.
|
|
26
|
+
*/
|
|
27
|
+
export declare function trailingPercentile(f7: (number | null)[], t: number, pctile: number): number | null;
|
|
28
|
+
export interface FundxEvents {
|
|
29
|
+
longEvents: number[];
|
|
30
|
+
riskEvents: number[];
|
|
31
|
+
/** usable days (F7 + percentiles available + trailing-14d return defined) */
|
|
32
|
+
usable: number[];
|
|
33
|
+
/** neutral days: F7 ∈ [p25, p75] */
|
|
34
|
+
neutral: number[];
|
|
35
|
+
}
|
|
36
|
+
/** Trailing 14d return at t: close[t]/close[t−14] − 1 (bars ≤ t only). */
|
|
37
|
+
export declare function trail14(candles: Candle[], t: number): number | null;
|
|
38
|
+
export declare function detectEvents(candles: Candle[], f7: (number | null)[]): FundxEvents;
|
|
39
|
+
/** Forward return close[t+h]/open[t+1] − 1; null if out of range. */
|
|
40
|
+
export declare function fwdReturn(candles: Candle[], t: number, h: number): number | null;
|
|
41
|
+
/** Forward 14d max drawdown: min(low[t+1..t+14])/open[t+1] − 1. */
|
|
42
|
+
export declare function fwdMaxDrawdown(candles: Candle[], t: number): number | null;
|
|
43
|
+
/**
|
|
44
|
+
* Matched-neutral baseline days: neutral-funding days whose trailing-14d
|
|
45
|
+
* return lies within ±1σ of the EVENT cohort's mean trailing-14d return; σ is
|
|
46
|
+
* the std of trailing-14d returns over all usable days in the same regime.
|
|
47
|
+
*/
|
|
48
|
+
export declare function matchedBaseline(candles: Candle[], events: number[], neutral: number[], usable: number[]): number[];
|
|
49
|
+
/**
|
|
50
|
+
* Mann–Whitney U, one-sided H1: "sample A tends LARGER than sample B" when
|
|
51
|
+
* direction = "greater" (use "less" for the drawdown leg). Normal
|
|
52
|
+
* approximation with tie correction.
|
|
53
|
+
*/
|
|
54
|
+
export declare function mannWhitneyP(a: number[], b: number[], direction: "greater" | "less"): number;
|
|
55
|
+
export interface FundxCell {
|
|
56
|
+
leg: "LONG-7d" | "LONG-30d" | "RISK-14dMaxDD";
|
|
57
|
+
regime: string;
|
|
58
|
+
nEvents: number;
|
|
59
|
+
nBaseline: number;
|
|
60
|
+
eventMean: number;
|
|
61
|
+
eventMedian: number;
|
|
62
|
+
baselineMean: number;
|
|
63
|
+
baselineMedian: number;
|
|
64
|
+
p: number;
|
|
65
|
+
parked: boolean;
|
|
66
|
+
}
|
|
67
|
+
export declare function evalFundxCells(candles: Candle[], prints: FundingPrint[], regimeName: string, inRegime: (t: number) => boolean): FundxCell[];
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fundx-1 — funding-rate extremes backtest (Phase 1b).
|
|
3
|
+
*
|
|
4
|
+
* Frozen by docs/phase1b-precommit.md. Two legs: LONG (sustained crowded
|
|
5
|
+
* shorts → forward returns vs a matched-neutral baseline) and RISK (crowded-
|
|
6
|
+
* long p90 crossings → deeper forward drawdowns vs the same construction).
|
|
7
|
+
* Baselines are CONDITIONAL: neutral-funding days matched on trailing 14d
|
|
8
|
+
* return, so the long leg must beat post-crash mean reversion, not drift.
|
|
9
|
+
* Deterministic — Mann–Whitney is closed-form, no RNG.
|
|
10
|
+
*/
|
|
11
|
+
import { mean, stdDev } from "./tsmom.js";
|
|
12
|
+
const DAY = 86_400_000;
|
|
13
|
+
/**
|
|
14
|
+
* F7(t) per candle: mean of funding rates with fundingTime in
|
|
15
|
+
* [openTime(t) − 7d, openTime(t)) — strictly before the day's open.
|
|
16
|
+
* null when fewer than 15 prints fall in the window.
|
|
17
|
+
*/
|
|
18
|
+
export function f7Series(candles, prints) {
|
|
19
|
+
const sorted = [...prints].sort((a, b) => a.fundingTime - b.fundingTime);
|
|
20
|
+
const times = sorted.map((p) => p.fundingTime);
|
|
21
|
+
// prefix sums for O(1) range means
|
|
22
|
+
const prefix = [0];
|
|
23
|
+
for (const p of sorted)
|
|
24
|
+
prefix.push(prefix[prefix.length - 1] + p.fundingRate);
|
|
25
|
+
const lowerBound = (x) => {
|
|
26
|
+
let lo = 0;
|
|
27
|
+
let hi = times.length;
|
|
28
|
+
while (lo < hi) {
|
|
29
|
+
const mid = (lo + hi) >> 1;
|
|
30
|
+
if (times[mid] < x)
|
|
31
|
+
lo = mid + 1;
|
|
32
|
+
else
|
|
33
|
+
hi = mid;
|
|
34
|
+
}
|
|
35
|
+
return lo;
|
|
36
|
+
};
|
|
37
|
+
return candles.map((c) => {
|
|
38
|
+
const from = lowerBound(c.openTime - 7 * DAY);
|
|
39
|
+
const to = lowerBound(c.openTime); // strictly before open
|
|
40
|
+
const n = to - from;
|
|
41
|
+
if (n < 15)
|
|
42
|
+
return null;
|
|
43
|
+
return (prefix[to] - prefix[from]) / n;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Trailing percentile of the usable F7 values for days [t−365, t−1]
|
|
48
|
+
* (bar-indexed on the daily series — daily candles are calendar days).
|
|
49
|
+
* null when fewer than 200 usable trailing values.
|
|
50
|
+
*/
|
|
51
|
+
export function trailingPercentile(f7, t, pctile) {
|
|
52
|
+
const from = Math.max(0, t - 365);
|
|
53
|
+
const vals = [];
|
|
54
|
+
for (let i = from; i < t; i++) {
|
|
55
|
+
const v = f7[i];
|
|
56
|
+
if (v !== null && v !== undefined)
|
|
57
|
+
vals.push(v);
|
|
58
|
+
}
|
|
59
|
+
if (vals.length < 200)
|
|
60
|
+
return null;
|
|
61
|
+
vals.sort((a, b) => a - b);
|
|
62
|
+
const idx = (vals.length - 1) * pctile;
|
|
63
|
+
const lo = Math.floor(idx);
|
|
64
|
+
const hi = Math.ceil(idx);
|
|
65
|
+
return vals[lo] + (vals[hi] - vals[lo]) * (idx - lo);
|
|
66
|
+
}
|
|
67
|
+
/** Trailing 14d return at t: close[t]/close[t−14] − 1 (bars ≤ t only). */
|
|
68
|
+
export function trail14(candles, t) {
|
|
69
|
+
if (t < 14)
|
|
70
|
+
return null;
|
|
71
|
+
return candles[t].close / candles[t - 14].close - 1;
|
|
72
|
+
}
|
|
73
|
+
export function detectEvents(candles, f7) {
|
|
74
|
+
const n = candles.length;
|
|
75
|
+
const longEvents = [];
|
|
76
|
+
const riskEvents = [];
|
|
77
|
+
const usable = [];
|
|
78
|
+
const neutral = [];
|
|
79
|
+
let negStreak = 0;
|
|
80
|
+
let longSuppressUntil = -1;
|
|
81
|
+
let riskSuppressed = false;
|
|
82
|
+
let riskSuppressStart = -1;
|
|
83
|
+
// previous USABLE day's position vs its own p90 — the spec's crossing
|
|
84
|
+
// requires "yesterday below its own p90, today at/above".
|
|
85
|
+
let prevBelowP90 = null;
|
|
86
|
+
for (let t = 0; t < n; t++) {
|
|
87
|
+
const v = f7[t];
|
|
88
|
+
const p25 = trailingPercentile(f7, t, 0.25);
|
|
89
|
+
const p75 = trailingPercentile(f7, t, 0.75);
|
|
90
|
+
const p90 = trailingPercentile(f7, t, 0.9);
|
|
91
|
+
const tr = trail14(candles, t);
|
|
92
|
+
if (v === null ||
|
|
93
|
+
v === undefined ||
|
|
94
|
+
p25 === null ||
|
|
95
|
+
p75 === null ||
|
|
96
|
+
p90 === null ||
|
|
97
|
+
tr === null) {
|
|
98
|
+
negStreak = 0; // unusable day breaks the consecutive-day requirement
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
usable.push(t);
|
|
102
|
+
if (v >= p25 && v <= p75)
|
|
103
|
+
neutral.push(t);
|
|
104
|
+
// LONG: F7 ≤ −0.0001 for ≥5 consecutive usable days, fire on day 5,
|
|
105
|
+
// suppress 30 calendar days (bar-indexed: daily candles).
|
|
106
|
+
if (v <= -0.0001) {
|
|
107
|
+
negStreak++;
|
|
108
|
+
if (negStreak === 5 && t > longSuppressUntil) {
|
|
109
|
+
longEvents.push(t);
|
|
110
|
+
longSuppressUntil = t + 30;
|
|
111
|
+
}
|
|
112
|
+
else if (negStreak > 5 && t > longSuppressUntil) {
|
|
113
|
+
// streak continues past a suppression window — re-fire once eligible
|
|
114
|
+
longEvents.push(t);
|
|
115
|
+
longSuppressUntil = t + 30;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
negStreak = 0;
|
|
120
|
+
}
|
|
121
|
+
// RISK: STRICT crossing ≥ p90 — previous usable day below its own p90,
|
|
122
|
+
// today at/above (precommit; refuter amendment 2: independent episodes).
|
|
123
|
+
// Suppression releases when F7 < p75 or ≥14 days elapse, but a re-fire
|
|
124
|
+
// still requires a fresh below→above crossing.
|
|
125
|
+
if (riskSuppressed) {
|
|
126
|
+
if (v < p75 || t - riskSuppressStart >= 14)
|
|
127
|
+
riskSuppressed = false;
|
|
128
|
+
}
|
|
129
|
+
if (!riskSuppressed && v >= p90 && prevBelowP90 === true) {
|
|
130
|
+
riskEvents.push(t);
|
|
131
|
+
riskSuppressed = true;
|
|
132
|
+
riskSuppressStart = t;
|
|
133
|
+
}
|
|
134
|
+
prevBelowP90 = v < p90;
|
|
135
|
+
}
|
|
136
|
+
return { longEvents, riskEvents, usable, neutral };
|
|
137
|
+
}
|
|
138
|
+
/** Forward return close[t+h]/open[t+1] − 1; null if out of range. */
|
|
139
|
+
export function fwdReturn(candles, t, h) {
|
|
140
|
+
if (t + h >= candles.length)
|
|
141
|
+
return null;
|
|
142
|
+
return candles[t + h].close / candles[t + 1].open - 1;
|
|
143
|
+
}
|
|
144
|
+
/** Forward 14d max drawdown: min(low[t+1..t+14])/open[t+1] − 1. */
|
|
145
|
+
export function fwdMaxDrawdown(candles, t) {
|
|
146
|
+
if (t + 14 >= candles.length)
|
|
147
|
+
return null;
|
|
148
|
+
const entry = candles[t + 1].open;
|
|
149
|
+
let lo = Number.POSITIVE_INFINITY;
|
|
150
|
+
for (let i = t + 1; i <= t + 14; i++)
|
|
151
|
+
lo = Math.min(lo, candles[i].low);
|
|
152
|
+
return lo / entry - 1;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Matched-neutral baseline days: neutral-funding days whose trailing-14d
|
|
156
|
+
* return lies within ±1σ of the EVENT cohort's mean trailing-14d return; σ is
|
|
157
|
+
* the std of trailing-14d returns over all usable days in the same regime.
|
|
158
|
+
*/
|
|
159
|
+
export function matchedBaseline(candles, events, neutral, usable) {
|
|
160
|
+
const eventTrails = events
|
|
161
|
+
.map((t) => trail14(candles, t))
|
|
162
|
+
.filter((x) => x !== null);
|
|
163
|
+
if (eventTrails.length === 0)
|
|
164
|
+
return [];
|
|
165
|
+
const center = mean(eventTrails);
|
|
166
|
+
const sigma = stdDev(usable
|
|
167
|
+
.map((t) => trail14(candles, t))
|
|
168
|
+
.filter((x) => x !== null));
|
|
169
|
+
return neutral.filter((t) => {
|
|
170
|
+
const tr = trail14(candles, t);
|
|
171
|
+
return tr !== null && Math.abs(tr - center) <= sigma;
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Mann–Whitney U, one-sided H1: "sample A tends LARGER than sample B" when
|
|
176
|
+
* direction = "greater" (use "less" for the drawdown leg). Normal
|
|
177
|
+
* approximation with tie correction.
|
|
178
|
+
*/
|
|
179
|
+
export function mannWhitneyP(a, b, direction) {
|
|
180
|
+
const nA = a.length;
|
|
181
|
+
const nB = b.length;
|
|
182
|
+
if (nA === 0 || nB === 0)
|
|
183
|
+
return 1;
|
|
184
|
+
const all = [...a.map((v) => ({ v, g: 0 })), ...b.map((v) => ({ v, g: 1 }))];
|
|
185
|
+
all.sort((x, y) => x.v - y.v);
|
|
186
|
+
// average ranks with ties
|
|
187
|
+
const ranks = new Array(all.length);
|
|
188
|
+
const tieGroups = [];
|
|
189
|
+
let i = 0;
|
|
190
|
+
while (i < all.length) {
|
|
191
|
+
let j = i;
|
|
192
|
+
while (j + 1 < all.length && all[j + 1].v === all[i].v)
|
|
193
|
+
j++;
|
|
194
|
+
const avg = (i + j + 2) / 2;
|
|
195
|
+
for (let k = i; k <= j; k++)
|
|
196
|
+
ranks[k] = avg;
|
|
197
|
+
tieGroups.push(j - i + 1);
|
|
198
|
+
i = j + 1;
|
|
199
|
+
}
|
|
200
|
+
let rA = 0;
|
|
201
|
+
all.forEach((x, idx) => {
|
|
202
|
+
if (x.g === 0)
|
|
203
|
+
rA += ranks[idx];
|
|
204
|
+
});
|
|
205
|
+
const U = rA - (nA * (nA + 1)) / 2;
|
|
206
|
+
const mu = (nA * nB) / 2;
|
|
207
|
+
const nTot = nA + nB;
|
|
208
|
+
const tieTerm = tieGroups.reduce((s, ti) => s + ti ** 3 - ti, 0);
|
|
209
|
+
const sigma = Math.sqrt(((nA * nB) / 12) * (nTot + 1 - tieTerm / (nTot * (nTot - 1))));
|
|
210
|
+
if (sigma === 0)
|
|
211
|
+
return 1;
|
|
212
|
+
// continuity correction
|
|
213
|
+
const zRaw = direction === "greater" ? U - mu - 0.5 : mu - U - 0.5;
|
|
214
|
+
const z = zRaw / sigma;
|
|
215
|
+
// one-sided upper tail
|
|
216
|
+
const tNorm = 1 / (1 + 0.2316419 * Math.abs(z));
|
|
217
|
+
const d = 0.3989422804014327 * Math.exp(-(z * z) / 2);
|
|
218
|
+
const tail = d *
|
|
219
|
+
tNorm *
|
|
220
|
+
(0.31938153 +
|
|
221
|
+
tNorm *
|
|
222
|
+
(-0.356563782 +
|
|
223
|
+
tNorm *
|
|
224
|
+
(1.781477937 + tNorm * (-1.821255978 + tNorm * 1.330274429))));
|
|
225
|
+
return z >= 0 ? tail : 1 - tail;
|
|
226
|
+
}
|
|
227
|
+
function median(xs) {
|
|
228
|
+
if (xs.length === 0)
|
|
229
|
+
return 0;
|
|
230
|
+
const s = [...xs].sort((a, b) => a - b);
|
|
231
|
+
const m = s.length >> 1;
|
|
232
|
+
return s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2;
|
|
233
|
+
}
|
|
234
|
+
export function evalFundxCells(candles, prints, regimeName, inRegime) {
|
|
235
|
+
const f7 = f7Series(candles, prints);
|
|
236
|
+
const ev = detectEvents(candles, f7);
|
|
237
|
+
const longE = ev.longEvents.filter(inRegime);
|
|
238
|
+
const riskE = ev.riskEvents.filter(inRegime);
|
|
239
|
+
const usable = ev.usable.filter(inRegime);
|
|
240
|
+
const neutral = ev.neutral.filter(inRegime);
|
|
241
|
+
const cells = [];
|
|
242
|
+
const mk = (leg, events, outcome, direction) => {
|
|
243
|
+
const baseDays = matchedBaseline(candles, events, neutral, usable);
|
|
244
|
+
const a = events.map(outcome).filter((x) => x !== null);
|
|
245
|
+
const b = baseDays.map(outcome).filter((x) => x !== null);
|
|
246
|
+
cells.push({
|
|
247
|
+
leg,
|
|
248
|
+
regime: regimeName,
|
|
249
|
+
nEvents: a.length,
|
|
250
|
+
nBaseline: b.length,
|
|
251
|
+
eventMean: mean(a),
|
|
252
|
+
eventMedian: median(a),
|
|
253
|
+
baselineMean: mean(b),
|
|
254
|
+
baselineMedian: median(b),
|
|
255
|
+
p: mannWhitneyP(a, b, direction),
|
|
256
|
+
parked: a.length < 8,
|
|
257
|
+
});
|
|
258
|
+
};
|
|
259
|
+
mk("LONG-7d", longE, (t) => fwdReturn(candles, t, 7), "greater");
|
|
260
|
+
mk("LONG-30d", longE, (t) => fwdReturn(candles, t, 30), "greater");
|
|
261
|
+
mk("RISK-14dMaxDD", riskE, (t) => fwdMaxDrawdown(candles, t), "less");
|
|
262
|
+
return cells;
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=fundx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fundx.js","sourceRoot":"","sources":["../../../src/ta/backtest/fundx.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fvg-1 — liquidity-void (fair value gap) backtest (Phase 1d).
|
|
3
|
+
*
|
|
4
|
+
* Frozen by docs/phase1d-precommit.md. Detection constants come verbatim from
|
|
5
|
+
* the user's EW_Fib_Liquidity.pine (ATR(100)×0.5 gap, ATR(14)×1.0 displacement,
|
|
6
|
+
* 10% penetration, CE midpoint); the refuter-amended baselines are matched
|
|
7
|
+
* random bands (H-magnet) and displacement-matched non-void days
|
|
8
|
+
* (H-continuation), with block bootstrap over event clusters because void
|
|
9
|
+
* outcome windows overlap. All randomness via frozen mulberry32 seeds.
|
|
10
|
+
*/
|
|
11
|
+
import type { Candle } from "../types.js";
|
|
12
|
+
/** Deterministic PRNG (frozen seeds in the precommit). */
|
|
13
|
+
export declare function mulberry32(seed: number): () => number;
|
|
14
|
+
/** Wilder RMA ATR; index i uses true ranges of bars ≤ i. null during warm-up. */
|
|
15
|
+
export declare function atrWilder(candles: Candle[], period: number): (number | null)[];
|
|
16
|
+
export interface VoidEvent {
|
|
17
|
+
/** +1 bullish (zone below price), −1 bearish (zone above price) */
|
|
18
|
+
dir: 1 | -1;
|
|
19
|
+
/** event bar index — LAST bar of a stacked run (merge rule) */
|
|
20
|
+
t: number;
|
|
21
|
+
vTop: number;
|
|
22
|
+
vBot: number;
|
|
23
|
+
ce: number;
|
|
24
|
+
width: number;
|
|
25
|
+
/** |close[t] − nearest zone edge| at the event bar */
|
|
26
|
+
distance: number;
|
|
27
|
+
/** formation displacement ratio |close[t−1]−open[t−1]| / ATR14[t] */
|
|
28
|
+
dispRatio: number;
|
|
29
|
+
/** ATR100 at the event bar (for vol-decile matching) */
|
|
30
|
+
atr100: number;
|
|
31
|
+
}
|
|
32
|
+
/** Raw per-bar detection flag (before stacking merge); exported for controls. */
|
|
33
|
+
export declare function rawVoidFlags(candles: Candle[], atr100: (number | null)[], atr14: (number | null)[]): (1 | -1 | 0)[];
|
|
34
|
+
/** Detect voids with the stacked-merge rule (consecutive same-dir → one event). */
|
|
35
|
+
export declare function detectVoids(candles: Candle[]): VoidEvent[];
|
|
36
|
+
export interface MachineOutcome {
|
|
37
|
+
tested: boolean;
|
|
38
|
+
ceReached: boolean;
|
|
39
|
+
filled: boolean;
|
|
40
|
+
/** first bar index with a >10%-penetration touch while not yet filled */
|
|
41
|
+
touchBar: number | null;
|
|
42
|
+
/** 5-bar log return from touch close, signed AWAY from the zone */
|
|
43
|
+
reaction: number | null;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run the frozen state machine on a zone from bar `from`+1 for `window` bars.
|
|
47
|
+
* Works identically for real voids and control bands (dir gives zone side).
|
|
48
|
+
*/
|
|
49
|
+
export declare function runStateMachine(candles: Candle[], dir: 1 | -1, vTop: number, vBot: number, from: number, window?: number): MachineOutcome;
|
|
50
|
+
/** Decile index (0-9) of x against frozen sorted boundaries. */
|
|
51
|
+
export declare function decileOf(sorted: number[], x: number): number;
|
|
52
|
+
/** Cluster events whose event bars are < gap bars apart (block bootstrap unit). */
|
|
53
|
+
export declare function clusterIndices(eventBars: number[], gap?: number): number[][];
|
|
54
|
+
/**
|
|
55
|
+
* One-sided cluster-bootstrap p for Δ = mean(eventStat) − mean(controlStat),
|
|
56
|
+
* H1: Δ > 0. Pairs travel together (each event carries its control mean).
|
|
57
|
+
* p = (1 + #{boot Δ ≤ 0}) / (B + 1). Frozen seed per call site.
|
|
58
|
+
*/
|
|
59
|
+
export declare function clusterBootstrapP(eventStats: number[], controlStats: (number | null)[], clusters: number[][], seed: number, B?: number): {
|
|
60
|
+
delta: number;
|
|
61
|
+
p: number;
|
|
62
|
+
};
|