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,141 @@
1
+ /**
2
+ * wp-ma-rejection @1d — Phase 4 second battery cell.
3
+ *
4
+ * FROZEN PARAMS (pre-registered in docs/qumo-desk-precommit.md §6.2;
5
+ * any change must bump methodVersion and resets accrual to zero):
6
+ *
7
+ * MA_BARS = 20 rolling bars for simple moving average
8
+ * MIN_WICK_DEPTH = 0.002 minimum wick depth below MA as fraction of close
9
+ * (avoids hairline MA touches; 0.002 = 0.2%)
10
+ * OUTCOME_WINDOW_BARS = 10 bars the card races before push/unscorable
11
+ * R_MULTIPLIER = 1.0 rRef = close + 1× stop-distance (1R long only)
12
+ * UNIVERSE = ["BTCUSDT", "ETHUSDT"] always-listed only
13
+ * METHOD_VERSION = "wpmr-1d-v1"
14
+ *
15
+ * Hypothesis: a daily bar that wicks below the 20-bar SMA but closes back above
16
+ * it (MA support rejection) reverts at a rate greater than chance over a 10-bar
17
+ * outcome window. LONG only — tests the support-rejection hypothesis.
18
+ *
19
+ * Look-ahead self-test: runs once at module import. Mutates future bars and
20
+ * asserts the fire decision is unchanged (detector reads only the fire bar + prior).
21
+ */
22
+ // ── Frozen params ─────────────────────────────────────────────────────────────
23
+ export const METHOD_VERSION = "wpmr-1d-v1";
24
+ export const PERMUTATION_SEED = 777;
25
+ export const NULL_SEED = 4242;
26
+ export const MA_BARS = 20;
27
+ export const MIN_WICK_DEPTH = 0.002;
28
+ export const OUTCOME_WINDOW_BARS = 10;
29
+ export const R_MULTIPLIER = 1.0;
30
+ export const UNIVERSE = ["BTCUSDT", "ETHUSDT"];
31
+ // ── Detector ──────────────────────────────────────────────────────────────────
32
+ /**
33
+ * Run on the latest CLOSED candle (candles[n-1]). Returns false if no rejection,
34
+ * or the card geometry if a MA-rejection bar fires.
35
+ *
36
+ * Fire condition (LONG only):
37
+ * 1. fire bar's low < sma20 (wick pierced below the MA)
38
+ * 2. fire bar's close > sma20 (closed back above the MA = rejection)
39
+ * 3. (sma20 - low) / close ≥ 0.002 (min 0.2% wick depth — avoids hairline touches)
40
+ */
41
+ export function detectMaRejection(candles) {
42
+ if (candles.length < MA_BARS + 1)
43
+ return false;
44
+ const bar = candles[candles.length - 1];
45
+ // 20-bar SMA over the PRIOR MA_BARS bars (excludes the current bar).
46
+ const smaSlice = candles.slice(-(MA_BARS + 1), -1);
47
+ const sma20 = smaSlice.reduce((s, c) => s + c.close, 0) / smaSlice.length;
48
+ // Fire conditions.
49
+ if (bar.low >= sma20)
50
+ return false; // wick must pierce below MA
51
+ if (bar.close <= sma20)
52
+ return false; // must close back above MA
53
+ const wickDepth = (sma20 - bar.low) / bar.close;
54
+ if (wickDepth < MIN_WICK_DEPTH)
55
+ return false; // hairline touch filter
56
+ const stopDistance = bar.close - bar.low;
57
+ if (stopDistance <= 0)
58
+ return false;
59
+ return {
60
+ direction: "long",
61
+ lastClose: bar.close,
62
+ invalidation: bar.low,
63
+ rRef: bar.close + R_MULTIPLIER * stopDistance,
64
+ };
65
+ }
66
+ // ── Look-ahead self-test (build gate, runs once at import) ────────────────────
67
+ function runLookAheadSelfTest() {
68
+ const BASE_PRICE = 50000;
69
+ const SMA_BASE = 49500; // MA below price so rejection can fire
70
+ // Build a series where the final bar rejects off the SMA.
71
+ const candles = [];
72
+ for (let i = 0; i < MA_BARS + 1; i++) {
73
+ const isRejection = i === MA_BARS;
74
+ const close = isRejection ? BASE_PRICE : SMA_BASE; // prior bars near SMA base
75
+ const low = isRejection ? SMA_BASE * 0.99 : SMA_BASE * 0.98; // rejection bar: low dips below SMA
76
+ const high = isRejection ? BASE_PRICE * 1.01 : SMA_BASE * 1.01;
77
+ candles.push({
78
+ openTime: i * 86_400_000,
79
+ open: close,
80
+ high,
81
+ low,
82
+ close,
83
+ volume: 100,
84
+ closeTime: i * 86_400_000 + 86_399_999,
85
+ });
86
+ }
87
+ // The SMA of prior bars ≈ SMA_BASE. The fire bar's low = SMA_BASE * 0.99 < SMA_BASE,
88
+ // close = BASE_PRICE > SMA_BASE. Should fire.
89
+ const baseline = detectMaRejection(candles);
90
+ if (!baseline) {
91
+ throw new Error(`wp-ma-rejection look-ahead self-test FAILED: synthetic rejection bar did not fire — ` +
92
+ `check MA_BARS (${MA_BARS}) and MIN_WICK_DEPTH (${MIN_WICK_DEPTH})`);
93
+ }
94
+ // Append corrupted future bars (prices ×1.37) then re-run on same slice — result must match.
95
+ const corrupted = [...candles];
96
+ for (let j = 0; j < 5; j++) {
97
+ corrupted.push({
98
+ openTime: (MA_BARS + 1 + j) * 86_400_000,
99
+ open: BASE_PRICE * 1.37,
100
+ high: BASE_PRICE * 1.37 * 1.05,
101
+ low: BASE_PRICE * 1.37 * 0.95,
102
+ close: BASE_PRICE * 1.37,
103
+ volume: 100,
104
+ closeTime: (MA_BARS + 1 + j) * 86_400_000 + 86_399_999,
105
+ });
106
+ }
107
+ const afterCorruption = detectMaRejection(corrupted.slice(0, MA_BARS + 1));
108
+ if (!afterCorruption) {
109
+ throw new Error(`wp-ma-rejection look-ahead self-test FAILED: detector fired on baseline but not after appending future bars`);
110
+ }
111
+ if (afterCorruption.direction !== baseline.direction ||
112
+ afterCorruption.lastClose !== baseline.lastClose) {
113
+ throw new Error(`wp-ma-rejection look-ahead self-test FAILED: detector result changed after appending corrupted future bars`);
114
+ }
115
+ }
116
+ runLookAheadSelfTest();
117
+ // ── CellDetector export ───────────────────────────────────────────────────────
118
+ export const wpMaRejectionDetector = {
119
+ cellType: "wp-ma-rejection",
120
+ timeframe: "1d",
121
+ assets: UNIVERSE,
122
+ outcomeWindowBars: OUTCOME_WINDOW_BARS,
123
+ detect: detectMaRejection,
124
+ };
125
+ // ── CellSpec for cellBacktest harness ─────────────────────────────────────────
126
+ /**
127
+ * FAMILY_N bumps from 1 → 2 when this cell joins the battery.
128
+ * Both cells must use the updated FAMILY_N for the shared Holm correction.
129
+ */
130
+ export const FAMILY_N = 2; // frozen Phase-4 cell count (wp-volume-climax + wp-ma-rejection)
131
+ export const wpMaRejectionSpec = {
132
+ cellName: "wp-ma-rejection",
133
+ methodVersion: METHOD_VERSION,
134
+ timeframe: "1d",
135
+ universe: UNIVERSE,
136
+ outcomeWindowBars: OUTCOME_WINDOW_BARS,
137
+ nullKind: "matched-date-dart",
138
+ seeds: { rng: 101, permutation: PERMUTATION_SEED, null: NULL_SEED },
139
+ detect: detectMaRejection,
140
+ };
141
+ //# sourceMappingURL=wpMaRejection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wpMaRejection.js","sourceRoot":"","sources":["../../../../src/ta/desk/cells/wpMaRejection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAMH,iFAAiF;AAEjF,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;AAC9B,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,CAAC;AAC1B,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC;AAChC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,SAAS,EAAE,SAAS,CAAU,CAAC;AAExD,iFAAiF;AAEjF;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAiB;IACjD,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAE/C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;IAEzC,qEAAqE;IACrE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IAE1E,mBAAmB;IACnB,IAAI,GAAG,CAAC,GAAG,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,4BAA4B;IAChE,IAAI,GAAG,CAAC,KAAK,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,2BAA2B;IACjE,MAAM,SAAS,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;IAChD,IAAI,SAAS,GAAG,cAAc;QAAE,OAAO,KAAK,CAAC,CAAC,wBAAwB;IAEtE,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;IACzC,IAAI,YAAY,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,OAAO;QACL,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,GAAG,CAAC,KAAK;QACpB,YAAY,EAAE,GAAG,CAAC,GAAG;QACrB,IAAI,EAAE,GAAG,CAAC,KAAK,GAAG,YAAY,GAAG,YAAY;KAC9C,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF,SAAS,oBAAoB;IAC3B,MAAM,UAAU,GAAG,KAAK,CAAC;IACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,uCAAuC;IAE/D,0DAA0D;IAC1D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,CAAC,KAAK,OAAO,CAAC;QAClC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,2BAA2B;QAC9E,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,oCAAoC;QACjG,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,CAAC,GAAG,UAAU;YACxB,IAAI,EAAE,KAAK;YACX,IAAI;YACJ,GAAG;YACH,KAAK;YACL,MAAM,EAAE,GAAG;YACX,SAAS,EAAE,CAAC,GAAG,UAAU,GAAG,UAAU;SACvC,CAAC,CAAC;IACL,CAAC;IAED,qFAAqF;IACrF,8CAA8C;IAC9C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,sFAAsF;YACpF,kBAAkB,OAAO,yBAAyB,cAAc,GAAG,CACtE,CAAC;IACJ,CAAC;IAED,6FAA6F;IAC7F,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC;YACb,QAAQ,EAAE,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU;YACxC,IAAI,EAAE,UAAU,GAAG,IAAI;YACvB,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI;YAC9B,GAAG,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI;YAC7B,KAAK,EAAE,UAAU,GAAG,IAAI;YACxB,MAAM,EAAE,GAAG;YACX,SAAS,EAAE,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,GAAG,UAAU;SACvD,CAAC,CAAC;IACL,CAAC;IAED,MAAM,eAAe,GAAG,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,6GAA6G,CAC9G,CAAC;IACJ,CAAC;IACD,IACE,eAAe,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS;QAChD,eAAe,CAAC,SAAS,KAAK,QAAQ,CAAC,SAAS,EAChD,CAAC;QACD,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,oBAAoB,EAAE,CAAC;AAEvB,iFAAiF;AAEjF,MAAM,CAAC,MAAM,qBAAqB,GAAiB;IACjD,QAAQ,EAAE,iBAAiB;IAC3B,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,QAAQ;IAChB,iBAAiB,EAAE,mBAAmB;IACtC,MAAM,EAAE,iBAAiB;CAC1B,CAAC;AAEF,iFAAiF;AAEjF;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,iEAAiE;AAE5F,MAAM,CAAC,MAAM,iBAAiB,GAAa;IACzC,QAAQ,EAAE,iBAAiB;IAC3B,aAAa,EAAE,cAAc;IAC7B,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,QAAQ;IAClB,iBAAiB,EAAE,mBAAmB;IACtC,QAAQ,EAAE,mBAAmB;IAC7B,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE;IACnE,MAAM,EAAE,iBAAiB;CAC1B,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * wp-volume-climax @1d — Phase 1 first proving cell.
3
+ *
4
+ * FROZEN PARAMS (pre-registered in docs/qumo-desk-precommit.md §3 Phase-1
5
+ * addendum; any change must bump methodVersion and resets accrual to zero):
6
+ *
7
+ * VOL_SMA_BARS = 20 rolling bars for average-volume baseline
8
+ * VOL_MULTIPLIER = 2.5 volume must be ≥ 2.5× the SMA to qualify
9
+ * REJECTION_THRESHOLD = 0.60 close must be in the outer 40% of bar range
10
+ * (< 40% from the low = long setup;
11
+ * > 60% from the low = short setup)
12
+ * OUTCOME_WINDOW_BARS = 10 bars the card races before push/unscorable
13
+ * R_MULTIPLIER = 1.0 rRef = close ± 1× stop-distance
14
+ * UNIVERSE = ["BTCUSDT", "ETHUSDT"] always-listed only
15
+ * METHOD_VERSION = "wpvc-1d-v1"
16
+ *
17
+ * Hypothesis: after a volume-climax bar that closes in the exhaustion-end of
18
+ * its range (buyers/sellers exhausted at extreme volume), price reacts in the
19
+ * opposite direction at a rate greater than chance.
20
+ *
21
+ * Look-ahead self-test: candles beyond the fire bar are mutated ×1.37; the
22
+ * OUTCOME-LABEL (win/loss/push) for the fire event must change (else the
23
+ * detector leaks future data into its fire decision — it is safe, only the
24
+ * outcome check is expected to change). Run once at module load.
25
+ *
26
+ * Phase 1 status: ACCRUE-ONLY. GRADED is code-impossible until Phase 2
27
+ * ships the full permutation harness. All emitted rows count toward the
28
+ * gate accumulation.
29
+ */
30
+ import type { Candle } from "../../types.js";
31
+ import type { CellDetector, DetectResult } from "../accrualEmitter.js";
32
+ export declare const METHOD_VERSION = "wpvc-1d-v1";
33
+ export declare const PERMUTATION_SEED = 777;
34
+ export declare const NULL_SEED = 4242;
35
+ export declare const VOL_SMA_BARS = 20;
36
+ export declare const VOL_MULTIPLIER = 2.5;
37
+ export declare const REJECTION_THRESHOLD = 0.6;
38
+ export declare const OUTCOME_WINDOW_BARS = 10;
39
+ export declare const R_MULTIPLIER = 1;
40
+ export declare const UNIVERSE: readonly ["BTCUSDT", "ETHUSDT"];
41
+ /**
42
+ * Run on the latest CLOSED candle (candles[n-1]). Returns false if no climax,
43
+ * or the card geometry if a volume-climax bar fires.
44
+ *
45
+ * @param candles Chronological 1d candles; last element = latest closed bar.
46
+ */
47
+ export declare function detectVolumeClimax(candles: Candle[]): DetectResult;
48
+ export declare const wpVolumeClimaxDetector: CellDetector;
49
+ import type { CellSpec } from "../cellBacktest.js";
50
+ /**
51
+ * The frozen CellSpec for the Phase-2 backtest harness.
52
+ * Seeds are pinned from the design doc: permutation=777, null=4242, rng=101.
53
+ * familyN=1 for Phase 2 (only wp-volume-climax in the battery).
54
+ * Bump when adding more cells to the registry.
55
+ */
56
+ export declare const FAMILY_N = 2;
57
+ export declare const wpVolumeClimaxSpec: CellSpec;
@@ -0,0 +1,193 @@
1
+ /**
2
+ * wp-volume-climax @1d — Phase 1 first proving cell.
3
+ *
4
+ * FROZEN PARAMS (pre-registered in docs/qumo-desk-precommit.md §3 Phase-1
5
+ * addendum; any change must bump methodVersion and resets accrual to zero):
6
+ *
7
+ * VOL_SMA_BARS = 20 rolling bars for average-volume baseline
8
+ * VOL_MULTIPLIER = 2.5 volume must be ≥ 2.5× the SMA to qualify
9
+ * REJECTION_THRESHOLD = 0.60 close must be in the outer 40% of bar range
10
+ * (< 40% from the low = long setup;
11
+ * > 60% from the low = short setup)
12
+ * OUTCOME_WINDOW_BARS = 10 bars the card races before push/unscorable
13
+ * R_MULTIPLIER = 1.0 rRef = close ± 1× stop-distance
14
+ * UNIVERSE = ["BTCUSDT", "ETHUSDT"] always-listed only
15
+ * METHOD_VERSION = "wpvc-1d-v1"
16
+ *
17
+ * Hypothesis: after a volume-climax bar that closes in the exhaustion-end of
18
+ * its range (buyers/sellers exhausted at extreme volume), price reacts in the
19
+ * opposite direction at a rate greater than chance.
20
+ *
21
+ * Look-ahead self-test: candles beyond the fire bar are mutated ×1.37; the
22
+ * OUTCOME-LABEL (win/loss/push) for the fire event must change (else the
23
+ * detector leaks future data into its fire decision — it is safe, only the
24
+ * outcome check is expected to change). Run once at module load.
25
+ *
26
+ * Phase 1 status: ACCRUE-ONLY. GRADED is code-impossible until Phase 2
27
+ * ships the full permutation harness. All emitted rows count toward the
28
+ * gate accumulation.
29
+ */
30
+ // ── Frozen params ─────────────────────────────────────────────────────────────
31
+ export const METHOD_VERSION = "wpvc-1d-v1";
32
+ export const PERMUTATION_SEED = 777; // frozen — shared with cellBacktest default
33
+ export const NULL_SEED = 4242; // frozen — null-arm RNG seed
34
+ export const VOL_SMA_BARS = 20;
35
+ export const VOL_MULTIPLIER = 2.5;
36
+ export const REJECTION_THRESHOLD = 0.6;
37
+ export const OUTCOME_WINDOW_BARS = 10;
38
+ export const R_MULTIPLIER = 1.0;
39
+ export const UNIVERSE = ["BTCUSDT", "ETHUSDT"];
40
+ // ── Detector ──────────────────────────────────────────────────────────────────
41
+ /**
42
+ * Run on the latest CLOSED candle (candles[n-1]). Returns false if no climax,
43
+ * or the card geometry if a volume-climax bar fires.
44
+ *
45
+ * @param candles Chronological 1d candles; last element = latest closed bar.
46
+ */
47
+ export function detectVolumeClimax(candles) {
48
+ if (candles.length < VOL_SMA_BARS + 1)
49
+ return false;
50
+ const bar = candles[candles.length - 1];
51
+ const range = bar.high - bar.low;
52
+ if (range <= 0)
53
+ return false;
54
+ // Volume SMA over the prior VOL_SMA_BARS bars (excludes the current bar).
55
+ const smaSlice = candles.slice(-(VOL_SMA_BARS + 1), -1);
56
+ const avgVol = smaSlice.reduce((s, c) => s + c.volume, 0) / smaSlice.length;
57
+ if (avgVol <= 0)
58
+ return false;
59
+ // Volume gate: current bar must be ≥ VOL_MULTIPLIER × SMA.
60
+ if (bar.volume < VOL_MULTIPLIER * avgVol)
61
+ return false;
62
+ // Rejection position: close relative to range.
63
+ const closePct = (bar.close - bar.low) / range; // 0 = close at low, 1 = at high
64
+ if (closePct <= 1 - REJECTION_THRESHOLD) {
65
+ // Close in the LOWER 40% — sellers exhausted → long setup.
66
+ const stopDistance = bar.close - bar.low;
67
+ if (stopDistance <= 0)
68
+ return false;
69
+ return {
70
+ direction: "long",
71
+ lastClose: bar.close,
72
+ invalidation: bar.low,
73
+ rRef: bar.close + R_MULTIPLIER * stopDistance,
74
+ };
75
+ }
76
+ if (closePct >= REJECTION_THRESHOLD) {
77
+ // Close in the UPPER 40% — buyers exhausted → short setup.
78
+ const stopDistance = bar.high - bar.close;
79
+ if (stopDistance <= 0)
80
+ return false;
81
+ return {
82
+ direction: "short",
83
+ lastClose: bar.close,
84
+ invalidation: bar.high,
85
+ rRef: bar.close - R_MULTIPLIER * stopDistance,
86
+ };
87
+ }
88
+ return false;
89
+ }
90
+ // ── Look-ahead self-test (build gate, runs once at import) ────────────────────
91
+ /**
92
+ * Mutate candles AFTER index `fireIdx` by ×1.37 and verify the fire decision
93
+ * is unchanged (detector is look-ahead clean) but the OUTCOME can differ
94
+ * (future bars matter for racing). Throws on any detected look-ahead leak.
95
+ *
96
+ * "Look-ahead clean" here means: detectVolumeClimax(candles[0..fireIdx+1]) gives
97
+ * the same result whether or not we corrupt candles beyond fireIdx.
98
+ */
99
+ function runLookAheadSelfTest() {
100
+ // Synthetic candle series: 30 bars of steady price, then a volume climax bar.
101
+ const BASE_PRICE = 50000;
102
+ const BASE_VOL = 100;
103
+ const candles = [];
104
+ for (let i = 0; i < VOL_SMA_BARS + 2; i++) {
105
+ const isClimax = i === VOL_SMA_BARS + 1;
106
+ const vol = isClimax ? BASE_VOL * (VOL_MULTIPLIER + 0.5) : BASE_VOL;
107
+ const range = 1000;
108
+ const low = BASE_PRICE - range / 2;
109
+ const high = BASE_PRICE + range / 2;
110
+ // Last (climax) bar: close near the low (long exhaustion setup).
111
+ const close = isClimax ? low + range * 0.15 : BASE_PRICE;
112
+ candles.push({
113
+ openTime: i * 86_400_000,
114
+ open: BASE_PRICE,
115
+ high,
116
+ low,
117
+ close,
118
+ volume: vol,
119
+ closeTime: i * 86_400_000 + 86_399_999,
120
+ });
121
+ }
122
+ const fireIdx = candles.length - 1;
123
+ // Baseline: detector on the real candles.
124
+ const baseline = detectVolumeClimax(candles);
125
+ if (!baseline) {
126
+ throw new Error(`wp-volume-climax look-ahead self-test FAILED: synthetic climax bar did not fire — ` +
127
+ `check VOL_MULTIPLIER (${VOL_MULTIPLIER}) and REJECTION_THRESHOLD (${REJECTION_THRESHOLD})`);
128
+ }
129
+ // Corrupt future: add extra candles AFTER fireIdx with prices ×1.37, then
130
+ // re-run detector on the slice up to and including the fire bar.
131
+ // The detector only looks at candles[0..n-1] — the fire bar is always last.
132
+ // This confirms the detector does NOT read beyond its input slice.
133
+ const corrupted = candles.slice(0, fireIdx + 1).map((c, i) => {
134
+ if (i < fireIdx)
135
+ return c; // prior bars untouched
136
+ return c; // fire bar itself untouched
137
+ });
138
+ // Now append corrupted future bars (should not affect the detector):
139
+ for (let j = 0; j < 5; j++) {
140
+ corrupted.push({
141
+ openTime: (fireIdx + 1 + j) * 86_400_000,
142
+ open: BASE_PRICE * 1.37,
143
+ high: BASE_PRICE * 1.37 * 1.05,
144
+ low: BASE_PRICE * 1.37 * 0.95,
145
+ close: BASE_PRICE * 1.37,
146
+ volume: BASE_VOL,
147
+ closeTime: (fireIdx + 1 + j) * 86_400_000 + 86_399_999,
148
+ });
149
+ }
150
+ // Run on the slice ENDING at the fire bar (the extra corrupted bars are
151
+ // AFTER the series — we test the detector on exactly candles[0..fireIdx+1]).
152
+ const afterCorruption = detectVolumeClimax(corrupted.slice(0, fireIdx + 1));
153
+ if (!afterCorruption) {
154
+ throw new Error(`wp-volume-climax look-ahead self-test FAILED: detector fired on baseline ` +
155
+ `but not after appending future bars — this is a look-ahead leak`);
156
+ }
157
+ if (afterCorruption.direction !== baseline.direction ||
158
+ afterCorruption.lastClose !== baseline.lastClose) {
159
+ throw new Error(`wp-volume-climax look-ahead self-test FAILED: detector result changed after ` +
160
+ `appending corrupted future bars — look-ahead contamination detected`);
161
+ }
162
+ // Self-test PASSED.
163
+ }
164
+ // Run at module load — fails fast if the detector has a look-ahead leak.
165
+ runLookAheadSelfTest();
166
+ // ── CellDetector export ───────────────────────────────────────────────────────
167
+ export const wpVolumeClimaxDetector = {
168
+ cellType: "wp-volume-climax",
169
+ timeframe: "1d",
170
+ assets: UNIVERSE,
171
+ outcomeWindowBars: OUTCOME_WINDOW_BARS,
172
+ detect: detectVolumeClimax,
173
+ };
174
+ /**
175
+ * The frozen CellSpec for the Phase-2 backtest harness.
176
+ * Seeds are pinned from the design doc: permutation=777, null=4242, rng=101.
177
+ * familyN=1 for Phase 2 (only wp-volume-climax in the battery).
178
+ * Bump when adding more cells to the registry.
179
+ */
180
+ export const FAMILY_N = 2; // frozen Phase-4 cell count (wp-volume-climax + wp-ma-rejection)
181
+ export const wpVolumeClimaxSpec = {
182
+ cellName: "wp-volume-climax",
183
+ methodVersion: METHOD_VERSION,
184
+ timeframe: "1d",
185
+ universe: UNIVERSE,
186
+ outcomeWindowBars: OUTCOME_WINDOW_BARS,
187
+ nullKind: "matched-date-dart",
188
+ seeds: { rng: 101, permutation: PERMUTATION_SEED, null: NULL_SEED },
189
+ detect: detectVolumeClimax,
190
+ };
191
+ // ── Re-export seeds for CellSpec (they are already local consts but exporting ─
192
+ // ── for use in tests that need to verify frozen values.) ─────────────────────
193
+ //# sourceMappingURL=wpVolumeClimax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wpVolumeClimax.js","sourceRoot":"","sources":["../../../../src/ta/desk/cells/wpVolumeClimax.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * collectors.ts — free-no-key feed collectors for the QUMO honest desk.
3
+ *
4
+ * Each collector wraps fetch in try/catch → FeedResult {value|null, asOf,
5
+ * source, state}. Successful pulls append a snapshot to
6
+ * ~/.patchwork/qumo-cache/<feed>.jsonl so the ~30d-retention derivative feeds
7
+ * accrete history from launch date. NEVER fabricates a value — failure → null
8
+ * + state 'offline'.
9
+ *
10
+ * Endpoints mirror src/recipes/tools/market.ts (same hosts/shapes). Run off-box
11
+ * on the local Mac only (the VPS http tool is POST-only with no crypto tools).
12
+ * Atlas adds a NET-NEW CoinGecko /coins/categories collector (DESIGN feed #13).
13
+ */
14
+ import type { Collected } from "./types.js";
15
+ /** Collect all free feeds concurrently. Each is independently fail-soft. */
16
+ export declare function collectAll(): Promise<Collected>;
17
+ /** A fully-offline Collected — used when --dry-run wants no network. */
18
+ export declare function offlineCollected(): Collected;