cbrowser 20.2.2 → 21.0.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.
- package/README.md +2 -2
- package/dist/analysis/accessibility-empathy.d.ts +29 -1
- package/dist/analysis/accessibility-empathy.d.ts.map +1 -1
- package/dist/analysis/accessibility-empathy.js +69 -35
- package/dist/analysis/accessibility-empathy.js.map +1 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +11 -7
- package/dist/browser.js.map +1 -1
- package/dist/cif-score.d.ts +56 -5
- package/dist/cif-score.d.ts.map +1 -1
- package/dist/cif-score.js +595 -346
- package/dist/cif-score.js.map +1 -1
- package/dist/cli.js +10 -8
- package/dist/cli.js.map +1 -1
- package/dist/cognitive/default-traits.d.ts +14 -0
- package/dist/cognitive/default-traits.d.ts.map +1 -0
- package/dist/cognitive/default-traits.js +36 -0
- package/dist/cognitive/default-traits.js.map +1 -0
- package/dist/cognitive/emotions.d.ts.map +1 -1
- package/dist/cognitive/emotions.js +104 -174
- package/dist/cognitive/emotions.js.map +1 -1
- package/dist/cognitive/index.d.ts +28 -0
- package/dist/cognitive/index.d.ts.map +1 -1
- package/dist/cognitive/index.js +353 -287
- package/dist/cognitive/index.js.map +1 -1
- package/dist/cognitive/temporal.d.ts +0 -24
- package/dist/cognitive/temporal.d.ts.map +1 -1
- package/dist/cognitive/temporal.js +45 -35
- package/dist/cognitive/temporal.js.map +1 -1
- package/dist/data/ctc-reference-v2-2026-10-24.d.ts +16 -0
- package/dist/data/ctc-reference-v2-2026-10-24.d.ts.map +1 -0
- package/dist/data/ctc-reference-v2-2026-10-24.js +1004 -0
- package/dist/data/ctc-reference-v2-2026-10-24.js.map +1 -0
- package/dist/ideal-profiles-gap.d.ts +1 -0
- package/dist/ideal-profiles-gap.d.ts.map +1 -1
- package/dist/ideal-profiles-gap.js +9 -1
- package/dist/ideal-profiles-gap.js.map +1 -1
- package/dist/ideal-profiles.d.ts +8 -0
- package/dist/ideal-profiles.d.ts.map +1 -1
- package/dist/ideal-profiles.js +28 -24
- package/dist/ideal-profiles.js.map +1 -1
- package/dist/mcp-server-remote.d.ts.map +1 -1
- package/dist/mcp-server-remote.js +7 -8
- package/dist/mcp-server-remote.js.map +1 -1
- package/dist/mcp-tools/account-personas.d.ts.map +1 -1
- package/dist/mcp-tools/account-personas.js +3 -1
- package/dist/mcp-tools/account-personas.js.map +1 -1
- package/dist/mcp-tools/base/answer-provenance.d.ts +28 -0
- package/dist/mcp-tools/base/answer-provenance.d.ts.map +1 -0
- package/dist/mcp-tools/base/answer-provenance.js +32 -0
- package/dist/mcp-tools/base/answer-provenance.js.map +1 -0
- package/dist/mcp-tools/base/audit-tools.d.ts +0 -3
- package/dist/mcp-tools/base/audit-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/audit-tools.js +152 -84
- package/dist/mcp-tools/base/audit-tools.js.map +1 -1
- package/dist/mcp-tools/base/capture-tools.js +1 -1
- package/dist/mcp-tools/base/capture-tools.js.map +1 -1
- package/dist/mcp-tools/base/chain-values.d.ts +38 -0
- package/dist/mcp-tools/base/chain-values.d.ts.map +1 -0
- package/dist/mcp-tools/base/chain-values.js +85 -0
- package/dist/mcp-tools/base/chain-values.js.map +1 -0
- package/dist/mcp-tools/base/cognitive-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/cognitive-tools.js +126 -120
- package/dist/mcp-tools/base/cognitive-tools.js.map +1 -1
- package/dist/mcp-tools/base/gif-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/gif-tools.js +23 -5
- package/dist/mcp-tools/base/gif-tools.js.map +1 -1
- package/dist/mcp-tools/base/persona-comparison-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/persona-comparison-tools.js +229 -172
- package/dist/mcp-tools/base/persona-comparison-tools.js.map +1 -1
- package/dist/mcp-tools/base/site-familiarity.d.ts +31 -0
- package/dist/mcp-tools/base/site-familiarity.d.ts.map +1 -0
- package/dist/mcp-tools/base/site-familiarity.js +30 -0
- package/dist/mcp-tools/base/site-familiarity.js.map +1 -0
- package/dist/mcp-tools/base/site-knowledge-tools.js +1 -1
- package/dist/mcp-tools/base/site-knowledge-tools.js.map +1 -1
- package/dist/mcp-tools/base/story-narrative.d.ts +50 -0
- package/dist/mcp-tools/base/story-narrative.d.ts.map +1 -0
- package/dist/mcp-tools/base/story-narrative.js +88 -0
- package/dist/mcp-tools/base/story-narrative.js.map +1 -0
- package/dist/mcp-tools/base/values-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/values-tools.js +19 -5
- package/dist/mcp-tools/base/values-tools.js.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.d.ts +5 -5
- package/dist/mcp-tools/base/visual-testing-tools.d.ts.map +1 -1
- package/dist/mcp-tools/base/visual-testing-tools.js +38 -11
- package/dist/mcp-tools/base/visual-testing-tools.js.map +1 -1
- package/dist/mcp-tools/persona-creation-tools.js +6 -6
- package/dist/mcp-tools/persona-creation-tools.js.map +1 -1
- package/dist/mcp-tools/persona-lifecycle-tools.d.ts.map +1 -1
- package/dist/mcp-tools/persona-lifecycle-tools.js +5 -1
- package/dist/mcp-tools/persona-lifecycle-tools.js.map +1 -1
- package/dist/mcp-tools/tier-gate.js +1 -1
- package/dist/mcp-tools/tool-result-saver.d.ts +7 -0
- package/dist/mcp-tools/tool-result-saver.d.ts.map +1 -1
- package/dist/mcp-tools/tool-result-saver.js +11 -0
- package/dist/mcp-tools/tool-result-saver.js.map +1 -1
- package/dist/mcp-tools/trait-provenance.d.ts +109 -0
- package/dist/mcp-tools/trait-provenance.d.ts.map +1 -0
- package/dist/mcp-tools/trait-provenance.js +187 -0
- package/dist/mcp-tools/trait-provenance.js.map +1 -0
- package/dist/mcp-tools/ui-resources.d.ts +6 -7
- package/dist/mcp-tools/ui-resources.d.ts.map +1 -1
- package/dist/mcp-tools/ui-resources.js +162 -12
- package/dist/mcp-tools/ui-resources.js.map +1 -1
- package/dist/mcp-tools/widget-kit.d.ts +129 -3
- package/dist/mcp-tools/widget-kit.d.ts.map +1 -1
- package/dist/mcp-tools/widget-kit.js +507 -28
- package/dist/mcp-tools/widget-kit.js.map +1 -1
- package/dist/performance/metrics.d.ts.map +1 -1
- package/dist/performance/metrics.js +4 -1
- package/dist/performance/metrics.js.map +1 -1
- package/dist/persona-questionnaire.js +1 -1
- package/dist/persona-questionnaire.js.map +1 -1
- package/dist/personas.d.ts.map +1 -1
- package/dist/personas.js +133 -82
- package/dist/personas.js.map +1 -1
- package/dist/recording/engine.d.ts.map +1 -1
- package/dist/recording/engine.js +5 -2
- package/dist/recording/engine.js.map +1 -1
- package/dist/recording/saliency-overlay.d.ts +8 -3
- package/dist/recording/saliency-overlay.d.ts.map +1 -1
- package/dist/recording/saliency-overlay.js +14 -5
- package/dist/recording/saliency-overlay.js.map +1 -1
- package/dist/recording/types.js +1 -1
- package/dist/testing/nl-test-suite.d.ts.map +1 -1
- package/dist/testing/nl-test-suite.js +2 -1
- package/dist/testing/nl-test-suite.js.map +1 -1
- package/dist/trait-reference.d.ts +19 -2
- package/dist/trait-reference.d.ts.map +1 -1
- package/dist/trait-reference.js +19 -2
- package/dist/trait-reference.js.map +1 -1
- package/dist/types.d.ts +32 -21
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +62 -52
- package/dist/types.js.map +1 -1
- package/dist/values/persona-completeness.js +1 -1
- package/dist/values/persona-completeness.js.map +1 -1
- package/dist/visual/ab-comparison.d.ts.map +1 -1
- package/dist/visual/ab-comparison.js +4 -1
- package/dist/visual/ab-comparison.js.map +1 -1
- package/dist/visual/attention-quality.d.ts +1 -1
- package/dist/visual/attention-quality.js +1 -1
- package/dist/visual/attention-transport.d.ts +74 -10
- package/dist/visual/attention-transport.d.ts.map +1 -1
- package/dist/visual/attention-transport.js +353 -193
- package/dist/visual/attention-transport.js.map +1 -1
- package/dist/visual/cognitive-models.d.ts +77 -55
- package/dist/visual/cognitive-models.d.ts.map +1 -1
- package/dist/visual/cognitive-models.js +231 -104
- package/dist/visual/cognitive-models.js.map +1 -1
- package/dist/visual/cognitive-transport-chain.d.ts +328 -30
- package/dist/visual/cognitive-transport-chain.d.ts.map +1 -1
- package/dist/visual/cognitive-transport-chain.js +576 -353
- package/dist/visual/cognitive-transport-chain.js.map +1 -1
- package/dist/visual/cognitive-transport.d.ts +446 -13
- package/dist/visual/cognitive-transport.d.ts.map +1 -1
- package/dist/visual/cognitive-transport.js +1085 -245
- package/dist/visual/cognitive-transport.js.map +1 -1
- package/dist/visual/cross-browser.d.ts.map +1 -1
- package/dist/visual/cross-browser.js +8 -6
- package/dist/visual/cross-browser.js.map +1 -1
- package/dist/visual/ctc-bands.d.ts +91 -0
- package/dist/visual/ctc-bands.d.ts.map +1 -0
- package/dist/visual/ctc-bands.js +117 -0
- package/dist/visual/ctc-bands.js.map +1 -0
- package/dist/visual/ctc-reference.d.ts +287 -0
- package/dist/visual/ctc-reference.d.ts.map +1 -0
- package/dist/visual/ctc-reference.js +376 -0
- package/dist/visual/ctc-reference.js.map +1 -0
- package/dist/visual/demand-laws.d.ts +145 -0
- package/dist/visual/demand-laws.d.ts.map +1 -0
- package/dist/visual/demand-laws.js +220 -0
- package/dist/visual/demand-laws.js.map +1 -0
- package/dist/visual/distance-metrics.d.ts +23 -1
- package/dist/visual/distance-metrics.d.ts.map +1 -1
- package/dist/visual/distance-metrics.js +49 -18
- package/dist/visual/distance-metrics.js.map +1 -1
- package/dist/visual/dro-bound.d.ts +220 -0
- package/dist/visual/dro-bound.d.ts.map +1 -0
- package/dist/visual/dro-bound.js +341 -0
- package/dist/visual/dro-bound.js.map +1 -0
- package/dist/visual/exact-w1.d.ts +60 -0
- package/dist/visual/exact-w1.d.ts.map +1 -0
- package/dist/visual/exact-w1.js +247 -0
- package/dist/visual/exact-w1.js.map +1 -0
- package/dist/visual/human-input.d.ts.map +1 -1
- package/dist/visual/human-input.js +45 -41
- package/dist/visual/human-input.js.map +1 -1
- package/dist/visual/index.d.ts +2 -0
- package/dist/visual/index.d.ts.map +1 -1
- package/dist/visual/index.js +2 -0
- package/dist/visual/index.js.map +1 -1
- package/dist/visual/law-times-report.d.ts +49 -0
- package/dist/visual/law-times-report.d.ts.map +1 -0
- package/dist/visual/law-times-report.js +38 -0
- package/dist/visual/law-times-report.js.map +1 -0
- package/dist/visual/model-provenance.d.ts +151 -0
- package/dist/visual/model-provenance.d.ts.map +1 -0
- package/dist/visual/model-provenance.js +334 -0
- package/dist/visual/model-provenance.js.map +1 -0
- package/dist/visual/normal-cdf.d.ts +14 -0
- package/dist/visual/normal-cdf.d.ts.map +1 -0
- package/dist/visual/normal-cdf.js +26 -0
- package/dist/visual/normal-cdf.js.map +1 -0
- package/dist/visual/perceptual-transport.d.ts +28 -4
- package/dist/visual/perceptual-transport.d.ts.map +1 -1
- package/dist/visual/perceptual-transport.js +66 -32
- package/dist/visual/perceptual-transport.js.map +1 -1
- package/dist/visual/provenance/attention.d.ts +55 -0
- package/dist/visual/provenance/attention.d.ts.map +1 -0
- package/dist/visual/provenance/attention.js +188 -0
- package/dist/visual/provenance/attention.js.map +1 -0
- package/dist/visual/provenance/chain.d.ts +41 -0
- package/dist/visual/provenance/chain.d.ts.map +1 -0
- package/dist/visual/provenance/chain.js +66 -0
- package/dist/visual/provenance/chain.js.map +1 -0
- package/dist/visual/provenance/cif.d.ts +42 -0
- package/dist/visual/provenance/cif.d.ts.map +1 -0
- package/dist/visual/provenance/cif.js +116 -0
- package/dist/visual/provenance/cif.js.map +1 -0
- package/dist/visual/provenance/ctc-reference.d.ts +36 -0
- package/dist/visual/provenance/ctc-reference.d.ts.map +1 -0
- package/dist/visual/provenance/ctc-reference.js +96 -0
- package/dist/visual/provenance/ctc-reference.js.map +1 -0
- package/dist/visual/provenance/distance.d.ts +10 -0
- package/dist/visual/provenance/distance.d.ts.map +1 -0
- package/dist/visual/provenance/distance.js +72 -0
- package/dist/visual/provenance/distance.js.map +1 -0
- package/dist/visual/provenance/dro.d.ts +10 -0
- package/dist/visual/provenance/dro.d.ts.map +1 -0
- package/dist/visual/provenance/dro.js +2 -0
- package/dist/visual/provenance/dro.js.map +1 -0
- package/dist/visual/provenance/emotion.d.ts +26 -0
- package/dist/visual/provenance/emotion.d.ts.map +1 -0
- package/dist/visual/provenance/emotion.js +99 -0
- package/dist/visual/provenance/emotion.js.map +1 -0
- package/dist/visual/provenance/human-input.d.ts +19 -0
- package/dist/visual/provenance/human-input.d.ts.map +1 -0
- package/dist/visual/provenance/human-input.js +84 -0
- package/dist/visual/provenance/human-input.js.map +1 -0
- package/dist/visual/provenance/journey-group.d.ts +15 -0
- package/dist/visual/provenance/journey-group.d.ts.map +1 -0
- package/dist/visual/provenance/journey-group.js +15 -0
- package/dist/visual/provenance/journey-group.js.map +1 -0
- package/dist/visual/provenance/journey-mcp.d.ts +24 -0
- package/dist/visual/provenance/journey-mcp.d.ts.map +1 -0
- package/dist/visual/provenance/journey-mcp.js +54 -0
- package/dist/visual/provenance/journey-mcp.js.map +1 -0
- package/dist/visual/provenance/journey.d.ts +34 -0
- package/dist/visual/provenance/journey.d.ts.map +1 -0
- package/dist/visual/provenance/journey.js +184 -0
- package/dist/visual/provenance/journey.js.map +1 -0
- package/dist/visual/provenance/laws.d.ts +38 -0
- package/dist/visual/provenance/laws.d.ts.map +1 -0
- package/dist/visual/provenance/laws.js +40 -0
- package/dist/visual/provenance/laws.js.map +1 -0
- package/dist/visual/provenance/page-metrics.d.ts +42 -0
- package/dist/visual/provenance/page-metrics.d.ts.map +1 -0
- package/dist/visual/provenance/page-metrics.js +79 -0
- package/dist/visual/provenance/page-metrics.js.map +1 -0
- package/dist/visual/provenance/perceptual.d.ts +63 -0
- package/dist/visual/provenance/perceptual.d.ts.map +1 -0
- package/dist/visual/provenance/perceptual.js +115 -0
- package/dist/visual/provenance/perceptual.js.map +1 -0
- package/dist/visual/provenance/persona-rates.d.ts +84 -0
- package/dist/visual/provenance/persona-rates.d.ts.map +1 -0
- package/dist/visual/provenance/persona-rates.js +112 -0
- package/dist/visual/provenance/persona-rates.js.map +1 -0
- package/dist/visual/provenance/personas.d.ts +122 -0
- package/dist/visual/provenance/personas.d.ts.map +1 -0
- package/dist/visual/provenance/personas.js +298 -0
- package/dist/visual/provenance/personas.js.map +1 -0
- package/dist/visual/provenance/profiles.d.ts +39 -0
- package/dist/visual/provenance/profiles.d.ts.map +1 -0
- package/dist/visual/provenance/profiles.js +37 -0
- package/dist/visual/provenance/profiles.js.map +1 -0
- package/dist/visual/provenance/temporal.d.ts +21 -0
- package/dist/visual/provenance/temporal.d.ts.map +1 -0
- package/dist/visual/provenance/temporal.js +56 -0
- package/dist/visual/provenance/temporal.js.map +1 -0
- package/dist/visual/provenance/visual-distance.d.ts +22 -0
- package/dist/visual/provenance/visual-distance.d.ts.map +1 -0
- package/dist/visual/provenance/visual-distance.js +30 -0
- package/dist/visual/provenance/visual-distance.js.map +1 -0
- package/dist/visual/regression.d.ts.map +1 -1
- package/dist/visual/regression.js +14 -9
- package/dist/visual/regression.js.map +1 -1
- package/dist/visual/responsive.d.ts.map +1 -1
- package/dist/visual/responsive.js +4 -1
- package/dist/visual/responsive.js.map +1 -1
- package/dist/visual/scope-prose.js +2 -2
- package/dist/visual/scope-prose.js.map +1 -1
- package/dist/visual/seeded-random.d.ts +16 -0
- package/dist/visual/seeded-random.d.ts.map +1 -0
- package/dist/visual/seeded-random.js +25 -0
- package/dist/visual/seeded-random.js.map +1 -0
- package/dist/visual/stored-accessibility-traits.d.ts +27 -0
- package/dist/visual/stored-accessibility-traits.d.ts.map +1 -0
- package/dist/visual/stored-accessibility-traits.js +35 -0
- package/dist/visual/stored-accessibility-traits.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exact-w1.d.ts","sourceRoot":"","sources":["../../src/visual/exact-w1.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AASH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,yFAAyF;IACzF,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,eAAe,CA+IvH"}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Exact Wasserstein-1 (earth mover's) distance between two discrete
|
|
3
|
+
* distributions over the same n points, under an arbitrary non-negative cost
|
|
4
|
+
* matrix.
|
|
5
|
+
*
|
|
6
|
+
* Solves the transportation problem
|
|
7
|
+
*
|
|
8
|
+
* min sum_ij C[i][j] * P[i][j]
|
|
9
|
+
* s.t. sum_j P[i][j] = a[i], sum_i P[i][j] = b[j], P >= 0
|
|
10
|
+
*
|
|
11
|
+
* as a min-cost flow on the bipartite graph source -> i -> j -> sink with
|
|
12
|
+
* successive shortest paths (Dijkstra with Johnson potentials, so reverse edges
|
|
13
|
+
* with negative reduced cost never break the search). Every augmentation ships
|
|
14
|
+
* the bottleneck mass along a shortest source-to-sink path in the residual
|
|
15
|
+
* graph; the plan it leaves behind is optimal by the standard SSP argument
|
|
16
|
+
* (each augmentation is along a shortest path, so no negative cycle is ever
|
|
17
|
+
* created in the residual graph).
|
|
18
|
+
*
|
|
19
|
+
* Complexity: one Dijkstra is O(V^2) on this dense graph, V = 2n + 2. The number
|
|
20
|
+
* of augmentations K is bounded by the number of edges whose residual capacity
|
|
21
|
+
* can be exhausted (each augmentation saturates a supply edge, a demand edge or
|
|
22
|
+
* cancels a reverse edge), so the total is O(K * n^2) with K = O(n^2) in the
|
|
23
|
+
* worst case. cognitiveDistance now calls it on 30 points (29 traits plus the
|
|
24
|
+
* slack bin of the generalized distance). Measured across all 300 roster pairs
|
|
25
|
+
* in the canonical order cognitiveDistance uses (2026-10-21, after the end-node
|
|
26
|
+
* fix below): K = 41 min, 51 median, 57 max on the 30-point problem (the
|
|
27
|
+
* 29-point simplex problem it replaced: 48 / 57 / 57; 54 / 72 / 161 with the
|
|
28
|
+
* old end-node rule), i.e. roughly 1.5n to 2n, and a 25 x 25 distance matrix
|
|
29
|
+
* takes ~62 ms median (research/latency/bench-ctc.ts; ~73 ms before).
|
|
30
|
+
* Mass is floating point, so "saturated" means residual <= EPS and the loop
|
|
31
|
+
* stops once every supply point or every demand point is at or below EPS.
|
|
32
|
+
*
|
|
33
|
+
* `cognitiveDistance` used to call its result "W1" while computing a weighted
|
|
34
|
+
* L1 sum (|a_i - b_i| times the mean ground distance of trait i), which is not
|
|
35
|
+
* optimal transport and does not respect the ground metric. This module is the
|
|
36
|
+
* exact replacement. Its oracle test (tests/cognitive-distance-w1.test.ts)
|
|
37
|
+
* checks it against an independent dense two-phase simplex on the same LP, and,
|
|
38
|
+
* with a slack bin, against the Piccoli-Rossi unbalanced LP it stands in for.
|
|
39
|
+
*
|
|
40
|
+
* @copyright 2026 Alexandria Eden alexandria.shai.eden@gmail.com https://cbrowser.ai
|
|
41
|
+
* @license MIT
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* Mass below this is treated as zero. Atoms can be smaller than this (the
|
|
45
|
+
* generalized persona measure has no floor), so termination is decided per
|
|
46
|
+
* point, not on the total; see the main loop.
|
|
47
|
+
*/
|
|
48
|
+
const EPS = 1e-12;
|
|
49
|
+
/**
|
|
50
|
+
* Exact W1 between distributions `a` and `b` (same length n, both summing to
|
|
51
|
+
* the same total up to EPS) under cost matrix `cost` (n x n, non-negative).
|
|
52
|
+
*
|
|
53
|
+
* Throws if the shapes disagree or the masses differ by more than 1e-9: unequal
|
|
54
|
+
* mass is an unbalanced problem and W1 is undefined for it. (cognitiveDistance
|
|
55
|
+
* balances its measures first with a slack bin; see traitsToLevelMeasure.)
|
|
56
|
+
*/
|
|
57
|
+
export function exactW1(a, b, cost) {
|
|
58
|
+
const n = a.length;
|
|
59
|
+
if (b.length !== n || cost.length !== n)
|
|
60
|
+
throw new Error(`exactW1: shape mismatch (a=${n}, b=${b.length}, cost=${cost.length})`);
|
|
61
|
+
let massA = 0, massB = 0;
|
|
62
|
+
for (let i = 0; i < n; i++) {
|
|
63
|
+
if (!(a[i] >= 0) || !(b[i] >= 0))
|
|
64
|
+
throw new Error(`exactW1: negative or NaN mass at index ${i}`);
|
|
65
|
+
massA += a[i];
|
|
66
|
+
massB += b[i];
|
|
67
|
+
}
|
|
68
|
+
if (Math.abs(massA - massB) > 1e-9)
|
|
69
|
+
throw new Error(`exactW1: unbalanced masses (${massA} vs ${massB})`);
|
|
70
|
+
// Residual state. Supply edges source->i carry `supply[i]` remaining; demand
|
|
71
|
+
// edges j->sink carry `demand[j]` remaining. Middle edges i->j have infinite
|
|
72
|
+
// forward capacity, and their reverse edge j->i has capacity plan[i][j].
|
|
73
|
+
const supply = new Float64Array(n);
|
|
74
|
+
const demand = new Float64Array(n);
|
|
75
|
+
for (let i = 0; i < n; i++) {
|
|
76
|
+
supply[i] = a[i];
|
|
77
|
+
demand[i] = b[i];
|
|
78
|
+
}
|
|
79
|
+
const plan = Array.from({ length: n }, () => new Array(n).fill(0));
|
|
80
|
+
// Johnson potentials for the 2n inner nodes: left (supply side) and right
|
|
81
|
+
// (demand side). All original costs are non-negative, so zero potentials are
|
|
82
|
+
// valid initially; after each Dijkstra they are updated with the distances so
|
|
83
|
+
// reduced costs stay non-negative.
|
|
84
|
+
const potL = new Float64Array(n);
|
|
85
|
+
const potR = new Float64Array(n);
|
|
86
|
+
const distL = new Float64Array(n);
|
|
87
|
+
const distR = new Float64Array(n);
|
|
88
|
+
const doneL = new Uint8Array(n);
|
|
89
|
+
const doneR = new Uint8Array(n);
|
|
90
|
+
// Predecessors: for a left node, the right node we came from (-1 = source);
|
|
91
|
+
// for a right node, the left node we came from.
|
|
92
|
+
const prevL = new Int32Array(n);
|
|
93
|
+
const prevR = new Int32Array(n);
|
|
94
|
+
let remaining = massA;
|
|
95
|
+
let total = 0;
|
|
96
|
+
let augmentations = 0;
|
|
97
|
+
for (;;) {
|
|
98
|
+
// Done once either side has nothing above EPS left at any point. The loop
|
|
99
|
+
// used to run while the TOTAL unshipped supply exceeded EPS, which threw
|
|
100
|
+
// "no augmenting path" when several atoms each below EPS added up to more
|
|
101
|
+
// than EPS: every one of them is treated as zero, so nothing could ship.
|
|
102
|
+
// Unreachable while cognitiveDistance floored every trait to 0.01; reachable
|
|
103
|
+
// on the generalized measure, which has no floor (fast-check found trait
|
|
104
|
+
// values of 1e-11 and 6e-12, 2026-10-21). What is left on the other side
|
|
105
|
+
// is at most the 1e-9 imbalance the entry check allows plus one sub-EPS
|
|
106
|
+
// crumb per point, and it changes the cost by less than that mass times the
|
|
107
|
+
// largest cost.
|
|
108
|
+
let open = false, need = false;
|
|
109
|
+
for (let i = 0; i < n; i++) {
|
|
110
|
+
if (supply[i] > EPS)
|
|
111
|
+
open = true;
|
|
112
|
+
if (demand[i] > EPS)
|
|
113
|
+
need = true;
|
|
114
|
+
}
|
|
115
|
+
if (!open || !need)
|
|
116
|
+
break;
|
|
117
|
+
// Dijkstra over the residual graph with reduced costs.
|
|
118
|
+
distL.fill(Infinity);
|
|
119
|
+
distR.fill(Infinity);
|
|
120
|
+
doneL.fill(0);
|
|
121
|
+
doneR.fill(0);
|
|
122
|
+
prevL.fill(-1);
|
|
123
|
+
prevR.fill(-1);
|
|
124
|
+
for (let i = 0; i < n; i++)
|
|
125
|
+
if (supply[i] > EPS)
|
|
126
|
+
distL[i] = 0; // source -> i, cost 0, potential 0 at source
|
|
127
|
+
for (;;) {
|
|
128
|
+
// Pick the unsettled node with the smallest tentative distance (dense O(V) scan).
|
|
129
|
+
let best = Infinity, side = -1, idx = -1;
|
|
130
|
+
for (let i = 0; i < n; i++)
|
|
131
|
+
if (!doneL[i] && distL[i] < best) {
|
|
132
|
+
best = distL[i];
|
|
133
|
+
side = 0;
|
|
134
|
+
idx = i;
|
|
135
|
+
}
|
|
136
|
+
for (let j = 0; j < n; j++)
|
|
137
|
+
if (!doneR[j] && distR[j] < best) {
|
|
138
|
+
best = distR[j];
|
|
139
|
+
side = 1;
|
|
140
|
+
idx = j;
|
|
141
|
+
}
|
|
142
|
+
if (idx < 0)
|
|
143
|
+
break;
|
|
144
|
+
if (side === 0) {
|
|
145
|
+
doneL[idx] = 1;
|
|
146
|
+
const costRow = cost[idx];
|
|
147
|
+
// Forward edges idx -> j (infinite capacity).
|
|
148
|
+
for (let j = 0; j < n; j++) {
|
|
149
|
+
if (doneR[j])
|
|
150
|
+
continue;
|
|
151
|
+
const nd = best + costRow[j] + potL[idx] - potR[j];
|
|
152
|
+
if (nd < distR[j] - EPS) {
|
|
153
|
+
distR[j] = nd;
|
|
154
|
+
prevR[j] = idx;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
doneR[idx] = 1;
|
|
160
|
+
// Reverse edges idx -> i exist where plan[i][idx] > EPS, with cost -C[i][idx].
|
|
161
|
+
for (let i = 0; i < n; i++) {
|
|
162
|
+
if (doneL[i] || plan[i][idx] <= EPS)
|
|
163
|
+
continue;
|
|
164
|
+
const nd = best - cost[i][idx] + potR[idx] - potL[i];
|
|
165
|
+
if (nd < distL[i] - EPS) {
|
|
166
|
+
distL[i] = nd;
|
|
167
|
+
prevL[i] = idx;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Cheapest reachable demand node with remaining capacity ends the path.
|
|
173
|
+
// "Cheapest" by TRUE distance, distR[j] + potR[j]: distR is reduced by j's
|
|
174
|
+
// own potential, which differs per j after the first round. This used to
|
|
175
|
+
// compare distR alone. That still ends at an optimal plan when every demand
|
|
176
|
+
// is filled (no residual sink arc is left to form a cycle through), but
|
|
177
|
+
// once the loop may stop with mass left over, the end chosen here decides
|
|
178
|
+
// which demand goes unfilled, and the reduced comparison picked a dearer
|
|
179
|
+
// flow (measured 2026-10-21: 1e-11 above the true min-cost flow on an
|
|
180
|
+
// 11-point line with a 3.7e-11 shortfall).
|
|
181
|
+
let endJ = -1, endD = Infinity;
|
|
182
|
+
for (let j = 0; j < n; j++) {
|
|
183
|
+
if (demand[j] <= EPS)
|
|
184
|
+
continue;
|
|
185
|
+
const d = distR[j] + potR[j];
|
|
186
|
+
if (d < endD) {
|
|
187
|
+
endD = d;
|
|
188
|
+
endJ = j;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (endJ < 0)
|
|
192
|
+
throw new Error(`exactW1: no augmenting path with ${remaining} mass unshipped (masses unbalanced beyond tolerance?)`);
|
|
193
|
+
// Walk the path back to find the bottleneck, then ship it.
|
|
194
|
+
let bottleneck = demand[endJ];
|
|
195
|
+
{
|
|
196
|
+
let j = endJ;
|
|
197
|
+
for (;;) {
|
|
198
|
+
const i = prevR[j];
|
|
199
|
+
const back = prevL[i];
|
|
200
|
+
if (back < 0) {
|
|
201
|
+
bottleneck = Math.min(bottleneck, supply[i]);
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
bottleneck = Math.min(bottleneck, plan[i][back]);
|
|
205
|
+
j = back;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
{
|
|
209
|
+
let j = endJ;
|
|
210
|
+
for (;;) {
|
|
211
|
+
const i = prevR[j];
|
|
212
|
+
plan[i][j] += bottleneck;
|
|
213
|
+
total += bottleneck * cost[i][j];
|
|
214
|
+
const back = prevL[i];
|
|
215
|
+
if (back < 0) {
|
|
216
|
+
supply[i] -= bottleneck;
|
|
217
|
+
break;
|
|
218
|
+
}
|
|
219
|
+
plan[i][back] -= bottleneck;
|
|
220
|
+
total -= bottleneck * cost[i][back];
|
|
221
|
+
if (plan[i][back] < EPS)
|
|
222
|
+
plan[i][back] = 0;
|
|
223
|
+
j = back;
|
|
224
|
+
}
|
|
225
|
+
demand[endJ] -= bottleneck;
|
|
226
|
+
}
|
|
227
|
+
remaining -= bottleneck;
|
|
228
|
+
augmentations++;
|
|
229
|
+
// Update potentials with the distances found (unreached nodes keep theirs).
|
|
230
|
+
for (let i = 0; i < n; i++)
|
|
231
|
+
if (distL[i] < Infinity)
|
|
232
|
+
potL[i] += distL[i];
|
|
233
|
+
for (let j = 0; j < n; j++)
|
|
234
|
+
if (distR[j] < Infinity)
|
|
235
|
+
potR[j] += distR[j];
|
|
236
|
+
}
|
|
237
|
+
// Recompute the cost from the final plan so accumulated add/subtract rounding
|
|
238
|
+
// in `total` cannot drift the reported number.
|
|
239
|
+
let exact = 0;
|
|
240
|
+
for (let i = 0; i < n; i++)
|
|
241
|
+
for (let j = 0; j < n; j++)
|
|
242
|
+
if (plan[i][j] > 0)
|
|
243
|
+
exact += plan[i][j] * cost[i][j];
|
|
244
|
+
void total;
|
|
245
|
+
return { cost: exact, plan, augmentations };
|
|
246
|
+
}
|
|
247
|
+
//# sourceMappingURL=exact-w1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exact-w1.js","sourceRoot":"","sources":["../../src/visual/exact-w1.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"human-input.d.ts","sourceRoot":"","sources":["../../src/visual/human-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"human-input.d.ts","sourceRoot":"","sources":["../../src/visual/human-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAQvC;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,oEAAoE;IACpE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA4CD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,IAAI,CAAC,CAiCf;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,WAAW,CAAC,EAAE,WAAW,EACzB,IAAI,CAAC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACvC,OAAO,CAAC;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2CnC;AAID;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAID;;;GAGG;AACH,wBAAsB,WAAW,CAAC,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1E"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { param } from "./model-provenance.js";
|
|
2
|
+
// Every duration, probability and distance below is registered, with where
|
|
3
|
+
// it comes from, in provenance/human-input.ts (humanInput.*) and read through
|
|
4
|
+
// param(). None is fitted or published.
|
|
5
|
+
const P = (id) => param(`humanInput.${id}`);
|
|
6
|
+
/** A trait the caller does not give: the journey's default, or for motor precision its own. */
|
|
7
7
|
const traits = (t) => ({
|
|
8
|
-
proceduralFluency: t?.proceduralFluency ??
|
|
9
|
-
motorPrecision: t?.motorPrecision ??
|
|
10
|
-
patience: t?.patience ??
|
|
11
|
-
readingTendency: t?.readingTendency ??
|
|
8
|
+
proceduralFluency: t?.proceduralFluency ?? param("journey.defaultTrait"),
|
|
9
|
+
motorPrecision: t?.motorPrecision ?? P("defaultMotorPrecision"),
|
|
10
|
+
patience: t?.patience ?? param("journey.defaultTrait"),
|
|
11
|
+
readingTendency: t?.readingTendency ?? param("journey.defaultTrait"),
|
|
12
12
|
});
|
|
13
13
|
// ─── Random helpers ─────────────────────────────────────────────────────────
|
|
14
14
|
/** Box-Muller sampler for Normal(mean, stddev). Truncated to [min, max]. */
|
|
@@ -49,28 +49,31 @@ function typoFor(c) {
|
|
|
49
49
|
*/
|
|
50
50
|
export async function humanType(page, text, inputTraits) {
|
|
51
51
|
const t = traits(inputTraits);
|
|
52
|
-
// Faster procedural fluency → smaller mean and stddev
|
|
53
|
-
|
|
54
|
-
|
|
52
|
+
// Faster procedural fluency → smaller mean and stddev: from the slowest
|
|
53
|
+
// decile's mean inter-key interval at 0 to the fastest decile's at 1
|
|
54
|
+
// (Dhakal et al. 2018, about 481 and 122 ms).
|
|
55
|
+
const slow = P("type.slowIntervalMs");
|
|
56
|
+
const meanInterval = slow - (slow - P("type.fastIntervalMs")) * t.proceduralFluency;
|
|
57
|
+
const stdInterval = P("type.intervalSdMs") + P("type.intervalSdPerSlowness") * (1 - t.proceduralFluency);
|
|
55
58
|
// Initial dwell — patient/thorough readers take longer to find the field
|
|
56
|
-
await sleep(rand(
|
|
59
|
+
await sleep(rand(P("type.focusMinMs"), P("type.focusMaxMs")) * (1 + t.readingTendency * P("type.focusReadingGain")));
|
|
57
60
|
for (let i = 0; i < text.length; i++) {
|
|
58
61
|
const ch = text[i];
|
|
59
62
|
// Occasional thinking pause (rare, longer)
|
|
60
|
-
if (Math.random() <
|
|
61
|
-
await sleep(rand(
|
|
63
|
+
if (Math.random() < P("type.pauseRate")) {
|
|
64
|
+
await sleep(rand(P("type.pauseMinMs"), P("type.pauseMaxMs")) * (1 + (1 - t.proceduralFluency) * P("type.pauseSlownessGain")));
|
|
62
65
|
}
|
|
63
66
|
// 5% typo+correction rate, only on letter chars
|
|
64
|
-
if (/[a-zA-Z]/.test(ch) && Math.random() <
|
|
67
|
+
if (/[a-zA-Z]/.test(ch) && Math.random() < P("type.typoRate")) {
|
|
65
68
|
const wrong = typoFor(ch);
|
|
66
69
|
await page.keyboard.type(wrong, { delay: 0 });
|
|
67
|
-
await sleep(gauss(
|
|
70
|
+
await sleep(gauss(P("type.noticeMeanMs"), P("type.noticeSdMs"), P("type.noticeMinMs"), P("type.noticeMaxMs"))); // notice the typo
|
|
68
71
|
await page.keyboard.press("Backspace");
|
|
69
|
-
await sleep(gauss(meanInterval *
|
|
72
|
+
await sleep(gauss(meanInterval * P("type.correctionShare"), stdInterval * P("type.correctionShare"), P("type.minIntervalMs"), P("type.correctionMaxMs")));
|
|
70
73
|
}
|
|
71
74
|
// Type the actual char
|
|
72
75
|
await page.keyboard.type(ch, { delay: 0 });
|
|
73
|
-
await sleep(gauss(meanInterval, stdInterval,
|
|
76
|
+
await sleep(gauss(meanInterval, stdInterval, P("type.minIntervalMs"), P("type.maxIntervalMs")));
|
|
74
77
|
}
|
|
75
78
|
}
|
|
76
79
|
// ─── Clicking ───────────────────────────────────────────────────────────────
|
|
@@ -89,35 +92,36 @@ export async function humanClick(page, cx, cy, inputTraits, bbox) {
|
|
|
89
92
|
const t = traits(inputTraits);
|
|
90
93
|
// Aim spread — high motorPrecision = small spread (1-2px), low = big (6-10px).
|
|
91
94
|
// Clamped so the click still lands inside the bbox we know about.
|
|
92
|
-
const maxSpread =
|
|
93
|
-
const halfW = bbox ? bbox.width / 2 :
|
|
94
|
-
const halfH = bbox ? bbox.height / 2 :
|
|
95
|
-
const spreadX = Math.min(maxSpread, halfW *
|
|
96
|
-
const spreadY = Math.min(maxSpread, halfH *
|
|
97
|
-
const
|
|
98
|
-
const
|
|
95
|
+
const maxSpread = P("click.maxSpreadPx") - P("click.precisionNarrowingPx") * t.motorPrecision;
|
|
96
|
+
const halfW = bbox ? bbox.width / 2 : P("click.defaultHalfWidthPx");
|
|
97
|
+
const halfH = bbox ? bbox.height / 2 : P("click.defaultHalfHeightPx");
|
|
98
|
+
const spreadX = Math.min(maxSpread, halfW * P("click.spreadShareOfHalf"));
|
|
99
|
+
const spreadY = Math.min(maxSpread, halfH * P("click.spreadShareOfHalf"));
|
|
100
|
+
const clampSd = P("clampSd");
|
|
101
|
+
const dx = gauss(0, spreadX, -spreadX * clampSd, spreadX * clampSd);
|
|
102
|
+
const dy = gauss(0, spreadY, -spreadY * clampSd, spreadY * clampSd);
|
|
99
103
|
const targetX = cx + dx;
|
|
100
104
|
const targetY = cy + dy;
|
|
101
105
|
// Mis-click roll (only if we know the bbox so we can land just outside)
|
|
102
|
-
const willMisclick = bbox && Math.random() <
|
|
106
|
+
const willMisclick = bbox && Math.random() < P("click.misclickRate");
|
|
103
107
|
if (willMisclick) {
|
|
104
108
|
// Click 6-12px outside the bbox edge, in a random direction
|
|
105
109
|
const angle = Math.random() * Math.PI * 2;
|
|
106
|
-
const dist = rand(halfW +
|
|
110
|
+
const dist = rand(halfW + P("click.missMinPx"), halfW + P("click.missMaxPx"));
|
|
107
111
|
const missX = cx + Math.cos(angle) * dist;
|
|
108
112
|
const missY = cy + Math.sin(angle) * dist;
|
|
109
|
-
await page.mouse.move(missX, missY, { steps:
|
|
110
|
-
await sleep(gauss(
|
|
113
|
+
await page.mouse.move(missX, missY, { steps: P("click.missMoveSteps") });
|
|
114
|
+
await sleep(gauss(P("click.missPauseMeanMs"), P("click.missPauseSdMs"), P("click.missPauseMinMs"), P("click.missPauseMaxMs")));
|
|
111
115
|
await page.mouse.click(missX, missY);
|
|
112
116
|
// Realize, recover
|
|
113
|
-
await sleep(gauss(
|
|
117
|
+
await sleep(gauss(P("click.recoverMeanMs"), P("click.recoverSdMs"), P("click.recoverMinMs"), P("click.recoverMaxMs")));
|
|
114
118
|
}
|
|
115
119
|
// Hover with smooth interpolation (steps=8-15) so any in-page mouse-tracker
|
|
116
120
|
// sees a real movement curve, not a teleport.
|
|
117
|
-
const moveSteps = Math.round(gauss(
|
|
121
|
+
const moveSteps = Math.round(gauss(P("click.moveStepsMean"), P("click.moveStepsSd"), P("click.moveStepsMin"), P("click.moveStepsMax")));
|
|
118
122
|
await page.mouse.move(targetX, targetY, { steps: moveSteps });
|
|
119
123
|
// Pre-click dwell — the "is this what I want?" pause
|
|
120
|
-
const dwell = gauss(
|
|
124
|
+
const dwell = gauss(P("click.dwellMeanMs"), P("click.dwellSdMs"), P("click.dwellMinMs"), P("click.dwellMaxMs")) * (1 + t.readingTendency * P("click.dwellReadingGain"));
|
|
121
125
|
await sleep(dwell);
|
|
122
126
|
await page.mouse.click(targetX, targetY);
|
|
123
127
|
return { x: targetX, y: targetY };
|
|
@@ -130,24 +134,24 @@ export async function humanClick(page, cx, cy, inputTraits, bbox) {
|
|
|
130
134
|
export async function humanScroll(page, baseDeltaY, inputTraits) {
|
|
131
135
|
const t = traits(inputTraits);
|
|
132
136
|
// Vary the delta ±20% — not always exactly 400px
|
|
133
|
-
const variance = baseDeltaY *
|
|
134
|
-
const delta = baseDeltaY + gauss(0, variance /
|
|
137
|
+
const variance = baseDeltaY * P("scroll.deltaVariance");
|
|
138
|
+
const delta = baseDeltaY + gauss(0, variance / P("clampSd"), -variance, variance);
|
|
135
139
|
// 5% glance-back: scroll the opposite way 60-100px, pause, then scroll the
|
|
136
140
|
// intended direction. Real readers do this when something catches their eye
|
|
137
141
|
// mid-scroll. Skip for impatient personas.
|
|
138
|
-
const willGlance = t.patience >
|
|
142
|
+
const willGlance = t.patience > P("scroll.glancePatience") && Math.random() < P("scroll.glanceRate");
|
|
139
143
|
if (willGlance) {
|
|
140
|
-
const glanceBack = -Math.sign(delta) * rand(
|
|
144
|
+
const glanceBack = -Math.sign(delta) * rand(P("scroll.glanceMinPx"), P("scroll.glanceMaxPx"));
|
|
141
145
|
await page.evaluate(({ d }) => {
|
|
142
146
|
window.scrollBy({ top: d, behavior: "smooth" });
|
|
143
147
|
}, { d: glanceBack });
|
|
144
|
-
await sleep(gauss(
|
|
148
|
+
await sleep(gauss(P("scroll.glancePauseMeanMs"), P("scroll.glancePauseSdMs"), P("scroll.glancePauseMinMs"), P("scroll.glancePauseMaxMs")));
|
|
145
149
|
}
|
|
146
150
|
await page.evaluate(({ d }) => {
|
|
147
151
|
window.scrollBy({ top: d, behavior: "smooth" });
|
|
148
152
|
}, { d: delta });
|
|
149
153
|
// Wait for the smooth scroll to settle
|
|
150
|
-
await sleep(gauss(
|
|
154
|
+
await sleep(gauss(P("scroll.settleMeanMs"), P("scroll.settleSdMs"), P("scroll.settleMinMs"), P("scroll.settleMaxMs")));
|
|
151
155
|
return delta;
|
|
152
156
|
}
|
|
153
157
|
// ─── Inter-action settle ────────────────────────────────────────────────────
|
|
@@ -158,7 +162,7 @@ export async function humanScroll(page, baseDeltaY, inputTraits) {
|
|
|
158
162
|
export async function humanSettle(inputTraits) {
|
|
159
163
|
const t = traits(inputTraits);
|
|
160
164
|
// Range: 200ms (impatient) → 1200ms (very patient + thorough)
|
|
161
|
-
const ms = gauss(
|
|
165
|
+
const ms = gauss(P("settle.baseMs") + P("settle.patienceMs") * t.patience + P("settle.readingMs") * t.readingTendency, P("settle.sdMs"), P("settle.minMs"), P("settle.maxMs"));
|
|
162
166
|
await sleep(ms);
|
|
163
167
|
}
|
|
164
168
|
//# sourceMappingURL=human-input.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"human-input.js","sourceRoot":"","sources":["../../src/visual/human-input.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"human-input.js","sourceRoot":"","sources":["../../src/visual/human-input.ts"],"names":[],"mappings":"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"}
|
package/dist/visual/index.d.ts
CHANGED
|
@@ -16,6 +16,8 @@ export * from "./distance-metrics.js";
|
|
|
16
16
|
export * from "./perceptual-transport.js";
|
|
17
17
|
export * from "./cognitive-transport.js";
|
|
18
18
|
export * from "./cognitive-transport-chain.js";
|
|
19
|
+
export * from "./dro-bound.js";
|
|
20
|
+
export * from "./model-provenance.js";
|
|
19
21
|
export * from "./cognitive-models.js";
|
|
20
22
|
export * from "./attention-transport.js";
|
|
21
23
|
export * from "./heatmap-overlay.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/visual/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/visual/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
package/dist/visual/index.js
CHANGED
|
@@ -16,6 +16,8 @@ export * from "./distance-metrics.js";
|
|
|
16
16
|
export * from "./perceptual-transport.js";
|
|
17
17
|
export * from "./cognitive-transport.js";
|
|
18
18
|
export * from "./cognitive-transport-chain.js";
|
|
19
|
+
export * from "./dro-bound.js";
|
|
20
|
+
export * from "./model-provenance.js";
|
|
19
21
|
export * from "./cognitive-models.js";
|
|
20
22
|
export * from "./attention-transport.js";
|
|
21
23
|
export * from "./heatmap-overlay.js";
|
package/dist/visual/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/visual/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/visual/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export interface LawTimesReport {
|
|
2
|
+
/** The time budget each law time is a demand against, seconds (law.timeBudget). */
|
|
3
|
+
budgetSeconds: number;
|
|
4
|
+
pointing: {
|
|
5
|
+
seconds: number;
|
|
6
|
+
demand: number;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* First-visit choosing (novice search), the decision layer's demand on every
|
|
10
|
+
* run. On a familiar run (siteFamiliarity e > 0) the time the cognitiveLoad
|
|
11
|
+
* abilities are asked, (1 - e) novice + e expert (Cockburn et al. 2007,
|
|
12
|
+
* Eq. 4), is reported beside it.
|
|
13
|
+
*/
|
|
14
|
+
choosing: {
|
|
15
|
+
seconds: number;
|
|
16
|
+
demand: number;
|
|
17
|
+
expertSeconds?: number;
|
|
18
|
+
siteFamiliarity?: number;
|
|
19
|
+
familiarSeconds?: number;
|
|
20
|
+
familiarDemand?: number;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* perLabelSeconds is the first read charged per menu label with visible
|
|
24
|
+
* text (law.reading.labelFirstRead), carried so a view states the number
|
|
25
|
+
* the run computed with instead of a copy of it.
|
|
26
|
+
*/
|
|
27
|
+
reading: {
|
|
28
|
+
seconds: number;
|
|
29
|
+
demand: number;
|
|
30
|
+
perLabelSeconds: number;
|
|
31
|
+
};
|
|
32
|
+
procedure: {
|
|
33
|
+
seconds: number;
|
|
34
|
+
demand: number;
|
|
35
|
+
};
|
|
36
|
+
note: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The four law times of a measured page beside the demand each makes, for a
|
|
40
|
+
* tool response: seconds of work for the reference user, d = T / (T + budget).
|
|
41
|
+
*/
|
|
42
|
+
export declare function lawTimesReport(m: {
|
|
43
|
+
pointingSeconds: number;
|
|
44
|
+
choosingSeconds: number;
|
|
45
|
+
readingSeconds: number;
|
|
46
|
+
procedureSeconds: number;
|
|
47
|
+
choosingSecondsExpert?: number;
|
|
48
|
+
}, siteFamiliarity?: number): LawTimesReport;
|
|
49
|
+
//# sourceMappingURL=law-times-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"law-times-report.d.ts","sourceRoot":"","sources":["../../src/visual/law-times-report.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,cAAc;IAC7B,mFAAmF;IACnF,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9C;;;;;OAKG;IACH,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnJ;;;;OAIG;IACH,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,SAAS,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,IAAI,EAAE,MAAM,CAAC;CACd;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAChC,eAAe,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IACnG,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,EAAE,eAAe,GAAE,MAAU,GAAG,cAAc,CAoB9C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The four law times of a measured page beside the demand each makes, as a
|
|
3
|
+
* tool response reports them (cognitive_effort's lawTimes, the site
|
|
4
|
+
* assessment's pageMetrics.lawTimes). Display rounding only; the laws and
|
|
5
|
+
* their constants are in demand-laws.ts.
|
|
6
|
+
*
|
|
7
|
+
* @copyright 2026 Alexandria Eden alexandria.shai.eden@gmail.com https://cbrowser.ai
|
|
8
|
+
* @license MIT
|
|
9
|
+
*/
|
|
10
|
+
import { param } from "./model-provenance.js";
|
|
11
|
+
import { timeDemand } from "./demand-laws.js";
|
|
12
|
+
const round = (x, places) => Math.round(x * 10 ** places) / 10 ** places;
|
|
13
|
+
/**
|
|
14
|
+
* The four law times of a measured page beside the demand each makes, for a
|
|
15
|
+
* tool response: seconds of work for the reference user, d = T / (T + budget).
|
|
16
|
+
*/
|
|
17
|
+
export function lawTimesReport(m, siteFamiliarity = 0) {
|
|
18
|
+
const one = (seconds) => ({ seconds: round(seconds, 1), demand: round(timeDemand(seconds), 3) });
|
|
19
|
+
const expert = m.choosingSecondsExpert;
|
|
20
|
+
const familiar = siteFamiliarity > 0 && typeof expert === "number";
|
|
21
|
+
const at = familiar ? one((1 - siteFamiliarity) * m.choosingSeconds + siteFamiliarity * expert) : undefined;
|
|
22
|
+
// Through param(), as the budget: the reading time above already read it, so
|
|
23
|
+
// the answer's provenance is unchanged, and an override reaches the words too.
|
|
24
|
+
const perLabel = round(param("law.reading.labelFirstRead"), 3);
|
|
25
|
+
return {
|
|
26
|
+
budgetSeconds: param("law.timeBudget"),
|
|
27
|
+
pointing: one(m.pointingSeconds),
|
|
28
|
+
choosing: {
|
|
29
|
+
...one(m.choosingSeconds),
|
|
30
|
+
...(typeof expert === "number" ? { expertSeconds: round(expert, 1) } : {}),
|
|
31
|
+
...(at ? { siteFamiliarity, familiarSeconds: at.seconds, familiarDemand: at.demand } : {}),
|
|
32
|
+
},
|
|
33
|
+
reading: { ...one(m.readingSeconds), perLabelSeconds: perLabel },
|
|
34
|
+
procedure: one(m.procedureSeconds),
|
|
35
|
+
note: `Seconds of work this page asks of a typical first-time visitor, from published laws: pointing (Fitts, every target once), choosing (novice visual search, every choice group once; expertSeconds is the Hick-Hyman expert limit; on a run with siteFamiliarity e the cognitiveLoad abilities are asked (1 - e) novice + e expert, familiarSeconds, Cockburn et al. 2007), reading (Brysbaert's silent reading rate for all prose outside menus once, plus a first read of each menu label with visible text, ${perLabel} s, a hypothesis read off Cockburn et al. 2007) and procedure (the keystroke-level model's mental preparation per entry field). Each is a demand against one time budget, d = T / (T + budget); the budget is the median stay on a first-time page visit (Weinreich et al. 2008), a hypothesis.`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=law-times-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"law-times-report.js","sourceRoot":"","sources":["../../src/visual/law-times-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAuB9C,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,MAAc,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC,GAAG,EAAE,IAAI,MAAM,CAAC;AAEzF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,CAG9B,EAAE,kBAA0B,CAAC;IAC5B,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IACzG,MAAM,MAAM,GAAG,CAAC,CAAC,qBAAqB,CAAC;IACvC,MAAM,QAAQ,GAAG,eAAe,GAAG,CAAC,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC;IACnE,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,eAAe,GAAG,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5G,6EAA6E;IAC7E,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC;QACtC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;QAChC,QAAQ,EAAE;YACR,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC;YACzB,GAAG,CAAC,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,eAAe,EAAE,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3F;QACD,OAAO,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE;QAChE,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAClC,IAAI,EAAE,gfAAgf,QAAQ,iSAAiS;KAChyB,CAAC;AACJ,CAAC"}
|