@winkjs/composer 0.0.2 → 0.4.0

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 (451) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +42 -103
  3. package/package.json +53 -29
  4. package/src/composer.js +75 -0
  5. package/src/core/batch/aoo-encoder.js +148 -0
  6. package/src/core/batch/index.js +12 -0
  7. package/src/core/batch/sliding-window.js +91 -0
  8. package/src/core/codec/index.js +137 -0
  9. package/src/core/emitter-manager/mqtt/constants.js +102 -0
  10. package/src/core/emitter-manager/mqtt/emitter.js +780 -0
  11. package/src/core/emitter-manager/mqtt/index.js +190 -0
  12. package/src/core/emitter-manager/mqtt/mqtt-store.js +538 -0
  13. package/src/core/emitter-manager/terminal/assert-columns.js +98 -0
  14. package/src/core/emitter-manager/terminal/formatters.js +160 -0
  15. package/src/core/emitter-manager/terminal/index.js +341 -0
  16. package/src/core/env-vars.js +245 -0
  17. package/src/core/mqtt-protocol.js +47 -0
  18. package/src/core/partition-manager/index.js +7 -0
  19. package/src/core/partition-manager/init.js +44 -0
  20. package/src/core/partition-manager/introspect.js +15 -0
  21. package/src/core/partition-manager/publish-to.js +6 -0
  22. package/src/core/partition-manager/recompute.js +5 -0
  23. package/src/core/partition-manager/reset.js +5 -0
  24. package/src/core/partition-manager/update.js +264 -0
  25. package/src/core/partition-manager/validate-flow.js +157 -0
  26. package/src/core/semantics/digest.js +128 -0
  27. package/src/core/semantics/index.js +83 -0
  28. package/src/core/semantics/loader.js +571 -0
  29. package/src/core/semantics/schemas/asset-class-schema.js +218 -0
  30. package/src/core/semantics/schemas/column-schema.js +651 -0
  31. package/src/core/semantics/schemas/enum-schema.js +153 -0
  32. package/src/core/semantics/schemas/index.js +51 -0
  33. package/src/core/semantics/warnings.js +141 -0
  34. package/src/core/shutdown-manager/index.js +289 -0
  35. package/src/core/source-manager/csv/index.js +171 -0
  36. package/src/core/source-manager/csv/start.js +456 -0
  37. package/src/core/source-manager/mqtt/client.js +406 -0
  38. package/src/core/source-manager/mqtt/constants.js +147 -0
  39. package/src/core/source-manager/mqtt/dedup.js +244 -0
  40. package/src/core/source-manager/mqtt/index.js +260 -0
  41. package/src/core/source-manager/mqtt/status.js +546 -0
  42. package/src/core/source-manager/test-harness/comparator.js +226 -0
  43. package/src/core/source-manager/test-harness/field-generator.js +85 -0
  44. package/src/core/source-manager/test-harness/fuzz.js +87 -0
  45. package/src/core/source-manager/test-harness/index.js +115 -0
  46. package/src/core/source-manager/test-harness/prng.js +57 -0
  47. package/src/core/source-manager/test-harness/start.js +232 -0
  48. package/src/core/source-manager/test-harness/validate.js +213 -0
  49. package/src/core/storage-manager/questdb/assert-columns.js +120 -0
  50. package/src/core/storage-manager/questdb/ensure-tables.js +187 -0
  51. package/src/core/storage-manager/questdb/index.js +1251 -0
  52. package/src/core/storage-manager/questdb/persist-plan.js +488 -0
  53. package/src/core/storage-manager/questdb/writers.js +142 -0
  54. package/src/core/test-utils/sealed-record.js +80 -0
  55. package/src/core/test-utils/soak-signature.js +149 -0
  56. package/src/core/test-utils/tcp-proxy.js +106 -0
  57. package/src/core/tunable/helpers.js +254 -0
  58. package/src/core/tunable/index.js +87 -0
  59. package/src/core/utils/console-formatter/index.js +207 -0
  60. package/src/core/utils/create-smart-store-as/index.js +98 -0
  61. package/src/core/utils/create-smart-store-as/sanitize-field.js +46 -0
  62. package/src/core/utils/create-smart-store-as/smart-truncate.js +93 -0
  63. package/src/core/utils/flow/index.js +5 -0
  64. package/src/core/utils/flow/make-collision-checker.js +23 -0
  65. package/src/core/utils/flow/to-kebab.js +20 -0
  66. package/src/core/utils/half-life/index.js +111 -0
  67. package/src/core/utils/node/disable.js +11 -0
  68. package/src/core/utils/node/enable.js +11 -0
  69. package/src/core/utils/node/execute-triggers.js +40 -0
  70. package/src/core/utils/node/index.js +10 -0
  71. package/src/core/utils/node/pause.js +11 -0
  72. package/src/core/utils/node/populate-predicate-inputs.js +14 -0
  73. package/src/core/utils/node/publish-nan.js +19 -0
  74. package/src/core/utils/node/reset-predicate-inputs.js +11 -0
  75. package/src/core/utils/node/unpause.js +11 -0
  76. package/src/core/utils/node/validate-spec.js +22 -0
  77. package/src/core/utils/options/resolve-field-keyed.js +115 -0
  78. package/src/core/utils/quantize/index.js +75 -0
  79. package/src/core/utils/stats/formulas.js +67 -0
  80. package/src/core/utils/stats/index.js +3 -0
  81. package/src/core/utils/validate/composer-validators.js +141 -0
  82. package/src/core/utils/validate/helpers.js +206 -0
  83. package/src/core/utils/validate/index.js +12 -0
  84. package/src/core/utils/validate/type-validators.js +538 -0
  85. package/src/core/utils/validate/validate.js +107 -0
  86. package/src/core/utils/validate/validators.js +177 -0
  87. package/src/core/wiring/assert-handle.js +57 -0
  88. package/src/core/wiring/assert-module.js +63 -0
  89. package/src/core/wiring/index.js +5 -0
  90. package/src/core/wiring/node-type-to-module.js +17 -0
  91. package/src/core/wiring/wire-emitters.js +256 -0
  92. package/src/core/wiring/wire-linear-graph.js +25 -0
  93. package/src/core/wiring/wire-node.js +157 -0
  94. package/src/core/wiring/wire-semantics.js +173 -0
  95. package/src/core/wiring/wire-storages.js +344 -0
  96. package/src/flow/check-output-collisions.js +93 -0
  97. package/src/flow/consts.js +9 -0
  98. package/src/flow/deep-clone-spec.js +64 -0
  99. package/src/flow/driver.js +171 -0
  100. package/src/flow/expand-single-input-array.js +76 -0
  101. package/src/flow/expand-template-spec.js +93 -0
  102. package/src/flow/flow-api-schemas.js +300 -0
  103. package/src/flow/flow.js +658 -0
  104. package/src/flow/for-each.js +225 -0
  105. package/src/flow/get-signature-pattern.js +31 -0
  106. package/src/flow/get-target-array.js +46 -0
  107. package/src/flow/inspect.js +67 -0
  108. package/src/flow/load-node-module.js +81 -0
  109. package/src/flow/make-node-method.js +112 -0
  110. package/src/flow/resolve-pick-by-field.js +77 -0
  111. package/src/flow/resolve-tunables.js +76 -0
  112. package/src/flow/run.js +392 -0
  113. package/src/flow/serialize.js +161 -0
  114. package/src/flow/signatures-schema.js +222 -0
  115. package/src/flow/spec-builder.js +65 -0
  116. package/src/flow/validate-triggers.js +250 -0
  117. package/src/flow/validate.js +261 -0
  118. package/src/nodes/accumulate/index.js +21 -0
  119. package/src/nodes/accumulate/init.js +48 -0
  120. package/src/nodes/accumulate/introspect.js +123 -0
  121. package/src/nodes/accumulate/publish-to.js +34 -0
  122. package/src/nodes/accumulate/recompute.js +27 -0
  123. package/src/nodes/accumulate/reset.js +25 -0
  124. package/src/nodes/accumulate/update.js +42 -0
  125. package/src/nodes/appraise/calibrate.js +64 -0
  126. package/src/nodes/appraise/decision.js +66 -0
  127. package/src/nodes/appraise/deviation.js +140 -0
  128. package/src/nodes/appraise/index.js +23 -0
  129. package/src/nodes/appraise/init.js +165 -0
  130. package/src/nodes/appraise/integrate.js +45 -0
  131. package/src/nodes/appraise/introspect.js +352 -0
  132. package/src/nodes/appraise/publish-to.js +93 -0
  133. package/src/nodes/appraise/receptor.js +69 -0
  134. package/src/nodes/appraise/recompute.js +79 -0
  135. package/src/nodes/appraise/reset.js +53 -0
  136. package/src/nodes/appraise/update.js +130 -0
  137. package/src/nodes/archive/csv/index.js +6 -0
  138. package/src/nodes/archive/csv/init.js +36 -0
  139. package/src/nodes/archive/csv/load.js +70 -0
  140. package/src/nodes/archive/csv/reset.js +14 -0
  141. package/src/nodes/archive/csv/simple-parser.js +216 -0
  142. package/src/nodes/archive/csv/test.js +173 -0
  143. package/src/nodes/archive/csv/update.js +63 -0
  144. package/src/nodes/butterworth-filter/index.js +18 -0
  145. package/src/nodes/butterworth-filter/init.js +184 -0
  146. package/src/nodes/butterworth-filter/introspect.js +228 -0
  147. package/src/nodes/butterworth-filter/publish-to.js +21 -0
  148. package/src/nodes/butterworth-filter/recompute.js +13 -0
  149. package/src/nodes/butterworth-filter/reset.js +30 -0
  150. package/src/nodes/butterworth-filter/update.js +38 -0
  151. package/src/nodes/categorize/index.js +19 -0
  152. package/src/nodes/categorize/init.js +58 -0
  153. package/src/nodes/categorize/introspect.js +177 -0
  154. package/src/nodes/categorize/publish-to.js +29 -0
  155. package/src/nodes/categorize/recompute.js +14 -0
  156. package/src/nodes/categorize/reset.js +16 -0
  157. package/src/nodes/categorize/update.js +53 -0
  158. package/src/nodes/controller/index.js +9 -0
  159. package/src/nodes/controller/init.js +55 -0
  160. package/src/nodes/controller/introspect.js +91 -0
  161. package/src/nodes/controller/publish-to.js +8 -0
  162. package/src/nodes/controller/recompute.js +9 -0
  163. package/src/nodes/controller/reset.js +17 -0
  164. package/src/nodes/controller/update.js +63 -0
  165. package/src/nodes/diff/index.js +19 -0
  166. package/src/nodes/diff/init.js +37 -0
  167. package/src/nodes/diff/introspect.js +132 -0
  168. package/src/nodes/diff/publish-to.js +21 -0
  169. package/src/nodes/diff/recompute.js +12 -0
  170. package/src/nodes/diff/reset.js +12 -0
  171. package/src/nodes/diff/update.js +37 -0
  172. package/src/nodes/digest-moments/formulas.js +12 -0
  173. package/src/nodes/digest-moments/index.js +14 -0
  174. package/src/nodes/digest-moments/init.js +67 -0
  175. package/src/nodes/digest-moments/introspect.js +154 -0
  176. package/src/nodes/digest-moments/publish-to.js +34 -0
  177. package/src/nodes/digest-moments/recompute.js +14 -0
  178. package/src/nodes/digest-moments/reset.js +14 -0
  179. package/src/nodes/digest-moments/update.js +120 -0
  180. package/src/nodes/dwell-time-tracker/index.js +14 -0
  181. package/src/nodes/dwell-time-tracker/init.js +59 -0
  182. package/src/nodes/dwell-time-tracker/introspect.js +137 -0
  183. package/src/nodes/dwell-time-tracker/publish-to.js +22 -0
  184. package/src/nodes/dwell-time-tracker/recompute.js +8 -0
  185. package/src/nodes/dwell-time-tracker/reset.js +23 -0
  186. package/src/nodes/dwell-time-tracker/update.js +103 -0
  187. package/src/nodes/emit-if/helpers.js +94 -0
  188. package/src/nodes/emit-if/index.js +16 -0
  189. package/src/nodes/emit-if/init.js +67 -0
  190. package/src/nodes/emit-if/introspect.js +102 -0
  191. package/src/nodes/emit-if/publish-to.js +13 -0
  192. package/src/nodes/emit-if/recompute.js +12 -0
  193. package/src/nodes/emit-if/reset.js +27 -0
  194. package/src/nodes/emit-if/update.js +93 -0
  195. package/src/nodes/es-correlation/index.js +19 -0
  196. package/src/nodes/es-correlation/init.js +73 -0
  197. package/src/nodes/es-correlation/introspect.js +176 -0
  198. package/src/nodes/es-correlation/publish-to.js +32 -0
  199. package/src/nodes/es-correlation/recompute.js +56 -0
  200. package/src/nodes/es-correlation/reset.js +27 -0
  201. package/src/nodes/es-correlation/update.js +110 -0
  202. package/src/nodes/es-mean/index.js +20 -0
  203. package/src/nodes/es-mean/init.js +58 -0
  204. package/src/nodes/es-mean/introspect.js +129 -0
  205. package/src/nodes/es-mean/publish-to.js +19 -0
  206. package/src/nodes/es-mean/recompute.js +16 -0
  207. package/src/nodes/es-mean/reset.js +24 -0
  208. package/src/nodes/es-mean/update.js +69 -0
  209. package/src/nodes/es-pairwise-correlation/index.js +19 -0
  210. package/src/nodes/es-pairwise-correlation/init.js +98 -0
  211. package/src/nodes/es-pairwise-correlation/introspect.js +187 -0
  212. package/src/nodes/es-pairwise-correlation/publish-to.js +31 -0
  213. package/src/nodes/es-pairwise-correlation/recompute.js +69 -0
  214. package/src/nodes/es-pairwise-correlation/reset.js +29 -0
  215. package/src/nodes/es-pairwise-correlation/update.js +89 -0
  216. package/src/nodes/es-stats/index.js +21 -0
  217. package/src/nodes/es-stats/init.js +105 -0
  218. package/src/nodes/es-stats/introspect.js +157 -0
  219. package/src/nodes/es-stats/publish-to.js +42 -0
  220. package/src/nodes/es-stats/recompute.js +74 -0
  221. package/src/nodes/es-stats/reset.js +49 -0
  222. package/src/nodes/es-stats/update-envelope.js +44 -0
  223. package/src/nodes/es-stats/update-welford.js +64 -0
  224. package/src/nodes/es-stats/update.js +59 -0
  225. package/src/nodes/index.js +83 -0
  226. package/src/nodes/invert-flag/index.js +20 -0
  227. package/src/nodes/invert-flag/init.js +36 -0
  228. package/src/nodes/invert-flag/introspect.js +115 -0
  229. package/src/nodes/invert-flag/publish-to.js +23 -0
  230. package/src/nodes/invert-flag/recompute.js +12 -0
  231. package/src/nodes/invert-flag/reset.js +12 -0
  232. package/src/nodes/invert-flag/update.js +32 -0
  233. package/src/nodes/kalman1d/index.js +20 -0
  234. package/src/nodes/kalman1d/init.js +103 -0
  235. package/src/nodes/kalman1d/introspect.js +250 -0
  236. package/src/nodes/kalman1d/publish-to.js +34 -0
  237. package/src/nodes/kalman1d/recompute.js +23 -0
  238. package/src/nodes/kalman1d/reset.js +29 -0
  239. package/src/nodes/kalman1d/update.js +144 -0
  240. package/src/nodes/kernel/index.js +18 -0
  241. package/src/nodes/kernel/init.js +66 -0
  242. package/src/nodes/kernel/introspect.js +163 -0
  243. package/src/nodes/kernel/presets.js +74 -0
  244. package/src/nodes/kernel/publish-to.js +25 -0
  245. package/src/nodes/kernel/recompute.js +14 -0
  246. package/src/nodes/kernel/reset.js +20 -0
  247. package/src/nodes/kernel/update.js +69 -0
  248. package/src/nodes/lag/index.js +21 -0
  249. package/src/nodes/lag/init.js +87 -0
  250. package/src/nodes/lag/introspect.js +202 -0
  251. package/src/nodes/lag/publish-to.js +64 -0
  252. package/src/nodes/lag/recompute.js +33 -0
  253. package/src/nodes/lag/reset.js +49 -0
  254. package/src/nodes/lag/update.js +133 -0
  255. package/src/nodes/median3/index.js +19 -0
  256. package/src/nodes/median3/init.js +40 -0
  257. package/src/nodes/median3/introspect.js +116 -0
  258. package/src/nodes/median3/publish-to.js +21 -0
  259. package/src/nodes/median3/recompute.js +12 -0
  260. package/src/nodes/median3/reset.js +15 -0
  261. package/src/nodes/median3/update.js +58 -0
  262. package/src/nodes/moments-digest/copy-from.js +12 -0
  263. package/src/nodes/moments-digest/flush.js +17 -0
  264. package/src/nodes/moments-digest/index.js +132 -0
  265. package/src/nodes/moments-digest/init.js +84 -0
  266. package/src/nodes/moments-digest/introspect.js +122 -0
  267. package/src/nodes/moments-digest/prelude.js +28 -0
  268. package/src/nodes/moments-digest/publish-to.js +31 -0
  269. package/src/nodes/moments-digest/recompute.js +9 -0
  270. package/src/nodes/moments-digest/reset.js +20 -0
  271. package/src/nodes/moments-digest/update.js +182 -0
  272. package/src/nodes/node-names.js +67 -0
  273. package/src/nodes/page-hinkley/index.js +20 -0
  274. package/src/nodes/page-hinkley/init.js +66 -0
  275. package/src/nodes/page-hinkley/introspect.js +193 -0
  276. package/src/nodes/page-hinkley/publish-to.js +28 -0
  277. package/src/nodes/page-hinkley/recompute.js +14 -0
  278. package/src/nodes/page-hinkley/reset.js +23 -0
  279. package/src/nodes/page-hinkley/update.js +105 -0
  280. package/src/nodes/pass-if/index.js +21 -0
  281. package/src/nodes/pass-if/init.js +37 -0
  282. package/src/nodes/pass-if/introspect.js +93 -0
  283. package/src/nodes/pass-if/publish-to.js +15 -0
  284. package/src/nodes/pass-if/recompute.js +15 -0
  285. package/src/nodes/pass-if/reset.js +18 -0
  286. package/src/nodes/pass-if/update.js +37 -0
  287. package/src/nodes/persist-if/helpers.js +111 -0
  288. package/src/nodes/persist-if/index.js +9 -0
  289. package/src/nodes/persist-if/init.js +98 -0
  290. package/src/nodes/persist-if/introspect.js +106 -0
  291. package/src/nodes/persist-if/publish-to.js +21 -0
  292. package/src/nodes/persist-if/recompute.js +20 -0
  293. package/src/nodes/persist-if/reset.js +35 -0
  294. package/src/nodes/persist-if/update.js +112 -0
  295. package/src/nodes/persistence-check/index.js +14 -0
  296. package/src/nodes/persistence-check/init.js +38 -0
  297. package/src/nodes/persistence-check/introspect.js +144 -0
  298. package/src/nodes/persistence-check/publish-to.js +11 -0
  299. package/src/nodes/persistence-check/recompute.js +7 -0
  300. package/src/nodes/persistence-check/reset.js +12 -0
  301. package/src/nodes/persistence-check/update.js +57 -0
  302. package/src/nodes/process-index/index.js +15 -0
  303. package/src/nodes/process-index/init.js +48 -0
  304. package/src/nodes/process-index/introspect.js +182 -0
  305. package/src/nodes/process-index/publish-to.js +29 -0
  306. package/src/nodes/process-index/recompute.js +8 -0
  307. package/src/nodes/process-index/reset.js +8 -0
  308. package/src/nodes/process-index/update.js +75 -0
  309. package/src/nodes/ratio/index.js +14 -0
  310. package/src/nodes/ratio/init.js +37 -0
  311. package/src/nodes/ratio/introspect.js +155 -0
  312. package/src/nodes/ratio/publish-to.js +15 -0
  313. package/src/nodes/ratio/recompute.js +7 -0
  314. package/src/nodes/ratio/reset.js +7 -0
  315. package/src/nodes/ratio/update.js +47 -0
  316. package/src/nodes/sanitize/index.js +82 -0
  317. package/src/nodes/sanitize/init.js +82 -0
  318. package/src/nodes/sanitize/introspect.js +194 -0
  319. package/src/nodes/sanitize/publish-to.js +15 -0
  320. package/src/nodes/sanitize/recompute.js +8 -0
  321. package/src/nodes/sanitize/reset.js +14 -0
  322. package/src/nodes/sanitize/update.js +102 -0
  323. package/src/nodes/spike-guard/index.js +14 -0
  324. package/src/nodes/spike-guard/init.js +47 -0
  325. package/src/nodes/spike-guard/introspect.js +130 -0
  326. package/src/nodes/spike-guard/publish-to.js +35 -0
  327. package/src/nodes/spike-guard/recompute.js +14 -0
  328. package/src/nodes/spike-guard/reset.js +19 -0
  329. package/src/nodes/spike-guard/update.js +89 -0
  330. package/src/nodes/sse-emitter/index.js +7 -0
  331. package/src/nodes/sse-emitter/init.js +105 -0
  332. package/src/nodes/sse-emitter/introspect.js +134 -0
  333. package/src/nodes/sse-emitter/publish-to.js +6 -0
  334. package/src/nodes/sse-emitter/recompute.js +16 -0
  335. package/src/nodes/sse-emitter/reset.js +19 -0
  336. package/src/nodes/sse-emitter/update.js +69 -0
  337. package/src/nodes/sse-emitter/utils/broadcast-heartbeat.js +36 -0
  338. package/src/nodes/sse-emitter/utils/build-message.js +31 -0
  339. package/src/nodes/sse-emitter/utils/connection-manager.js +45 -0
  340. package/src/nodes/sse-emitter/utils/endpoint-initializer.js +20 -0
  341. package/src/nodes/sse-emitter/utils/health-monitor.js +38 -0
  342. package/src/nodes/sse-emitter/utils/qos-handler.js +41 -0
  343. package/src/nodes/state-change-detector/helpers.js +35 -0
  344. package/src/nodes/state-change-detector/index.js +12 -0
  345. package/src/nodes/state-change-detector/init.js +56 -0
  346. package/src/nodes/state-change-detector/introspect.js +146 -0
  347. package/src/nodes/state-change-detector/publish-to.js +20 -0
  348. package/src/nodes/state-change-detector/recompute.js +6 -0
  349. package/src/nodes/state-change-detector/reset.js +20 -0
  350. package/src/nodes/state-change-detector/update.js +97 -0
  351. package/src/nodes/sw-stats/index.js +14 -0
  352. package/src/nodes/sw-stats/init.js +51 -0
  353. package/src/nodes/sw-stats/introspect.js +131 -0
  354. package/src/nodes/sw-stats/publish-to.js +45 -0
  355. package/src/nodes/sw-stats/recompute.js +33 -0
  356. package/src/nodes/sw-stats/reset.js +15 -0
  357. package/src/nodes/sw-stats/update.js +39 -0
  358. package/src/nodes/swing-watch/index.js +17 -0
  359. package/src/nodes/swing-watch/init.js +144 -0
  360. package/src/nodes/swing-watch/introspect.js +188 -0
  361. package/src/nodes/swing-watch/publish-to.js +53 -0
  362. package/src/nodes/swing-watch/recompute.js +22 -0
  363. package/src/nodes/swing-watch/reset.js +55 -0
  364. package/src/nodes/swing-watch/update.js +767 -0
  365. package/src/nodes/tally/index.js +15 -0
  366. package/src/nodes/tally/init.js +32 -0
  367. package/src/nodes/tally/introspect.js +116 -0
  368. package/src/nodes/tally/publish-to.js +28 -0
  369. package/src/nodes/tally/recompute.js +10 -0
  370. package/src/nodes/tally/reset.js +10 -0
  371. package/src/nodes/tally/update.js +44 -0
  372. package/src/nodes/threshold/index.js +14 -0
  373. package/src/nodes/threshold/init.js +121 -0
  374. package/src/nodes/threshold/introspect.js +192 -0
  375. package/src/nodes/threshold/publish-to.js +11 -0
  376. package/src/nodes/threshold/recompute.js +8 -0
  377. package/src/nodes/threshold/reset.js +14 -0
  378. package/src/nodes/threshold/update.js +54 -0
  379. package/src/nodes/transform/helpers.js +39 -0
  380. package/src/nodes/transform/index.js +15 -0
  381. package/src/nodes/transform/init.js +35 -0
  382. package/src/nodes/transform/introspect.js +118 -0
  383. package/src/nodes/transform/publish-to.js +23 -0
  384. package/src/nodes/transform/recompute.js +12 -0
  385. package/src/nodes/transform/reset.js +11 -0
  386. package/src/nodes/transform/update.js +32 -0
  387. package/src/nodes/trend/compute-confidence.js +112 -0
  388. package/src/nodes/trend/index.js +14 -0
  389. package/src/nodes/trend/init.js +81 -0
  390. package/src/nodes/trend/introspect.js +151 -0
  391. package/src/nodes/trend/publish-to.js +22 -0
  392. package/src/nodes/trend/recompute.js +15 -0
  393. package/src/nodes/trend/reset.js +26 -0
  394. package/src/nodes/trend/update.js +93 -0
  395. package/src/nodes/tw-stats/copy-from.js +16 -0
  396. package/src/nodes/tw-stats/flush.js +12 -0
  397. package/src/nodes/tw-stats/index.js +41 -0
  398. package/src/nodes/tw-stats/init.js +92 -0
  399. package/src/nodes/tw-stats/introspect.js +171 -0
  400. package/src/nodes/tw-stats/publish-to.js +108 -0
  401. package/src/nodes/tw-stats/recompute.js +9 -0
  402. package/src/nodes/tw-stats/reset.js +16 -0
  403. package/src/nodes/tw-stats/update.js +113 -0
  404. package/src/nodes/unbalance/index.js +15 -0
  405. package/src/nodes/unbalance/init.js +59 -0
  406. package/src/nodes/unbalance/introspect.js +167 -0
  407. package/src/nodes/unbalance/publish-to.js +52 -0
  408. package/src/nodes/unbalance/recompute.js +11 -0
  409. package/src/nodes/unbalance/reset.js +10 -0
  410. package/src/nodes/unbalance/update.js +83 -0
  411. package/src/nodes/vector-distance/index.js +14 -0
  412. package/src/nodes/vector-distance/init.js +54 -0
  413. package/src/nodes/vector-distance/introspect.js +149 -0
  414. package/src/nodes/vector-distance/publish-to.js +35 -0
  415. package/src/nodes/vector-distance/recompute.js +11 -0
  416. package/src/nodes/vector-distance/reset.js +20 -0
  417. package/src/nodes/vector-distance/update.js +139 -0
  418. package/src/nodes/winnow/index.js +12 -0
  419. package/src/nodes/winnow/init.js +82 -0
  420. package/src/nodes/winnow/introspect.js +253 -0
  421. package/src/nodes/winnow/publish-to.js +51 -0
  422. package/src/nodes/winnow/recompute.js +14 -0
  423. package/src/nodes/winnow/reset.js +34 -0
  424. package/src/nodes/winnow/update.js +203 -0
  425. package/src/tools/training/features.js +227 -0
  426. package/src/tools/training/index.js +21 -0
  427. package/src/tools/training/logistic.js +238 -0
  428. package/src/tools/training/metrics.js +126 -0
  429. package/src/tools/training/scale.js +239 -0
  430. package/src/tools/training/validate.js +103 -0
  431. package/src/windowing/count-sliding/create.js +16 -0
  432. package/src/windowing/count-sliding/get-reverse-chronological-index.js +19 -0
  433. package/src/windowing/count-sliding/index.js +6 -0
  434. package/src/windowing/count-sliding/is-not-full.js +5 -0
  435. package/src/windowing/count-sliding/push.js +15 -0
  436. package/src/windowing/count-sliding/reset.js +11 -0
  437. package/src/windowing/count-sliding/size.js +5 -0
  438. package/src/windowing/time-sliding/create.js +25 -0
  439. package/src/windowing/time-sliding/push.js +42 -0
  440. package/CODE_OF_CONDUCT.md +0 -46
  441. package/CONTRIBUTING.md +0 -132
  442. package/docs/.nojekyll +0 -0
  443. package/docs/CONTRIBUTING.md +0 -134
  444. package/docs/README.md +0 -132
  445. package/docs/_coverpage.md +0 -26
  446. package/docs/_media/bg.png +0 -0
  447. package/docs/_media/wink-logo.png +0 -0
  448. package/docs/_navbar.md +0 -14
  449. package/docs/_sidebar.md +0 -2
  450. package/docs/index.html +0 -44
  451. package/eslint.config.js +0 -283
