@seanhogg/builderforce-memory-engine 2026.9.34 → 2026.10.2

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 (189) hide show
  1. package/dist/evermind/delta_wire.d.ts +26 -2
  2. package/dist/evermind/delta_wire.d.ts.map +1 -1
  3. package/dist/evermind/delta_wire.js +46 -4
  4. package/dist/evermind/delta_wire.js.map +1 -1
  5. package/dist/evermind/index.d.ts +5 -5
  6. package/dist/evermind/index.d.ts.map +1 -1
  7. package/dist/evermind/index.js +2 -2
  8. package/dist/evermind/index.js.map +1 -1
  9. package/dist/evermind/merge.d.ts +28 -0
  10. package/dist/evermind/merge.d.ts.map +1 -1
  11. package/dist/evermind/merge.js +33 -0
  12. package/dist/evermind/merge.js.map +1 -1
  13. package/dist/evermind/ml_head.d.ts +28 -0
  14. package/dist/evermind/ml_head.d.ts.map +1 -0
  15. package/dist/evermind/ml_head.js +47 -0
  16. package/dist/evermind/ml_head.js.map +1 -0
  17. package/dist/evermind/package.d.ts +9 -0
  18. package/dist/evermind/package.d.ts.map +1 -1
  19. package/dist/evermind/package.js +20 -0
  20. package/dist/evermind/package.js.map +1 -1
  21. package/dist/index.d.ts +6 -5
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +5 -3
  24. package/dist/index.js.map +1 -1
  25. package/dist/limbic/index.d.ts +3 -0
  26. package/dist/limbic/index.d.ts.map +1 -1
  27. package/dist/limbic/index.js +3 -0
  28. package/dist/limbic/index.js.map +1 -1
  29. package/dist/limbic/limbic_model.d.ts.map +1 -1
  30. package/dist/limbic/limbic_model.js +1 -3
  31. package/dist/limbic/limbic_model.js.map +1 -1
  32. package/dist/limbic/limbic_task.d.ts +22 -0
  33. package/dist/limbic/limbic_task.d.ts.map +1 -0
  34. package/dist/limbic/limbic_task.js +45 -0
  35. package/dist/limbic/limbic_task.js.map +1 -0
  36. package/dist/limbic/limbic_trainer.d.ts +17 -30
  37. package/dist/limbic/limbic_trainer.d.ts.map +1 -1
  38. package/dist/limbic/limbic_trainer.js +38 -144
  39. package/dist/limbic/limbic_trainer.js.map +1 -1
  40. package/dist/ml/classical/anomaly_composite.d.ts +32 -0
  41. package/dist/ml/classical/anomaly_composite.d.ts.map +1 -0
  42. package/dist/ml/classical/anomaly_composite.js +29 -0
  43. package/dist/ml/classical/anomaly_composite.js.map +1 -0
  44. package/dist/ml/classical/ewma.d.ts +37 -0
  45. package/dist/ml/classical/ewma.d.ts.map +1 -0
  46. package/dist/ml/classical/ewma.js +48 -0
  47. package/dist/ml/classical/ewma.js.map +1 -0
  48. package/dist/ml/classical/gbm.d.ts +42 -0
  49. package/dist/ml/classical/gbm.d.ts.map +1 -0
  50. package/dist/ml/classical/gbm.js +117 -0
  51. package/dist/ml/classical/gbm.js.map +1 -0
  52. package/dist/ml/classical/index.d.ts +52 -0
  53. package/dist/ml/classical/index.d.ts.map +1 -0
  54. package/dist/ml/classical/index.js +49 -0
  55. package/dist/ml/classical/index.js.map +1 -0
  56. package/dist/ml/classical/isolation_forest.d.ts +37 -0
  57. package/dist/ml/classical/isolation_forest.d.ts.map +1 -0
  58. package/dist/ml/classical/isolation_forest.js +72 -0
  59. package/dist/ml/classical/isolation_forest.js.map +1 -0
  60. package/dist/ml/classical/kmeans.d.ts +31 -0
  61. package/dist/ml/classical/kmeans.d.ts.map +1 -0
  62. package/dist/ml/classical/kmeans.js +112 -0
  63. package/dist/ml/classical/kmeans.js.map +1 -0
  64. package/dist/ml/classical/knn.d.ts +51 -0
  65. package/dist/ml/classical/knn.d.ts.map +1 -0
  66. package/dist/ml/classical/knn.js +69 -0
  67. package/dist/ml/classical/knn.js.map +1 -0
  68. package/dist/ml/classical/linear.d.ts +29 -0
  69. package/dist/ml/classical/linear.d.ts.map +1 -0
  70. package/dist/ml/classical/linear.js +114 -0
  71. package/dist/ml/classical/linear.js.map +1 -0
  72. package/dist/ml/classical/logistic.d.ts +31 -0
  73. package/dist/ml/classical/logistic.d.ts.map +1 -0
  74. package/dist/ml/classical/logistic.js +111 -0
  75. package/dist/ml/classical/logistic.js.map +1 -0
  76. package/dist/ml/classical/math.d.ts +26 -0
  77. package/dist/ml/classical/math.d.ts.map +1 -0
  78. package/dist/ml/classical/math.js +90 -0
  79. package/dist/ml/classical/math.js.map +1 -0
  80. package/dist/ml/classical/naive_bayes.d.ts +28 -0
  81. package/dist/ml/classical/naive_bayes.d.ts.map +1 -0
  82. package/dist/ml/classical/naive_bayes.js +72 -0
  83. package/dist/ml/classical/naive_bayes.js.map +1 -0
  84. package/dist/ml/classical/robust_z.d.ts +38 -0
  85. package/dist/ml/classical/robust_z.d.ts.map +1 -0
  86. package/dist/ml/classical/robust_z.js +47 -0
  87. package/dist/ml/classical/robust_z.js.map +1 -0
  88. package/dist/ml/dense_head.d.ts +33 -0
  89. package/dist/ml/dense_head.d.ts.map +1 -0
  90. package/dist/ml/dense_head.js +140 -0
  91. package/dist/ml/dense_head.js.map +1 -0
  92. package/dist/ml/eval_loss.d.ts +15 -0
  93. package/dist/ml/eval_loss.d.ts.map +1 -0
  94. package/dist/ml/eval_loss.js +20 -0
  95. package/dist/ml/eval_loss.js.map +1 -0
  96. package/dist/ml/features.d.ts +25 -0
  97. package/dist/ml/features.d.ts.map +1 -0
  98. package/dist/ml/features.js +46 -0
  99. package/dist/ml/features.js.map +1 -0
  100. package/dist/ml/federate.d.ts +56 -0
  101. package/dist/ml/federate.d.ts.map +1 -0
  102. package/dist/ml/federate.js +99 -0
  103. package/dist/ml/federate.js.map +1 -0
  104. package/dist/ml/head_trainer.d.ts +78 -0
  105. package/dist/ml/head_trainer.d.ts.map +1 -0
  106. package/dist/ml/head_trainer.js +182 -0
  107. package/dist/ml/head_trainer.js.map +1 -0
  108. package/dist/ml/index.d.ts +23 -0
  109. package/dist/ml/index.d.ts.map +1 -0
  110. package/dist/ml/index.js +11 -0
  111. package/dist/ml/index.js.map +1 -0
  112. package/dist/ml/registry.d.ts +20 -0
  113. package/dist/ml/registry.d.ts.map +1 -0
  114. package/dist/ml/registry.js +43 -0
  115. package/dist/ml/registry.js.map +1 -0
  116. package/dist/ml/run.d.ts +103 -0
  117. package/dist/ml/run.d.ts.map +1 -0
  118. package/dist/ml/run.js +169 -0
  119. package/dist/ml/run.js.map +1 -0
  120. package/dist/ml/tasks/experience.d.ts +127 -0
  121. package/dist/ml/tasks/experience.d.ts.map +1 -0
  122. package/dist/ml/tasks/experience.js +213 -0
  123. package/dist/ml/tasks/experience.js.map +1 -0
  124. package/dist/ml/tasks/index.d.ts +10 -0
  125. package/dist/ml/tasks/index.d.ts.map +1 -0
  126. package/dist/ml/tasks/index.js +28 -0
  127. package/dist/ml/tasks/index.js.map +1 -0
  128. package/dist/ml/tasks/local_success.d.ts +55 -0
  129. package/dist/ml/tasks/local_success.d.ts.map +1 -0
  130. package/dist/ml/tasks/local_success.js +77 -0
  131. package/dist/ml/tasks/local_success.js.map +1 -0
  132. package/dist/ml/tasks/run_anomaly.d.ts +52 -0
  133. package/dist/ml/tasks/run_anomaly.d.ts.map +1 -0
  134. package/dist/ml/tasks/run_anomaly.js +50 -0
  135. package/dist/ml/tasks/run_anomaly.js.map +1 -0
  136. package/dist/ml/train.d.ts +59 -0
  137. package/dist/ml/train.d.ts.map +1 -0
  138. package/dist/ml/train.js +84 -0
  139. package/dist/ml/train.js.map +1 -0
  140. package/dist/ml/types.d.ts +115 -0
  141. package/dist/ml/types.d.ts.map +1 -0
  142. package/dist/ml/types.js +24 -0
  143. package/dist/ml/types.js.map +1 -0
  144. package/dist/moe/moe_model.d.ts.map +1 -1
  145. package/dist/moe/moe_model.js +1 -16
  146. package/dist/moe/moe_model.js.map +1 -1
  147. package/dist/training/cpu_ops.d.ts +2 -0
  148. package/dist/training/cpu_ops.d.ts.map +1 -1
  149. package/dist/training/cpu_ops.js +16 -0
  150. package/dist/training/cpu_ops.js.map +1 -1
  151. package/package.json +1 -1
  152. package/src/evermind/delta_wire.ts +63 -4
  153. package/src/evermind/index.ts +7 -3
  154. package/src/evermind/merge.ts +59 -0
  155. package/src/evermind/ml_head.ts +63 -0
  156. package/src/evermind/package.ts +24 -0
  157. package/src/index.ts +17 -1
  158. package/src/limbic/index.ts +5 -0
  159. package/src/limbic/limbic_model.ts +1 -4
  160. package/src/limbic/limbic_task.ts +62 -0
  161. package/src/limbic/limbic_trainer.ts +41 -208
  162. package/src/ml/classical/anomaly_composite.ts +46 -0
  163. package/src/ml/classical/ewma.ts +74 -0
  164. package/src/ml/classical/gbm.ts +144 -0
  165. package/src/ml/classical/index.ts +82 -0
  166. package/src/ml/classical/isolation_forest.ts +88 -0
  167. package/src/ml/classical/kmeans.ts +120 -0
  168. package/src/ml/classical/knn.ts +102 -0
  169. package/src/ml/classical/linear.ts +119 -0
  170. package/src/ml/classical/logistic.ts +125 -0
  171. package/src/ml/classical/math.ts +93 -0
  172. package/src/ml/classical/naive_bayes.ts +84 -0
  173. package/src/ml/classical/robust_z.ts +74 -0
  174. package/src/ml/dense_head.ts +157 -0
  175. package/src/ml/eval_loss.ts +27 -0
  176. package/src/ml/features.ts +61 -0
  177. package/src/ml/federate.ts +130 -0
  178. package/src/ml/head_trainer.ts +247 -0
  179. package/src/ml/index.ts +57 -0
  180. package/src/ml/registry.ts +44 -0
  181. package/src/ml/run.ts +222 -0
  182. package/src/ml/tasks/experience.ts +293 -0
  183. package/src/ml/tasks/index.ts +30 -0
  184. package/src/ml/tasks/local_success.ts +118 -0
  185. package/src/ml/tasks/run_anomaly.ts +84 -0
  186. package/src/ml/train.ts +120 -0
  187. package/src/ml/types.ts +135 -0
  188. package/src/moe/moe_model.ts +1 -13
  189. package/src/training/cpu_ops.ts +14 -0
