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,34 @@
1
+ /**
2
+ * volsq-1 — volatility compression → expansion backtest (Phase 1c).
3
+ *
4
+ * Frozen by docs/phase1c-precommit.md (refuter-amended: LEVEL metrics only,
5
+ * the FwdRV/TrailingRV ratio is descriptive because its denominator is the
6
+ * conditioning variable; expectation registered as likely-null given GARCH
7
+ * persistence). Two squeeze variants: BBW(20,2) on daily closes and RV from
8
+ * trailing 120 4h returns.
9
+ */
10
+ import type { Candle } from "../types.js";
11
+ /** Population std (Pine ta.stdev convention) of the last `n` closes at t. */
12
+ export declare function popStdCloses(candles: Candle[], t: number, n: number): number | null;
13
+ /** BBW(t) = 4·σ20(t)/SMA20(t); null during warm-up. */
14
+ export declare function bbwSeries(candles: Candle[]): (number | null)[];
15
+ /**
16
+ * RV variant: per DAILY bar t, sample std of the trailing 120 4h log
17
+ * close-returns among 4h bars with closeTime ≤ closeTime(t), × √(365·6).
18
+ */
19
+ export declare function rv4hDaily(daily: Candle[], fourH: Candle[]): (number | null)[];
20
+ /** Trailing-252 percentile (linear interp) of series[t] history; ≥200 needed. */
21
+ export declare function trailing252Pctile(series: (number | null)[], t: number, pctile: number): number | null;
22
+ /** Percentile RANK (0-1) of series[c] within its own trailing 252 history. */
23
+ export declare function trailingRank(series: (number | null)[], c: number): number | null;
24
+ /** Squeeze events: measure[t] < trailing P10, 20-bar non-overlap. */
25
+ export declare function detectSqueezes(measure: (number | null)[]): number[];
26
+ /** Forward 20-bar realized vol (sample std of daily log returns) × √365. */
27
+ export declare function fwdRV(daily: Candle[], t: number): number | null;
28
+ /** |20-bar forward log return|. */
29
+ export declare function absRet20(daily: Candle[], t: number): number | null;
30
+ /**
31
+ * Direction sub-claim (exploratory, expected null): sign of the first daily
32
+ * close outside the walk-forward SMA20±2σ bands within 20 bars, else 0.
33
+ */
34
+ export declare function firstBreakoutDir(daily: Candle[], t: number): 1 | -1 | 0;
@@ -0,0 +1,154 @@
1
+ /**
2
+ * volsq-1 — volatility compression → expansion backtest (Phase 1c).
3
+ *
4
+ * Frozen by docs/phase1c-precommit.md (refuter-amended: LEVEL metrics only,
5
+ * the FwdRV/TrailingRV ratio is descriptive because its denominator is the
6
+ * conditioning variable; expectation registered as likely-null given GARCH
7
+ * persistence). Two squeeze variants: BBW(20,2) on daily closes and RV from
8
+ * trailing 120 4h returns.
9
+ */
10
+ import { mean, stdDev } from "./tsmom.js";
11
+ /** Population std (Pine ta.stdev convention) of the last `n` closes at t. */
12
+ export function popStdCloses(candles, t, n) {
13
+ if (t < n - 1)
14
+ return null;
15
+ const xs = [];
16
+ for (let i = t - n + 1; i <= t; i++)
17
+ xs.push(candles[i].close);
18
+ const m = mean(xs);
19
+ return Math.sqrt(xs.reduce((a, b) => a + (b - m) * (b - m), 0) / xs.length);
20
+ }
21
+ /** BBW(t) = 4·σ20(t)/SMA20(t); null during warm-up. */
22
+ export function bbwSeries(candles) {
23
+ return candles.map((_, t) => {
24
+ const sd = popStdCloses(candles, t, 20);
25
+ if (sd === null)
26
+ return null;
27
+ let s = 0;
28
+ for (let i = t - 19; i <= t; i++)
29
+ s += candles[i].close;
30
+ const sma = s / 20;
31
+ return sma !== 0 ? (4 * sd) / sma : null;
32
+ });
33
+ }
34
+ /**
35
+ * RV variant: per DAILY bar t, sample std of the trailing 120 4h log
36
+ * close-returns among 4h bars with closeTime ≤ closeTime(t), × √(365·6).
37
+ */
38
+ export function rv4hDaily(daily, fourH) {
39
+ const logr = [];
40
+ const closeTimes = [];
41
+ for (let i = 1; i < fourH.length; i++) {
42
+ logr.push(Math.log(fourH[i].close / fourH[i - 1].close));
43
+ closeTimes.push(fourH[i].closeTime);
44
+ }
45
+ const out = [];
46
+ let ptr = 0;
47
+ for (const d of daily) {
48
+ while (ptr < closeTimes.length && closeTimes[ptr] <= d.closeTime)
49
+ ptr++;
50
+ // returns [ptr-120, ptr-1] are the trailing 120 ending at/before d.close
51
+ if (ptr < 120) {
52
+ out.push(null);
53
+ continue;
54
+ }
55
+ const window = logr.slice(ptr - 120, ptr);
56
+ out.push(stdDev(window) * Math.sqrt(365 * 6));
57
+ }
58
+ return out;
59
+ }
60
+ /** Trailing-252 percentile (linear interp) of series[t] history; ≥200 needed. */
61
+ export function trailing252Pctile(series, t, pctile) {
62
+ const from = Math.max(0, t - 252);
63
+ const vals = [];
64
+ for (let i = from; i < t; i++) {
65
+ const v = series[i];
66
+ if (v !== null && v !== undefined && Number.isFinite(v))
67
+ vals.push(v);
68
+ }
69
+ if (vals.length < 200)
70
+ return null;
71
+ vals.sort((a, b) => a - b);
72
+ const idx = (vals.length - 1) * pctile;
73
+ const lo = Math.floor(idx);
74
+ const hi = Math.ceil(idx);
75
+ return vals[lo] + (vals[hi] - vals[lo]) * (idx - lo);
76
+ }
77
+ /** Percentile RANK (0-1) of series[c] within its own trailing 252 history. */
78
+ export function trailingRank(series, c) {
79
+ const v = series[c];
80
+ if (v === null || v === undefined)
81
+ return null;
82
+ const from = Math.max(0, c - 252);
83
+ let cnt = 0;
84
+ let below = 0;
85
+ for (let i = from; i < c; i++) {
86
+ const x = series[i];
87
+ if (x === null || x === undefined || !Number.isFinite(x))
88
+ continue;
89
+ cnt++;
90
+ if (x < v)
91
+ below++;
92
+ }
93
+ if (cnt < 200)
94
+ return null;
95
+ return below / cnt;
96
+ }
97
+ /** Squeeze events: measure[t] < trailing P10, 20-bar non-overlap. */
98
+ export function detectSqueezes(measure) {
99
+ const out = [];
100
+ let nextEligible = 0;
101
+ for (let t = 0; t < measure.length; t++) {
102
+ if (t < nextEligible)
103
+ continue;
104
+ const v = measure[t];
105
+ if (v === null || v === undefined)
106
+ continue;
107
+ const p10 = trailing252Pctile(measure, t, 0.1);
108
+ if (p10 === null)
109
+ continue;
110
+ if (v < p10) {
111
+ out.push(t);
112
+ nextEligible = t + 20;
113
+ }
114
+ }
115
+ return out;
116
+ }
117
+ /** Forward 20-bar realized vol (sample std of daily log returns) × √365. */
118
+ export function fwdRV(daily, t) {
119
+ if (t + 20 >= daily.length)
120
+ return null;
121
+ const rs = [];
122
+ for (let i = t + 1; i <= t + 20; i++) {
123
+ rs.push(Math.log(daily[i].close / daily[i - 1].close));
124
+ }
125
+ return stdDev(rs) * Math.sqrt(365);
126
+ }
127
+ /** |20-bar forward log return|. */
128
+ export function absRet20(daily, t) {
129
+ if (t + 20 >= daily.length)
130
+ return null;
131
+ return Math.abs(Math.log(daily[t + 20].close / daily[t].close));
132
+ }
133
+ /**
134
+ * Direction sub-claim (exploratory, expected null): sign of the first daily
135
+ * close outside the walk-forward SMA20±2σ bands within 20 bars, else 0.
136
+ */
137
+ export function firstBreakoutDir(daily, t) {
138
+ const end = Math.min(daily.length - 1, t + 20);
139
+ for (let i = t + 1; i <= end; i++) {
140
+ const sd = popStdCloses(daily, i, 20);
141
+ if (sd === null)
142
+ continue;
143
+ let s = 0;
144
+ for (let k = i - 19; k <= i; k++)
145
+ s += daily[k].close;
146
+ const sma = s / 20;
147
+ if (daily[i].close > sma + 2 * sd)
148
+ return 1;
149
+ if (daily[i].close < sma - 2 * sd)
150
+ return -1;
151
+ }
152
+ return 0;
153
+ }
154
+ //# sourceMappingURL=volsq.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"volsq.js","sourceRoot":"","sources":["../../../src/ta/backtest/volsq.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Walk-forward backtest loop.
3
+ *
4
+ * At each cursor t, only swings confirmed by t (index ≤ t − N) are visible and
5
+ * outcomes are scored strictly on bars after t — the no-lookahead guarantee.
6
+ * Detecting all swings once and filtering by index is provably identical to
7
+ * re-running detection on candles[0..t] (a fractal at i needs only bars i±N,
8
+ * all ≤ t when i ≤ t − N) and is far cheaper.
9
+ *
10
+ * Each distinct setup (a swing range, or a swing+cycle) is emitted ONCE, at the
11
+ * first cursor it appears, so correlated repeats don't inflate N.
12
+ */
13
+ import { type Candle, type Timeframe } from "../types.js";
14
+ export type ClaimType = "price-third" | "price-fifty" | "fourth-level-top" | "time-cycle";
15
+ export interface Prediction {
16
+ asset: string;
17
+ timeframe: Timeframe;
18
+ type: ClaimType;
19
+ n?: number;
20
+ cursorIndex: number;
21
+ hit: boolean;
22
+ baselineHit: boolean;
23
+ }
24
+ export interface WalkForwardOptions {
25
+ asset: string;
26
+ timeframe: Timeframe;
27
+ fractalN?: number;
28
+ /** Bars to skip at the start (need swing history). */
29
+ warmup?: number;
30
+ /** PRNG seed for reproducible random baselines. */
31
+ seed?: number;
32
+ /**
33
+ * Cycle bar-counts projected from reversals (default PIVOT_SEQUENCE — the
34
+ * ta-cycles-1 set). fibtime-1 passes the Fibonacci set; the paired-baseline
35
+ * scoring is otherwise identical.
36
+ */
37
+ cycleSequence?: readonly number[];
38
+ }
39
+ export declare function runWalkForward(candles: Candle[], opts: WalkForwardOptions): Prediction[];
40
+ /** Unconditional context stats — the "dumb" reference rates. */
41
+ export declare function contextStats(candles: Candle[], fractalN?: number): {
42
+ reversalBaseRate: number;
43
+ upRate: number;
44
+ bars: number;
45
+ };
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Walk-forward backtest loop.
3
+ *
4
+ * At each cursor t, only swings confirmed by t (index ≤ t − N) are visible and
5
+ * outcomes are scored strictly on bars after t — the no-lookahead guarantee.
6
+ * Detecting all swings once and filtering by index is provably identical to
7
+ * re-running detection on candles[0..t] (a fractal at i needs only bars i±N,
8
+ * all ≤ t when i ≤ t − N) and is far cheaper.
9
+ *
10
+ * Each distinct setup (a swing range, or a swing+cycle) is emitted ONCE, at the
11
+ * first cursor it appears, so correlated repeats don't inflate N.
12
+ */
13
+ import { computeLevels } from "../levels.js";
14
+ import { detectSwings, latestReversal, latestSwing } from "../swings.js";
15
+ import { PIVOT_SEQUENCE } from "../types.js";
16
+ import { CYCLE_WINDOW, firstTouchIndex, mulberry32, OUTCOME_WINDOW, priceLevelHit, reversalNear, } from "./scoring.js";
17
+ export function runWalkForward(candles, opts) {
18
+ const fractalN = opts.fractalN ?? 2;
19
+ const warmup = opts.warmup ?? 60;
20
+ const cycleSequence = opts.cycleSequence ?? PIVOT_SEQUENCE;
21
+ const rng = mulberry32(opts.seed ?? 0x5eed);
22
+ const preds = [];
23
+ const emitted = new Set();
24
+ const allSwings = detectSwings(candles, fractalN);
25
+ const lastCursor = candles.length - 1 - OUTCOME_WINDOW;
26
+ for (let t = warmup; t <= lastCursor; t++) {
27
+ const avail = allSwings.filter((s) => s.index <= t - fractalN);
28
+ if (avail.length === 0)
29
+ continue;
30
+ const hi = latestSwing(avail, "high");
31
+ const lo = latestSwing(avail, "low");
32
+ const rev = latestReversal(avail);
33
+ const from = t + 1;
34
+ const to = t + OUTCOME_WINDOW;
35
+ const future = candles.slice(from, to + 1);
36
+ // ── Price levels (S/R retracements + fourth-level top) ──────────────────
37
+ if (hi && lo) {
38
+ const levels = computeLevels(lo.price, hi.price);
39
+ if (levels) {
40
+ const rangeKey = `${lo.time}:${hi.time}`;
41
+ const randLevel = () => lo.price + rng() * levels.range;
42
+ // R/3 and 2R/3 retracements → price-third
43
+ for (const k of [1, 2]) {
44
+ const key = `third${k}:${rangeKey}`;
45
+ if (!emitted.has(key)) {
46
+ emitted.add(key);
47
+ const level = levels.ladder[k].price;
48
+ preds.push({
49
+ asset: opts.asset,
50
+ timeframe: opts.timeframe,
51
+ type: "price-third",
52
+ cursorIndex: t,
53
+ hit: priceLevelHit(level, future),
54
+ baselineHit: priceLevelHit(randLevel(), future),
55
+ });
56
+ }
57
+ }
58
+ // 50% retracement → price-fifty
59
+ const fiftyKey = `fifty:${rangeKey}`;
60
+ if (!emitted.has(fiftyKey)) {
61
+ emitted.add(fiftyKey);
62
+ preds.push({
63
+ asset: opts.asset,
64
+ timeframe: opts.timeframe,
65
+ type: "price-fifty",
66
+ cursorIndex: t,
67
+ hit: priceLevelHit(levels.fifty, future),
68
+ baselineHit: priceLevelHit(randLevel(), future),
69
+ });
70
+ }
71
+ // Fourth level (high + R/3): a top claim — only resolves if price
72
+ // reaches it within the window; hit = reversal at the touch.
73
+ const topKey = `top:${rangeKey}`;
74
+ if (levels.fourthLevel !== null && !emitted.has(topKey)) {
75
+ const touch = firstTouchIndex(levels.fourthLevel, candles, from, to);
76
+ if (touch !== -1) {
77
+ emitted.add(topKey);
78
+ const randIdx = from + Math.floor(rng() * (to - from + 1));
79
+ preds.push({
80
+ asset: opts.asset,
81
+ timeframe: opts.timeframe,
82
+ type: "fourth-level-top",
83
+ cursorIndex: t,
84
+ hit: reversalNear(candles, touch, fractalN),
85
+ baselineHit: reversalNear(candles, randIdx, fractalN),
86
+ });
87
+ }
88
+ }
89
+ }
90
+ }
91
+ // ── Time cycles from the latest reversal ────────────────────────────────
92
+ if (rev) {
93
+ for (const n of cycleSequence) {
94
+ const target = rev.index + n;
95
+ if (target <= t || target > to)
96
+ continue; // must land in the future window
97
+ if (target + CYCLE_WINDOW >= candles.length)
98
+ continue;
99
+ const key = `cycle:${rev.time}:${n}`;
100
+ if (emitted.has(key))
101
+ continue;
102
+ emitted.add(key);
103
+ const randIdx = from + Math.floor(rng() * (to - from + 1));
104
+ preds.push({
105
+ asset: opts.asset,
106
+ timeframe: opts.timeframe,
107
+ type: "time-cycle",
108
+ n,
109
+ cursorIndex: t,
110
+ hit: reversalNear(candles, target, fractalN),
111
+ baselineHit: reversalNear(candles, randIdx, fractalN),
112
+ });
113
+ }
114
+ }
115
+ }
116
+ return preds;
117
+ }
118
+ /** Unconditional context stats — the "dumb" reference rates. */
119
+ export function contextStats(candles, fractalN = 2) {
120
+ let reversals = 0;
121
+ let ups = 0;
122
+ let denom = 0;
123
+ for (let i = fractalN; i < candles.length - OUTCOME_WINDOW; i++) {
124
+ if (reversalNear(candles, i, fractalN))
125
+ reversals++;
126
+ if (candles[i + OUTCOME_WINDOW].close > candles[i].close)
127
+ ups++;
128
+ denom++;
129
+ }
130
+ return {
131
+ reversalBaseRate: denom ? reversals / denom : 0,
132
+ upRate: denom ? ups / denom : 0,
133
+ bars: denom,
134
+ };
135
+ }
136
+ //# sourceMappingURL=walkForward.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walkForward.js","sourceRoot":"","sources":["../../../src/ta/backtest/walkForward.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Time-cycle pivots — candle-count projection.
3
+ *
4
+ * From a confirmed swing extreme (the reversal bar, count 0), pivots project
5
+ * forward at n ∈ PIVOT_SEQUENCE closed bars: `projectedTime = swing.time +
6
+ * n · barInterval`. The method claims higher timeframes are more reliable, so
7
+ * 1d pivots are flagged `moreReliable`.
8
+ */
9
+ import { type Swing, type Timeframe, type TimePivot } from "./types.js";
10
+ /**
11
+ * Project all PIVOT_SEQUENCE pivots from a swing on the given timeframe.
12
+ * Returns every pivot (caller filters for "upcoming" when needed; the backtest
13
+ * scores all of them).
14
+ */
15
+ export declare function projectTimePivots(swing: Swing, timeframe: Timeframe): TimePivot[];
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Time-cycle pivots — candle-count projection.
3
+ *
4
+ * From a confirmed swing extreme (the reversal bar, count 0), pivots project
5
+ * forward at n ∈ PIVOT_SEQUENCE closed bars: `projectedTime = swing.time +
6
+ * n · barInterval`. The method claims higher timeframes are more reliable, so
7
+ * 1d pivots are flagged `moreReliable`.
8
+ */
9
+ import { BAR_INTERVAL_MS, PIVOT_SEQUENCE, } from "./types.js";
10
+ /**
11
+ * Project all PIVOT_SEQUENCE pivots from a swing on the given timeframe.
12
+ * Returns every pivot (caller filters for "upcoming" when needed; the backtest
13
+ * scores all of them).
14
+ */
15
+ export function projectTimePivots(swing, timeframe) {
16
+ const interval = BAR_INTERVAL_MS[timeframe];
17
+ const moreReliable = timeframe === "1d";
18
+ return PIVOT_SEQUENCE.map((n) => {
19
+ const projectedTime = swing.time + n * interval;
20
+ return {
21
+ n,
22
+ projectedTime,
23
+ projectedDate: new Date(projectedTime).toISOString(),
24
+ fromSwingIndex: swing.index,
25
+ fromSwingKind: swing.kind,
26
+ fromSwingTime: swing.time,
27
+ moreReliable,
28
+ };
29
+ });
30
+ }
31
+ //# sourceMappingURL=cycles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cycles.js","sourceRoot":"","sources":["../../src/ta/cycles.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,eAAe,EACf,cAAc,GAIf,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAY,EACZ,SAAoB;IAEpB,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,SAAS,KAAK,IAAI,CAAC;IACxC,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC;QAChD,OAAO;YACL,CAAC;YACD,aAAa;YACb,aAAa,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE;YACpD,cAAc,EAAE,KAAK,CAAC,KAAK;YAC3B,aAAa,EAAE,KAAK,CAAC,IAAI;YACzB,aAAa,EAAE,KAAK,CAAC,IAAI;YACzB,YAAY;SACb,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * accrualEmitter.ts — Phase 0(b) accrual emitter for the QUMO desk.
3
+ *
4
+ * Writes dated card/level rows to ~/.patchwork/qumo-ledger.jsonl (NEVER the shared
5
+ * ta-ledger.jsonl). Called once per daily engine run after feeds are collected.
6
+ *
7
+ * Design:
8
+ * - A `CellDetector` registry maps cellType → detector function + geometry.
9
+ * - On each daily run: for each registered detector, for each asset in its universe,
10
+ * run the detector on the latest closed candle. If it fires, append a row.
11
+ * - Deduplication: one row per {cellType, asset, candleDay}. Duplicate writes
12
+ * for the same day are silently dropped (idempotent).
13
+ * - Startup check: if qumo-ledger.jsonl EXISTS (not first run) and a registered
14
+ * cell has 0 rows AND the file has at least MIN_EMITTER_RUNS rows from other
15
+ * cells, throw — the emitter is wired but not writing for that cell.
16
+ *
17
+ * Phase 0 ships with an empty registry (no detectors wired yet). Phase 1 wires
18
+ * wp-volume-climax. The infrastructure — writer, dedup, startup check — is the
19
+ * deliverable.
20
+ */
21
+ import type { Candle } from "../types.js";
22
+ export type DetectResult = false | {
23
+ direction: "long" | "short";
24
+ lastClose: number;
25
+ invalidation: number;
26
+ rRef: number;
27
+ };
28
+ /**
29
+ * A cell the emitter tracks.
30
+ * detector: given candles[0..n] where candles[n] is the latest CLOSED candle,
31
+ * return false or the card geometry.
32
+ * outcomeWindowBars: the window in bars for the card's outcome race.
33
+ * assets: universe the cell applies to (always-listed subset only).
34
+ * timeframe: "1d" etc.
35
+ */
36
+ export interface CellDetector {
37
+ cellType: string;
38
+ timeframe: "1d" | "4h";
39
+ assets: readonly string[];
40
+ outcomeWindowBars: number;
41
+ /** Run at bar-close. candles are chronological; last element is the just-closed bar. */
42
+ detect: (candles: Candle[]) => DetectResult;
43
+ }
44
+ export declare function registerDetector(d: CellDetector): void;
45
+ /**
46
+ * Startup self-check. If the ledger is large enough (MIN_EMITTER_RUNS rows) and a
47
+ * registered detector has zero rows, the emitter is broken — throw.
48
+ * Call this BEFORE emitting new rows.
49
+ */
50
+ export declare function startupCheck(): void;
51
+ /**
52
+ * Emit card rows for today's closed candles.
53
+ * Called once per daily engine run. Idempotent — duplicate rows for the same day are dropped.
54
+ *
55
+ * @param candlesByAsset Map from symbol → candles (chronological, latest closed).
56
+ * @param nowMs Current timestamp (Date.now()).
57
+ * @returns count of new rows written.
58
+ */
59
+ export declare function emitTodayCards(candlesByAsset: Map<string, Candle[]>, nowMs: number): number;
@@ -0,0 +1,136 @@
1
+ /**
2
+ * accrualEmitter.ts — Phase 0(b) accrual emitter for the QUMO desk.
3
+ *
4
+ * Writes dated card/level rows to ~/.patchwork/qumo-ledger.jsonl (NEVER the shared
5
+ * ta-ledger.jsonl). Called once per daily engine run after feeds are collected.
6
+ *
7
+ * Design:
8
+ * - A `CellDetector` registry maps cellType → detector function + geometry.
9
+ * - On each daily run: for each registered detector, for each asset in its universe,
10
+ * run the detector on the latest closed candle. If it fires, append a row.
11
+ * - Deduplication: one row per {cellType, asset, candleDay}. Duplicate writes
12
+ * for the same day are silently dropped (idempotent).
13
+ * - Startup check: if qumo-ledger.jsonl EXISTS (not first run) and a registered
14
+ * cell has 0 rows AND the file has at least MIN_EMITTER_RUNS rows from other
15
+ * cells, throw — the emitter is wired but not writing for that cell.
16
+ *
17
+ * Phase 0 ships with an empty registry (no detectors wired yet). Phase 1 wires
18
+ * wp-volume-climax. The infrastructure — writer, dedup, startup check — is the
19
+ * deliverable.
20
+ */
21
+ import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
22
+ import { homedir } from "node:os";
23
+ import path from "node:path";
24
+ import { QUMO_LEDGER } from "./deskLedger.js";
25
+ const PATCHWORK = path.join(homedir(), ".patchwork");
26
+ /** Minimum total row count in the ledger before we enforce per-cell emitter checks. */
27
+ const MIN_EMITTER_RUNS = 10;
28
+ /** The registry of registered detectors. Add via registerDetector(). */
29
+ const REGISTRY = [];
30
+ export function registerDetector(d) {
31
+ if (REGISTRY.some((r) => r.cellType === d.cellType)) {
32
+ throw new Error(`accrualEmitter: duplicate registration for cellType "${d.cellType}"`);
33
+ }
34
+ REGISTRY.push(d);
35
+ }
36
+ function isoDay(ms) {
37
+ return new Date(ms).toISOString().slice(0, 10);
38
+ }
39
+ /** Read all existing rows from qumo-ledger.jsonl. Returns empty array on missing/corrupt file. */
40
+ function readRows() {
41
+ if (!existsSync(QUMO_LEDGER))
42
+ return [];
43
+ try {
44
+ return readFileSync(QUMO_LEDGER, "utf-8")
45
+ .split("\n")
46
+ .filter(Boolean)
47
+ .map((line) => JSON.parse(line));
48
+ }
49
+ catch {
50
+ return [];
51
+ }
52
+ }
53
+ /** Append a single JSON row to qumo-ledger.jsonl (O_APPEND). */
54
+ function appendRow(row) {
55
+ mkdirSync(PATCHWORK, { recursive: true });
56
+ appendFileSync(QUMO_LEDGER, JSON.stringify(row) + "\n", {
57
+ encoding: "utf-8",
58
+ });
59
+ }
60
+ /**
61
+ * Startup self-check. If the ledger is large enough (MIN_EMITTER_RUNS rows) and a
62
+ * registered detector has zero rows, the emitter is broken — throw.
63
+ * Call this BEFORE emitting new rows.
64
+ */
65
+ export function startupCheck() {
66
+ if (REGISTRY.length === 0)
67
+ return; // nothing registered — no check needed
68
+ const rows = readRows();
69
+ if (rows.length < MIN_EMITTER_RUNS)
70
+ return; // too early to enforce
71
+ for (const det of REGISTRY) {
72
+ const typeRows = rows.filter((r) => r["type"] === det.cellType);
73
+ if (typeRows.length === 0) {
74
+ throw new Error(`accrualEmitter startup check FAILED: registered cell "${det.cellType}" has 0 rows ` +
75
+ `in ${QUMO_LEDGER} but the ledger has ${rows.length} rows (emitter not writing for this cell).`);
76
+ }
77
+ }
78
+ }
79
+ /**
80
+ * Emit card rows for today's closed candles.
81
+ * Called once per daily engine run. Idempotent — duplicate rows for the same day are dropped.
82
+ *
83
+ * @param candlesByAsset Map from symbol → candles (chronological, latest closed).
84
+ * @param nowMs Current timestamp (Date.now()).
85
+ * @returns count of new rows written.
86
+ */
87
+ export function emitTodayCards(candlesByAsset, nowMs) {
88
+ if (REGISTRY.length === 0)
89
+ return 0;
90
+ const existingRows = readRows();
91
+ // Build dedup key set: "cellType:asset:candleDay"
92
+ const seen = new Set(existingRows
93
+ .filter((r) => r["type"] && r["asset"] && r["madeAt"])
94
+ .map((r) => `${r["type"]}:${r["asset"]}:${String(r["madeAt"]).slice(0, 10)}`));
95
+ let written = 0;
96
+ for (const det of REGISTRY) {
97
+ for (const asset of det.assets) {
98
+ const candles = candlesByAsset.get(asset);
99
+ if (!candles || candles.length === 0)
100
+ continue;
101
+ const result = det.detect(candles);
102
+ if (!result)
103
+ continue;
104
+ const lastCandle = candles[candles.length - 1];
105
+ const candleDay = isoDay(lastCandle.openTime);
106
+ const dedupKey = `${det.cellType}:${asset}:${candleDay}`;
107
+ if (seen.has(dedupKey))
108
+ continue;
109
+ // Outcome window ends W bars from the fire candle's close time.
110
+ // Use closeTime + (W-1)*86400000 for daily bars (rough; exact window is
111
+ // evaluated by the backtest using candles, not wall-clock).
112
+ const barMs = det.timeframe === "1d" ? 86_400_000 : 14_400_000;
113
+ const outcomeWindowEndsAt = new Date(lastCandle.closeTime + (det.outcomeWindowBars - 1) * barMs).toISOString();
114
+ const row = {
115
+ id: `${det.cellType}-${asset}-${candleDay}`,
116
+ kind: "card",
117
+ type: det.cellType,
118
+ timeframe: det.timeframe,
119
+ asset,
120
+ direction: result.direction,
121
+ lastClose: result.lastClose,
122
+ invalidation: result.invalidation,
123
+ rRef: result.rRef,
124
+ madeAt: new Date(nowMs).toISOString(),
125
+ outcomeWindowEndsAt,
126
+ candleDay,
127
+ // methodVersion is set at registration time in the CellSpec (Phase 1+)
128
+ };
129
+ appendRow(row);
130
+ seen.add(dedupKey);
131
+ written++;
132
+ }
133
+ }
134
+ return written;
135
+ }
136
+ //# sourceMappingURL=accrualEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accrualEmitter.js","sourceRoot":"","sources":["../../../src/ta/desk/accrualEmitter.ts"],"names":[],"mappings":"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"}