@@ -0,0 +1,149 @@
1
+ // nodes/vector-distance/introspect.js
2
+
3
+ import { validators } from '../../core/utils/validate/index.js';
4
+
5
+ /** The type of this node */
6
+ const NODE_TYPE = 'Vector Distance';
7
+
8
+ /** Single source of truth for what this plugin can do */
9
+ const SUPPORTED_STATS = [
10
+ 'mad', // Mean Absolute Distance
11
+ 'rms', // Root Mean Square Distance
12
+ 'maximum', // Maximum Distance (L∞)
13
+ 'cosine', // Cosine Distance
14
+ 'angular' // Angular Distance (radians)
15
+ ];
16
+
17
+ /** Human-readable descriptions (for introspection) */
18
+ const STAT_DESCRIPTIONS = {
19
+ mad: 'Mean absolute distance between vectors',
20
+ // For correlations [-1,1]: bounded [0,2]
21
+ // For general vectors: bounded [0, ∞]
22
+
23
+ rms: 'Root mean square distance between vectors',
24
+ // For correlations [-1,1]: bounded [0,2]
25
+ // For general vectors: bounded [0, ∞]
26
+
27
+ maximum: 'Maximum single element difference',
28
+ // For correlations [-1,1]: bounded [0,2]
29
+ // For general vectors: bounded [0, ∞]
30
+
31
+ cosine: 'Cosine distance [0,2]', // Always [0,2] regardless of input
32
+ angular: 'Angular distance [0,π]' // Always [0,π] regardless of input
33
+ };
34
+
35
+ /** Control methods available for triggers */
36
+ const SUPPORTED_CONTROL_METHODS = {
37
+ reset: 'Clears accumulated state and restarts computation',
38
+ enable: 'Enables node processing',
39
+ disable: 'Disables node processing',
40
+ pause: 'Pauses node processing while keeping state visible',
41
+ unpause: 'Resumes node processing after pause'
42
+ };
43
+
44
+ /** Node capabilities for documentation */
45
+ const CAPABILITIES = {
46
+ description: 'Computes multiple distance metrics between numeric vectors',
47
+ features: [
48
+ 'Five complementary distance metrics (MAD, RMS, Maximum, Cosine, Angular)',
49
+ 'Works with any numeric vectors (correlations, features, histograms, embeddings)',
50
+ 'Direct integration with change detectors (Page-Hinkley, CUSUM, Threshold)'
51
+ ]
52
+ };
53
+
54
+ // Attach static metadata once, from our constants by making a shallow copy.
55
+ export const getSupportedStats = () => SUPPORTED_STATS.slice();
56
+ export const getStatDescriptions = () => ( { ...STAT_DESCRIPTIONS } );
57
+ export const getSupportedControlMethods = () => ( { ...SUPPORTED_CONTROL_METHODS } );
58
+ export const getNodeType = () => NODE_TYPE;
59
+ export const getCapabilities = () => ( { ...CAPABILITIES, features: CAPABILITIES.features.slice() } );
60
+
61
+ // DSL Metadata for transpilation
62
+ // Metadata → describes how to build → Specs → initialize → Nodes
63
+ const DSL_METADATA = {
64
+ // Spec schema for validation
65
+ specSchema: {
66
+ nodeType: {
67
+ type: 'string',
68
+ required: true,
69
+ value: NODE_TYPE,
70
+ },
71
+ name: {
72
+ type: 'string',
73
+ required: true,
74
+ minLength: 1,
75
+ validator: validators.identifier, // Using standard validator
76
+ error: 'Name must be a valid identifier'
77
+ },
78
+ from: {
79
+ type: 'object',
80
+ required: true,
81
+ properties: {
82
+ x: {
83
+ type: 'string',
84
+ required: true,
85
+ minLength: 1,
86
+ validator: validators.noSpaces, // Using standard validator
87
+ error: 'Field name cannot contain spaces'
88
+ },
89
+ y: {
90
+ type: 'string',
91
+ required: true,
92
+ minLength: 1,
93
+ validator: validators.noSpaces, // Using standard validator
94
+ error: 'Field name cannot contain spaces'
95
+ }
96
+ }
97
+ },
98
+ stats: {
99
+ type: 'object',
100
+ required: true,
101
+ minProperties: 1,
102
+ propertyNames: SUPPORTED_STATS,
103
+ propertySchema: {
104
+ type: 'object',
105
+ required: true,
106
+ properties: {
107
+ storeAs: {
108
+ type: 'string',
109
+ required: true,
110
+ minLength: 1,
111
+ validator: validators.identifier, // Using standard validator
112
+ error: 'storeAs must be a valid identifier'
113
+ }
114
+ }
115
+ }
116
+ }
117
+ },
118
+
119
+ // Cross-field validators
120
+ crossFieldValidators: [
121
+ {
122
+ fields: [ 'from.x', 'from.y' ],
123
+ validator: ( spec ) => spec.from.x !== spec.from.y,
124
+ error: 'from.x and from.y must be different fields'
125
+ },
126
+ {
127
+ fields: [ 'stats' ],
128
+ validator: ( spec ) => {
129
+ // Ensure no duplicate storeAs values
130
+ const storeAsValues = Object.values( spec.stats ).map( ( s ) => s.storeAs );
131
+ return storeAsValues.length === new Set( storeAsValues ).size;
132
+ },
133
+ error: 'All storeAs values must be unique'
134
+ }
135
+ ],
136
+
137
+ // How to build the spec from DSL params
138
+ // Pattern: NAME_X_Y_OUTPUTS_OPTIONS -> (name, x, y, stats, options)
139
+ buildSpec: ( name, x, y, stats, options ) => ( {
140
+ nodeType: NODE_TYPE,
141
+ name,
142
+ from: { x, y },
143
+ stats,
144
+ ...options
145
+ } ),
146
+
147
+ };
148
+
149
+ export const getDSLMetadata = () => ({ ...DSL_METADATA });
@@ -0,0 +1,35 @@
1
+ // nodes/vector-distance/publish-to.js
2
+
3
+ import { publishNaN } from '../../core/utils/node/index.js';
4
+
5
+ const publishTo = function ( state, msg ) {
6
+ if ( state.disable ) return;
7
+ // Propagate NaN if unhealthy
8
+ if ( state.inputValidationFailed ) {
9
+ publishNaN( state, msg );
10
+ return;
11
+ }
12
+
13
+ // Publish each configured statistic directly
14
+ if ( state.stats.mad ) {
15
+ msg[ state.stats.mad.storeAs ] = state.distances.mad;
16
+ }
17
+
18
+ if ( state.stats.rms ) {
19
+ msg[ state.stats.rms.storeAs ] = state.distances.rms;
20
+ }
21
+
22
+ if ( state.stats.maximum ) {
23
+ msg[ state.stats.maximum.storeAs ] = state.distances.maximum;
24
+ }
25
+
26
+ if ( state.stats.cosine ) {
27
+ msg[ state.stats.cosine.storeAs ] = state.distances.cosine;
28
+ }
29
+
30
+ if ( state.stats.angular ) {
31
+ msg[ state.stats.angular.storeAs ] = state.distances.angular;
32
+ }
33
+ }; // publishTo()
34
+
35
+ export default publishTo;
@@ -0,0 +1,11 @@
1
+ // nodes/vector-distance/recompute.js
2
+
3
+ const recompute = function ( _state ) {
4
+ // For correlation distance, there's no accumulated state to recompute
5
+ // Each update is independent
6
+ // This function exists for API consistency
7
+
8
+ return true;
9
+ }; // recompute()
10
+
11
+ export default recompute;
@@ -0,0 +1,20 @@
1
+ // nodes/vector-distance/reset.js
2
+
3
+ const reset = function ( state ) {
4
+ // Reset all distance values
5
+ state.distances.mad = 0;
6
+ state.distances.rms = 0;
7
+ state.distances.maximum = 0;
8
+ state.distances.cosine = 0;
9
+ state.distances.angular = 0;
10
+
11
+ // Reset computation flag
12
+ state.computed = false;
13
+
14
+ // Reset workspace values
15
+ state.accumulator.fill( 0 );
16
+
17
+ return true;
18
+ }; // reset()
19
+
20
+ export default reset;
@@ -0,0 +1,139 @@
1
+ // nodes/vector-distance/update.js
2
+
3
+ /* eslint-disable no-bitwise */
4
+
5
+ /**
6
+ * vector-distance / update.js
7
+ *
8
+ * Purpose
9
+ * Compute distances between two vectors in a single pass:
10
+ * - Maximum single element difference
11
+ * - For correlations [-1,1]: bounded [0,2]
12
+ * - For general vectors: bounded [0, ∞]
13
+ * - RMS distance between vectors
14
+ * - For correlations [-1,1]: bounded [0,2]
15
+ * - For general vectors: bounded [0, ∞]
16
+ * - MAD distance between vectors
17
+ * - For correlations [-1,1]: bounded [0,2]
18
+ * - For general vectors: bounded [0, ∞]
19
+ * - Angular distance [0,π] regardless of input
20
+ * - Cosine distance [0,2] regardless of input
21
+ */
22
+
23
+ // ---- slot indices for Float64 accumulator --------------
24
+ const ACC_SUM_ABS = 0;
25
+ const ACC_SUM_SQ = 1;
26
+ const ACC_MAX = 2;
27
+ const ACC_DOT = 3;
28
+ const ACC_N1 = 4;
29
+ const ACC_N2 = 5;
30
+
31
+ // ---- helpers ----------------------------------------------------------------
32
+
33
+ /**
34
+ * Quick structural validation. Strict same-length requirement.
35
+ * Returns null to indicate "do nothing" (pass-through).
36
+ */
37
+ const validateVectors = function ( state, msg ) {
38
+ const xVal = msg[ state.x ];
39
+ const yVal = msg[ state.y ];
40
+ if ( !xVal || !yVal ) return null;
41
+ const nx = ( typeof xVal.length === 'number' ) ? xVal.length : -1;
42
+ const ny = ( typeof yVal.length === 'number' ) ? yVal.length : -1;
43
+ if ( ( nx <= 0 ) || ( ny <= 0 ) || ( nx !== ny ) ) return null;
44
+
45
+ for ( let i = 0; i < nx; i += 1 ) if ( !Number.isFinite( xVal[ i ] ) ) return null;
46
+ for ( let i = 0; i < nx; i += 1 ) if ( !Number.isFinite( yVal[ i ] ) ) return null;
47
+ return { xVal, yVal, n: nx };
48
+ }; // validateVectors()
49
+
50
+ /**
51
+ * Tight single-pass accumulation. No type checks inside the loop
52
+ * (assumes upstream generated numeric vectors).
53
+ */
54
+ const accumulate = function ( acc, v1, v2, n, mask ) {
55
+ for ( let i = 0; i < n; i += 1 ) {
56
+ const a = v1[ i ];
57
+ const b = v2[ i ];
58
+ const d = ( a - b );
59
+
60
+ if ( ( mask & 1 ) !== 0 ) {
61
+ const ad = Math.abs( d );
62
+ acc[ ACC_SUM_ABS ] += ad;
63
+ if ( ad > acc[ ACC_MAX ] ) acc[ ACC_MAX ] = ad;
64
+ }
65
+ if ( ( mask & 2 ) !== 0 ) {
66
+ acc[ ACC_SUM_SQ ] += ( d * d );
67
+ }
68
+ if ( ( mask & 4 ) !== 0 ) {
69
+ acc[ ACC_DOT ] += ( a * b );
70
+ acc[ ACC_N1 ] += ( a * a );
71
+ acc[ ACC_N2 ] += ( b * b );
72
+ }
73
+ }
74
+ }; // accumulate()
75
+
76
+ /**
77
+ * Convert accumulators into requested distances and update state.
78
+ * Clamps cosine similarity to avoid NaN from acos due to FP error.
79
+ */
80
+ const finalize = function ( state, acc, n ) {
81
+ if ( state.stats.mad ) {
82
+ state.distances.mad = acc[ ACC_SUM_ABS ] / n;
83
+ }
84
+ if ( state.stats.rms ) {
85
+ state.distances.rms = Math.sqrt( acc[ ACC_SUM_SQ ] / n );
86
+ }
87
+ if ( state.stats.maximum ) {
88
+ state.distances.maximum = acc[ ACC_MAX ];
89
+ }
90
+
91
+ if ( ( state.mask & 4 ) !== 0 ) {
92
+ const n1 = acc[ ACC_N1 ];
93
+ const n2 = acc[ ACC_N2 ];
94
+
95
+ // Zero-vector policy: treat as no directional information -> zero distances
96
+ if ( ( n1 === 0 ) || ( n2 === 0 ) ) {
97
+ if ( state.stats.cosine ) state.distances.cosine = 0;
98
+ if ( state.stats.angular ) state.distances.angular = 0;
99
+ return;
100
+ }
101
+
102
+ const denom = Math.sqrt( n1 ) * Math.sqrt( n2 );
103
+ let cosSim = acc[ ACC_DOT ] / denom;
104
+
105
+ // Clamp for numerical safety
106
+ if ( cosSim > 1 ) cosSim = 1;
107
+ else if ( cosSim < -1 ) cosSim = -1;
108
+
109
+ if ( state.stats.cosine ) state.distances.cosine = 1 - cosSim;
110
+ if ( state.stats.angular ) state.distances.angular = Math.acos( cosSim );
111
+ }
112
+ }; // finalize()
113
+
114
+ // ---- update (export default) ------------------------------------------------
115
+
116
+ const update = function ( state, msg ) {
117
+ if ( state.disable || state.pause ) return state;
118
+ // Reset on each update
119
+ state.inputValidationFailed = false;
120
+ const validated = validateVectors( state, msg );
121
+ if ( !validated ) {
122
+ // Reset on the downstream node may cause this state.
123
+ // Will wait until warms up or error goes away.
124
+ state.inputValidationFailed = true;
125
+ return state;
126
+ }
127
+
128
+ const { xVal, yVal, n } = validated;
129
+
130
+ const acc = state.accumulator;
131
+ acc.fill( 0 );
132
+ accumulate( acc, xVal, yVal, n, state.mask );
133
+ finalize( state, acc, n );
134
+
135
+ state.computed = true;
136
+ return state;
137
+ }; // update()
138
+
139
+ export default update;
@@ -0,0 +1,12 @@
1
+ // nodes/winnow/index.js
2
+
3
+ export { default as init } from './init.js';
4
+ export { default as update } from './update.js';
5
+ export { default as publishTo } from './publish-to.js';
6
+ export { default as reset } from './reset.js';
7
+ export { default as recompute } from './recompute.js';
8
+ export { default as disable } from '../../core/utils/node/disable.js';
9
+ export { default as enable } from '../../core/utils/node/enable.js';
10
+ export { default as pause } from '../../core/utils/node/pause.js';
11
+ export { default as unpause } from '../../core/utils/node/unpause.js';
12
+ export * from './introspect.js';
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @fileoverview Initialisation for the winnow node.
3
+ *
4
+ * Creates per-partition state: anchor tracking, slope projection,
5
+ * and adaptive threshold configuration. All allocations happen here
6
+ * — update() and publishTo() are zero-allocation hot paths.
7
+ */
8
+
9
+ import { validateSpec } from '../../core/utils/node/index.js';
10
+ import * as introspect from './introspect.js';
11
+ import { resolveScalar } from '../../core/utils/options/resolve-field-keyed.js';
12
+ import { asTunable } from '../../core/tunable/index.js';
13
+
14
+ const init = function ( spec ) {
15
+ validateSpec( spec, introspect );
16
+
17
+ const state = Object.create( null );
18
+
19
+ // ── Standard flags (all nodes) ──────────────────────────────────
20
+ state.disable = false;
21
+ state.pause = false;
22
+ state.inputValidationFailed = false;
23
+
24
+ // ── Configuration from spec ─────────────────────────────────────
25
+ state.x = spec.from.x;
26
+ state.stats = spec.stats;
27
+
28
+ // Pre-built field names — no string ops in hot path
29
+ state.slopeField = spec.slopeField ?? introspect.DEFAULT_OPTIONS.slopeField;
30
+ state.noiseField = spec.noiseField ?? introspect.DEFAULT_OPTIONS.noiseField;
31
+ state.dirField = spec.dirField ?? introspect.DEFAULT_OPTIONS.dirField;
32
+ state.gateField = spec.gateField ?? introspect.DEFAULT_OPTIONS.gateField;
33
+
34
+ // Scalar options (support field-keyed specification)
35
+ state.chi2Threshold = resolveScalar( spec.chi2Threshold, state.x ) ??
36
+ introspect.DEFAULT_OPTIONS.chi2Threshold;
37
+ state.tightenBase = resolveScalar( spec.tightenBase, state.x ) ??
38
+ introspect.DEFAULT_OPTIONS.tightenBase;
39
+ state.maxGap = resolveScalar( spec.maxGap, state.x ) ??
40
+ introspect.DEFAULT_OPTIONS.maxGap;
41
+
42
+ // ── Pre-compiled tunable ────────────────────────────────────────
43
+ const resolvedK = resolveScalar( spec.K, state.x ) ?? introspect.DEFAULT_OPTIONS.K;
44
+ state.KFn = asTunable( resolvedK );
45
+ state.K = typeof resolvedK === 'number' ? resolvedK : introspect.DEFAULT_OPTIONS.K;
46
+ state.tunableErrorLogged = false;
47
+
48
+ // ── Accumulated state (per-partition core) ──────────────────────
49
+ state.anchor = null;
50
+ state.anchorSlope = 0;
51
+ state.anchorTime = 0;
52
+ state.lastPassedAt = 0;
53
+ state.prevDirection = null;
54
+ state.counter = 0;
55
+
56
+ // ── Outputs ─────────────────────────────────────────────────────
57
+ state.deviation = 0;
58
+ state.predicted = 0;
59
+ state.significant = false;
60
+
61
+ // ── 1-sample buffer for spike-region anchoring ──────────────────
62
+ // When bufferPrev is true, winnow holds the previous tick's input
63
+ // value and timestamp. On Check 2 (chi-squared gate fire), it
64
+ // publishes xPrev/tPrev — providing the (k-1) anchor that
65
+ // eliminates linear-interpolation overshoot around spikes.
66
+ state.bufferPrev = spec.bufferPrev ?? introspect.DEFAULT_OPTIONS.bufferPrev;
67
+ state.timestampField = spec.timestampField ?? null;
68
+ state.bufferedX = NaN;
69
+ state.bufferedT = NaN;
70
+ state.keptByGate = false;
71
+ state.xPrev = NaN;
72
+ state.tPrev = NaN;
73
+ state.hasXPrev = spec.stats.xPrev !== undefined;
74
+ state.hasTPrev = spec.stats.tPrev !== undefined;
75
+
76
+ // ── Metadata ────────────────────────────────────────────────────
77
+ state.nodeType = introspect.getNodeType();
78
+
79
+ return state;
80
+ }; // init()
81
+
82
+ export default init;