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.
Files changed (739) hide show
  1. package/README.bridge.md +15 -16
  2. package/README.md +46 -458
  3. package/dist/activationMetrics.js +2 -3
  4. package/dist/activationMetrics.js.map +1 -1
  5. package/dist/activityLog.d.ts +1 -0
  6. package/dist/activityLog.js +8 -3
  7. package/dist/activityLog.js.map +1 -1
  8. package/dist/adapters/gemini.js +2 -2
  9. package/dist/adapters/gemini.js.map +1 -1
  10. package/dist/adapters/grok.js +6 -1
  11. package/dist/adapters/grok.js.map +1 -1
  12. package/dist/adapters/openai.js +4 -0
  13. package/dist/adapters/openai.js.map +1 -1
  14. package/dist/approvalHttp.d.ts +9 -0
  15. package/dist/approvalHttp.js +210 -171
  16. package/dist/approvalHttp.js.map +1 -1
  17. package/dist/approvalKpi.d.ts +102 -0
  18. package/dist/approvalKpi.js +282 -0
  19. package/dist/approvalKpi.js.map +1 -0
  20. package/dist/approvalQueue.d.ts +1 -1
  21. package/dist/approvalQueue.js.map +1 -1
  22. package/dist/automation.d.ts +45 -4
  23. package/dist/automation.js +123 -15
  24. package/dist/automation.js.map +1 -1
  25. package/dist/bridge.d.ts +10 -0
  26. package/dist/bridge.js +225 -46
  27. package/dist/bridge.js.map +1 -1
  28. package/dist/bridgeLockDiscovery.d.ts +16 -1
  29. package/dist/bridgeLockDiscovery.js +38 -4
  30. package/dist/bridgeLockDiscovery.js.map +1 -1
  31. package/dist/bridgeToolsRules.js +3 -18
  32. package/dist/bridgeToolsRules.js.map +1 -1
  33. package/dist/claudeAuthHttp.d.ts +25 -0
  34. package/dist/claudeAuthHttp.js +219 -0
  35. package/dist/claudeAuthHttp.js.map +1 -0
  36. package/dist/claudeDriver.js +4 -1
  37. package/dist/claudeDriver.js.map +1 -1
  38. package/dist/claudeOrchestrator.d.ts +15 -0
  39. package/dist/claudeOrchestrator.js +44 -0
  40. package/dist/claudeOrchestrator.js.map +1 -1
  41. package/dist/commands/connect.d.ts +47 -0
  42. package/dist/commands/connect.js +419 -0
  43. package/dist/commands/connect.js.map +1 -0
  44. package/dist/commands/install.js +3 -10
  45. package/dist/commands/install.js.map +1 -1
  46. package/dist/commands/launchd.d.ts +7 -0
  47. package/dist/commands/launchd.js +20 -2
  48. package/dist/commands/launchd.js.map +1 -1
  49. package/dist/commands/patchworkInit.d.ts +7 -0
  50. package/dist/commands/patchworkInit.js +26 -0
  51. package/dist/commands/patchworkInit.js.map +1 -1
  52. package/dist/commands/recipe.d.ts +59 -4
  53. package/dist/commands/recipe.js +206 -5
  54. package/dist/commands/recipe.js.map +1 -1
  55. package/dist/commands/recipeInstall.d.ts +9 -0
  56. package/dist/commands/recipeInstall.js +56 -3
  57. package/dist/commands/recipeInstall.js.map +1 -1
  58. package/dist/commands/task.d.ts +25 -0
  59. package/dist/commands/task.js +61 -41
  60. package/dist/commands/task.js.map +1 -1
  61. package/dist/commands/tokenEfficiency.d.ts +4 -0
  62. package/dist/commands/tokenEfficiency.js +23 -26
  63. package/dist/commands/tokenEfficiency.js.map +1 -1
  64. package/dist/commands/tracesExport.d.ts +15 -1
  65. package/dist/commands/tracesExport.js +39 -5
  66. package/dist/commands/tracesExport.js.map +1 -1
  67. package/dist/config.js +16 -0
  68. package/dist/config.js.map +1 -1
  69. package/dist/connectorRoutes.js +613 -62
  70. package/dist/connectorRoutes.js.map +1 -1
  71. package/dist/connectors/asana.js +9 -3
  72. package/dist/connectors/asana.js.map +1 -1
  73. package/dist/connectors/baseConnector.d.ts +16 -0
  74. package/dist/connectors/baseConnector.js +2 -0
  75. package/dist/connectors/baseConnector.js.map +1 -1
  76. package/dist/connectors/caldiy.js +34 -0
  77. package/dist/connectors/caldiy.js.map +1 -1
  78. package/dist/connectors/confluence.js +9 -2
  79. package/dist/connectors/confluence.js.map +1 -1
  80. package/dist/connectors/connectorActivity.d.ts +24 -0
  81. package/dist/connectors/connectorActivity.js +32 -0
  82. package/dist/connectors/connectorActivity.js.map +1 -0
  83. package/dist/connectors/connectorRedirectUri.js +22 -2
  84. package/dist/connectors/connectorRedirectUri.js.map +1 -1
  85. package/dist/connectors/connectorRegistry.d.ts +0 -3
  86. package/dist/connectors/connectorRegistry.js +8 -8
  87. package/dist/connectors/connectorRegistry.js.map +1 -1
  88. package/dist/connectors/datadog.js +8 -1
  89. package/dist/connectors/datadog.js.map +1 -1
  90. package/dist/connectors/discord.js +4 -3
  91. package/dist/connectors/discord.js.map +1 -1
  92. package/dist/connectors/elasticsearch.js +22 -0
  93. package/dist/connectors/elasticsearch.js.map +1 -1
  94. package/dist/connectors/github.d.ts +38 -0
  95. package/dist/connectors/github.js +91 -5
  96. package/dist/connectors/github.js.map +1 -1
  97. package/dist/connectors/gitlab.js +19 -16
  98. package/dist/connectors/gitlab.js.map +1 -1
  99. package/dist/connectors/gmail.d.ts +5 -0
  100. package/dist/connectors/gmail.js +53 -11
  101. package/dist/connectors/gmail.js.map +1 -1
  102. package/dist/connectors/googleCalendar.js +5 -4
  103. package/dist/connectors/googleCalendar.js.map +1 -1
  104. package/dist/connectors/googleDocs.js +7 -6
  105. package/dist/connectors/googleDocs.js.map +1 -1
  106. package/dist/connectors/googleDrive.js +15 -8
  107. package/dist/connectors/googleDrive.js.map +1 -1
  108. package/dist/connectors/grafana.js +39 -3
  109. package/dist/connectors/grafana.js.map +1 -1
  110. package/dist/connectors/jira.d.ts +1 -1
  111. package/dist/connectors/jira.js +19 -4
  112. package/dist/connectors/jira.js.map +1 -1
  113. package/dist/connectors/linear.js +2 -2
  114. package/dist/connectors/linear.js.map +1 -1
  115. package/dist/connectors/mcpClient.d.ts +29 -1
  116. package/dist/connectors/mcpClient.js +114 -44
  117. package/dist/connectors/mcpClient.js.map +1 -1
  118. package/dist/connectors/mcpOAuth.d.ts +1 -0
  119. package/dist/connectors/mcpOAuth.js +49 -4
  120. package/dist/connectors/mcpOAuth.js.map +1 -1
  121. package/dist/connectors/monday.js +5 -4
  122. package/dist/connectors/monday.js.map +1 -1
  123. package/dist/connectors/mongodb.js +32 -5
  124. package/dist/connectors/mongodb.js.map +1 -1
  125. package/dist/connectors/notion.d.ts +1 -1
  126. package/dist/connectors/notion.js +22 -6
  127. package/dist/connectors/notion.js.map +1 -1
  128. package/dist/connectors/oauthError.d.ts +17 -0
  129. package/dist/connectors/oauthError.js +50 -0
  130. package/dist/connectors/oauthError.js.map +1 -0
  131. package/dist/connectors/postgres.d.ts +7 -0
  132. package/dist/connectors/postgres.js +32 -2
  133. package/dist/connectors/postgres.js.map +1 -1
  134. package/dist/connectors/posthog.js +26 -0
  135. package/dist/connectors/posthog.js.map +1 -1
  136. package/dist/connectors/redis.d.ts +1 -0
  137. package/dist/connectors/redis.js +47 -20
  138. package/dist/connectors/redis.js.map +1 -1
  139. package/dist/connectors/salesforce.js +66 -5
  140. package/dist/connectors/salesforce.js.map +1 -1
  141. package/dist/connectors/sentry.js +2 -2
  142. package/dist/connectors/sentry.js.map +1 -1
  143. package/dist/connectors/slack.js +37 -14
  144. package/dist/connectors/slack.js.map +1 -1
  145. package/dist/connectors/snowflake.js +24 -0
  146. package/dist/connectors/snowflake.js.map +1 -1
  147. package/dist/connectors/stripe.js +9 -2
  148. package/dist/connectors/stripe.js.map +1 -1
  149. package/dist/connectors/supabase.js +34 -0
  150. package/dist/connectors/supabase.js.map +1 -1
  151. package/dist/connectors/tokenStorage.d.ts +20 -0
  152. package/dist/connectors/tokenStorage.js +196 -64
  153. package/dist/connectors/tokenStorage.js.map +1 -1
  154. package/dist/connectors/woocommerce.js +34 -0
  155. package/dist/connectors/woocommerce.js.map +1 -1
  156. package/dist/copilot/parseIntent.d.ts +58 -0
  157. package/dist/copilot/parseIntent.js +149 -0
  158. package/dist/copilot/parseIntent.js.map +1 -0
  159. package/dist/decisionReplay.d.ts +8 -6
  160. package/dist/decisionReplay.js +35 -11
  161. package/dist/decisionReplay.js.map +1 -1
  162. package/dist/decisionTraceLog.d.ts +9 -0
  163. package/dist/decisionTraceLog.js +6 -0
  164. package/dist/decisionTraceLog.js.map +1 -1
  165. package/dist/drivers/claude/api.js +49 -7
  166. package/dist/drivers/claude/api.js.map +1 -1
  167. package/dist/drivers/claude/envSanitizer.d.ts +9 -1
  168. package/dist/drivers/claude/envSanitizer.js +41 -3
  169. package/dist/drivers/claude/envSanitizer.js.map +1 -1
  170. package/dist/drivers/claude/streamParser.d.ts +13 -0
  171. package/dist/drivers/claude/streamParser.js.map +1 -1
  172. package/dist/drivers/claude/subprocess.js +131 -16
  173. package/dist/drivers/claude/subprocess.js.map +1 -1
  174. package/dist/drivers/claude/subprocessSettings.d.ts +1 -1
  175. package/dist/drivers/claude/subprocessSettings.js +18 -4
  176. package/dist/drivers/claude/subprocessSettings.js.map +1 -1
  177. package/dist/drivers/gemini/index.d.ts +13 -0
  178. package/dist/drivers/gemini/index.js +211 -67
  179. package/dist/drivers/gemini/index.js.map +1 -1
  180. package/dist/drivers/local/index.d.ts +2 -17
  181. package/dist/drivers/local/index.js +5 -92
  182. package/dist/drivers/local/index.js.map +1 -1
  183. package/dist/drivers/openai/index.js +69 -9
  184. package/dist/drivers/openai/index.js.map +1 -1
  185. package/dist/drivers/outputCap.d.ts +27 -0
  186. package/dist/drivers/outputCap.js +50 -0
  187. package/dist/drivers/outputCap.js.map +1 -0
  188. package/dist/embeddings/cosine.d.ts +23 -0
  189. package/dist/embeddings/cosine.js +59 -0
  190. package/dist/embeddings/cosine.js.map +1 -0
  191. package/dist/embeddings/index.d.ts +19 -0
  192. package/dist/embeddings/index.js +35 -0
  193. package/dist/embeddings/index.js.map +1 -0
  194. package/dist/embeddings/localEmbeddings.d.ts +29 -0
  195. package/dist/embeddings/localEmbeddings.js +103 -0
  196. package/dist/embeddings/localEmbeddings.js.map +1 -0
  197. package/dist/embeddings/localEndpoints.d.ts +24 -0
  198. package/dist/embeddings/localEndpoints.js +37 -0
  199. package/dist/embeddings/localEndpoints.js.map +1 -0
  200. package/dist/embeddings/types.d.ts +32 -0
  201. package/dist/embeddings/types.js +12 -0
  202. package/dist/embeddings/types.js.map +1 -0
  203. package/dist/featureFlags.d.ts +18 -0
  204. package/dist/featureFlags.js +32 -0
  205. package/dist/featureFlags.js.map +1 -1
  206. package/dist/fp/automationInterpreter.js +118 -39
  207. package/dist/fp/automationInterpreter.js.map +1 -1
  208. package/dist/fp/automationProgram.d.ts +10 -0
  209. package/dist/fp/automationProgram.js.map +1 -1
  210. package/dist/fp/automationState.d.ts +6 -0
  211. package/dist/fp/automationState.js +38 -0
  212. package/dist/fp/automationState.js.map +1 -1
  213. package/dist/fp/commandDescription.d.ts +6 -0
  214. package/dist/fp/commandDescription.js +18 -5
  215. package/dist/fp/commandDescription.js.map +1 -1
  216. package/dist/fp/interpreterContext.d.ts +16 -5
  217. package/dist/fp/interpreterContext.js +59 -3
  218. package/dist/fp/interpreterContext.js.map +1 -1
  219. package/dist/fp/policyParser.js +18 -8
  220. package/dist/fp/policyParser.js.map +1 -1
  221. package/dist/haltPushDispatch.d.ts +4 -0
  222. package/dist/haltPushDispatch.js +7 -22
  223. package/dist/haltPushDispatch.js.map +1 -1
  224. package/dist/inboxRoutes.js +2 -2
  225. package/dist/inboxRoutes.js.map +1 -1
  226. package/dist/index.js +672 -135
  227. package/dist/index.js.map +1 -1
  228. package/dist/installGuard.js +6 -0
  229. package/dist/installGuard.js.map +1 -1
  230. package/dist/localEndpointGuard.d.ts +25 -0
  231. package/dist/localEndpointGuard.js +101 -0
  232. package/dist/localEndpointGuard.js.map +1 -0
  233. package/dist/mcpRoutes.js +1 -1
  234. package/dist/mcpRoutes.js.map +1 -1
  235. package/dist/oauth.d.ts +13 -0
  236. package/dist/oauth.js +53 -9
  237. package/dist/oauth.js.map +1 -1
  238. package/dist/orchestrator/childBridgeClient.d.ts +7 -0
  239. package/dist/orchestrator/childBridgeClient.js +42 -1
  240. package/dist/orchestrator/childBridgeClient.js.map +1 -1
  241. package/dist/orchestrator/orchestratorBridge.d.ts +33 -0
  242. package/dist/orchestrator/orchestratorBridge.js +75 -9
  243. package/dist/orchestrator/orchestratorBridge.js.map +1 -1
  244. package/dist/patchworkConfig.d.ts +4 -0
  245. package/dist/patchworkConfig.js +33 -4
  246. package/dist/patchworkConfig.js.map +1 -1
  247. package/dist/probe.js +39 -5
  248. package/dist/probe.js.map +1 -1
  249. package/dist/recipeOrchestration.d.ts +59 -0
  250. package/dist/recipeOrchestration.js +314 -60
  251. package/dist/recipeOrchestration.js.map +1 -1
  252. package/dist/recipeRoutes.d.ts +93 -0
  253. package/dist/recipeRoutes.js +664 -27
  254. package/dist/recipeRoutes.js.map +1 -1
  255. package/dist/recipes/RecipeOrchestrator.d.ts +14 -0
  256. package/dist/recipes/RecipeOrchestrator.js +42 -2
  257. package/dist/recipes/RecipeOrchestrator.js.map +1 -1
  258. package/dist/recipes/agentExecutor.d.ts +51 -2
  259. package/dist/recipes/agentExecutor.js +86 -13
  260. package/dist/recipes/agentExecutor.js.map +1 -1
  261. package/dist/recipes/chainedRunner.d.ts +111 -3
  262. package/dist/recipes/chainedRunner.js +440 -45
  263. package/dist/recipes/chainedRunner.js.map +1 -1
  264. package/dist/recipes/compiler.js +42 -29
  265. package/dist/recipes/compiler.js.map +1 -1
  266. package/dist/recipes/connectorPreflight.js +31 -0
  267. package/dist/recipes/connectorPreflight.js.map +1 -1
  268. package/dist/recipes/dependencyGraph.d.ts +16 -0
  269. package/dist/recipes/dependencyGraph.js +37 -2
  270. package/dist/recipes/dependencyGraph.js.map +1 -1
  271. package/dist/recipes/eventTriggerPrograms.d.ts +36 -0
  272. package/dist/recipes/eventTriggerPrograms.js +158 -0
  273. package/dist/recipes/eventTriggerPrograms.js.map +1 -0
  274. package/dist/recipes/githubInstallSource.d.ts +9 -2
  275. package/dist/recipes/githubInstallSource.js +36 -6
  276. package/dist/recipes/githubInstallSource.js.map +1 -1
  277. package/dist/recipes/haltCategory.d.ts +10 -0
  278. package/dist/recipes/haltCategory.js +11 -1
  279. package/dist/recipes/haltCategory.js.map +1 -1
  280. package/dist/recipes/idempotencyKey.d.ts +30 -3
  281. package/dist/recipes/idempotencyKey.js +89 -5
  282. package/dist/recipes/idempotencyKey.js.map +1 -1
  283. package/dist/recipes/installer.js +12 -35
  284. package/dist/recipes/installer.js.map +1 -1
  285. package/dist/recipes/judgeVerdict.d.ts +11 -1
  286. package/dist/recipes/judgeVerdict.js +47 -7
  287. package/dist/recipes/judgeVerdict.js.map +1 -1
  288. package/dist/recipes/names.d.ts +5 -0
  289. package/dist/recipes/names.js +10 -5
  290. package/dist/recipes/names.js.map +1 -1
  291. package/dist/recipes/parser.js +74 -10
  292. package/dist/recipes/parser.js.map +1 -1
  293. package/dist/recipes/pricing/costRouter.d.ts +43 -0
  294. package/dist/recipes/pricing/costRouter.js +44 -0
  295. package/dist/recipes/pricing/costRouter.js.map +1 -0
  296. package/dist/recipes/pricing/priceTable.d.ts +76 -0
  297. package/dist/recipes/pricing/priceTable.js +144 -0
  298. package/dist/recipes/pricing/priceTable.js.map +1 -0
  299. package/dist/recipes/replayRun.js +5 -2
  300. package/dist/recipes/replayRun.js.map +1 -1
  301. package/dist/recipes/resolveRecipePath.js +15 -1
  302. package/dist/recipes/resolveRecipePath.js.map +1 -1
  303. package/dist/recipes/runBudget.d.ts +93 -32
  304. package/dist/recipes/runBudget.js +213 -49
  305. package/dist/recipes/runBudget.js.map +1 -1
  306. package/dist/recipes/runRegistry.d.ts +32 -0
  307. package/dist/recipes/runRegistry.js +54 -0
  308. package/dist/recipes/runRegistry.js.map +1 -0
  309. package/dist/recipes/scheduler.js +6 -2
  310. package/dist/recipes/scheduler.js.map +1 -1
  311. package/dist/recipes/schema.d.ts +59 -6
  312. package/dist/recipes/schemaGenerator.d.ts +9 -0
  313. package/dist/recipes/schemaGenerator.js +446 -77
  314. package/dist/recipes/schemaGenerator.js.map +1 -1
  315. package/dist/recipes/simulation/aggregateRunRisk.d.ts +46 -0
  316. package/dist/recipes/simulation/aggregateRunRisk.js +120 -0
  317. package/dist/recipes/simulation/aggregateRunRisk.js.map +1 -0
  318. package/dist/recipes/simulation/costProjector.d.ts +32 -0
  319. package/dist/recipes/simulation/costProjector.js +194 -0
  320. package/dist/recipes/simulation/costProjector.js.map +1 -0
  321. package/dist/recipes/simulation/sideEffects.d.ts +32 -0
  322. package/dist/recipes/simulation/sideEffects.js +62 -0
  323. package/dist/recipes/simulation/sideEffects.js.map +1 -0
  324. package/dist/recipes/simulation/simulate.d.ts +36 -0
  325. package/dist/recipes/simulation/simulate.js +264 -0
  326. package/dist/recipes/simulation/simulate.js.map +1 -0
  327. package/dist/recipes/simulation/simulateMockedRun.d.ts +52 -0
  328. package/dist/recipes/simulation/simulateMockedRun.js +84 -0
  329. package/dist/recipes/simulation/simulateMockedRun.js.map +1 -0
  330. package/dist/recipes/simulation/synthesizeMockedOutputs.d.ts +31 -0
  331. package/dist/recipes/simulation/synthesizeMockedOutputs.js +50 -0
  332. package/dist/recipes/simulation/synthesizeMockedOutputs.js.map +1 -0
  333. package/dist/recipes/simulation/types.d.ts +198 -0
  334. package/dist/recipes/simulation/types.js +30 -0
  335. package/dist/recipes/simulation/types.js.map +1 -0
  336. package/dist/recipes/stepObservation.d.ts +12 -0
  337. package/dist/recipes/stepObservation.js +21 -1
  338. package/dist/recipes/stepObservation.js.map +1 -1
  339. package/dist/recipes/toolRegistry.js +61 -24
  340. package/dist/recipes/toolRegistry.js.map +1 -1
  341. package/dist/recipes/tools/airtable.d.ts +15 -0
  342. package/dist/recipes/tools/airtable.js +240 -0
  343. package/dist/recipes/tools/airtable.js.map +1 -0
  344. package/dist/recipes/tools/caldiy.d.ts +13 -0
  345. package/dist/recipes/tools/caldiy.js +215 -0
  346. package/dist/recipes/tools/caldiy.js.map +1 -0
  347. package/dist/recipes/tools/circleci.d.ts +10 -0
  348. package/dist/recipes/tools/circleci.js +204 -0
  349. package/dist/recipes/tools/circleci.js.map +1 -0
  350. package/dist/recipes/tools/cloudflare.d.ts +13 -0
  351. package/dist/recipes/tools/cloudflare.js +211 -0
  352. package/dist/recipes/tools/cloudflare.js.map +1 -0
  353. package/dist/recipes/tools/confluence.js +11 -10
  354. package/dist/recipes/tools/confluence.js.map +1 -1
  355. package/dist/recipes/tools/datadog.js +13 -12
  356. package/dist/recipes/tools/datadog.js.map +1 -1
  357. package/dist/recipes/tools/docs.d.ts +18 -0
  358. package/dist/recipes/tools/docs.js +95 -0
  359. package/dist/recipes/tools/docs.js.map +1 -0
  360. package/dist/recipes/tools/elasticsearch.d.ts +11 -0
  361. package/dist/recipes/tools/elasticsearch.js +157 -0
  362. package/dist/recipes/tools/elasticsearch.js.map +1 -0
  363. package/dist/recipes/tools/fanOut.js +4 -4
  364. package/dist/recipes/tools/fanOut.js.map +1 -1
  365. package/dist/recipes/tools/figma.d.ts +12 -0
  366. package/dist/recipes/tools/figma.js +195 -0
  367. package/dist/recipes/tools/figma.js.map +1 -0
  368. package/dist/recipes/tools/file.js +43 -22
  369. package/dist/recipes/tools/file.js.map +1 -1
  370. package/dist/recipes/tools/github.js +162 -5
  371. package/dist/recipes/tools/github.js.map +1 -1
  372. package/dist/recipes/tools/gmail.js +45 -33
  373. package/dist/recipes/tools/gmail.js.map +1 -1
  374. package/dist/recipes/tools/grafana.d.ts +11 -0
  375. package/dist/recipes/tools/grafana.js +216 -0
  376. package/dist/recipes/tools/grafana.js.map +1 -0
  377. package/dist/recipes/tools/http.d.ts +1 -1
  378. package/dist/recipes/tools/http.js +10 -28
  379. package/dist/recipes/tools/http.js.map +1 -1
  380. package/dist/recipes/tools/hubspot.js +13 -12
  381. package/dist/recipes/tools/hubspot.js.map +1 -1
  382. package/dist/recipes/tools/index.d.ts +28 -0
  383. package/dist/recipes/tools/index.js +28 -0
  384. package/dist/recipes/tools/index.js.map +1 -1
  385. package/dist/recipes/tools/intercom.js +11 -10
  386. package/dist/recipes/tools/intercom.js.map +1 -1
  387. package/dist/recipes/tools/jira.js +13 -0
  388. package/dist/recipes/tools/jira.js.map +1 -1
  389. package/dist/recipes/tools/meetingNotes.js +2 -2
  390. package/dist/recipes/tools/monday.d.ts +22 -0
  391. package/dist/recipes/tools/monday.js +242 -0
  392. package/dist/recipes/tools/monday.js.map +1 -0
  393. package/dist/recipes/tools/mongodb.d.ts +19 -0
  394. package/dist/recipes/tools/mongodb.js +194 -0
  395. package/dist/recipes/tools/mongodb.js.map +1 -0
  396. package/dist/recipes/tools/notion.js +11 -10
  397. package/dist/recipes/tools/notion.js.map +1 -1
  398. package/dist/recipes/tools/obsidian.d.ts +15 -0
  399. package/dist/recipes/tools/obsidian.js +173 -0
  400. package/dist/recipes/tools/obsidian.js.map +1 -0
  401. package/dist/recipes/tools/outcomes.d.ts +15 -0
  402. package/dist/recipes/tools/outcomes.js +111 -0
  403. package/dist/recipes/tools/outcomes.js.map +1 -0
  404. package/dist/recipes/tools/paystack.d.ts +11 -0
  405. package/dist/recipes/tools/paystack.js +212 -0
  406. package/dist/recipes/tools/paystack.js.map +1 -0
  407. package/dist/recipes/tools/pipedrive.d.ts +16 -0
  408. package/dist/recipes/tools/pipedrive.js +234 -0
  409. package/dist/recipes/tools/pipedrive.js.map +1 -0
  410. package/dist/recipes/tools/postgres.d.ts +15 -0
  411. package/dist/recipes/tools/postgres.js +186 -0
  412. package/dist/recipes/tools/postgres.js.map +1 -0
  413. package/dist/recipes/tools/posthog.d.ts +16 -0
  414. package/dist/recipes/tools/posthog.js +219 -0
  415. package/dist/recipes/tools/posthog.js.map +1 -0
  416. package/dist/recipes/tools/redis.d.ts +9 -0
  417. package/dist/recipes/tools/redis.js +141 -0
  418. package/dist/recipes/tools/redis.js.map +1 -0
  419. package/dist/recipes/tools/resend.d.ts +8 -0
  420. package/dist/recipes/tools/resend.js +153 -0
  421. package/dist/recipes/tools/resend.js.map +1 -0
  422. package/dist/recipes/tools/salesforce.d.ts +16 -0
  423. package/dist/recipes/tools/salesforce.js +184 -0
  424. package/dist/recipes/tools/salesforce.js.map +1 -0
  425. package/dist/recipes/tools/sendgrid.d.ts +9 -0
  426. package/dist/recipes/tools/sendgrid.js +175 -0
  427. package/dist/recipes/tools/sendgrid.js.map +1 -0
  428. package/dist/recipes/tools/shopify.d.ts +16 -0
  429. package/dist/recipes/tools/shopify.js +266 -0
  430. package/dist/recipes/tools/shopify.js.map +1 -0
  431. package/dist/recipes/tools/snowflake.d.ts +16 -0
  432. package/dist/recipes/tools/snowflake.js +173 -0
  433. package/dist/recipes/tools/snowflake.js.map +1 -0
  434. package/dist/recipes/tools/stripe.js +13 -12
  435. package/dist/recipes/tools/stripe.js.map +1 -1
  436. package/dist/recipes/tools/supabase.d.ts +9 -0
  437. package/dist/recipes/tools/supabase.js +133 -0
  438. package/dist/recipes/tools/supabase.js.map +1 -0
  439. package/dist/recipes/tools/todoist.d.ts +15 -0
  440. package/dist/recipes/tools/todoist.js +228 -0
  441. package/dist/recipes/tools/todoist.js.map +1 -0
  442. package/dist/recipes/tools/twilio.d.ts +11 -0
  443. package/dist/recipes/tools/twilio.js +180 -0
  444. package/dist/recipes/tools/twilio.js.map +1 -0
  445. package/dist/recipes/tools/vercel.d.ts +9 -0
  446. package/dist/recipes/tools/vercel.js +146 -0
  447. package/dist/recipes/tools/vercel.js.map +1 -0
  448. package/dist/recipes/tools/webflow.d.ts +11 -0
  449. package/dist/recipes/tools/webflow.js +244 -0
  450. package/dist/recipes/tools/webflow.js.map +1 -0
  451. package/dist/recipes/tools/woocommerce.d.ts +18 -0
  452. package/dist/recipes/tools/woocommerce.js +260 -0
  453. package/dist/recipes/tools/woocommerce.js.map +1 -0
  454. package/dist/recipes/tools/wrapConnectorExecute.d.ts +25 -0
  455. package/dist/recipes/tools/wrapConnectorExecute.js +37 -0
  456. package/dist/recipes/tools/wrapConnectorExecute.js.map +1 -0
  457. package/dist/recipes/tools/zendesk.js +11 -10
  458. package/dist/recipes/tools/zendesk.js.map +1 -1
  459. package/dist/recipes/triggerVars.d.ts +15 -0
  460. package/dist/recipes/triggerVars.js +57 -0
  461. package/dist/recipes/triggerVars.js.map +1 -0
  462. package/dist/recipes/validation.d.ts +1 -1
  463. package/dist/recipes/validation.js +536 -12
  464. package/dist/recipes/validation.js.map +1 -1
  465. package/dist/recipes/yamlPositions.d.ts +1 -1
  466. package/dist/recipes/yamlPositions.js +7 -2
  467. package/dist/recipes/yamlPositions.js.map +1 -1
  468. package/dist/recipes/yamlRunner.d.ts +216 -4
  469. package/dist/recipes/yamlRunner.js +1030 -96
  470. package/dist/recipes/yamlRunner.js.map +1 -1
  471. package/dist/recipesHttp.d.ts +5 -0
  472. package/dist/recipesHttp.js +68 -6
  473. package/dist/recipesHttp.js.map +1 -1
  474. package/dist/resources.js +14 -1
  475. package/dist/resources.js.map +1 -1
  476. package/dist/riskSignals.d.ts +42 -0
  477. package/dist/riskSignals.js +197 -0
  478. package/dist/riskSignals.js.map +1 -0
  479. package/dist/riskTier.d.ts +9 -0
  480. package/dist/riskTier.js +48 -0
  481. package/dist/riskTier.js.map +1 -1
  482. package/dist/runLog.d.ts +53 -0
  483. package/dist/runLog.js +75 -16
  484. package/dist/runLog.js.map +1 -1
  485. package/dist/schemas/recipe.v1.json +360 -16
  486. package/dist/server.d.ts +60 -0
  487. package/dist/server.js +192 -31
  488. package/dist/server.js.map +1 -1
  489. package/dist/sessionCheckpoint.js +4 -1
  490. package/dist/sessionCheckpoint.js.map +1 -1
  491. package/dist/sessionDetail.d.ts +43 -0
  492. package/dist/sessionDetail.js +59 -0
  493. package/dist/sessionDetail.js.map +1 -0
  494. package/dist/settingsEnv.d.ts +47 -0
  495. package/dist/settingsEnv.js +88 -0
  496. package/dist/settingsEnv.js.map +1 -0
  497. package/dist/streamableHttp.js +44 -10
  498. package/dist/streamableHttp.js.map +1 -1
  499. package/dist/ta/backtest/abnday.d.ts +53 -0
  500. package/dist/ta/backtest/abnday.js +123 -0
  501. package/dist/ta/backtest/abnday.js.map +1 -0
  502. package/dist/ta/backtest/directional.d.ts +48 -0
  503. package/dist/ta/backtest/directional.js +103 -0
  504. package/dist/ta/backtest/directional.js.map +1 -0
  505. package/dist/ta/backtest/fundx.d.ts +67 -0
  506. package/dist/ta/backtest/fundx.js +264 -0
  507. package/dist/ta/backtest/fundx.js.map +1 -0
  508. package/dist/ta/backtest/fvg.d.ts +62 -0
  509. package/dist/ta/backtest/fvg.js +236 -0
  510. package/dist/ta/backtest/fvg.js.map +1 -0
  511. package/dist/ta/backtest/ichimoku.d.ts +41 -0
  512. package/dist/ta/backtest/ichimoku.js +146 -0
  513. package/dist/ta/backtest/ichimoku.js.map +1 -0
  514. package/dist/ta/backtest/ingest.d.ts +20 -0
  515. package/dist/ta/backtest/ingest.js +104 -0
  516. package/dist/ta/backtest/ingest.js.map +1 -0
  517. package/dist/ta/backtest/msb.d.ts +49 -0
  518. package/dist/ta/backtest/msb.js +162 -0
  519. package/dist/ta/backtest/msb.js.map +1 -0
  520. package/dist/ta/backtest/scoring.d.ts +33 -0
  521. package/dist/ta/backtest/scoring.js +82 -0
  522. package/dist/ta/backtest/scoring.js.map +1 -0
  523. package/dist/ta/backtest/summary.d.ts +20 -0
  524. package/dist/ta/backtest/summary.js +42 -0
  525. package/dist/ta/backtest/summary.js.map +1 -0
  526. package/dist/ta/backtest/tsmom.d.ts +72 -0
  527. package/dist/ta/backtest/tsmom.js +202 -0
  528. package/dist/ta/backtest/tsmom.js.map +1 -0
  529. package/dist/ta/backtest/volsq.d.ts +34 -0
  530. package/dist/ta/backtest/volsq.js +154 -0
  531. package/dist/ta/backtest/volsq.js.map +1 -0
  532. package/dist/ta/backtest/walkForward.d.ts +45 -0
  533. package/dist/ta/backtest/walkForward.js +136 -0
  534. package/dist/ta/backtest/walkForward.js.map +1 -0
  535. package/dist/ta/cycles.d.ts +15 -0
  536. package/dist/ta/cycles.js +31 -0
  537. package/dist/ta/cycles.js.map +1 -0
  538. package/dist/ta/desk/accrualEmitter.d.ts +59 -0
  539. package/dist/ta/desk/accrualEmitter.js +136 -0
  540. package/dist/ta/desk/accrualEmitter.js.map +1 -0
  541. package/dist/ta/desk/cellBacktest.d.ts +179 -0
  542. package/dist/ta/desk/cellBacktest.js +514 -0
  543. package/dist/ta/desk/cellBacktest.js.map +1 -0
  544. package/dist/ta/desk/cells/wpMaRejection.d.ts +49 -0
  545. package/dist/ta/desk/cells/wpMaRejection.js +141 -0
  546. package/dist/ta/desk/cells/wpMaRejection.js.map +1 -0
  547. package/dist/ta/desk/cells/wpVolumeClimax.d.ts +57 -0
  548. package/dist/ta/desk/cells/wpVolumeClimax.js +193 -0
  549. package/dist/ta/desk/cells/wpVolumeClimax.js.map +1 -0
  550. package/dist/ta/desk/collectors.d.ts +18 -0
  551. package/dist/ta/desk/collectors.js +450 -0
  552. package/dist/ta/desk/collectors.js.map +1 -0
  553. package/dist/ta/desk/contract.d.ts +51 -0
  554. package/dist/ta/desk/contract.js +261 -0
  555. package/dist/ta/desk/contract.js.map +1 -0
  556. package/dist/ta/desk/deskLedger.d.ts +36 -0
  557. package/dist/ta/desk/deskLedger.js +239 -0
  558. package/dist/ta/desk/deskLedger.js.map +1 -0
  559. package/dist/ta/desk/liqTape.d.ts +37 -0
  560. package/dist/ta/desk/liqTape.js +99 -0
  561. package/dist/ta/desk/liqTape.js.map +1 -0
  562. package/dist/ta/desk/post.d.ts +20 -0
  563. package/dist/ta/desk/post.js +65 -0
  564. package/dist/ta/desk/post.js.map +1 -0
  565. package/dist/ta/desk/render.d.ts +25 -0
  566. package/dist/ta/desk/render.js +398 -0
  567. package/dist/ta/desk/render.js.map +1 -0
  568. package/dist/ta/desk/surfaces.d.ts +216 -0
  569. package/dist/ta/desk/surfaces.js +472 -0
  570. package/dist/ta/desk/surfaces.js.map +1 -0
  571. package/dist/ta/desk/types.d.ts +174 -0
  572. package/dist/ta/desk/types.js +104 -0
  573. package/dist/ta/desk/types.js.map +1 -0
  574. package/dist/ta/index.d.ts +23 -0
  575. package/dist/ta/index.js +54 -0
  576. package/dist/ta/index.js.map +1 -0
  577. package/dist/ta/ledger.d.ts +44 -0
  578. package/dist/ta/ledger.js +95 -0
  579. package/dist/ta/ledger.js.map +1 -0
  580. package/dist/ta/levels.d.ts +21 -0
  581. package/dist/ta/levels.js +41 -0
  582. package/dist/ta/levels.js.map +1 -0
  583. package/dist/ta/swings.d.ts +30 -0
  584. package/dist/ta/swings.js +83 -0
  585. package/dist/ta/swings.js.map +1 -0
  586. package/dist/ta/types.d.ts +81 -0
  587. package/dist/ta/types.js +20 -0
  588. package/dist/ta/types.js.map +1 -0
  589. package/dist/telemetry.js +20 -9
  590. package/dist/telemetry.js.map +1 -1
  591. package/dist/tokenUsageTracker.d.ts +2 -1
  592. package/dist/tokenUsageTracker.js +38 -20
  593. package/dist/tokenUsageTracker.js.map +1 -1
  594. package/dist/tools/contextBundle.js +13 -9
  595. package/dist/tools/contextBundle.js.map +1 -1
  596. package/dist/tools/ctxGetTaskContext.js +8 -3
  597. package/dist/tools/ctxGetTaskContext.js.map +1 -1
  598. package/dist/tools/ctxQueryTraces.d.ts +18 -1
  599. package/dist/tools/ctxQueryTraces.js +176 -27
  600. package/dist/tools/ctxQueryTraces.js.map +1 -1
  601. package/dist/tools/enrichCommit.js +5 -2
  602. package/dist/tools/enrichCommit.js.map +1 -1
  603. package/dist/tools/getDependencyTree.js +2 -2
  604. package/dist/tools/getDependencyTree.js.map +1 -1
  605. package/dist/tools/getDiagnostics.js +3 -0
  606. package/dist/tools/getDiagnostics.js.map +1 -1
  607. package/dist/tools/getDocumentSymbols.js +5 -1
  608. package/dist/tools/getDocumentSymbols.js.map +1 -1
  609. package/dist/tools/getGitHotspots.js +12 -1
  610. package/dist/tools/getGitHotspots.js.map +1 -1
  611. package/dist/tools/getGitLog.js +5 -2
  612. package/dist/tools/getGitLog.js.map +1 -1
  613. package/dist/tools/getGitStatus.js +6 -1
  614. package/dist/tools/getGitStatus.js.map +1 -1
  615. package/dist/tools/getProjectContext.js +3 -1
  616. package/dist/tools/getProjectContext.js.map +1 -1
  617. package/dist/tools/getToolCapabilities.js +39 -4
  618. package/dist/tools/getToolCapabilities.js.map +1 -1
  619. package/dist/tools/gitWrite.js +12 -3
  620. package/dist/tools/gitWrite.js.map +1 -1
  621. package/dist/tools/github/composite.d.ts +1 -1
  622. package/dist/tools/github/composite.js +7 -7
  623. package/dist/tools/github/composite.js.map +1 -1
  624. package/dist/tools/github/pr.d.ts +6 -6
  625. package/dist/tools/github/pr.js +18 -11
  626. package/dist/tools/github/pr.js.map +1 -1
  627. package/dist/tools/httpClient.js +55 -3
  628. package/dist/tools/httpClient.js.map +1 -1
  629. package/dist/tools/index.d.ts +2 -1
  630. package/dist/tools/index.js +19 -12
  631. package/dist/tools/index.js.map +1 -1
  632. package/dist/tools/lsp.d.ts +6 -0
  633. package/dist/tools/lsp.js +81 -12
  634. package/dist/tools/lsp.js.map +1 -1
  635. package/dist/tools/previewEdit.js +16 -1
  636. package/dist/tools/previewEdit.js.map +1 -1
  637. package/dist/tools/resumeClaudeTask.js +17 -0
  638. package/dist/tools/resumeClaudeTask.js.map +1 -1
  639. package/dist/tools/searchAndReplace.js +9 -5
  640. package/dist/tools/searchAndReplace.js.map +1 -1
  641. package/dist/tools/searchTools.d.ts +26 -0
  642. package/dist/tools/searchTools.js +42 -2
  643. package/dist/tools/searchTools.js.map +1 -1
  644. package/dist/tools/terminal.js +23 -51
  645. package/dist/tools/terminal.js.map +1 -1
  646. package/dist/tools/transaction.d.ts +9 -1
  647. package/dist/tools/transaction.js +59 -4
  648. package/dist/tools/transaction.js.map +1 -1
  649. package/dist/tools/utils.d.ts +16 -0
  650. package/dist/tools/utils.js +77 -7
  651. package/dist/tools/utils.js.map +1 -1
  652. package/dist/transport.d.ts +31 -0
  653. package/dist/transport.js +117 -14
  654. package/dist/transport.js.map +1 -1
  655. package/dist/wireHaltPushDispatch.js +12 -0
  656. package/dist/wireHaltPushDispatch.js.map +1 -1
  657. package/dist/workerGateDecisionLog.d.ts +141 -0
  658. package/dist/workerGateDecisionLog.js +361 -0
  659. package/dist/workerGateDecisionLog.js.map +1 -0
  660. package/dist/workers/actionClass.d.ts +38 -0
  661. package/dist/workers/actionClass.js +155 -0
  662. package/dist/workers/actionClass.js.map +1 -0
  663. package/dist/workers/backtest.d.ts +68 -0
  664. package/dist/workers/backtest.js +113 -0
  665. package/dist/workers/backtest.js.map +1 -0
  666. package/dist/workers/contextRisk.d.ts +35 -0
  667. package/dist/workers/contextRisk.js +20 -0
  668. package/dist/workers/contextRisk.js.map +1 -0
  669. package/dist/workers/contextRiskScorer.d.ts +48 -0
  670. package/dist/workers/contextRiskScorer.js +94 -0
  671. package/dist/workers/contextRiskScorer.js.map +1 -0
  672. package/dist/workers/graduation.d.ts +61 -0
  673. package/dist/workers/graduation.js +112 -0
  674. package/dist/workers/graduation.js.map +1 -0
  675. package/dist/workers/outcomeStore.d.ts +98 -0
  676. package/dist/workers/outcomeStore.js +146 -0
  677. package/dist/workers/outcomeStore.js.map +1 -0
  678. package/dist/workers/outcomesCli.d.ts +34 -0
  679. package/dist/workers/outcomesCli.js +91 -0
  680. package/dist/workers/outcomesCli.js.map +1 -0
  681. package/dist/workers/runWorkerShadow.d.ts +90 -0
  682. package/dist/workers/runWorkerShadow.js +323 -0
  683. package/dist/workers/runWorkerShadow.js.map +1 -0
  684. package/dist/workers/shadowGate.d.ts +30 -0
  685. package/dist/workers/shadowGate.js +58 -0
  686. package/dist/workers/shadowGate.js.map +1 -0
  687. package/dist/workers/shadowObserver.d.ts +165 -0
  688. package/dist/workers/shadowObserver.js +203 -0
  689. package/dist/workers/shadowObserver.js.map +1 -0
  690. package/dist/workers/shadowReport.d.ts +16 -0
  691. package/dist/workers/shadowReport.js +61 -0
  692. package/dist/workers/shadowReport.js.map +1 -0
  693. package/dist/workers/shadowRun.d.ts +38 -0
  694. package/dist/workers/shadowRun.js +44 -0
  695. package/dist/workers/shadowRun.js.map +1 -0
  696. package/dist/workers/trustLevel.d.ts +82 -0
  697. package/dist/workers/trustLevel.js +100 -0
  698. package/dist/workers/trustLevel.js.map +1 -0
  699. package/dist/workers/worker.d.ts +49 -0
  700. package/dist/workers/worker.js +88 -0
  701. package/dist/workers/worker.js.map +1 -0
  702. package/dist/workers/workerGate.d.ts +101 -0
  703. package/dist/workers/workerGate.js +210 -0
  704. package/dist/workers/workerGate.js.map +1 -0
  705. package/dist/workers/workerLevelStore.d.ts +33 -0
  706. package/dist/workers/workerLevelStore.js +87 -0
  707. package/dist/workers/workerLevelStore.js.map +1 -0
  708. package/dist/workers/workerLoader.d.ts +7 -0
  709. package/dist/workers/workerLoader.js +31 -0
  710. package/dist/workers/workerLoader.js.map +1 -0
  711. package/dist/writeFileAtomic.js +40 -13
  712. package/dist/writeFileAtomic.js.map +1 -1
  713. package/package.json +14 -6
  714. package/scripts/mcp-stdio-shim.cjs +247 -87
  715. package/templates/CLAUDE.bridge.md +1 -1
  716. package/templates/recipes/dependency-bump.yaml +33 -0
  717. package/templates/recipes/incident-to-pr.yaml +187 -0
  718. package/templates/recipes/outcome-ingester.yaml +53 -0
  719. package/templates/recipes/release-notes.yaml +30 -0
  720. package/templates/recipes/triage-failing-tests-autofile.yaml +152 -0
  721. package/templates/recipes/triage-failing-tests.yaml +38 -0
  722. package/templates/workers/dependency-upkeep.worker.yaml +26 -0
  723. package/templates/workers/release-notes.worker.yaml +17 -0
  724. package/templates/workers/test-guardian.worker.yaml +24 -0
  725. package/deploy/README.md +0 -172
  726. package/deploy/bootstrap-new-vps.sh +0 -364
  727. package/deploy/bootstrap-vps.sh +0 -192
  728. package/deploy/claude-ide-bridge.service.template +0 -67
  729. package/deploy/claude-ide-bridge@.service +0 -31
  730. package/deploy/deploy-dashboard.sh +0 -198
  731. package/deploy/deploy-landing.sh +0 -136
  732. package/deploy/ecosystem.config.js.example +0 -36
  733. package/deploy/install-vps-service.sh +0 -240
  734. package/deploy/macos/README.md +0 -153
  735. package/deploy/macos/com.patchwork.bridge.plist.template +0 -54
  736. package/deploy/macos/com.patchwork.tunnel.plist.template +0 -76
  737. package/deploy/macos/install-mac-bridge.sh +0 -244
  738. package/deploy/macos/uninstall-mac-bridge.sh +0 -22
  739. 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
+ };