@winkjs/composer 0.0.2 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +106 -80
- package/package.json +56 -28
- package/src/composer.js +75 -0
- package/src/core/batch/aoo-encoder.js +148 -0
- package/src/core/batch/index.js +12 -0
- package/src/core/batch/sliding-window.js +91 -0
- package/src/core/codec/index.js +137 -0
- package/src/core/emitter-manager/mqtt/constants.js +102 -0
- package/src/core/emitter-manager/mqtt/emitter.js +780 -0
- package/src/core/emitter-manager/mqtt/index.js +190 -0
- package/src/core/emitter-manager/mqtt/mqtt-store.js +538 -0
- package/src/core/emitter-manager/terminal/assert-columns.js +98 -0
- package/src/core/emitter-manager/terminal/formatters.js +160 -0
- package/src/core/emitter-manager/terminal/index.js +341 -0
- package/src/core/env-vars.js +245 -0
- package/src/core/mqtt-protocol.js +47 -0
- package/src/core/partition-manager/index.js +7 -0
- package/src/core/partition-manager/init.js +44 -0
- package/src/core/partition-manager/introspect.js +15 -0
- package/src/core/partition-manager/publish-to.js +6 -0
- package/src/core/partition-manager/recompute.js +5 -0
- package/src/core/partition-manager/reset.js +5 -0
- package/src/core/partition-manager/update.js +264 -0
- package/src/core/partition-manager/validate-flow.js +157 -0
- package/src/core/semantics/digest.js +128 -0
- package/src/core/semantics/index.js +83 -0
- package/src/core/semantics/loader.js +571 -0
- package/src/core/semantics/schemas/asset-class-schema.js +218 -0
- package/src/core/semantics/schemas/column-schema.js +651 -0
- package/src/core/semantics/schemas/enum-schema.js +153 -0
- package/src/core/semantics/schemas/index.js +51 -0
- package/src/core/semantics/warnings.js +141 -0
- package/src/core/shutdown-manager/index.js +289 -0
- package/src/core/source-manager/csv/index.js +171 -0
- package/src/core/source-manager/csv/start.js +456 -0
- package/src/core/source-manager/mqtt/client.js +406 -0
- package/src/core/source-manager/mqtt/constants.js +147 -0
- package/src/core/source-manager/mqtt/dedup.js +244 -0
- package/src/core/source-manager/mqtt/index.js +260 -0
- package/src/core/source-manager/mqtt/status.js +546 -0
- package/src/core/source-manager/test-harness/comparator.js +226 -0
- package/src/core/source-manager/test-harness/field-generator.js +85 -0
- package/src/core/source-manager/test-harness/fuzz.js +87 -0
- package/src/core/source-manager/test-harness/index.js +115 -0
- package/src/core/source-manager/test-harness/prng.js +57 -0
- package/src/core/source-manager/test-harness/start.js +232 -0
- package/src/core/source-manager/test-harness/validate.js +213 -0
- package/src/core/storage-manager/questdb/assert-columns.js +120 -0
- package/src/core/storage-manager/questdb/ensure-tables.js +187 -0
- package/src/core/storage-manager/questdb/index.js +1251 -0
- package/src/core/storage-manager/questdb/persist-plan.js +488 -0
- package/src/core/storage-manager/questdb/writers.js +142 -0
- package/src/core/test-utils/sealed-record.js +80 -0
- package/src/core/test-utils/soak-signature.js +149 -0
- package/src/core/test-utils/tcp-proxy.js +106 -0
- package/src/core/tunable/helpers.js +254 -0
- package/src/core/tunable/index.js +87 -0
- package/src/core/utils/console-formatter/index.js +207 -0
- package/src/core/utils/create-smart-store-as/index.js +98 -0
- package/src/core/utils/create-smart-store-as/sanitize-field.js +46 -0
- package/src/core/utils/create-smart-store-as/smart-truncate.js +93 -0
- package/src/core/utils/flow/index.js +5 -0
- package/src/core/utils/flow/make-collision-checker.js +23 -0
- package/src/core/utils/flow/to-kebab.js +20 -0
- package/src/core/utils/half-life/index.js +111 -0
- package/src/core/utils/node/disable.js +11 -0
- package/src/core/utils/node/enable.js +11 -0
- package/src/core/utils/node/execute-triggers.js +40 -0
- package/src/core/utils/node/index.js +10 -0
- package/src/core/utils/node/pause.js +11 -0
- package/src/core/utils/node/populate-predicate-inputs.js +14 -0
- package/src/core/utils/node/publish-nan.js +19 -0
- package/src/core/utils/node/reset-predicate-inputs.js +11 -0
- package/src/core/utils/node/unpause.js +11 -0
- package/src/core/utils/node/validate-spec.js +22 -0
- package/src/core/utils/options/resolve-field-keyed.js +115 -0
- package/src/core/utils/quantize/index.js +75 -0
- package/src/core/utils/stats/formulas.js +67 -0
- package/src/core/utils/stats/index.js +3 -0
- package/src/core/utils/validate/composer-validators.js +141 -0
- package/src/core/utils/validate/helpers.js +206 -0
- package/src/core/utils/validate/index.js +12 -0
- package/src/core/utils/validate/type-validators.js +538 -0
- package/src/core/utils/validate/validate.js +107 -0
- package/src/core/utils/validate/validators.js +177 -0
- package/src/core/wiring/assert-handle.js +57 -0
- package/src/core/wiring/assert-module.js +63 -0
- package/src/core/wiring/index.js +5 -0
- package/src/core/wiring/node-type-to-module.js +17 -0
- package/src/core/wiring/wire-emitters.js +256 -0
- package/src/core/wiring/wire-linear-graph.js +25 -0
- package/src/core/wiring/wire-node.js +157 -0
- package/src/core/wiring/wire-semantics.js +173 -0
- package/src/core/wiring/wire-storages.js +344 -0
- package/src/flow/check-output-collisions.js +93 -0
- package/src/flow/consts.js +9 -0
- package/src/flow/deep-clone-spec.js +64 -0
- package/src/flow/driver.js +171 -0
- package/src/flow/expand-single-input-array.js +76 -0
- package/src/flow/expand-template-spec.js +93 -0
- package/src/flow/flow-api-schemas.js +300 -0
- package/src/flow/flow.js +658 -0
- package/src/flow/for-each.js +225 -0
- package/src/flow/get-signature-pattern.js +31 -0
- package/src/flow/get-target-array.js +46 -0
- package/src/flow/inspect.js +67 -0
- package/src/flow/load-node-module.js +81 -0
- package/src/flow/make-node-method.js +112 -0
- package/src/flow/resolve-pick-by-field.js +77 -0
- package/src/flow/resolve-tunables.js +76 -0
- package/src/flow/run.js +392 -0
- package/src/flow/serialize.js +161 -0
- package/src/flow/signatures-schema.js +222 -0
- package/src/flow/spec-builder.js +65 -0
- package/src/flow/validate-triggers.js +250 -0
- package/src/flow/validate.js +261 -0
- package/src/nodes/accumulate/index.js +21 -0
- package/src/nodes/accumulate/init.js +48 -0
- package/src/nodes/accumulate/introspect.js +123 -0
- package/src/nodes/accumulate/publish-to.js +34 -0
- package/src/nodes/accumulate/recompute.js +27 -0
- package/src/nodes/accumulate/reset.js +25 -0
- package/src/nodes/accumulate/update.js +42 -0
- package/src/nodes/appraise/calibrate.js +64 -0
- package/src/nodes/appraise/decision.js +66 -0
- package/src/nodes/appraise/deviation.js +140 -0
- package/src/nodes/appraise/index.js +23 -0
- package/src/nodes/appraise/init.js +165 -0
- package/src/nodes/appraise/integrate.js +45 -0
- package/src/nodes/appraise/introspect.js +352 -0
- package/src/nodes/appraise/publish-to.js +93 -0
- package/src/nodes/appraise/receptor.js +69 -0
- package/src/nodes/appraise/recompute.js +79 -0
- package/src/nodes/appraise/reset.js +53 -0
- package/src/nodes/appraise/update.js +130 -0
- package/src/nodes/archive/csv/index.js +6 -0
- package/src/nodes/archive/csv/init.js +36 -0
- package/src/nodes/archive/csv/load.js +70 -0
- package/src/nodes/archive/csv/reset.js +14 -0
- package/src/nodes/archive/csv/simple-parser.js +216 -0
- package/src/nodes/archive/csv/test.js +173 -0
- package/src/nodes/archive/csv/update.js +63 -0
- package/src/nodes/butterworth-filter/index.js +18 -0
- package/src/nodes/butterworth-filter/init.js +184 -0
- package/src/nodes/butterworth-filter/introspect.js +228 -0
- package/src/nodes/butterworth-filter/publish-to.js +21 -0
- package/src/nodes/butterworth-filter/recompute.js +13 -0
- package/src/nodes/butterworth-filter/reset.js +30 -0
- package/src/nodes/butterworth-filter/update.js +38 -0
- package/src/nodes/categorize/index.js +19 -0
- package/src/nodes/categorize/init.js +58 -0
- package/src/nodes/categorize/introspect.js +177 -0
- package/src/nodes/categorize/publish-to.js +29 -0
- package/src/nodes/categorize/recompute.js +14 -0
- package/src/nodes/categorize/reset.js +16 -0
- package/src/nodes/categorize/update.js +53 -0
- package/src/nodes/controller/index.js +9 -0
- package/src/nodes/controller/init.js +55 -0
- package/src/nodes/controller/introspect.js +91 -0
- package/src/nodes/controller/publish-to.js +8 -0
- package/src/nodes/controller/recompute.js +9 -0
- package/src/nodes/controller/reset.js +17 -0
- package/src/nodes/controller/update.js +63 -0
- package/src/nodes/diff/index.js +19 -0
- package/src/nodes/diff/init.js +37 -0
- package/src/nodes/diff/introspect.js +132 -0
- package/src/nodes/diff/publish-to.js +21 -0
- package/src/nodes/diff/recompute.js +12 -0
- package/src/nodes/diff/reset.js +12 -0
- package/src/nodes/diff/update.js +37 -0
- package/src/nodes/digest-moments/formulas.js +12 -0
- package/src/nodes/digest-moments/index.js +14 -0
- package/src/nodes/digest-moments/init.js +67 -0
- package/src/nodes/digest-moments/introspect.js +154 -0
- package/src/nodes/digest-moments/publish-to.js +34 -0
- package/src/nodes/digest-moments/recompute.js +14 -0
- package/src/nodes/digest-moments/reset.js +14 -0
- package/src/nodes/digest-moments/update.js +120 -0
- package/src/nodes/dwell-time-tracker/index.js +14 -0
- package/src/nodes/dwell-time-tracker/init.js +59 -0
- package/src/nodes/dwell-time-tracker/introspect.js +137 -0
- package/src/nodes/dwell-time-tracker/publish-to.js +22 -0
- package/src/nodes/dwell-time-tracker/recompute.js +8 -0
- package/src/nodes/dwell-time-tracker/reset.js +23 -0
- package/src/nodes/dwell-time-tracker/update.js +103 -0
- package/src/nodes/emit-if/helpers.js +94 -0
- package/src/nodes/emit-if/index.js +16 -0
- package/src/nodes/emit-if/init.js +67 -0
- package/src/nodes/emit-if/introspect.js +102 -0
- package/src/nodes/emit-if/publish-to.js +13 -0
- package/src/nodes/emit-if/recompute.js +12 -0
- package/src/nodes/emit-if/reset.js +27 -0
- package/src/nodes/emit-if/update.js +93 -0
- package/src/nodes/es-correlation/index.js +19 -0
- package/src/nodes/es-correlation/init.js +73 -0
- package/src/nodes/es-correlation/introspect.js +176 -0
- package/src/nodes/es-correlation/publish-to.js +32 -0
- package/src/nodes/es-correlation/recompute.js +56 -0
- package/src/nodes/es-correlation/reset.js +27 -0
- package/src/nodes/es-correlation/update.js +110 -0
- package/src/nodes/es-mean/index.js +20 -0
- package/src/nodes/es-mean/init.js +58 -0
- package/src/nodes/es-mean/introspect.js +129 -0
- package/src/nodes/es-mean/publish-to.js +19 -0
- package/src/nodes/es-mean/recompute.js +16 -0
- package/src/nodes/es-mean/reset.js +24 -0
- package/src/nodes/es-mean/update.js +69 -0
- package/src/nodes/es-pairwise-correlation/index.js +19 -0
- package/src/nodes/es-pairwise-correlation/init.js +98 -0
- package/src/nodes/es-pairwise-correlation/introspect.js +187 -0
- package/src/nodes/es-pairwise-correlation/publish-to.js +31 -0
- package/src/nodes/es-pairwise-correlation/recompute.js +69 -0
- package/src/nodes/es-pairwise-correlation/reset.js +29 -0
- package/src/nodes/es-pairwise-correlation/update.js +89 -0
- package/src/nodes/es-stats/index.js +21 -0
- package/src/nodes/es-stats/init.js +105 -0
- package/src/nodes/es-stats/introspect.js +157 -0
- package/src/nodes/es-stats/publish-to.js +42 -0
- package/src/nodes/es-stats/recompute.js +74 -0
- package/src/nodes/es-stats/reset.js +49 -0
- package/src/nodes/es-stats/update-envelope.js +44 -0
- package/src/nodes/es-stats/update-welford.js +64 -0
- package/src/nodes/es-stats/update.js +59 -0
- package/src/nodes/index.js +83 -0
- package/src/nodes/invert-flag/index.js +20 -0
- package/src/nodes/invert-flag/init.js +36 -0
- package/src/nodes/invert-flag/introspect.js +115 -0
- package/src/nodes/invert-flag/publish-to.js +23 -0
- package/src/nodes/invert-flag/recompute.js +12 -0
- package/src/nodes/invert-flag/reset.js +12 -0
- package/src/nodes/invert-flag/update.js +32 -0
- package/src/nodes/kalman1d/index.js +20 -0
- package/src/nodes/kalman1d/init.js +103 -0
- package/src/nodes/kalman1d/introspect.js +250 -0
- package/src/nodes/kalman1d/publish-to.js +34 -0
- package/src/nodes/kalman1d/recompute.js +23 -0
- package/src/nodes/kalman1d/reset.js +29 -0
- package/src/nodes/kalman1d/update.js +144 -0
- package/src/nodes/kernel/index.js +18 -0
- package/src/nodes/kernel/init.js +66 -0
- package/src/nodes/kernel/introspect.js +163 -0
- package/src/nodes/kernel/presets.js +74 -0
- package/src/nodes/kernel/publish-to.js +25 -0
- package/src/nodes/kernel/recompute.js +14 -0
- package/src/nodes/kernel/reset.js +20 -0
- package/src/nodes/kernel/update.js +69 -0
- package/src/nodes/lag/index.js +21 -0
- package/src/nodes/lag/init.js +87 -0
- package/src/nodes/lag/introspect.js +202 -0
- package/src/nodes/lag/publish-to.js +64 -0
- package/src/nodes/lag/recompute.js +33 -0
- package/src/nodes/lag/reset.js +49 -0
- package/src/nodes/lag/update.js +133 -0
- package/src/nodes/median3/index.js +19 -0
- package/src/nodes/median3/init.js +40 -0
- package/src/nodes/median3/introspect.js +116 -0
- package/src/nodes/median3/publish-to.js +21 -0
- package/src/nodes/median3/recompute.js +12 -0
- package/src/nodes/median3/reset.js +15 -0
- package/src/nodes/median3/update.js +58 -0
- package/src/nodes/moments-digest/copy-from.js +12 -0
- package/src/nodes/moments-digest/flush.js +17 -0
- package/src/nodes/moments-digest/index.js +132 -0
- package/src/nodes/moments-digest/init.js +84 -0
- package/src/nodes/moments-digest/introspect.js +122 -0
- package/src/nodes/moments-digest/prelude.js +28 -0
- package/src/nodes/moments-digest/publish-to.js +31 -0
- package/src/nodes/moments-digest/recompute.js +9 -0
- package/src/nodes/moments-digest/reset.js +20 -0
- package/src/nodes/moments-digest/update.js +182 -0
- package/src/nodes/node-names.js +67 -0
- package/src/nodes/page-hinkley/index.js +20 -0
- package/src/nodes/page-hinkley/init.js +66 -0
- package/src/nodes/page-hinkley/introspect.js +193 -0
- package/src/nodes/page-hinkley/publish-to.js +28 -0
- package/src/nodes/page-hinkley/recompute.js +14 -0
- package/src/nodes/page-hinkley/reset.js +23 -0
- package/src/nodes/page-hinkley/update.js +105 -0
- package/src/nodes/pass-if/index.js +21 -0
- package/src/nodes/pass-if/init.js +37 -0
- package/src/nodes/pass-if/introspect.js +93 -0
- package/src/nodes/pass-if/publish-to.js +15 -0
- package/src/nodes/pass-if/recompute.js +15 -0
- package/src/nodes/pass-if/reset.js +18 -0
- package/src/nodes/pass-if/update.js +37 -0
- package/src/nodes/persist-if/helpers.js +111 -0
- package/src/nodes/persist-if/index.js +9 -0
- package/src/nodes/persist-if/init.js +98 -0
- package/src/nodes/persist-if/introspect.js +106 -0
- package/src/nodes/persist-if/publish-to.js +21 -0
- package/src/nodes/persist-if/recompute.js +20 -0
- package/src/nodes/persist-if/reset.js +35 -0
- package/src/nodes/persist-if/update.js +112 -0
- package/src/nodes/persistence-check/index.js +14 -0
- package/src/nodes/persistence-check/init.js +38 -0
- package/src/nodes/persistence-check/introspect.js +144 -0
- package/src/nodes/persistence-check/publish-to.js +11 -0
- package/src/nodes/persistence-check/recompute.js +7 -0
- package/src/nodes/persistence-check/reset.js +12 -0
- package/src/nodes/persistence-check/update.js +57 -0
- package/src/nodes/process-index/index.js +15 -0
- package/src/nodes/process-index/init.js +48 -0
- package/src/nodes/process-index/introspect.js +182 -0
- package/src/nodes/process-index/publish-to.js +29 -0
- package/src/nodes/process-index/recompute.js +8 -0
- package/src/nodes/process-index/reset.js +8 -0
- package/src/nodes/process-index/update.js +75 -0
- package/src/nodes/ratio/index.js +14 -0
- package/src/nodes/ratio/init.js +37 -0
- package/src/nodes/ratio/introspect.js +155 -0
- package/src/nodes/ratio/publish-to.js +15 -0
- package/src/nodes/ratio/recompute.js +7 -0
- package/src/nodes/ratio/reset.js +7 -0
- package/src/nodes/ratio/update.js +47 -0
- package/src/nodes/sanitize/index.js +82 -0
- package/src/nodes/sanitize/init.js +82 -0
- package/src/nodes/sanitize/introspect.js +194 -0
- package/src/nodes/sanitize/publish-to.js +15 -0
- package/src/nodes/sanitize/recompute.js +8 -0
- package/src/nodes/sanitize/reset.js +14 -0
- package/src/nodes/sanitize/update.js +102 -0
- package/src/nodes/spike-guard/index.js +14 -0
- package/src/nodes/spike-guard/init.js +47 -0
- package/src/nodes/spike-guard/introspect.js +130 -0
- package/src/nodes/spike-guard/publish-to.js +35 -0
- package/src/nodes/spike-guard/recompute.js +14 -0
- package/src/nodes/spike-guard/reset.js +19 -0
- package/src/nodes/spike-guard/update.js +89 -0
- package/src/nodes/sse-emitter/index.js +7 -0
- package/src/nodes/sse-emitter/init.js +105 -0
- package/src/nodes/sse-emitter/introspect.js +134 -0
- package/src/nodes/sse-emitter/publish-to.js +6 -0
- package/src/nodes/sse-emitter/recompute.js +16 -0
- package/src/nodes/sse-emitter/reset.js +19 -0
- package/src/nodes/sse-emitter/update.js +69 -0
- package/src/nodes/sse-emitter/utils/broadcast-heartbeat.js +36 -0
- package/src/nodes/sse-emitter/utils/build-message.js +31 -0
- package/src/nodes/sse-emitter/utils/connection-manager.js +45 -0
- package/src/nodes/sse-emitter/utils/endpoint-initializer.js +20 -0
- package/src/nodes/sse-emitter/utils/health-monitor.js +38 -0
- package/src/nodes/sse-emitter/utils/qos-handler.js +41 -0
- package/src/nodes/state-change-detector/helpers.js +35 -0
- package/src/nodes/state-change-detector/index.js +12 -0
- package/src/nodes/state-change-detector/init.js +56 -0
- package/src/nodes/state-change-detector/introspect.js +146 -0
- package/src/nodes/state-change-detector/publish-to.js +20 -0
- package/src/nodes/state-change-detector/recompute.js +6 -0
- package/src/nodes/state-change-detector/reset.js +20 -0
- package/src/nodes/state-change-detector/update.js +97 -0
- package/src/nodes/sw-stats/index.js +14 -0
- package/src/nodes/sw-stats/init.js +51 -0
- package/src/nodes/sw-stats/introspect.js +131 -0
- package/src/nodes/sw-stats/publish-to.js +45 -0
- package/src/nodes/sw-stats/recompute.js +33 -0
- package/src/nodes/sw-stats/reset.js +15 -0
- package/src/nodes/sw-stats/update.js +39 -0
- package/src/nodes/swing-watch/index.js +17 -0
- package/src/nodes/swing-watch/init.js +144 -0
- package/src/nodes/swing-watch/introspect.js +188 -0
- package/src/nodes/swing-watch/publish-to.js +53 -0
- package/src/nodes/swing-watch/recompute.js +22 -0
- package/src/nodes/swing-watch/reset.js +55 -0
- package/src/nodes/swing-watch/update.js +767 -0
- package/src/nodes/tally/index.js +15 -0
- package/src/nodes/tally/init.js +32 -0
- package/src/nodes/tally/introspect.js +116 -0
- package/src/nodes/tally/publish-to.js +28 -0
- package/src/nodes/tally/recompute.js +10 -0
- package/src/nodes/tally/reset.js +10 -0
- package/src/nodes/tally/update.js +44 -0
- package/src/nodes/threshold/index.js +14 -0
- package/src/nodes/threshold/init.js +121 -0
- package/src/nodes/threshold/introspect.js +192 -0
- package/src/nodes/threshold/publish-to.js +11 -0
- package/src/nodes/threshold/recompute.js +8 -0
- package/src/nodes/threshold/reset.js +14 -0
- package/src/nodes/threshold/update.js +54 -0
- package/src/nodes/transform/helpers.js +39 -0
- package/src/nodes/transform/index.js +15 -0
- package/src/nodes/transform/init.js +35 -0
- package/src/nodes/transform/introspect.js +118 -0
- package/src/nodes/transform/publish-to.js +23 -0
- package/src/nodes/transform/recompute.js +12 -0
- package/src/nodes/transform/reset.js +11 -0
- package/src/nodes/transform/update.js +32 -0
- package/src/nodes/trend/compute-confidence.js +112 -0
- package/src/nodes/trend/index.js +14 -0
- package/src/nodes/trend/init.js +81 -0
- package/src/nodes/trend/introspect.js +151 -0
- package/src/nodes/trend/publish-to.js +22 -0
- package/src/nodes/trend/recompute.js +15 -0
- package/src/nodes/trend/reset.js +26 -0
- package/src/nodes/trend/update.js +93 -0
- package/src/nodes/tw-stats/copy-from.js +16 -0
- package/src/nodes/tw-stats/flush.js +12 -0
- package/src/nodes/tw-stats/index.js +41 -0
- package/src/nodes/tw-stats/init.js +92 -0
- package/src/nodes/tw-stats/introspect.js +171 -0
- package/src/nodes/tw-stats/publish-to.js +108 -0
- package/src/nodes/tw-stats/recompute.js +9 -0
- package/src/nodes/tw-stats/reset.js +16 -0
- package/src/nodes/tw-stats/update.js +113 -0
- package/src/nodes/unbalance/index.js +15 -0
- package/src/nodes/unbalance/init.js +59 -0
- package/src/nodes/unbalance/introspect.js +167 -0
- package/src/nodes/unbalance/publish-to.js +52 -0
- package/src/nodes/unbalance/recompute.js +11 -0
- package/src/nodes/unbalance/reset.js +10 -0
- package/src/nodes/unbalance/update.js +83 -0
- package/src/nodes/vector-distance/index.js +14 -0
- package/src/nodes/vector-distance/init.js +54 -0
- package/src/nodes/vector-distance/introspect.js +149 -0
- package/src/nodes/vector-distance/publish-to.js +35 -0
- package/src/nodes/vector-distance/recompute.js +11 -0
- package/src/nodes/vector-distance/reset.js +20 -0
- package/src/nodes/vector-distance/update.js +139 -0
- package/src/nodes/winnow/index.js +12 -0
- package/src/nodes/winnow/init.js +82 -0
- package/src/nodes/winnow/introspect.js +253 -0
- package/src/nodes/winnow/publish-to.js +51 -0
- package/src/nodes/winnow/recompute.js +14 -0
- package/src/nodes/winnow/reset.js +34 -0
- package/src/nodes/winnow/update.js +203 -0
- package/src/tools/training/features.js +227 -0
- package/src/tools/training/index.js +21 -0
- package/src/tools/training/logistic.js +238 -0
- package/src/tools/training/metrics.js +126 -0
- package/src/tools/training/scale.js +239 -0
- package/src/tools/training/validate.js +103 -0
- package/src/windowing/count-sliding/create.js +16 -0
- package/src/windowing/count-sliding/get-reverse-chronological-index.js +19 -0
- package/src/windowing/count-sliding/index.js +6 -0
- package/src/windowing/count-sliding/is-not-full.js +5 -0
- package/src/windowing/count-sliding/push.js +15 -0
- package/src/windowing/count-sliding/reset.js +11 -0
- package/src/windowing/count-sliding/size.js +5 -0
- package/src/windowing/time-sliding/create.js +25 -0
- package/src/windowing/time-sliding/push.js +42 -0
- package/CODE_OF_CONDUCT.md +0 -46
- package/CONTRIBUTING.md +0 -132
- package/docs/.nojekyll +0 -0
- package/docs/CONTRIBUTING.md +0 -134
- package/docs/README.md +0 -132
- package/docs/_coverpage.md +0 -26
- package/docs/_media/bg.png +0 -0
- package/docs/_media/wink-logo.png +0 -0
- package/docs/_navbar.md +0 -14
- package/docs/_sidebar.md +0 -2
- package/docs/index.html +0 -44
- package/eslint.config.js +0 -283
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// core/partition-manager/validate-flow.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Fail-fast validation of the `flow` object handed to
|
|
5
|
+
* partition-manager's `init()`.
|
|
6
|
+
*
|
|
7
|
+
* Three live callers construct this object:
|
|
8
|
+
* - src/flow/run.js (production DSL — validated upstream)
|
|
9
|
+
* - composer-website/apps/docs/lib/demo-runner.js (hand-constructed)
|
|
10
|
+
* - composer-website/apps/docs/lib/benchmark-runner.js (hand-constructed)
|
|
11
|
+
*
|
|
12
|
+
* The last two bypass the DSL, so this module is their only contract
|
|
13
|
+
* enforcement point. Invalid shapes here used to surface as silent
|
|
14
|
+
* drops or late-throw errors on the first message; they now fail at
|
|
15
|
+
* flow start with an aggregated error list.
|
|
16
|
+
*
|
|
17
|
+
* Contract:
|
|
18
|
+
* - partitionField : null | non-empty string
|
|
19
|
+
* - specializationField : null | non-empty string
|
|
20
|
+
* - specsBySpecialization : non-null object, ≥ 1 own key,
|
|
21
|
+
* each value is a non-empty array
|
|
22
|
+
* - nodeModules : non-null object
|
|
23
|
+
* - yieldThreshold : number ≥ 0 (Infinity accepted — the
|
|
24
|
+
* documented "never yield" sentinel used
|
|
25
|
+
* by website benchmark / demo runners)
|
|
26
|
+
* - unknown top-level keys rejected (catches typos such as
|
|
27
|
+
* `yieldThreshhold: 100` that would otherwise silently disable
|
|
28
|
+
* yielding through a NaN comparison)
|
|
29
|
+
*
|
|
30
|
+
* Stricter checks (e.g. identifier-shape field names) are delegated to
|
|
31
|
+
* the flow DSL. Partition-manager's guard is defence-in-depth, not a
|
|
32
|
+
* re-implementation.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
import { validateWithSchema, validators } from '../utils/validate/index.js';
|
|
36
|
+
|
|
37
|
+
// Keys accepted at the top level. Anything else is rejected as a typo
|
|
38
|
+
// via _propertyNames whitelist enforcement in validateWithSchema.
|
|
39
|
+
const PROPERTY_NAMES = [
|
|
40
|
+
'partitionField',
|
|
41
|
+
'specializationField',
|
|
42
|
+
'specsBySpecialization',
|
|
43
|
+
'nodeModules',
|
|
44
|
+
'yieldThreshold'
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Accepts `null` (documented single-partition / single-specialization
|
|
49
|
+
* sentinel) or a non-empty string (field name for `msg[field]` lookup).
|
|
50
|
+
*
|
|
51
|
+
* @param { * } v - Value under validation.
|
|
52
|
+
* @returns { boolean } True when shape is acceptable.
|
|
53
|
+
*/
|
|
54
|
+
const isNullOrNonEmptyString = function ( v ) {
|
|
55
|
+
return v === null || ( typeof v === 'string' && v.length > 0 );
|
|
56
|
+
}; // isNullOrNonEmptyString()
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Accepts a plain object (not null, not array) that carries at least
|
|
60
|
+
* one own key, with every value being a non-empty array. This is the
|
|
61
|
+
* minimum shape the graph-build branch of `update()` depends on.
|
|
62
|
+
*
|
|
63
|
+
* @param { * } v - Value under validation.
|
|
64
|
+
* @returns { boolean } True when shape is acceptable.
|
|
65
|
+
*/
|
|
66
|
+
const isNonNullObjectWithSpecArrays = function ( v ) {
|
|
67
|
+
if ( v === null ) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
if ( typeof v !== 'object' ) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
if ( Array.isArray( v ) ) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
const keys = Object.keys( v );
|
|
77
|
+
if ( keys.length === 0 ) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
for ( let i = 0; i < keys.length; i += 1 ) {
|
|
81
|
+
const specs = v[ keys[ i ] ];
|
|
82
|
+
if ( !Array.isArray( specs ) ) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
if ( specs.length === 0 ) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}; // isNonNullObjectWithSpecArrays()
|
|
91
|
+
|
|
92
|
+
// Schema consumed by validateWithSchema. Fields that accept null do
|
|
93
|
+
// not carry a `type` so that the schema framework's custom validator
|
|
94
|
+
// runs for null values (the framework short-circuits type validators
|
|
95
|
+
// ahead of custom ones only when type is set and fails).
|
|
96
|
+
const flowSchema = {
|
|
97
|
+
partitionField: {
|
|
98
|
+
required: true,
|
|
99
|
+
validator: isNullOrNonEmptyString,
|
|
100
|
+
error: 'partitionField must be null or a non-empty string'
|
|
101
|
+
},
|
|
102
|
+
specializationField: {
|
|
103
|
+
required: true,
|
|
104
|
+
validator: isNullOrNonEmptyString,
|
|
105
|
+
error: 'specializationField must be null or a non-empty string'
|
|
106
|
+
},
|
|
107
|
+
specsBySpecialization: {
|
|
108
|
+
required: true,
|
|
109
|
+
validator: isNonNullObjectWithSpecArrays,
|
|
110
|
+
error: 'specsBySpecialization must be a non-null object with at least one specialization, each mapping to a non-empty spec array'
|
|
111
|
+
},
|
|
112
|
+
nodeModules: {
|
|
113
|
+
type: 'object',
|
|
114
|
+
required: true,
|
|
115
|
+
error: 'nodeModules must be a non-null object'
|
|
116
|
+
},
|
|
117
|
+
yieldThreshold: {
|
|
118
|
+
type: 'number',
|
|
119
|
+
required: true,
|
|
120
|
+
validator: validators.nonNegative,
|
|
121
|
+
error: 'yieldThreshold must be a number >= 0 (Infinity allowed)'
|
|
122
|
+
},
|
|
123
|
+
_propertyNames: PROPERTY_NAMES
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Validates the flow config and throws TypeError on any violation.
|
|
128
|
+
* The error message aggregates every problem found, not just the first.
|
|
129
|
+
*
|
|
130
|
+
* @param { * } flow - Flow config object.
|
|
131
|
+
* @throws { TypeError } With aggregated error list on any violation.
|
|
132
|
+
*/
|
|
133
|
+
const validateFlow = function ( flow ) {
|
|
134
|
+
// Pre-check: validateWithSchema iterates `key in object`, which
|
|
135
|
+
// throws on null/undefined and behaves oddly on arrays. Handle
|
|
136
|
+
// those root-level shape errors up front with the same error
|
|
137
|
+
// format throwIfInvalid uses for consistency.
|
|
138
|
+
if ( flow === null || flow === undefined || typeof flow !== 'object' || Array.isArray( flow ) ) {
|
|
139
|
+
let actualType;
|
|
140
|
+
if ( flow === null ) {
|
|
141
|
+
actualType = 'null';
|
|
142
|
+
} else if ( Array.isArray( flow ) ) {
|
|
143
|
+
actualType = 'array';
|
|
144
|
+
} else {
|
|
145
|
+
actualType = typeof flow;
|
|
146
|
+
}
|
|
147
|
+
throw new TypeError(
|
|
148
|
+
`WinkComposer/partitionManager validation failed:\n flow: Expected object, got ${actualType}`
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const validation = validateWithSchema( flowSchema, flow, 'flow' );
|
|
153
|
+
validation.throwIfInvalid( 'partitionManager' );
|
|
154
|
+
}; // validateFlow()
|
|
155
|
+
|
|
156
|
+
export default validateFlow;
|
|
157
|
+
export { validateFlow };
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// core/semantics/digest.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Semantic Digest Computation
|
|
5
|
+
*
|
|
6
|
+
* Computes deterministic hashes of semantics for SSOT verification.
|
|
7
|
+
* Used by QuestDB storage layer for schema-semantics binding.
|
|
8
|
+
*
|
|
9
|
+
* Hash properties:
|
|
10
|
+
* - Formatting-independent (canonicalized before hashing)
|
|
11
|
+
* - Sorted object keys (deterministic)
|
|
12
|
+
* - Preserved array order (contexts are first-match-wins)
|
|
13
|
+
* - Includes descriptions (affect interpretation)
|
|
14
|
+
* - Hashes as-loaded (JSON files are the contract)
|
|
15
|
+
*
|
|
16
|
+
* Performance: Runs once at startup. Allocation-minimized for hot path
|
|
17
|
+
* is not a concern here.
|
|
18
|
+
*
|
|
19
|
+
* @see docs/architecture/storage-layer.md
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import crypto from 'node:crypto';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Check if value is a plain object (not array, null, or other type).
|
|
26
|
+
*
|
|
27
|
+
* @param {*} value - Value to check
|
|
28
|
+
* @returns {boolean} True if plain object
|
|
29
|
+
*/
|
|
30
|
+
const isPlainObject = function ( value ) {
|
|
31
|
+
return (
|
|
32
|
+
typeof value === 'object' &&
|
|
33
|
+
value !== null &&
|
|
34
|
+
Array.isArray( value ) === false
|
|
35
|
+
);
|
|
36
|
+
}; // isPlainObject()
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Recursively canonicalize a value for deterministic hashing.
|
|
40
|
+
* - Objects: keys sorted alphabetically, values canonicalized
|
|
41
|
+
* - Arrays: order preserved, elements canonicalized
|
|
42
|
+
* - Primitives: returned as-is
|
|
43
|
+
*
|
|
44
|
+
* @param {*} value - Value to canonicalize
|
|
45
|
+
* @returns {*} Canonicalized value
|
|
46
|
+
*/
|
|
47
|
+
const canonicalize = function ( value ) {
|
|
48
|
+
if ( Array.isArray( value ) ) {
|
|
49
|
+
const len = value.length;
|
|
50
|
+
const out = new Array( len );
|
|
51
|
+
for ( let i = 0; i < len; i += 1 ) {
|
|
52
|
+
out[ i ] = canonicalize( value[ i ] );
|
|
53
|
+
}
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if ( isPlainObject( value ) ) {
|
|
58
|
+
const keys = Object.keys( value ).sort();
|
|
59
|
+
const out = Object.create( null );
|
|
60
|
+
for ( let i = 0; i < keys.length; i += 1 ) {
|
|
61
|
+
const key = keys[ i ];
|
|
62
|
+
out[ key ] = canonicalize( value[ key ] );
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return value;
|
|
68
|
+
}; // canonicalize()
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Compute SHA-256 hash of a string.
|
|
72
|
+
*
|
|
73
|
+
* @param {string} str - String to hash
|
|
74
|
+
* @returns {string} 64-character hex hash
|
|
75
|
+
*/
|
|
76
|
+
const sha256 = function ( str ) {
|
|
77
|
+
return crypto
|
|
78
|
+
.createHash( 'sha256' )
|
|
79
|
+
.update( str, 'utf8' )
|
|
80
|
+
.digest( 'hex' );
|
|
81
|
+
}; // sha256()
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Compute semantic digest with global and per-asset-class hashes.
|
|
85
|
+
*
|
|
86
|
+
* @param {Object} semantics - { enums, assetClasses } after validation
|
|
87
|
+
* @param {string} [version] - Human-controlled version string
|
|
88
|
+
* @returns {Object} Digest with globalHash, enumsHash, assetHashes, version
|
|
89
|
+
*/
|
|
90
|
+
const computeSemanticsDigest = function ( semantics, version = '1.0.0' ) {
|
|
91
|
+
const { enums, assetClasses } = semantics;
|
|
92
|
+
|
|
93
|
+
// Canonicalize entire semantics for global hash
|
|
94
|
+
const canonical = canonicalize( { enums, assetClasses } );
|
|
95
|
+
const globalHash = sha256( JSON.stringify( canonical ) );
|
|
96
|
+
|
|
97
|
+
// Canonicalize enums only
|
|
98
|
+
const enumsHash = sha256( JSON.stringify( canonicalize( enums ) ) );
|
|
99
|
+
|
|
100
|
+
// Canonicalize each asset class individually
|
|
101
|
+
const assetHashes = Object.create( null );
|
|
102
|
+
const assetNames = Object.keys( assetClasses ).sort();
|
|
103
|
+
for ( let i = 0; i < assetNames.length; i += 1 ) {
|
|
104
|
+
const name = assetNames[ i ];
|
|
105
|
+
const canonicalAsset = canonicalize( assetClasses[ name ] );
|
|
106
|
+
assetHashes[ name ] = sha256( JSON.stringify( canonicalAsset ) );
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
globalHash,
|
|
111
|
+
enumsHash,
|
|
112
|
+
assetHashes,
|
|
113
|
+
version
|
|
114
|
+
};
|
|
115
|
+
}; // computeSemanticsDigest()
|
|
116
|
+
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// EXPORTS
|
|
119
|
+
// ============================================================================
|
|
120
|
+
|
|
121
|
+
export {
|
|
122
|
+
canonicalize,
|
|
123
|
+
sha256,
|
|
124
|
+
computeSemanticsDigest,
|
|
125
|
+
isPlainObject
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export default computeSemanticsDigest;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// core/semantics/index.js
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @fileoverview Semantics Layer for @winkjs/composer
|
|
5
|
+
*
|
|
6
|
+
* Provides semantic metadata for columns, asset classes, and insight types.
|
|
7
|
+
* Loaded from JSON configuration files and used for:
|
|
8
|
+
* - Column validation (physicalRange, operational limits)
|
|
9
|
+
* - Data projection (insightType → column subset)
|
|
10
|
+
* - Threshold configuration (context-dependent limits)
|
|
11
|
+
* - LLM/dashboard context (units, descriptions)
|
|
12
|
+
*
|
|
13
|
+
* Usage:
|
|
14
|
+
* ```javascript
|
|
15
|
+
* import { loadSemantics } from './core/semantics/index.js';
|
|
16
|
+
*
|
|
17
|
+
* const semantics = await loadSemantics( './config/semantics' );
|
|
18
|
+
* const { enums, assetClasses } = semantics;
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// LOADER
|
|
24
|
+
// ============================================================================
|
|
25
|
+
|
|
26
|
+
export {
|
|
27
|
+
loadSemantics,
|
|
28
|
+
loadEnums,
|
|
29
|
+
loadAssetClasses,
|
|
30
|
+
loadJsonFile,
|
|
31
|
+
validateCrossReferences
|
|
32
|
+
} from './loader.js';
|
|
33
|
+
|
|
34
|
+
// ============================================================================
|
|
35
|
+
// DIGEST
|
|
36
|
+
// ============================================================================
|
|
37
|
+
|
|
38
|
+
export {
|
|
39
|
+
computeSemanticsDigest,
|
|
40
|
+
canonicalize
|
|
41
|
+
} from './digest.js';
|
|
42
|
+
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// WARNINGS
|
|
45
|
+
// ============================================================================
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
WARNING_PREFIX,
|
|
49
|
+
defaultOnWarning,
|
|
50
|
+
createWarningCollector
|
|
51
|
+
} from './warnings.js';
|
|
52
|
+
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// SCHEMAS
|
|
55
|
+
// ============================================================================
|
|
56
|
+
|
|
57
|
+
export {
|
|
58
|
+
// Enum schema
|
|
59
|
+
enumSchema,
|
|
60
|
+
validEnumKeys,
|
|
61
|
+
validEnumValues,
|
|
62
|
+
|
|
63
|
+
// Column schema
|
|
64
|
+
columnSchema,
|
|
65
|
+
validPhysicalRange,
|
|
66
|
+
validOperational,
|
|
67
|
+
validSpecification,
|
|
68
|
+
validWhen,
|
|
69
|
+
validContext,
|
|
70
|
+
validContexts,
|
|
71
|
+
validColumnType,
|
|
72
|
+
validInterpretation,
|
|
73
|
+
validLimitsMutualExclusivity,
|
|
74
|
+
COLUMN_TYPES,
|
|
75
|
+
COLUMN_DEFAULTS,
|
|
76
|
+
|
|
77
|
+
// Asset class schema
|
|
78
|
+
assetClassSchema,
|
|
79
|
+
insightTypeSchema,
|
|
80
|
+
validColumnsStructure,
|
|
81
|
+
validInsightType,
|
|
82
|
+
validInsightTypes
|
|
83
|
+
} from './schemas/index.js';
|