@@ -0,0 +1,103 @@
1
+ /**
2
+ * ml/run.ts — the ONE runner: `runMlTask(id, input, ctx)`.
3
+ *
4
+ * Picks the first engine the inference mode allows that can answer (Local only:
5
+ * local tiers; Hybrid: local first, then the host's cloud port; Specific: exactly
6
+ * the named engine), returns `{ output, confidence, engine }`, and records the
7
+ * decision so routing can be evaluated later. The cloud is a PORT the host
8
+ * supplies — nothing here touches the network.
9
+ */
10
+ import { type TextEmbedder } from "./features.js";
11
+ import type { MlTaskRegistry } from "./registry.js";
12
+ import { type InferenceMode, type MlEngineRef, type MlPrediction, type MlPredictor, type MlTask } from "./types.js";
13
+ /** Fitted local models, per (task id, engine key). */
14
+ export interface MlModelStore {
15
+ get(taskId: string, engine: string): MlPredictor | undefined;
16
+ set(taskId: string, engine: string, predictor: MlPredictor): void;
17
+ }
18
+ /** The plain in-process store. */
19
+ export declare class InMemoryMlModels implements MlModelStore {
20
+ private readonly _m;
21
+ get(taskId: string, engine: string): MlPredictor | undefined;
22
+ set(taskId: string, engine: string, predictor: MlPredictor): void;
23
+ }
24
+ /** A cloud engine, supplied by the host (Builderforce.ai passes its gateway client). */
25
+ export interface MlCloudPort {
26
+ run(request: {
27
+ taskId: string;
28
+ engine: MlEngineRef;
29
+ input: unknown;
30
+ }): Promise<MlPrediction>;
31
+ }
32
+ /** Why the runner moved past an engine. */
33
+ export type MlSkipReason = "unavailable" | "low-confidence" | "error";
34
+ /** One routing decision, recorded for eval. */
35
+ export interface MlDecision {
36
+ taskId: string;
37
+ mode: InferenceMode;
38
+ /** The engine that answered (key), or null when none could. */
39
+ engine: string | null;
40
+ tier: "local" | "cloud" | null;
41
+ confidence: number | null;
42
+ /** Engines passed over before the answer, with why. */
43
+ skipped: {
44
+ engine: string;
45
+ reason: MlSkipReason;
46
+ detail?: string;
47
+ }[];
48
+ }
49
+ export interface MlDecisionSink {
50
+ record(decision: MlDecision): void;
51
+ }
52
+ /** A bounded in-memory decision log with a per-task summary. */
53
+ export declare class MlDecisionLog implements MlDecisionSink {
54
+ readonly capacity: number;
55
+ private readonly _d;
56
+ constructor(capacity?: number);
57
+ record(decision: MlDecision): void;
58
+ list(): readonly MlDecision[];
59
+ /** Per task: how many runs, which engines answered, mean confidence, unanswered count. */
60
+ summary(): Record<string, {
61
+ runs: number;
62
+ byEngine: Record<string, number>;
63
+ unanswered: number;
64
+ meanConfidence: number | null;
65
+ }>;
66
+ }
67
+ export interface MlRunContext {
68
+ registry: MlTaskRegistry;
69
+ mode: InferenceMode;
70
+ /** For `specific`: the engine (ref or key) to use. */
71
+ engine?: MlEngineRef | string;
72
+ models?: MlModelStore;
73
+ embedder?: TextEmbedder;
74
+ cloud?: MlCloudPort;
75
+ /** Hybrid only: a local answer below this confidence defers to the cloud when it can answer. */
76
+ minConfidence?: number;
77
+ decisions?: MlDecisionSink;
78
+ }
79
+ export interface MlResult<O> {
80
+ output: O;
81
+ confidence: number;
82
+ engine: MlEngineRef;
83
+ }
84
+ /** No engine allowed by the mode could answer. */
85
+ export declare class MlEngineUnavailableError extends Error {
86
+ readonly taskId: string;
87
+ readonly decision: MlDecision;
88
+ constructor(taskId: string, decision: MlDecision);
89
+ }
90
+ /**
91
+ * The task's engines the mode allows, in the order the runner tries them. Exhaustive:
92
+ * a mode string outside {@link InferenceMode} (a host passing a stale or mistyped
93
+ * setting) throws instead of being read as `specific`.
94
+ */
95
+ export declare function candidateEngines(task: MlTask<any, any>, mode: InferenceMode, specific?: MlEngineRef | string): MlEngineRef[];
96
+ /**
97
+ * Answer task `id` for `input` with the first engine the mode allows that can. An
98
+ * engine that throws (feature extraction or its own predict) is recorded as an
99
+ * `error` skip and the next allowed engine is tried — in Hybrid, the cloud. Throws
100
+ * {@link MlEngineUnavailableError}, carrying every engine's reason, only when none answers.
101
+ */
102
+ export declare function runMlTask<O = unknown, I = unknown>(id: string, input: I, ctx: MlRunContext): Promise<MlResult<O>>;
103
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/ml/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAa,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAE/H,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAC7D,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;CACnE;AAED,kCAAkC;AAClC,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAkC;IACrD,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAG5D,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,IAAI;CAGlE;AAED,wFAAwF;AACxF,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC9F;AAED,2CAA2C;AAC3C,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAEtE,+CAA+C;AAC/C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,aAAa,CAAC;IACpB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,uDAAuD;IACvD,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,YAAY,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtE;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI,CAAC;CACpC;AAED,gEAAgE;AAChE,qBAAa,aAAc,YAAW,cAAc;IAEtC,QAAQ,CAAC,QAAQ;IAD7B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAoB;gBAClB,QAAQ,SAAM;IAEnC,MAAM,CAAC,QAAQ,EAAE,UAAU,GAAG,IAAI;IAKlC,IAAI,IAAI,SAAS,UAAU,EAAE;IAI7B,0FAA0F;IAC1F,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAkBjI;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,IAAI,EAAE,aAAa,CAAC;IACpB,sDAAsD;IACtD,MAAM,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,gGAAgG;IAChG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB,MAAM,EAAE,CAAC,CAAC;IACV,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,kDAAkD;AAClD,qBAAa,wBAAyB,SAAQ,KAAK;IAE/C,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,QAAQ,EAAE,UAAU;gBADpB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,UAAU;CAShC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,EAAE,CAkB5H;AAID;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAiEvH"}
package/dist/ml/run.js ADDED
@@ -0,0 +1,169 @@
1
+ /**
2
+ * ml/run.ts — the ONE runner: `runMlTask(id, input, ctx)`.
3
+ *
4
+ * Picks the first engine the inference mode allows that can answer (Local only:
5
+ * local tiers; Hybrid: local first, then the host's cloud port; Specific: exactly
6
+ * the named engine), returns `{ output, confidence, engine }`, and records the
7
+ * decision so routing can be evaluated later. The cloud is a PORT the host
8
+ * supplies — nothing here touches the network.
9
+ */
10
+ import { extractFeatures } from "./features.js";
11
+ import { engineKey } from "./types.js";
12
+ /** The plain in-process store. */
13
+ export class InMemoryMlModels {
14
+ _m = new Map();
15
+ get(taskId, engine) {
16
+ return this._m.get(`${taskId}|${engine}`);
17
+ }
18
+ set(taskId, engine, predictor) {
19
+ this._m.set(`${taskId}|${engine}`, predictor);
20
+ }
21
+ }
22
+ /** A bounded in-memory decision log with a per-task summary. */
23
+ export class MlDecisionLog {
24
+ capacity;
25
+ _d = [];
26
+ constructor(capacity = 500) {
27
+ this.capacity = capacity;
28
+ }
29
+ record(decision) {
30
+ this._d.push(decision);
31
+ if (this._d.length > this.capacity)
32
+ this._d.splice(0, this._d.length - this.capacity);
33
+ }
34
+ list() {
35
+ return this._d;
36
+ }
37
+ /** Per task: how many runs, which engines answered, mean confidence, unanswered count. */
38
+ summary() {
39
+ const out = {};
40
+ const sums = {};
41
+ for (const d of this._d) {
42
+ const t = (out[d.taskId] ??= { runs: 0, byEngine: {}, unanswered: 0, meanConfidence: null });
43
+ t.runs++;
44
+ if (d.engine == null) {
45
+ t.unanswered++;
46
+ continue;
47
+ }
48
+ t.byEngine[d.engine] = (t.byEngine[d.engine] ?? 0) + 1;
49
+ const c = (sums[d.taskId] ??= { s: 0, n: 0 });
50
+ c.s += d.confidence ?? 0;
51
+ c.n++;
52
+ t.meanConfidence = c.s / c.n;
53
+ }
54
+ return out;
55
+ }
56
+ }
57
+ /** No engine allowed by the mode could answer. */
58
+ export class MlEngineUnavailableError extends Error {
59
+ taskId;
60
+ decision;
61
+ constructor(taskId, decision) {
62
+ super(`runMlTask(${taskId}): no engine could answer in '${decision.mode}' mode (${decision.skipped.map((s) => `${s.engine}: ${s.reason}${s.detail ? ` (${s.detail})` : ""}`).join(", ") || "none allowed"})`);
63
+ this.taskId = taskId;
64
+ this.decision = decision;
65
+ this.name = "MlEngineUnavailableError";
66
+ }
67
+ }
68
+ /**
69
+ * The task's engines the mode allows, in the order the runner tries them. Exhaustive:
70
+ * a mode string outside {@link InferenceMode} (a host passing a stale or mistyped
71
+ * setting) throws instead of being read as `specific`.
72
+ */
73
+ export function candidateEngines(task, mode, specific) {
74
+ switch (mode) {
75
+ case "local-only":
76
+ return task.engines.filter((e) => e.tier === "local");
77
+ case "hybrid":
78
+ return [...task.engines.filter((e) => e.tier === "local"), ...task.engines.filter((e) => e.tier === "cloud")];
79
+ case "specific": {
80
+ if (specific == null)
81
+ throw new Error(`runMlTask(${task.id}): 'specific' mode needs ctx.engine`);
82
+ const key = typeof specific === "string" ? specific : engineKey(specific);
83
+ const match = task.engines.filter((e) => engineKey(e) === key);
84
+ if (match.length === 0)
85
+ throw new Error(`runMlTask(${task.id}): engine '${key}' is not one of this task's engines`);
86
+ return match;
87
+ }
88
+ default: {
89
+ const unknown = mode;
90
+ throw new Error(`runMlTask(${task.id}): unknown inference mode '${String(unknown)}'`);
91
+ }
92
+ }
93
+ }
94
+ const errorDetail = (error) => (error instanceof Error ? error.message : String(error));
95
+ /**
96
+ * Answer task `id` for `input` with the first engine the mode allows that can. An
97
+ * engine that throws (feature extraction or its own predict) is recorded as an
98
+ * `error` skip and the next allowed engine is tried — in Hybrid, the cloud. Throws
99
+ * {@link MlEngineUnavailableError}, carrying every engine's reason, only when none answers.
100
+ */
101
+ export async function runMlTask(id, input, ctx) {
102
+ const task = ctx.registry.require(id);
103
+ const engines = candidateEngines(task, ctx.mode, ctx.engine);
104
+ const skipped = [];
105
+ let features = null;
106
+ let featureError = null;
107
+ let deferred = null;
108
+ const finish = (ref, p) => {
109
+ ctx.decisions?.record({ taskId: id, mode: ctx.mode, engine: engineKey(ref), tier: ref.tier, confidence: p.confidence, skipped });
110
+ return { output: task.output.decode(p), confidence: p.confidence, engine: ref };
111
+ };
112
+ for (let i = 0; i < engines.length; i++) {
113
+ const ref = engines[i];
114
+ const key = engineKey(ref);
115
+ if (ref.tier === "local") {
116
+ const predictor = ctx.models?.get(id, key);
117
+ if (!predictor) {
118
+ skipped.push({ engine: key, reason: "unavailable" });
119
+ continue;
120
+ }
121
+ // Extract once; a failure (e.g. no embedder) fails every local engine alike, so
122
+ // it is remembered rather than retried per engine.
123
+ if (!features && featureError == null) {
124
+ try {
125
+ features = await extractFeatures(task.features, input, ctx.embedder);
126
+ }
127
+ catch (error) {
128
+ featureError = error;
129
+ }
130
+ }
131
+ if (!features) {
132
+ skipped.push({ engine: key, reason: "error", detail: `features: ${errorDetail(featureError)}` });
133
+ continue;
134
+ }
135
+ let p;
136
+ try {
137
+ p = predictor.predict(features);
138
+ }
139
+ catch (error) {
140
+ skipped.push({ engine: key, reason: "error", detail: errorDetail(error) });
141
+ continue;
142
+ }
143
+ const cloudLater = ctx.mode === "hybrid" && !!ctx.cloud && engines.slice(i + 1).some((e) => e.tier === "cloud");
144
+ if (ctx.minConfidence != null && p.confidence < ctx.minConfidence && cloudLater) {
145
+ skipped.push({ engine: key, reason: "low-confidence", detail: p.confidence.toFixed(3) });
146
+ deferred ??= { ref, p };
147
+ continue;
148
+ }
149
+ return finish(ref, p);
150
+ }
151
+ if (!ctx.cloud) {
152
+ skipped.push({ engine: key, reason: "unavailable" });
153
+ continue;
154
+ }
155
+ try {
156
+ return finish(ref, await ctx.cloud.run({ taskId: id, engine: ref, input }));
157
+ }
158
+ catch (error) {
159
+ skipped.push({ engine: key, reason: "error", detail: errorDetail(error) });
160
+ }
161
+ }
162
+ // The cloud could not answer after a low-confidence local one: the local answer stands.
163
+ if (deferred)
164
+ return finish(deferred.ref, deferred.p);
165
+ const decision = { taskId: id, mode: ctx.mode, engine: null, tier: null, confidence: null, skipped };
166
+ ctx.decisions?.record(decision);
167
+ throw new MlEngineUnavailableError(id, decision);
168
+ }
169
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/ml/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * ml/tasks/experience.ts — `experience.quality` and `experience.dedupe`, and the
3
+ * opt-in curation step that applies them in front of the ONE adaptation recipe
4
+ * (`evermind/adapt.ts`), so the private model learns from good, varied examples
5
+ * instead of every transcript. Curation only drops documents; it never rewrites one.
6
+ */
7
+ import { type ExperienceDocument } from "../../experience/corpus.js";
8
+ import type { Episode, Run, Skill } from "../../experience/types.js";
9
+ import { type TextEmbedder } from "../features.js";
10
+ import { type MlRunContext } from "../run.js";
11
+ import { type MlTrainExample } from "../train.js";
12
+ import type { MlPrediction, MlPredictor, MlTask } from "../types.js";
13
+ /** One learnable procedure plus the outcome fields that say how well it went. */
14
+ export interface ExperienceQualityInput {
15
+ doc: ExperienceDocument;
16
+ /** Steps in the procedure. */
17
+ steps: number;
18
+ /** Runs of the skill (0 for an uncompiled demonstration). */
19
+ runs: number;
20
+ succeeded: number;
21
+ failed: number;
22
+ }
23
+ export interface ExperienceQuality {
24
+ label: "low" | "high";
25
+ /** P(high). */
26
+ pHigh: number;
27
+ }
28
+ export declare const EXPERIENCE_QUALITY_TASK: MlTask<ExperienceQualityInput, ExperienceQuality>;
29
+ /** Quality inputs for every learnable document, with run outcomes joined by skill id. */
30
+ export declare function experienceQualityInputs(episodes: Episode[], skills: Skill[], runs?: readonly Run[]): ExperienceQualityInput[];
31
+ /** The training label of a quality input: 1 (high) when most finished runs succeeded, 0 when not, null with no runs. */
32
+ export declare function experienceQualityLabel(i: ExperienceQualityInput): number | null;
33
+ /** Labelled examples for `experience.quality` — only the inputs that have run outcomes. */
34
+ export declare function experienceQualityExamples(inputs: readonly ExperienceQualityInput[]): MlTrainExample<ExperienceQualityInput>[];
35
+ export interface ExperienceDuplicate {
36
+ /** Index (in keep order) of the nearest already-kept document, or -1 when none. */
37
+ nearest: number;
38
+ similarity: number;
39
+ duplicate: boolean;
40
+ }
41
+ /** Cosine similarity at or above which two procedures count as one. */
42
+ export declare const DEFAULT_DEDUPE_THRESHOLD = 0.97;
43
+ export declare const EXPERIENCE_DEDUPE_TASK: MlTask<ExperienceDocument, ExperienceDuplicate>;
44
+ /**
45
+ * The `experience.dedupe` predictor: a cosine nearest-neighbour index of the
46
+ * documents kept so far. `scores = [nearestIndex, similarity, duplicate ? 1 : 0]`.
47
+ */
48
+ export declare class DedupeIndex implements MlPredictor {
49
+ readonly threshold: number;
50
+ private readonly _knn;
51
+ constructor(threshold?: number);
52
+ get size(): number;
53
+ add(x: Float32Array): void;
54
+ predict(x: Float32Array): MlPrediction;
55
+ }
56
+ export interface CurationOptions {
57
+ /** Embeds each document once (the person's CPU Evermind: `EvermindTextEmbedder`). */
58
+ embedder: TextEmbedder;
59
+ /** Cosine similarity at or above which a document duplicates a kept one. Default {@link DEFAULT_DEDUPE_THRESHOLD}. */
60
+ dedupeThreshold?: number;
61
+ /**
62
+ * Quality filter through the runner. A document whose P(high) is below `minPHigh`
63
+ * (default 0.5) is dropped; one the runner cannot score (no trained engine) is kept,
64
+ * and so is an UNSCORED one (`runs === 0` — never run is unknown, not bad).
65
+ */
66
+ quality?: {
67
+ ctx: MlRunContext;
68
+ input: (doc: ExperienceDocument) => ExperienceQualityInput;
69
+ minPHigh?: number;
70
+ };
71
+ /** Document ids to leave out (e.g. those whose runs `run.anomaly` flagged). */
72
+ exclude?: ReadonlySet<string>;
73
+ /**
74
+ * Documents the model has ALREADY learned. They seed the de-duplication index, so a
75
+ * pending document that only repeats one of them is dropped (reported `of` that
76
+ * one); they are never in `kept`. Each is embedded once per call, so this is
77
+ * bounded — {@link curatePendingExperience} keeps the {@link CURATION_KNOWN_LIMIT}
78
+ * most recently learned.
79
+ */
80
+ known?: readonly ExperienceDocument[];
81
+ }
82
+ /**
83
+ * How many already-learned documents curation de-duplicates against: the most
84
+ * recently learned ones. Each costs one CPU embed per curation call, and a
85
+ * repeat of something learned long ago is cheap to relearn, so a recent window is the
86
+ * trade — 200 embeds of a small Evermind take seconds on a laptop CPU.
87
+ */
88
+ export declare const CURATION_KNOWN_LIMIT = 200;
89
+ export interface CurationResult {
90
+ kept: ExperienceDocument[];
91
+ dropped: {
92
+ id: string;
93
+ reason: "duplicate" | "low-quality" | "excluded";
94
+ of?: string;
95
+ score?: number;
96
+ }[];
97
+ }
98
+ /**
99
+ * Curate documents before they are packed into adaptation passes: drop excluded
100
+ * ones, low-quality ones (when a quality filter is given), then near-duplicates of
101
+ * an already-learned one (`known`) or an earlier kept one. Order is preserved, and
102
+ * the FIRST copy wins — compiled skills come before raw demonstrations in
103
+ * `experienceDocuments`, so the reviewed version is the one kept.
104
+ */
105
+ export declare function curateExperience(docs: readonly ExperienceDocument[], opts: CurationOptions): Promise<CurationResult>;
106
+ /** What {@link curatePendingExperience} reads: the experience snapshot's raw records. */
107
+ export interface ExperienceCurationSource {
108
+ episodes: Episode[];
109
+ skills: Skill[];
110
+ runs: readonly Run[];
111
+ }
112
+ /**
113
+ * The whole curation step a host runs in front of the adaptation passes, so every
114
+ * host wires it the same way: train `experience.quality` on the run outcomes there
115
+ * are (it stays untrained below its `minSamples`, and then nothing is dropped for
116
+ * quality), then {@link curateExperience} the pending documents with it,
117
+ * de-duplicating against each other and against `known` — the already-learned
118
+ * documents, MOST RECENTLY LEARNED FIRST; only the first {@link CURATION_KNOWN_LIMIT}
119
+ * are embedded, so a host can pass its whole ledger.
120
+ */
121
+ export declare function curatePendingExperience(pending: readonly ExperienceDocument[], source: ExperienceCurationSource, opts: {
122
+ embedder: TextEmbedder;
123
+ known?: readonly ExperienceDocument[];
124
+ dedupeThreshold?: number;
125
+ minPHigh?: number;
126
+ }): Promise<CurationResult>;
127
+ //# sourceMappingURL=experience.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experience.d.ts","sourceRoot":"","sources":["../../../src/ml/tasks/experience.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * ml/tasks/experience.ts — `experience.quality` and `experience.dedupe`, and the
3
+ * opt-in curation step that applies them in front of the ONE adaptation recipe
4
+ * (`evermind/adapt.ts`), so the private model learns from good, varied examples
5
+ * instead of every transcript. Curation only drops documents; it never rewrites one.
6
+ */
7
+ import { experienceDocuments } from "../../experience/corpus.js";
8
+ import { KnnModel } from "../classical/knn.js";
9
+ import { logScale } from "../features.js";
10
+ import { MlTaskRegistry } from "../registry.js";
11
+ import { InMemoryMlModels, MlEngineUnavailableError, runMlTask } from "../run.js";
12
+ import { trainMlTask } from "../train.js";
13
+ export const EXPERIENCE_QUALITY_TASK = {
14
+ kind: "classify",
15
+ id: "experience.quality",
16
+ description: "Is this procedure worth learning from (does it run, and run well)?",
17
+ features: {
18
+ text: (i) => i.doc.text,
19
+ // No success/failure rate: the label IS `succeeded / runs >= 0.5`, so a rate
20
+ // feature would leak it — the model would learn the label, not the procedure.
21
+ numeric: (i) => [logScale(i.steps, 50), logScale(i.runs, 20)],
22
+ numericNames: ["steps", "runs"],
23
+ },
24
+ engines: [
25
+ { tier: "local", engine: "classical", algorithm: "knn" },
26
+ { tier: "local", engine: "classical", algorithm: "logistic" },
27
+ ],
28
+ // Below 12 labelled procedures the task stays untrained and curation keeps
29
+ // everything. At 12, after the 20% holdout ≈10 remain to fit, both classes can have
30
+ // several members, and kNN votes with k = ⌊√n⌋ = 3 neighbours rather than the whole
31
+ // set — with fewer, every point votes and the answer collapses to the class prior.
32
+ train: { minSamples: 12 },
33
+ output: {
34
+ labels: ["low", "high"],
35
+ decode: (p) => ({ label: (p.scores[1] ?? 0) >= 0.5 ? "high" : "low", pHigh: p.scores[1] ?? 0 }),
36
+ },
37
+ };
38
+ /** Quality inputs for every learnable document, with run outcomes joined by skill id. */
39
+ export function experienceQualityInputs(episodes, skills, runs = []) {
40
+ const steps = new Map([...skills.map((s) => [s.id, s.steps.length]), ...episodes.map((e) => [e.id, e.steps.length])]);
41
+ const byItem = new Map();
42
+ for (const r of runs) {
43
+ if (r.status === "running")
44
+ continue;
45
+ const t = byItem.get(r.skillId) ?? { runs: 0, succeeded: 0, failed: 0 };
46
+ t.runs++;
47
+ if (r.status === "succeeded")
48
+ t.succeeded++;
49
+ if (r.status === "failed")
50
+ t.failed++;
51
+ byItem.set(r.skillId, t);
52
+ }
53
+ return experienceDocuments(episodes, skills).map((doc) => ({
54
+ doc,
55
+ steps: steps.get(doc.id) ?? 0,
56
+ ...(byItem.get(doc.id) ?? { runs: 0, succeeded: 0, failed: 0 }),
57
+ }));
58
+ }
59
+ /** The training label of a quality input: 1 (high) when most finished runs succeeded, 0 when not, null with no runs. */
60
+ export function experienceQualityLabel(i) {
61
+ if (i.runs === 0)
62
+ return null;
63
+ return i.succeeded / i.runs >= 0.5 ? 1 : 0;
64
+ }
65
+ /** Labelled examples for `experience.quality` — only the inputs that have run outcomes. */
66
+ export function experienceQualityExamples(inputs) {
67
+ return inputs.flatMap((input) => {
68
+ const label = experienceQualityLabel(input);
69
+ return label == null ? [] : [{ input, label }];
70
+ });
71
+ }
72
+ /** Cosine similarity at or above which two procedures count as one. */
73
+ export const DEFAULT_DEDUPE_THRESHOLD = 0.97;
74
+ export const EXPERIENCE_DEDUPE_TASK = {
75
+ kind: "cluster",
76
+ id: "experience.dedupe",
77
+ description: "Is this procedure a near-copy of one already kept?",
78
+ features: { text: (d) => d.text },
79
+ engines: [{ tier: "local", engine: "classical", algorithm: "knn" }],
80
+ output: {
81
+ decode: (p) => ({ nearest: p.scores[0] ?? -1, similarity: p.scores[1] ?? 0, duplicate: (p.scores[2] ?? 0) === 1 }),
82
+ },
83
+ };
84
+ /**
85
+ * The `experience.dedupe` predictor: a cosine nearest-neighbour index of the
86
+ * documents kept so far. `scores = [nearestIndex, similarity, duplicate ? 1 : 0]`.
87
+ */
88
+ export class DedupeIndex {
89
+ threshold;
90
+ _knn = new KnnModel(1, "cosine", 2);
91
+ constructor(threshold = DEFAULT_DEDUPE_THRESHOLD) {
92
+ this.threshold = threshold;
93
+ }
94
+ get size() {
95
+ return this._knn.size;
96
+ }
97
+ add(x) {
98
+ this._knn.add(x);
99
+ }
100
+ predict(x) {
101
+ const n = this._knn.nearest(x);
102
+ if (!n)
103
+ return { scores: [-1, 0, 0], confidence: 1 };
104
+ const dup = n.similarity >= this.threshold;
105
+ return { scores: [n.index, n.similarity, dup ? 1 : 0], confidence: Math.abs(n.similarity) };
106
+ }
107
+ }
108
+ /**
109
+ * How many already-learned documents curation de-duplicates against: the most
110
+ * recently learned ones. Each costs one CPU embed per curation call, and a
111
+ * repeat of something learned long ago is cheap to relearn, so a recent window is the
112
+ * trade — 200 embeds of a small Evermind take seconds on a laptop CPU.
113
+ */
114
+ export const CURATION_KNOWN_LIMIT = 200;
115
+ /** Memoise an embedder for one call, so curation embeds each text once. */
116
+ function memoEmbedder(e) {
117
+ const cache = new Map();
118
+ return {
119
+ dimensions: e.dimensions,
120
+ fingerprint: e.fingerprint,
121
+ async embed(text) {
122
+ let v = cache.get(text);
123
+ if (!v)
124
+ cache.set(text, (v = await e.embed(text)));
125
+ return v;
126
+ },
127
+ };
128
+ }
129
+ /**
130
+ * Curate documents before they are packed into adaptation passes: drop excluded
131
+ * ones, low-quality ones (when a quality filter is given), then near-duplicates of
132
+ * an already-learned one (`known`) or an earlier kept one. Order is preserved, and
133
+ * the FIRST copy wins — compiled skills come before raw demonstrations in
134
+ * `experienceDocuments`, so the reviewed version is the one kept.
135
+ */
136
+ export async function curateExperience(docs, opts) {
137
+ const embedder = memoEmbedder(opts.embedder);
138
+ const index = new DedupeIndex(opts.dedupeThreshold ?? DEFAULT_DEDUPE_THRESHOLD);
139
+ /** Index position → document id: the known documents first, then each kept one. */
140
+ const indexed = [];
141
+ const kept = [];
142
+ const dropped = [];
143
+ const qctx = opts.quality ? { ...opts.quality.ctx, embedder } : null;
144
+ const embedDoc = (doc) => embedder.embed(EXPERIENCE_DEDUPE_TASK.features.text(doc));
145
+ for (const doc of opts.known ?? []) {
146
+ index.add(await embedDoc(doc));
147
+ indexed.push(doc.id);
148
+ }
149
+ for (const doc of docs) {
150
+ if (opts.exclude?.has(doc.id)) {
151
+ dropped.push({ id: doc.id, reason: "excluded" });
152
+ continue;
153
+ }
154
+ if (opts.quality && qctx) {
155
+ const input = opts.quality.input(doc);
156
+ // Never run ⇒ no outcome to judge it by: keep it rather than let a guess drop it.
157
+ if (input.runs > 0) {
158
+ try {
159
+ const r = await runMlTask(EXPERIENCE_QUALITY_TASK.id, input, qctx);
160
+ if (r.output.pHigh < (opts.quality.minPHigh ?? 0.5)) {
161
+ dropped.push({ id: doc.id, reason: "low-quality", score: r.output.pHigh });
162
+ continue;
163
+ }
164
+ }
165
+ catch (error) {
166
+ if (!(error instanceof MlEngineUnavailableError))
167
+ throw error;
168
+ }
169
+ }
170
+ }
171
+ const x = await embedDoc(doc);
172
+ const d = EXPERIENCE_DEDUPE_TASK.output.decode(index.predict(x));
173
+ if (d.duplicate) {
174
+ dropped.push({ id: doc.id, reason: "duplicate", of: indexed[d.nearest], score: d.similarity });
175
+ continue;
176
+ }
177
+ index.add(x);
178
+ indexed.push(doc.id);
179
+ kept.push(doc);
180
+ }
181
+ return { kept, dropped };
182
+ }
183
+ /**
184
+ * The whole curation step a host runs in front of the adaptation passes, so every
185
+ * host wires it the same way: train `experience.quality` on the run outcomes there
186
+ * are (it stays untrained below its `minSamples`, and then nothing is dropped for
187
+ * quality), then {@link curateExperience} the pending documents with it,
188
+ * de-duplicating against each other and against `known` — the already-learned
189
+ * documents, MOST RECENTLY LEARNED FIRST; only the first {@link CURATION_KNOWN_LIMIT}
190
+ * are embedded, so a host can pass its whole ledger.
191
+ */
192
+ export async function curatePendingExperience(pending, source, opts) {
193
+ const known = opts.known?.slice(0, CURATION_KNOWN_LIMIT);
194
+ const embedder = memoEmbedder(opts.embedder);
195
+ const inputs = experienceQualityInputs(source.episodes, source.skills, source.runs);
196
+ const byId = new Map(inputs.map((i) => [i.doc.id, i]));
197
+ const registry = new MlTaskRegistry();
198
+ registry.register(EXPERIENCE_QUALITY_TASK);
199
+ const models = new InMemoryMlModels();
200
+ await trainMlTask(EXPERIENCE_QUALITY_TASK, experienceQualityExamples(inputs), { embedder, models });
201
+ return curateExperience(pending, {
202
+ embedder,
203
+ ...(known ? { known } : {}),
204
+ ...(opts.dedupeThreshold != null ? { dedupeThreshold: opts.dedupeThreshold } : {}),
205
+ quality: {
206
+ ctx: { registry, mode: "local-only", models },
207
+ // A document with no joined input (not in the snapshot) counts as never run.
208
+ input: (doc) => byId.get(doc.id) ?? { doc, steps: 0, runs: 0, succeeded: 0, failed: 0 },
209
+ ...(opts.minPHigh != null ? { minPHigh: opts.minPHigh } : {}),
210
+ },
211
+ });
212
+ }
213
+ //# sourceMappingURL=experience.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experience.js","sourceRoot":"","sources":["../../../src/ml/tasks/experience.ts"],"names":[],"mappings":"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"}