@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,10 @@
1
+ import { MlTaskRegistry } from "../registry.js";
2
+ import type { MlTask } from "../types.js";
3
+ /** The built-in rows, in catalog order. */
4
+ export declare const BUILTIN_ML_TASKS: readonly MlTask<any, any>[];
5
+ /** A registry holding every built-in row (add host rows with `register`). */
6
+ export declare function createMlRegistry(): MlTaskRegistry;
7
+ export * from "./experience.js";
8
+ export * from "./run_anomaly.js";
9
+ export * from "./local_success.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ml/tasks/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAK1C,2CAA2C;AAC3C,eAAO,MAAM,gBAAgB,EAAE,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAMvD,CAAC;AAEF,6EAA6E;AAC7E,wBAAgB,gBAAgB,IAAI,cAAc,CAIjD;AAED,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ml/tasks — the built-in catalog rows (docs/ml-task-catalog.md §4), in order.
3
+ * `limbic.affect` is defined by limbic/ itself; this only lists it.
4
+ */
5
+ import { LIMBIC_AFFECT_TASK } from "../../limbic/limbic_task.js";
6
+ import { MlTaskRegistry } from "../registry.js";
7
+ import { EXPERIENCE_DEDUPE_TASK, EXPERIENCE_QUALITY_TASK } from "./experience.js";
8
+ import { LOCAL_SUCCESS_TASK } from "./local_success.js";
9
+ import { RUN_ANOMALY_TASK } from "./run_anomaly.js";
10
+ /** The built-in rows, in catalog order. */
11
+ export const BUILTIN_ML_TASKS = [
12
+ LIMBIC_AFFECT_TASK,
13
+ EXPERIENCE_QUALITY_TASK,
14
+ EXPERIENCE_DEDUPE_TASK,
15
+ RUN_ANOMALY_TASK,
16
+ LOCAL_SUCCESS_TASK,
17
+ ];
18
+ /** A registry holding every built-in row (add host rows with `register`). */
19
+ export function createMlRegistry() {
20
+ const r = new MlTaskRegistry();
21
+ for (const t of BUILTIN_ML_TASKS)
22
+ r.register(t);
23
+ return r;
24
+ }
25
+ export * from "./experience.js";
26
+ export * from "./run_anomaly.js";
27
+ export * from "./local_success.js";
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ml/tasks/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAgC;IAC3D,kBAAkB;IAClB,uBAAuB;IACvB,sBAAsB;IACtB,gBAAgB;IAChB,kBAAkB;CACnB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,UAAU,gBAAgB;IAC9B,MAAM,CAAC,GAAG,IAAI,cAAc,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,gBAAgB;QAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,55 @@
1
+ import type { MlTrainExample } from "../train.js";
2
+ import type { MlTask } from "../types.js";
3
+ /** What the router knows about a turn before it runs, plus the local model's served context. */
4
+ export interface LocalTurnFeatures {
5
+ promptTokens: number;
6
+ /** Tokens of context (history, files, memory) the turn carries. */
7
+ contextTokens: number;
8
+ /** The local model's served context window, in tokens. */
9
+ servedContextTokens: number;
10
+ /** Tools advertised to the turn. */
11
+ tools: number;
12
+ /** Position of the turn in its conversation (0 = first). */
13
+ turnIndex: number;
14
+ attachments?: number;
15
+ /** Recent local success rate for this person/workload in [0, 1], when known. */
16
+ priorLocalSuccessRate?: number;
17
+ /** The turn is mostly code (edits, diffs, stack traces). */
18
+ codeHeavy?: boolean;
19
+ }
20
+ export declare const LOCAL_SUCCESS_FEATURES: readonly ["promptTokens", "contextTokens", "contextFill", "overflows", "tools", "turnIndex", "attachments", "priorLocalSuccessRate", "codeHeavy"];
21
+ /** Fixed scales — the same on every machine, so the weights federate. */
22
+ export declare function localSuccessFeatures(t: LocalTurnFeatures): number[];
23
+ export interface LocalSuccess {
24
+ succeeds: boolean;
25
+ /** P(the local model succeeds). */
26
+ probability: number;
27
+ }
28
+ export declare const LOCAL_SUCCESS_TASK: MlTask<LocalTurnFeatures, LocalSuccess>;
29
+ export type TurnResult = "succeeded" | "failed";
30
+ /** How one routed turn actually went. */
31
+ export interface LocalSuccessOutcome {
32
+ turn: LocalTurnFeatures;
33
+ /** The local model's result, when it ran. */
34
+ local?: TurnResult;
35
+ /** The cloud's result, when it ran. */
36
+ cloud?: TurnResult;
37
+ /** The local model ran first and the turn was handed to the cloud. */
38
+ fellBack?: boolean;
39
+ }
40
+ /** Weight of a cloud failure on a turn the local model never tried — weak evidence the turn was hard. */
41
+ export declare const CLOUD_ONLY_FAILURE_WEIGHT = 0.5;
42
+ /**
43
+ * The training label of one outcome, or null when it says nothing about the local model.
44
+ * - local ran: its result (1 succeeded / 0 failed);
45
+ * - fell back to the cloud: 0 — the local model could not finish it;
46
+ * - cloud only, and the cloud failed: 0 at {@link CLOUD_ONLY_FAILURE_WEIGHT};
47
+ * - cloud only, and the cloud succeeded: no evidence about local → null.
48
+ */
49
+ export declare function localSuccessLabel(o: LocalSuccessOutcome): {
50
+ label: 0 | 1;
51
+ weight: number;
52
+ } | null;
53
+ /** Labelled examples from routed outcomes (local AND cloud), oldest first. */
54
+ export declare function localSuccessExamples(outcomes: readonly LocalSuccessOutcome[]): MlTrainExample<LocalTurnFeatures>[];
55
+ //# sourceMappingURL=local_success.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local_success.d.ts","sourceRoot":"","sources":["../../../src/ml/tasks/local_success.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAgB,MAAM,EAAE,MAAM,aAAa,CAAC;AAExD,gGAAgG;AAChG,MAAM,WAAW,iBAAiB;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,sBAAsB,mJAUzB,CAAC;AAEX,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAanE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,iBAAiB,EAAE,YAAY,CActE,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,CAAC;AAEhD,yCAAyC;AACzC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,6CAA6C;IAC7C,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,uCAAuC;IACvC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,yGAAyG;AACzG,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,mBAAmB,GAAG;IAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKjG;AAED,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,GAAG,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAKlH"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * ml/tasks/local_success.ts — `run.local-success`: will this turn succeed on the
3
+ * local model? Exported for the Hybrid router (Builderforce.ai), which keeps a turn
4
+ * local when it can and sends it to the cloud when it can't.
5
+ *
6
+ * It LEARNS FROM THE CLOUD (docs/ml-task-catalog.md §6): in Hybrid, a turn that
7
+ * fell back to — or was also served by — the cloud is a training label for the
8
+ * local predictor, alongside local outcomes. See {@link localSuccessLabel}.
9
+ */
10
+ import { clampRatio, logScale } from "../features.js";
11
+ export const LOCAL_SUCCESS_FEATURES = [
12
+ "promptTokens",
13
+ "contextTokens",
14
+ "contextFill",
15
+ "overflows",
16
+ "tools",
17
+ "turnIndex",
18
+ "attachments",
19
+ "priorLocalSuccessRate",
20
+ "codeHeavy",
21
+ ];
22
+ /** Fixed scales — the same on every machine, so the weights federate. */
23
+ export function localSuccessFeatures(t) {
24
+ const fill = clampRatio(t.promptTokens + t.contextTokens, t.servedContextTokens, 4);
25
+ return [
26
+ logScale(t.promptTokens, 100_000),
27
+ logScale(t.contextTokens, 100_000),
28
+ fill,
29
+ fill > 1 ? 1 : 0,
30
+ logScale(t.tools, 64),
31
+ logScale(t.turnIndex, 100),
32
+ logScale(t.attachments ?? 0, 16),
33
+ Math.max(0, Math.min(1, t.priorLocalSuccessRate ?? 0.5)),
34
+ t.codeHeavy ? 1 : 0,
35
+ ];
36
+ }
37
+ export const LOCAL_SUCCESS_TASK = {
38
+ kind: "classify",
39
+ id: "run.local-success",
40
+ description: "Will this turn succeed on the local model?",
41
+ features: { numeric: localSuccessFeatures, numericNames: LOCAL_SUCCESS_FEATURES },
42
+ engines: [
43
+ { tier: "local", engine: "classical", algorithm: "logistic" },
44
+ { tier: "local", engine: "classical", algorithm: "gbm-small" },
45
+ ],
46
+ train: { minSamples: 8 },
47
+ output: {
48
+ labels: ["fails", "succeeds"],
49
+ decode: (p) => ({ succeeds: (p.scores[1] ?? 0) >= 0.5, probability: p.scores[1] ?? 0 }),
50
+ },
51
+ };
52
+ /** Weight of a cloud failure on a turn the local model never tried — weak evidence the turn was hard. */
53
+ export const CLOUD_ONLY_FAILURE_WEIGHT = 0.5;
54
+ /**
55
+ * The training label of one outcome, or null when it says nothing about the local model.
56
+ * - local ran: its result (1 succeeded / 0 failed);
57
+ * - fell back to the cloud: 0 — the local model could not finish it;
58
+ * - cloud only, and the cloud failed: 0 at {@link CLOUD_ONLY_FAILURE_WEIGHT};
59
+ * - cloud only, and the cloud succeeded: no evidence about local → null.
60
+ */
61
+ export function localSuccessLabel(o) {
62
+ if (o.local)
63
+ return { label: o.local === "succeeded" ? 1 : 0, weight: 1 };
64
+ if (o.fellBack)
65
+ return { label: 0, weight: 1 };
66
+ if (o.cloud === "failed")
67
+ return { label: 0, weight: CLOUD_ONLY_FAILURE_WEIGHT };
68
+ return null;
69
+ }
70
+ /** Labelled examples from routed outcomes (local AND cloud), oldest first. */
71
+ export function localSuccessExamples(outcomes) {
72
+ return outcomes.flatMap((o) => {
73
+ const l = localSuccessLabel(o);
74
+ return l ? [{ input: o.turn, label: l.label, weight: l.weight }] : [];
75
+ });
76
+ }
77
+ //# sourceMappingURL=local_success.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local_success.js","sourceRoot":"","sources":["../../../src/ml/tasks/local_success.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * ml/tasks/run_anomaly.ts — `run.anomaly`: a run that cost, took or failed far
3
+ * outside its normal range. Flags runs to leave out of training and to surface as
4
+ * Insights.
5
+ *
6
+ * ONE engine, `anomaly-composite`: robust z (median/MAD over the whole history —
7
+ * "far from normal") and EWMA (the recent trend — "drifting away from lately"),
8
+ * scored as the larger of the two so either one can flag. The row lists exactly
9
+ * that engine, so the key it is stored under is the key the runner asks for.
10
+ */
11
+ import type { Run } from "../../experience/types.js";
12
+ import { AnomalyCompositeModel, type AnomalyCompositeOptions } from "../classical/anomaly_composite.js";
13
+ import type { MlSample, MlTask } from "../types.js";
14
+ /** What a run cost and how it went — the host supplies cost; the rest is in the run log. */
15
+ export interface RunMetrics {
16
+ costUsd: number;
17
+ durationMs: number;
18
+ toolFailures: number;
19
+ }
20
+ export interface RunAnomaly {
21
+ anomalous: boolean;
22
+ /** Normalised score: ≥ 1 is anomalous. */
23
+ score: number;
24
+ }
25
+ export declare const RUN_ANOMALY_METRICS: readonly ["cost", "duration", "toolFailures"];
26
+ /** Fixed log scales (a $10 run, a one-hour run, 50 failures map to 1). */
27
+ export declare function runAnomalyFeatures(m: RunMetrics): number[];
28
+ /**
29
+ * The smallest per-metric scale (σ) both detectors use, in the fixed log units above.
30
+ * A history with no tool failures has MAD = mean-AD = 0 and EWMA σ = 0, so without an
31
+ * absolute floor ONE failure (log1p(1)/log1p(50) ≈ 0.18) scored as a huge outlier and
32
+ * every run with any failure was flagged. At 0.1, one or two failures after a clean
33
+ * history stay normal (z ≈ 1.8 / 2.8) and three or more flag (z ≥ 3.5); on cost, 0.1
34
+ * is ~0.7 nats, so a constant-cost history flags a ~10× jump. (0.05 was too tight: it
35
+ * still flagged a single failure.)
36
+ */
37
+ export declare const RUN_ANOMALY_MIN_SCALE = 0.1;
38
+ /** The composite detector with `run.anomaly`'s metric names on its explanation. */
39
+ export declare class RunAnomalyDetector extends AnomalyCompositeModel {
40
+ /** Which metrics are out of range, per detector (z / threshold, ≥ 1 = out of range). */
41
+ explain(x: ArrayLike<number>): {
42
+ metric: (typeof RUN_ANOMALY_METRICS)[number];
43
+ population: number;
44
+ trend: number;
45
+ }[];
46
+ }
47
+ /** Fit both detectors on a chronological history of runs (as feature vectors), floored at {@link RUN_ANOMALY_MIN_SCALE}. */
48
+ export declare function fitRunAnomaly(samples: readonly MlSample[], opts?: AnomalyCompositeOptions): RunAnomalyDetector;
49
+ export declare const RUN_ANOMALY_TASK: MlTask<RunMetrics, RunAnomaly>;
50
+ /** Duration and tool-failure count of an experience run, with the host's cost. */
51
+ export declare function experienceRunMetrics(run: Run, costUsd?: number): RunMetrics;
52
+ //# sourceMappingURL=run_anomaly.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_anomaly.d.ts","sourceRoot":"","sources":["../../../src/ml/tasks/run_anomaly.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,KAAK,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAIxG,OAAO,KAAK,EAAgB,QAAQ,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAElE,4FAA4F;AAC5F,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,mBAAmB,+CAAgD,CAAC;AAEjF,0EAA0E;AAC1E,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,CAE1D;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,mFAAmF;AACnF,qBAAa,kBAAmB,SAAQ,qBAAqB;IAC3D,wFAAwF;IACxF,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG;QAAE,MAAM,EAAE,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE;CAIrH;AAED,4HAA4H;AAC5H,wBAAgB,aAAa,CAAC,OAAO,EAAE,SAAS,QAAQ,EAAE,EAAE,IAAI,GAAE,uBAA4B,GAAG,kBAAkB,CAKlH;AAED,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAS3D,CAAC;AAEF,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,SAAI,GAAG,UAAU,CAMtE"}
@@ -0,0 +1,50 @@
1
+ import { AnomalyCompositeModel } from "../classical/anomaly_composite.js";
2
+ import { fitEwma } from "../classical/ewma.js";
3
+ import { fitRobustZ } from "../classical/robust_z.js";
4
+ import { logScale } from "../features.js";
5
+ export const RUN_ANOMALY_METRICS = ["cost", "duration", "toolFailures"];
6
+ /** Fixed log scales (a $10 run, a one-hour run, 50 failures map to 1). */
7
+ export function runAnomalyFeatures(m) {
8
+ return [logScale(m.costUsd * 100, 1000), logScale(m.durationMs, 3_600_000), logScale(m.toolFailures, 50)];
9
+ }
10
+ /**
11
+ * The smallest per-metric scale (σ) both detectors use, in the fixed log units above.
12
+ * A history with no tool failures has MAD = mean-AD = 0 and EWMA σ = 0, so without an
13
+ * absolute floor ONE failure (log1p(1)/log1p(50) ≈ 0.18) scored as a huge outlier and
14
+ * every run with any failure was flagged. At 0.1, one or two failures after a clean
15
+ * history stay normal (z ≈ 1.8 / 2.8) and three or more flag (z ≥ 3.5); on cost, 0.1
16
+ * is ~0.7 nats, so a constant-cost history flags a ~10× jump. (0.05 was too tight: it
17
+ * still flagged a single failure.)
18
+ */
19
+ export const RUN_ANOMALY_MIN_SCALE = 0.1;
20
+ /** The composite detector with `run.anomaly`'s metric names on its explanation. */
21
+ export class RunAnomalyDetector extends AnomalyCompositeModel {
22
+ /** Which metrics are out of range, per detector (z / threshold, ≥ 1 = out of range). */
23
+ explain(x) {
24
+ const per = this.featureScores(x);
25
+ return RUN_ANOMALY_METRICS.map((metric, i) => ({ metric, ...per[i] }));
26
+ }
27
+ }
28
+ /** Fit both detectors on a chronological history of runs (as feature vectors), floored at {@link RUN_ANOMALY_MIN_SCALE}. */
29
+ export function fitRunAnomaly(samples, opts = {}) {
30
+ return new RunAnomalyDetector(fitRobustZ(samples, { ...opts.robustZ, minScale: opts.robustZ?.minScale ?? RUN_ANOMALY_MIN_SCALE }), fitEwma(samples, { ...opts.ewma, minScale: opts.ewma?.minScale ?? RUN_ANOMALY_MIN_SCALE }));
31
+ }
32
+ export const RUN_ANOMALY_TASK = {
33
+ kind: "anomaly",
34
+ id: "run.anomaly",
35
+ description: "Did this run cost, take or fail far outside its normal range?",
36
+ features: { numeric: runAnomalyFeatures, numericNames: RUN_ANOMALY_METRICS },
37
+ engines: [{ tier: "local", engine: "classical", algorithm: "anomaly-composite" }],
38
+ // The task's own fit: the same composite, with the metric floor and named explanation.
39
+ train: { minSamples: 5, fit: (samples) => fitRunAnomaly(samples) },
40
+ output: { decode: (p) => ({ anomalous: (p.scores[0] ?? 0) >= 1, score: p.scores[0] ?? 0 }) },
41
+ };
42
+ /** Duration and tool-failure count of an experience run, with the host's cost. */
43
+ export function experienceRunMetrics(run, costUsd = 0) {
44
+ return {
45
+ costUsd,
46
+ durationMs: run.endedAt != null ? Math.max(0, run.endedAt - run.startedAt) : 0,
47
+ toolFailures: run.steps.filter((s) => s.outcome === "failed").length,
48
+ };
49
+ }
50
+ //# sourceMappingURL=run_anomaly.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_anomaly.js","sourceRoot":"","sources":["../../../src/ml/tasks/run_anomaly.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * ml/train.ts — the ONE trainer seam for catalog tasks.
3
+ *
4
+ * Classical engines fit in closed form or by small iteration (`classical/`);
5
+ * head engines train a {@link DenseHead} through the shared {@link HeadTrainer}
6
+ * (GPU AdamW when a device is supplied, CPU AdamW otherwise). A task can name its
7
+ * own composite fit (`TrainSpec.fit`), or say that something else trains it
8
+ * (`TrainSpec.trainedBy`, e.g. `LimbicTrainer` for `limbic.affect`).
9
+ *
10
+ * Held-out loss is measured the same way everywhere ({@link mlEvalLoss}) — it is
11
+ * also what gates a federated merge.
12
+ */
13
+ import { type ClassicalOptions } from "./classical/index.js";
14
+ import { type TextEmbedder } from "./features.js";
15
+ import { type HeadTrainOptions } from "./head_trainer.js";
16
+ import type { MlModelStore } from "./run.js";
17
+ import { type MlEngineRef, type MlPredictor, type MlTask } from "./types.js";
18
+ /** One labelled example in input space. */
19
+ export interface MlTrainExample<I> {
20
+ input: I;
21
+ /** classify: class index; regress: target value; cluster/anomaly: ignored (use 0). */
22
+ label: number;
23
+ weight?: number;
24
+ }
25
+ export interface MlTrainOptions {
26
+ /** Engine to fit (default: the task's first trainable local engine). */
27
+ engine?: MlEngineRef;
28
+ embedder?: TextEmbedder;
29
+ device?: GPUDevice | null;
30
+ classical?: ClassicalOptions;
31
+ head?: {
32
+ hiddenDim?: number;
33
+ seed?: number;
34
+ train?: HeadTrainOptions;
35
+ };
36
+ /** Overrides the task's `holdoutFraction`. 0 disables the held-out measurement. */
37
+ holdoutFraction?: number;
38
+ /** After measuring on the held-out tail, refit on everything. Default true. */
39
+ refitOnAll?: boolean;
40
+ /** Store the fitted predictor here under (task id, engine key). */
41
+ models?: MlModelStore;
42
+ }
43
+ export interface MlTrainResult {
44
+ predictor: MlPredictor;
45
+ engine: MlEngineRef;
46
+ /** Examples the final fit saw. */
47
+ samples: number;
48
+ /** Size of the held-out tail, and the model's loss on it (null when none was held out). */
49
+ holdout: number;
50
+ holdoutLoss: number | null;
51
+ }
52
+ export { mlEvalLoss } from "./eval_loss.js";
53
+ /**
54
+ * Fit task `task` on labelled examples. Returns null when there are fewer than
55
+ * the task's `minSamples` (it stays untrained). Throws for a task with no train
56
+ * spec, or one another trainer owns.
57
+ */
58
+ export declare function trainMlTask<I>(task: MlTask<I, any>, examples: readonly MlTrainExample<I>[], opts?: MlTrainOptions): Promise<MlTrainResult | null>;
59
+ //# sourceMappingURL=train.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"train.d.ts","sourceRoot":"","sources":["../../src/ml/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAgB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG3E,OAAO,EAAwB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAe,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAa,KAAK,WAAW,EAAE,KAAK,WAAW,EAAiB,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAEvG,2CAA2C;AAC3C,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC;IACT,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,wEAAwE;IACxE,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,gBAAgB,CAAA;KAAE,CAAC;IACvE,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mEAAmE;IACnE,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,WAAW,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,2FAA2F;IAC3F,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AA4B5C;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,EACpB,QAAQ,EAAE,SAAS,cAAc,CAAC,CAAC,CAAC,EAAE,EACtC,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA6B/B"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * ml/train.ts — the ONE trainer seam for catalog tasks.
3
+ *
4
+ * Classical engines fit in closed form or by small iteration (`classical/`);
5
+ * head engines train a {@link DenseHead} through the shared {@link HeadTrainer}
6
+ * (GPU AdamW when a device is supplied, CPU AdamW otherwise). A task can name its
7
+ * own composite fit (`TrainSpec.fit`), or say that something else trains it
8
+ * (`TrainSpec.trainedBy`, e.g. `LimbicTrainer` for `limbic.affect`).
9
+ *
10
+ * Held-out loss is measured the same way everywhere ({@link mlEvalLoss}) — it is
11
+ * also what gates a federated merge.
12
+ */
13
+ import { fitClassical } from "./classical/index.js";
14
+ import { DenseHead } from "./dense_head.js";
15
+ import { mlEvalLoss } from "./eval_loss.js";
16
+ import { extractFeatureMatrix } from "./features.js";
17
+ import { HeadTrainer } from "./head_trainer.js";
18
+ import { engineKey } from "./types.js";
19
+ export { mlEvalLoss } from "./eval_loss.js";
20
+ /** The task's first local engine the seam can train. */
21
+ function defaultEngine(task) {
22
+ const e = task.engines.find((r) => r.tier === "local" && (r.engine === "classical" || r.engine === "head"));
23
+ if (!e)
24
+ throw new Error(`trainMlTask(${task.id}): no trainable local engine`);
25
+ return e;
26
+ }
27
+ async function fitEngine(task, ref, samples, opts) {
28
+ if (task.train?.fit)
29
+ return task.train.fit(samples, ref);
30
+ if (ref.engine === "classical")
31
+ return fitClassical(ref.algorithm, samples, opts.classical);
32
+ if (ref.engine === "head") {
33
+ const objective = task.kind === "classify" ? "softmax" : task.kind === "regress" ? "mse" : null;
34
+ if (!objective)
35
+ throw new Error(`trainMlTask(${task.id}): a head engine trains classify or regress tasks only`);
36
+ const head = new DenseHead({
37
+ inputDim: samples[0].x.length,
38
+ hiddenDim: ref.head === "linear" ? 0 : (opts.head?.hiddenDim ?? 16),
39
+ outputDim: objective === "softmax" ? task.output.labels.length : 1,
40
+ objective,
41
+ ...(opts.head?.seed != null ? { seed: opts.head.seed } : {}),
42
+ });
43
+ await new HeadTrainer(head, opts.device ?? null, `trainMlTask(${task.id})`).train(samples, opts.head?.train);
44
+ return head;
45
+ }
46
+ throw new Error(`trainMlTask(${task.id}): engine '${engineKey(ref)}' is not trained here`);
47
+ }
48
+ /**
49
+ * Fit task `task` on labelled examples. Returns null when there are fewer than
50
+ * the task's `minSamples` (it stays untrained). Throws for a task with no train
51
+ * spec, or one another trainer owns.
52
+ */
53
+ export async function trainMlTask(task, examples, opts = {}) {
54
+ const spec = task.train;
55
+ if (!spec)
56
+ throw new Error(`trainMlTask(${task.id}): task is rule-based or pre-trained only`);
57
+ if (spec.trainedBy)
58
+ throw new Error(`trainMlTask(${task.id}): trained by ${spec.trainedBy}`);
59
+ if (examples.length < spec.minSamples)
60
+ return null;
61
+ const ref = opts.engine ?? defaultEngine(task);
62
+ const X = await extractFeatureMatrix(task.features, examples.map((e) => e.input), opts.embedder);
63
+ const samples = examples.map((e, i) => ({ x: X[i], y: e.label, ...(e.weight != null ? { weight: e.weight } : {}) }));
64
+ // Hold out the chronological TAIL: examples arrive oldest first, and the question
65
+ // is always "does this generalise to what comes next".
66
+ const supervised = task.kind === "classify" || task.kind === "regress";
67
+ const frac = supervised ? (opts.holdoutFraction ?? spec.holdoutFraction ?? 0.2) : 0;
68
+ const nHold = Math.floor(samples.length * frac);
69
+ let holdoutLoss = null;
70
+ if (nHold >= 1 && samples.length - nHold >= 1) {
71
+ const train = samples.slice(0, samples.length - nHold);
72
+ const hold = samples.slice(samples.length - nHold);
73
+ const predictor = await fitEngine(task, ref, train, opts);
74
+ holdoutLoss = mlEvalLoss(task.kind, predictor, hold);
75
+ if (opts.refitOnAll === false) {
76
+ opts.models?.set(task.id, engineKey(ref), predictor);
77
+ return { predictor, engine: ref, samples: train.length, holdout: nHold, holdoutLoss };
78
+ }
79
+ }
80
+ const predictor = await fitEngine(task, ref, samples, opts);
81
+ opts.models?.set(task.id, engineKey(ref), predictor);
82
+ return { predictor, engine: ref, samples: samples.length, holdout: nHold >= 1 ? nHold : 0, holdoutLoss };
83
+ }
84
+ //# sourceMappingURL=train.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"train.js","sourceRoot":"","sources":["../../src/ml/train.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * ml/types.ts — the ML task catalog contract (docs/ml-task-catalog.md §3).
3
+ *
4
+ * One bounded question Evermind answers without an LLM is ONE data row: how its
5
+ * input becomes a vector, which engines may answer it (in preference order), how
6
+ * it trains, and what its output means. Pure types — no vscode, no DOM, no network.
7
+ * (Imports only the leaf `evermind/ml_head.ts`; evermind/ never imports ml/.)
8
+ */
9
+ /** The shape of the question. */
10
+ export type MlTaskKind = "classify" | "regress" | "cluster" | "anomaly" | "rank";
11
+ /** Pure-TypeScript algorithms that run everywhere (`ml/classical/`). */
12
+ export type ClassicalAlgorithm = "knn" | "naive-bayes" | "logistic" | "linear" | "kmeans" | "robust-z" | "ewma"
13
+ /** robust z + EWMA as one fitted engine (`classical/anomaly_composite.ts`). */
14
+ | "anomaly-composite" | "isolation-forest" | "gbm-small";
15
+ /** An engine that can answer a task. Cloud engines are a port the HOST supplies. */
16
+ export type MlEngineRef = {
17
+ tier: "local";
18
+ engine: "classical";
19
+ algorithm: ClassicalAlgorithm;
20
+ } | {
21
+ tier: "local";
22
+ engine: "head";
23
+ head: "mlp" | "linear";
24
+ } | {
25
+ tier: "local";
26
+ engine: "onnx";
27
+ model: string;
28
+ } | {
29
+ tier: "cloud";
30
+ engine: "workers-ai";
31
+ model: string;
32
+ };
33
+ /**
34
+ * Which engines a run may use — the person's inference setting.
35
+ * - `local-only`: local tiers only, never the network.
36
+ * - `hybrid`: local first, the cloud port when no local engine can answer (or the
37
+ * local answer is below the caller's confidence floor).
38
+ * - `specific`: exactly the engine the caller names.
39
+ */
40
+ export type InferenceMode = "local-only" | "hybrid" | "specific";
41
+ /** What an engine returns before the task decodes it. */
42
+ export interface MlPrediction {
43
+ /**
44
+ * classify: one probability per label; regress: the predicted value(s);
45
+ * cluster: `[clusterId]`; anomaly: `[score]` where ≥ 1 is anomalous;
46
+ * rank: one score per candidate.
47
+ */
48
+ scores: number[];
49
+ /** Calibrated confidence in [0, 1]. */
50
+ confidence: number;
51
+ }
52
+ /** A fitted model that answers on a feature vector. */
53
+ export interface MlPredictor {
54
+ predict(x: Float32Array): MlPrediction;
55
+ /** Trainable state as one flat vector — present on models that federate. */
56
+ exportParams?(): Float32Array;
57
+ /** Load a flat vector produced by {@link exportParams} (e.g. after a merge). */
58
+ importParams?(params: ArrayLike<number>): void;
59
+ }
60
+ /** How an input becomes a vector: an embedded text part, numeric fields, or both. */
61
+ export interface FeatureSpec<I> {
62
+ /** Text to embed (needs an embedder in the run context). */
63
+ text?: (input: I) => string;
64
+ /** Numeric fields, already on a stable scale (so federated weights mean the same thing everywhere). */
65
+ numeric?: (input: I) => number[];
66
+ /** Names of the numeric fields, index-aligned — documentation and Insights labels. */
67
+ numericNames?: readonly string[];
68
+ }
69
+ /** One labelled training example in feature space. */
70
+ export interface MlSample {
71
+ x: Float32Array;
72
+ /** classify: class index; regress: target value; cluster/anomaly: ignored. */
73
+ y: number;
74
+ /** Sample weight (default 1). */
75
+ weight?: number;
76
+ }
77
+ /** How a task trains. Absent on the task = rule-based or pre-trained only. */
78
+ export interface TrainSpec {
79
+ /** Fewer labelled examples than this and the task stays untrained. */
80
+ minSamples: number;
81
+ /** Fraction held out for the eval gate (default 0.2). */
82
+ holdoutFraction?: number;
83
+ /**
84
+ * A task-specific fit (e.g. a composite of two classical detectors). When absent
85
+ * the trainer fits the engine named by the run (`ml/train.ts`).
86
+ */
87
+ fit?: (samples: readonly MlSample[], engine: MlEngineRef) => MlPredictor;
88
+ /** Who trains it when not `ml/train.ts` (e.g. `LimbicTrainer` for `limbic.affect`). */
89
+ trainedBy?: string;
90
+ }
91
+ /** What a task's answer means. */
92
+ export interface OutputSpec<O> {
93
+ /** Label set for classify tasks (index-aligned with `MlPrediction.scores`). */
94
+ labels?: readonly string[];
95
+ /** Decode an engine prediction into the task's output. */
96
+ decode(p: MlPrediction): O;
97
+ }
98
+ /** One bounded question Evermind can answer without an LLM. DATA, not a class tree. */
99
+ export interface MlTask<I = unknown, O = unknown> {
100
+ kind: MlTaskKind;
101
+ /** Stable id, e.g. `experience.quality`. */
102
+ id: string;
103
+ /** One line on what it answers. */
104
+ description: string;
105
+ features: FeatureSpec<I>;
106
+ /** In preference order; filtered by the inference mode. */
107
+ engines: readonly MlEngineRef[];
108
+ train?: TrainSpec;
109
+ output: OutputSpec<O>;
110
+ }
111
+ /** Task ids: lowercase dotted segments — defined once with the artifact's head contract. */
112
+ export { ML_TASK_ID_RE } from "../evermind/ml_head.js";
113
+ /** A stable string key for an engine ref, e.g. `local:classical:logistic`. */
114
+ export declare function engineKey(ref: MlEngineRef): string;
115
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ml/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * ml/types.ts — the ML task catalog contract (docs/ml-task-catalog.md §3).
3
+ *
4
+ * One bounded question Evermind answers without an LLM is ONE data row: how its
5
+ * input becomes a vector, which engines may answer it (in preference order), how
6
+ * it trains, and what its output means. Pure types — no vscode, no DOM, no network.
7
+ * (Imports only the leaf `evermind/ml_head.ts`; evermind/ never imports ml/.)
8
+ */
9
+ /** Task ids: lowercase dotted segments — defined once with the artifact's head contract. */
10
+ export { ML_TASK_ID_RE } from "../evermind/ml_head.js";
11
+ /** A stable string key for an engine ref, e.g. `local:classical:logistic`. */
12
+ export function engineKey(ref) {
13
+ switch (ref.engine) {
14
+ case "classical":
15
+ return `local:classical:${ref.algorithm}`;
16
+ case "head":
17
+ return `local:head:${ref.head}`;
18
+ case "onnx":
19
+ return `local:onnx:${ref.model}`;
20
+ case "workers-ai":
21
+ return `cloud:workers-ai:${ref.model}`;
22
+ }
23
+ }
24
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ml/types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAgHH,4FAA4F;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,8EAA8E;AAC9E,MAAM,UAAU,SAAS,CAAC,GAAgB;IACxC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC;QACnB,KAAK,WAAW;YACd,OAAO,mBAAmB,GAAG,CAAC,SAAS,EAAE,CAAC;QAC5C,KAAK,MAAM;YACT,OAAO,cAAc,GAAG,CAAC,IAAI,EAAE,CAAC;QAClC,KAAK,MAAM;YACT,OAAO,cAAc,GAAG,CAAC,KAAK,EAAE,CAAC;QACnC,KAAK,YAAY;YACf,OAAO,oBAAoB,GAAG,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"moe_model.d.ts","sourceRoot":"","sources":["../../src/moe/moe_model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"moe_model.d.ts","sourceRoot":"","sources":["../../src/moe/moe_model.ts"],"names":[],"mappings":"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"}