@seanhogg/builderforce-memory-engine 2026.9.28 → 2026.9.30

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 (112) hide show
  1. package/dist/evermind/adapt.d.ts +13 -0
  2. package/dist/evermind/adapt.d.ts.map +1 -1
  3. package/dist/evermind/adapt.js +13 -1
  4. package/dist/evermind/adapt.js.map +1 -1
  5. package/dist/evermind/index.d.ts +3 -3
  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/package.d.ts +16 -0
  10. package/dist/evermind/package.d.ts.map +1 -1
  11. package/dist/evermind/package.js +40 -14
  12. package/dist/evermind/package.js.map +1 -1
  13. package/dist/experience/approval.d.ts +16 -0
  14. package/dist/experience/approval.d.ts.map +1 -0
  15. package/dist/experience/approval.js +40 -0
  16. package/dist/experience/approval.js.map +1 -0
  17. package/dist/experience/corpus.d.ts +24 -0
  18. package/dist/experience/corpus.d.ts.map +1 -0
  19. package/dist/experience/corpus.js +90 -0
  20. package/dist/experience/corpus.js.map +1 -0
  21. package/dist/experience/index.d.ts +18 -0
  22. package/dist/experience/index.d.ts.map +1 -0
  23. package/dist/experience/index.js +8 -0
  24. package/dist/experience/index.js.map +1 -0
  25. package/dist/experience/overview.d.ts +52 -0
  26. package/dist/experience/overview.d.ts.map +1 -0
  27. package/dist/experience/overview.js +92 -0
  28. package/dist/experience/overview.js.map +1 -0
  29. package/dist/experience/schedule.d.ts +10 -0
  30. package/dist/experience/schedule.d.ts.map +1 -0
  31. package/dist/experience/schedule.js +22 -0
  32. package/dist/experience/schedule.js.map +1 -0
  33. package/dist/experience/store.d.ts +88 -0
  34. package/dist/experience/store.d.ts.map +1 -0
  35. package/dist/experience/store.js +128 -0
  36. package/dist/experience/store.js.map +1 -0
  37. package/dist/experience/trainOnce.d.ts +18 -0
  38. package/dist/experience/trainOnce.d.ts.map +1 -0
  39. package/dist/experience/trainOnce.js +74 -0
  40. package/dist/experience/trainOnce.js.map +1 -0
  41. package/dist/experience/types.d.ts +171 -0
  42. package/dist/experience/types.d.ts.map +1 -0
  43. package/dist/experience/types.js +22 -0
  44. package/dist/experience/types.js.map +1 -0
  45. package/dist/export/onnx.d.ts.map +1 -1
  46. package/dist/export/onnx.js +0 -8
  47. package/dist/export/onnx.js.map +1 -1
  48. package/dist/import/foreign/falcon_mamba.d.ts +15 -2
  49. package/dist/import/foreign/falcon_mamba.d.ts.map +1 -1
  50. package/dist/import/foreign/falcon_mamba.js +53 -36
  51. package/dist/import/foreign/falcon_mamba.js.map +1 -1
  52. package/dist/import/foreign/index.d.ts +5 -2
  53. package/dist/import/foreign/index.d.ts.map +1 -1
  54. package/dist/import/foreign/index.js +4 -2
  55. package/dist/import/foreign/index.js.map +1 -1
  56. package/dist/import/foreign/infer.d.ts +20 -0
  57. package/dist/import/foreign/infer.d.ts.map +1 -0
  58. package/dist/import/foreign/infer.js +58 -0
  59. package/dist/import/foreign/infer.js.map +1 -0
  60. package/dist/import/foreign/registry.d.ts.map +1 -1
  61. package/dist/import/foreign/registry.js +2 -1
  62. package/dist/import/foreign/registry.js.map +1 -1
  63. package/dist/import/foreign/vocab.d.ts +19 -0
  64. package/dist/import/foreign/vocab.d.ts.map +1 -0
  65. package/dist/import/foreign/vocab.js +40 -0
  66. package/dist/import/foreign/vocab.js.map +1 -0
  67. package/dist/import/index.d.ts +2 -2
  68. package/dist/import/index.d.ts.map +1 -1
  69. package/dist/import/index.js +1 -1
  70. package/dist/import/index.js.map +1 -1
  71. package/dist/import/safetensors.d.ts +1 -1
  72. package/dist/import/safetensors.js +11 -2
  73. package/dist/import/safetensors.js.map +1 -1
  74. package/dist/index.d.ts +5 -4
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +5 -3
  77. package/dist/index.js.map +1 -1
  78. package/dist/moe/moe_model.d.ts +2 -0
  79. package/dist/moe/moe_model.d.ts.map +1 -1
  80. package/dist/moe/moe_model.js +9 -7
  81. package/dist/moe/moe_model.js.map +1 -1
  82. package/dist/moe/moe_trainer.d.ts.map +1 -1
  83. package/dist/moe/moe_trainer.js +5 -8
  84. package/dist/moe/moe_trainer.js.map +1 -1
  85. package/dist/utils/rng.d.ts +7 -3
  86. package/dist/utils/rng.d.ts.map +1 -1
  87. package/dist/utils/rng.js +10 -6
  88. package/dist/utils/rng.js.map +1 -1
  89. package/package.json +1 -1
  90. package/src/evermind/adapt.ts +26 -1
  91. package/src/evermind/index.ts +3 -3
  92. package/src/evermind/package.ts +39 -12
  93. package/src/experience/approval.ts +49 -0
  94. package/src/experience/corpus.ts +103 -0
  95. package/src/experience/index.ts +35 -0
  96. package/src/experience/overview.ts +143 -0
  97. package/src/experience/schedule.ts +29 -0
  98. package/src/experience/store.ts +188 -0
  99. package/src/experience/trainOnce.ts +85 -0
  100. package/src/experience/types.ts +162 -0
  101. package/src/export/onnx.ts +0 -7
  102. package/src/import/foreign/falcon_mamba.ts +63 -40
  103. package/src/import/foreign/index.ts +5 -2
  104. package/src/import/foreign/infer.ts +62 -0
  105. package/src/import/foreign/registry.ts +2 -1
  106. package/src/import/foreign/vocab.ts +50 -0
  107. package/src/import/index.ts +5 -0
  108. package/src/import/safetensors.ts +9 -2
  109. package/src/index.ts +14 -1
  110. package/src/moe/moe_model.ts +9 -7
  111. package/src/moe/moe_trainer.ts +5 -8
  112. package/src/utils/rng.ts +10 -6
@@ -0,0 +1,92 @@
1
+ /**
2
+ * experience/overview.ts — what experience says about the brain, for anything that draws
3
+ * it. Pure: the host passes the snapshot, which adaptation its model is at, the clock
4
+ * and the local UTC offset; every number comes from the snapshot, none is estimated.
5
+ *
6
+ * The regions are the parts of the brain experience lives in:
7
+ * - **hippocampus** — episodic memory: the demonstrations;
8
+ * - **basalGanglia** — action selection: the skills, and how their runs went;
9
+ * - **amygdala** — salience: the decisions made at irreversible steps;
10
+ * - **hypothalamus** — drives: the routines that start skills by themselves;
11
+ * - **neocortex** — the private model's weights: the procedures adapted into it.
12
+ * Facts (semantic memory) and attention belong to other stores; a host adds those.
13
+ */
14
+ import { experienceDocuments } from './corpus.js';
15
+ const DAY_MS = 86_400_000;
16
+ function localDay(at, offsetMinutes) {
17
+ return new Date(at + offsetMinutes * 60_000).toISOString().slice(0, 10);
18
+ }
19
+ export function experienceOverview(snap, opts) {
20
+ const known = (id) => {
21
+ const n = snap.learned[id];
22
+ return typeof n === 'number' && n >= 1 && n <= opts.modelIndex;
23
+ };
24
+ const docs = experienceDocuments(snap.episodes, snap.skills);
25
+ const learned = docs.filter((d) => known(d.id)).length;
26
+ const runs = { running: 0, succeeded: 0, failed: 0, stopped: 0, denied: 0 };
27
+ const approvals = { approved: 0, denied: 0 };
28
+ const events = [];
29
+ for (const e of snap.episodes) {
30
+ events.push({ region: 'hippocampus', kind: 'demonstration', id: e.id, name: e.name, at: e.startedAt });
31
+ }
32
+ for (const s of snap.skills) {
33
+ events.push({ region: 'basalGanglia', kind: 'skill', id: s.id, name: s.name, at: s.createdAt });
34
+ }
35
+ for (const r of snap.runs) {
36
+ runs[r.status] = (runs[r.status] ?? 0) + 1;
37
+ events.push({ region: 'basalGanglia', kind: 'run', id: r.id, name: r.skillName, at: r.startedAt, detail: r.status });
38
+ for (const step of r.steps) {
39
+ if (step.outcome !== 'approved' && step.outcome !== 'denied')
40
+ continue;
41
+ approvals[step.outcome]++;
42
+ events.push({ region: 'amygdala', kind: 'approval', id: r.id, name: r.skillName, at: step.at, detail: step.outcome });
43
+ }
44
+ }
45
+ // Only adaptations the loaded model descends from: a rolled-back model's discarded
46
+ // versions are not what it knows.
47
+ const adaptations = snap.adaptations.filter((a) => a.index <= opts.modelIndex).reverse();
48
+ for (const a of adaptations) {
49
+ events.push({ region: 'neocortex', kind: 'adaptation', id: a.version, name: a.version, at: a.at, detail: a.loss.toFixed(3) });
50
+ }
51
+ const windowDays = Math.max(1, opts.days ?? 30);
52
+ const days = [];
53
+ const index = new Map();
54
+ for (let i = windowDays - 1; i >= 0; i--) {
55
+ const day = localDay(opts.now - i * DAY_MS, opts.utcOffsetMinutes);
56
+ if (index.has(day))
57
+ continue;
58
+ const entry = { day, demonstrations: 0, skills: 0, runs: 0, learned: 0 };
59
+ index.set(day, entry);
60
+ days.push(entry);
61
+ }
62
+ const bump = (at, field, by = 1) => {
63
+ const d = index.get(localDay(at, opts.utcOffsetMinutes));
64
+ if (d)
65
+ d[field] += by;
66
+ };
67
+ for (const e of snap.episodes)
68
+ bump(e.startedAt, 'demonstrations');
69
+ for (const s of snap.skills)
70
+ bump(s.createdAt, 'skills');
71
+ for (const r of snap.runs)
72
+ bump(r.startedAt, 'runs');
73
+ for (const a of adaptations)
74
+ bump(a.at, 'learned', a.learned.length);
75
+ return {
76
+ regions: {
77
+ hippocampus: snap.episodes.length,
78
+ basalGanglia: snap.skills.length,
79
+ amygdala: approvals.approved + approvals.denied,
80
+ hypothalamus: snap.skills.filter((s) => s.routine?.enabled).length,
81
+ neocortex: learned,
82
+ },
83
+ learned,
84
+ pending: docs.length - learned,
85
+ runs,
86
+ approvals,
87
+ adaptations,
88
+ days,
89
+ recent: events.sort((a, b) => b.at - a.at).slice(0, Math.max(0, opts.recent ?? 40)),
90
+ };
91
+ }
92
+ //# sourceMappingURL=overview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/experience/overview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * experience/schedule.ts — when a skill's routine is due. Pure: the host supplies the
3
+ * clock and the local UTC offset, and ticks as often as it likes.
4
+ */
5
+ import type { Schedule, Skill } from './types.js';
6
+ /** `utcOffsetMinutes` is local minus UTC (e.g. -240 for UTC-4). */
7
+ export declare function isDue(schedule: Schedule, lastRunAt: number | null | undefined, now: number, utcOffsetMinutes: number): boolean;
8
+ /** Skills whose enabled routine is due now, oldest-run first. */
9
+ export declare function dueSkills(skills: Skill[], now: number, utcOffsetMinutes: number): Skill[];
10
+ //# sourceMappingURL=schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/experience/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKlD,mEAAmE;AACnE,wBAAgB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAW9H;AAED,iEAAiE;AACjE,wBAAgB,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,KAAK,EAAE,CAIzF"}
@@ -0,0 +1,22 @@
1
+ const MINUTE = 60_000;
2
+ const DAY = 86_400_000;
3
+ /** `utcOffsetMinutes` is local minus UTC (e.g. -240 for UTC-4). */
4
+ export function isDue(schedule, lastRunAt, now, utcOffsetMinutes) {
5
+ if (schedule.every === 'minutes') {
6
+ const every = Math.max(1, schedule.minutes) * MINUTE;
7
+ return lastRunAt == null || now - lastRunAt >= every;
8
+ }
9
+ const offset = utcOffsetMinutes * MINUTE;
10
+ const localNow = now + offset;
11
+ const dayStart = localNow - (((localNow % DAY) + DAY) % DAY);
12
+ const target = dayStart + Math.min(23, Math.max(0, schedule.hour)) * 3_600_000 + Math.min(59, Math.max(0, schedule.minute)) * MINUTE;
13
+ // Due once the time of day has passed, unless it already ran since then.
14
+ return localNow >= target && (lastRunAt == null || lastRunAt + offset < target);
15
+ }
16
+ /** Skills whose enabled routine is due now, oldest-run first. */
17
+ export function dueSkills(skills, now, utcOffsetMinutes) {
18
+ return skills
19
+ .filter((s) => s.routine?.enabled && isDue(s.routine.schedule, s.routine.lastRunAt, now, utcOffsetMinutes))
20
+ .sort((a, b) => (a.routine?.lastRunAt ?? 0) - (b.routine?.lastRunAt ?? 0));
21
+ }
22
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/experience/schedule.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,GAAG,MAAM,CAAC;AACtB,MAAM,GAAG,GAAG,UAAU,CAAC;AAEvB,mEAAmE;AACnE,MAAM,UAAU,KAAK,CAAC,QAAkB,EAAE,SAAoC,EAAE,GAAW,EAAE,gBAAwB;IACnH,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;QACrD,OAAO,SAAS,IAAI,IAAI,IAAI,GAAG,GAAG,SAAS,IAAI,KAAK,CAAC;IACvD,CAAC;IACD,MAAM,MAAM,GAAG,gBAAgB,GAAG,MAAM,CAAC;IACzC,MAAM,QAAQ,GAAG,GAAG,GAAG,MAAM,CAAC;IAC9B,MAAM,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;IACrI,yEAAyE;IACzE,OAAO,QAAQ,IAAI,MAAM,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC,CAAC;AAClF,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,SAAS,CAAC,MAAe,EAAE,GAAW,EAAE,gBAAwB;IAC9E,OAAO,MAAM;SACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;SAC1G,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * experience/store.ts — the persistence port for experience, and its snapshot format.
3
+ *
4
+ * The engine does no I/O (checkpoints are `ArrayBuffer`s the host stores); experience
5
+ * follows the same rule. `ExperienceStore` is the port every host implements over its own
6
+ * storage — a JSON file on disk (memory-mcp), IndexedDB, a KV. `InMemoryExperienceStore`
7
+ * is the reference implementation, and `ExperienceSnapshot` is the one serialized shape,
8
+ * so a store on one runtime can be read by another.
9
+ */
10
+ import type { Adaptation, Episode, EpisodeSummary, Run, RunStepLog, Skill } from './types.js';
11
+ export declare const EXPERIENCE_SCHEMA = "evermind.experience/1";
12
+ /** Runs kept, newest first — the audit trail is recent history, not an archive. */
13
+ export declare const MAX_RUNS = 500;
14
+ /** Adaptations kept, newest first — enough history to chart how learning went. */
15
+ export declare const MAX_ADAPTATIONS = 200;
16
+ export interface ExperienceSnapshot {
17
+ schema: typeof EXPERIENCE_SCHEMA;
18
+ episodes: Episode[];
19
+ skills: Skill[];
20
+ runs: Run[];
21
+ /**
22
+ * Which episodes and skills the local Evermind has been adapted on, and by which
23
+ * adaptation (the N of the model's `+expN` version) — so training reads each
24
+ * procedure once, and a model rolled back to an earlier N re-learns what the
25
+ * discarded versions had learned.
26
+ */
27
+ learned: Record<string, number>;
28
+ /** Every adaptation's measurements, newest first (capped at {@link MAX_ADAPTATIONS}). */
29
+ adaptations: Adaptation[];
30
+ }
31
+ export interface ExperienceStore {
32
+ putEpisode(episode: Episode): Promise<void>;
33
+ getEpisode(id: string): Promise<Episode | undefined>;
34
+ listEpisodes(): Promise<EpisodeSummary[]>;
35
+ /** Forget a demonstration. Skills compiled from it keep working — they carry their own steps. */
36
+ deleteEpisode(id: string): Promise<boolean>;
37
+ putSkill(skill: Skill): Promise<void>;
38
+ getSkill(id: string): Promise<Skill | undefined>;
39
+ listSkills(): Promise<Skill[]>;
40
+ deleteSkill(id: string): Promise<boolean>;
41
+ putRun(run: Run): Promise<void>;
42
+ /** Append one audit line to a run; false when the run is unknown. */
43
+ appendRunStep(runId: string, step: RunStepLog): Promise<boolean>;
44
+ getRun(id: string): Promise<Run | undefined>;
45
+ listRuns(limit: number): Promise<Run[]>;
46
+ /**
47
+ * Record one adaptation: its items join the learned ledger under its index (the
48
+ * model's `+expN`) and its measurements join the history — one write, so the ledger
49
+ * and the chart can never disagree.
50
+ */
51
+ recordAdaptation(adaptation: Adaptation): Promise<void>;
52
+ snapshot(): Promise<ExperienceSnapshot>;
53
+ /** Delete every episode, skill and run. */
54
+ clear(): Promise<void>;
55
+ }
56
+ export declare function emptySnapshot(): ExperienceSnapshot;
57
+ /** Parse a snapshot, tolerating a missing or foreign file as empty. */
58
+ export declare function parseSnapshot(raw: unknown): ExperienceSnapshot;
59
+ /**
60
+ * The reference store: the snapshot held in memory. Hosts that persist wrap it and
61
+ * write `snapshot()` after each change (see `onChange`).
62
+ */
63
+ export declare class InMemoryExperienceStore implements ExperienceStore {
64
+ private readonly onChange?;
65
+ private data;
66
+ constructor(initial?: ExperienceSnapshot, onChange?: ((s: ExperienceSnapshot) => void | Promise<void>) | undefined);
67
+ /** Replace the contents (a host re-reading its file after another process wrote it). */
68
+ load(snapshot: ExperienceSnapshot): void;
69
+ private changed;
70
+ private static upsert;
71
+ private static remove;
72
+ putEpisode(episode: Episode): Promise<void>;
73
+ getEpisode(id: string): Promise<Episode | undefined>;
74
+ listEpisodes(): Promise<EpisodeSummary[]>;
75
+ deleteEpisode(id: string): Promise<boolean>;
76
+ putSkill(skill: Skill): Promise<void>;
77
+ getSkill(id: string): Promise<Skill | undefined>;
78
+ listSkills(): Promise<Skill[]>;
79
+ deleteSkill(id: string): Promise<boolean>;
80
+ putRun(run: Run): Promise<void>;
81
+ appendRunStep(runId: string, step: RunStepLog): Promise<boolean>;
82
+ getRun(id: string): Promise<Run | undefined>;
83
+ listRuns(limit: number): Promise<Run[]>;
84
+ recordAdaptation(adaptation: Adaptation): Promise<void>;
85
+ snapshot(): Promise<ExperienceSnapshot>;
86
+ clear(): Promise<void>;
87
+ }
88
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/experience/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ export const EXPERIENCE_SCHEMA = 'evermind.experience/1';
2
+ /** Runs kept, newest first — the audit trail is recent history, not an archive. */
3
+ export const MAX_RUNS = 500;
4
+ /** Adaptations kept, newest first — enough history to chart how learning went. */
5
+ export const MAX_ADAPTATIONS = 200;
6
+ export function emptySnapshot() {
7
+ return { schema: EXPERIENCE_SCHEMA, episodes: [], skills: [], runs: [], learned: {}, adaptations: [] };
8
+ }
9
+ /** Parse a snapshot, tolerating a missing or foreign file as empty. */
10
+ export function parseSnapshot(raw) {
11
+ const s = raw;
12
+ if (!s || s.schema !== EXPERIENCE_SCHEMA)
13
+ return emptySnapshot();
14
+ return {
15
+ schema: EXPERIENCE_SCHEMA,
16
+ episodes: Array.isArray(s.episodes) ? s.episodes : [],
17
+ skills: Array.isArray(s.skills) ? s.skills : [],
18
+ runs: Array.isArray(s.runs) ? s.runs : [],
19
+ learned: s.learned && typeof s.learned === 'object' && !Array.isArray(s.learned) ? s.learned : {},
20
+ // Optional within schema 1: snapshots written before the history existed have none.
21
+ adaptations: Array.isArray(s.adaptations) ? s.adaptations : [],
22
+ };
23
+ }
24
+ function summary(e) {
25
+ return { id: e.id, name: e.name, program: e.program, startedAt: e.startedAt, steps: e.steps.length };
26
+ }
27
+ /**
28
+ * The reference store: the snapshot held in memory. Hosts that persist wrap it and
29
+ * write `snapshot()` after each change (see `onChange`).
30
+ */
31
+ export class InMemoryExperienceStore {
32
+ onChange;
33
+ data;
34
+ constructor(initial, onChange) {
35
+ this.onChange = onChange;
36
+ this.data = initial ? parseSnapshot(initial) : emptySnapshot();
37
+ }
38
+ /** Replace the contents (a host re-reading its file after another process wrote it). */
39
+ load(snapshot) {
40
+ this.data = parseSnapshot(snapshot);
41
+ }
42
+ async changed() {
43
+ await this.onChange?.(this.data);
44
+ }
45
+ static upsert(list, item) {
46
+ const i = list.findIndex((x) => x.id === item.id);
47
+ if (i >= 0)
48
+ list[i] = item;
49
+ else
50
+ list.push(item);
51
+ }
52
+ static remove(list, id) {
53
+ const i = list.findIndex((x) => x.id === id);
54
+ if (i < 0)
55
+ return false;
56
+ list.splice(i, 1);
57
+ return true;
58
+ }
59
+ async putEpisode(episode) {
60
+ InMemoryExperienceStore.upsert(this.data.episodes, episode);
61
+ await this.changed();
62
+ }
63
+ async getEpisode(id) {
64
+ return this.data.episodes.find((e) => e.id === id);
65
+ }
66
+ async listEpisodes() {
67
+ return [...this.data.episodes].sort((a, b) => b.startedAt - a.startedAt).map(summary);
68
+ }
69
+ async deleteEpisode(id) {
70
+ const ok = InMemoryExperienceStore.remove(this.data.episodes, id);
71
+ delete this.data.learned[id];
72
+ if (ok)
73
+ await this.changed();
74
+ return ok;
75
+ }
76
+ async putSkill(skill) {
77
+ InMemoryExperienceStore.upsert(this.data.skills, skill);
78
+ await this.changed();
79
+ }
80
+ async getSkill(id) {
81
+ return this.data.skills.find((s) => s.id === id);
82
+ }
83
+ async listSkills() {
84
+ return [...this.data.skills].sort((a, b) => b.createdAt - a.createdAt);
85
+ }
86
+ async deleteSkill(id) {
87
+ const ok = InMemoryExperienceStore.remove(this.data.skills, id);
88
+ delete this.data.learned[id];
89
+ if (ok)
90
+ await this.changed();
91
+ return ok;
92
+ }
93
+ async putRun(run) {
94
+ InMemoryExperienceStore.upsert(this.data.runs, run);
95
+ this.data.runs.sort((a, b) => b.startedAt - a.startedAt);
96
+ this.data.runs.length = Math.min(this.data.runs.length, MAX_RUNS);
97
+ await this.changed();
98
+ }
99
+ async appendRunStep(runId, step) {
100
+ const run = this.data.runs.find((r) => r.id === runId);
101
+ if (!run)
102
+ return false;
103
+ run.steps.push(step);
104
+ await this.changed();
105
+ return true;
106
+ }
107
+ async getRun(id) {
108
+ return this.data.runs.find((r) => r.id === id);
109
+ }
110
+ async listRuns(limit) {
111
+ return this.data.runs.slice(0, Math.max(0, limit));
112
+ }
113
+ async recordAdaptation(adaptation) {
114
+ for (const id of adaptation.learned)
115
+ this.data.learned[id] = adaptation.index;
116
+ this.data.adaptations.unshift(adaptation);
117
+ this.data.adaptations.length = Math.min(this.data.adaptations.length, MAX_ADAPTATIONS);
118
+ await this.changed();
119
+ }
120
+ async snapshot() {
121
+ return structuredClone(this.data);
122
+ }
123
+ async clear() {
124
+ this.data = emptySnapshot();
125
+ await this.changed();
126
+ }
127
+ }
128
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/experience/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type Episode, type Skill } from './types.js';
2
+ /** What the person changed in review, keyed by recorded step id. */
3
+ export interface ReviewEdits {
4
+ /** The skill's name (defaults to the episode's). */
5
+ name?: string | null;
6
+ /** Steps left out of the skill. */
7
+ removed?: string[];
8
+ /** Typed values kept exactly as recorded instead of asked for each run. */
9
+ fixed?: string[];
10
+ /** Approval gate per step, where the person overrode the default. */
11
+ approvals?: Record<string, boolean>;
12
+ /** Parameter names the person chose, per step. */
13
+ paramNames?: Record<string, string>;
14
+ }
15
+ export declare function trainOnce(episode: Episode, edits?: ReviewEdits, now?: number): Skill;
16
+ /** `Invoice Amount (USD)` → `invoice_amount_usd`. Letters in any script survive. */
17
+ export declare function slug(label: string): string;
18
+ //# sourceMappingURL=trainOnce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trainOnce.d.ts","sourceRoot":"","sources":["../../src/experience/trainOnce.ts"],"names":[],"mappings":"AASA,OAAO,EAAmB,KAAK,OAAO,EAAE,KAAK,KAAK,EAAqD,MAAM,YAAY,CAAC;AAE1H,oEAAoE;AACpE,MAAM,WAAW,WAAW;IAC1B,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,GAAE,WAAgB,EAAE,GAAG,GAAE,MAAmB,GAAG,KAAK,CAwCpG;AAED,oFAAoF;AACpF,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ1C"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * experience/trainOnce.ts — Train Once: one reviewed demonstration becomes a skill that
3
+ * runs again with new values.
4
+ *
5
+ * Deterministic, local, no model call. Every value the person typed becomes a named
6
+ * parameter (named after the field it went into), every secret field a secret parameter,
7
+ * and every irreversible click an approval gate. The review edits decide what stays.
8
+ */
9
+ import { elementLabel, needsApproval } from './approval.js';
10
+ import { newExperienceId } from './types.js';
11
+ export function trainOnce(episode, edits = {}, now = Date.now()) {
12
+ const removed = new Set(edits.removed ?? []);
13
+ const fixed = new Set(edits.fixed ?? []);
14
+ const params = [];
15
+ const steps = [];
16
+ for (const rec of episode.steps) {
17
+ if (removed.has(rec.id))
18
+ continue;
19
+ const a = rec.action;
20
+ let action;
21
+ if (a.kind === 'setValue') {
22
+ if (!a.secret && fixed.has(rec.id)) {
23
+ action = { kind: 'setValue', target: a.target, value: { from: 'literal', text: a.value } };
24
+ }
25
+ else {
26
+ const chosen = slug(edits.paramNames?.[rec.id] ?? '');
27
+ const base = chosen || slug(elementLabel(a.target)) || 'value';
28
+ const name = uniqueName(params, base);
29
+ params.push({ name, label: elementLabel(a.target), default: a.secret ? null : a.value, secret: !!a.secret });
30
+ action = { kind: 'setValue', target: a.target, value: { from: 'param', name } };
31
+ }
32
+ }
33
+ else {
34
+ action = a;
35
+ }
36
+ steps.push({
37
+ id: rec.id,
38
+ action,
39
+ requiresApproval: edits.approvals?.[rec.id] ?? needsApproval(a),
40
+ screenshot: rec.screenshot ?? null,
41
+ });
42
+ }
43
+ return {
44
+ id: newExperienceId(),
45
+ name: edits.name?.trim() || episode.name,
46
+ program: episode.program,
47
+ args: [...episode.args],
48
+ params,
49
+ steps,
50
+ sourceEpisode: episode.id,
51
+ createdAt: now,
52
+ routine: null,
53
+ };
54
+ }
55
+ /** `Invoice Amount (USD)` → `invoice_amount_usd`. Letters in any script survive. */
56
+ export function slug(label) {
57
+ return label
58
+ .toLowerCase()
59
+ .split(/[^\p{L}\p{N}]+/u)
60
+ .filter(Boolean)
61
+ .join('_')
62
+ .slice(0, 40)
63
+ .replace(/_+$/, '');
64
+ }
65
+ function uniqueName(params, base) {
66
+ if (!params.some((p) => p.name === base))
67
+ return base;
68
+ for (let i = 2;; i++) {
69
+ const n = `${base}_${i}`;
70
+ if (!params.some((p) => p.name === n))
71
+ return n;
72
+ }
73
+ }
74
+ //# sourceMappingURL=trainOnce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trainOnce.js","sourceRoot":"","sources":["../../src/experience/trainOnce.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * experience/types.ts — what Evermind has DONE, as opposed to what it knows.
3
+ *
4
+ * Facts live in `@seanhogg/builderforce-memory` (MemoryStore / EvermindCognition) and
5
+ * weights in the model; this is the third kind of learned item: experience.
6
+ * - an **Episode** is one demonstration — a person doing a task in a program, recorded
7
+ * as semantic steps (the UI element acted on and the value set, never raw keystrokes);
8
+ * - a **Skill** is what Train Once compiles from an episode — a procedure that runs
9
+ * again with new values, with approval gates on irreversible steps;
10
+ * - a **Run** is one execution of a skill, with its step-by-step audit trail.
11
+ *
12
+ * Plain data, JSON-shaped (camelCase, actions tagged by `kind`), so any recorder — the
13
+ * native Windows UI Automation one in Synapse included — produces it and any runtime
14
+ * persists it. Timestamps are epoch milliseconds.
15
+ */
16
+ /** A UI element, identified the way the platform's accessibility API sees it. */
17
+ export interface ElementRef {
18
+ name: string;
19
+ automationId: string;
20
+ /** `Button`, `Edit`, `MenuItem`, … */
21
+ controlType: string;
22
+ className: string;
23
+ /** The top-level window the element sits in. */
24
+ windowTitle: string;
25
+ processName: string;
26
+ /** Where it was acted on, relative to the window's top-left — the replay fallback. */
27
+ relX: number;
28
+ relY: number;
29
+ }
30
+ /** One thing the person did. A secret field records that it was filled, never the value. */
31
+ export type Action = {
32
+ kind: 'click';
33
+ target: ElementRef;
34
+ } | {
35
+ kind: 'setValue';
36
+ target: ElementRef;
37
+ value: string;
38
+ secret?: boolean;
39
+ } | {
40
+ kind: 'keys';
41
+ keys: string;
42
+ target?: ElementRef | null;
43
+ };
44
+ export interface RecordedStep {
45
+ id: string;
46
+ /** Milliseconds since the recording started. */
47
+ atMs: number;
48
+ action: Action;
49
+ /** Screenshot file name inside the episode's folder, if one was taken. */
50
+ screenshot?: string | null;
51
+ }
52
+ export interface Episode {
53
+ id: string;
54
+ name: string;
55
+ program: string;
56
+ args: string[];
57
+ startedAt: number;
58
+ endedAt?: number | null;
59
+ steps: RecordedStep[];
60
+ }
61
+ export interface EpisodeSummary {
62
+ id: string;
63
+ name: string;
64
+ program: string;
65
+ startedAt: number;
66
+ steps: number;
67
+ }
68
+ /** A value a skill asks for at run time. */
69
+ export interface SkillParam {
70
+ /** Stable key, e.g. `amount`. */
71
+ name: string;
72
+ /** What the field was called where it was typed, e.g. `Amount`. */
73
+ label: string;
74
+ /** The value from the demonstration; never set for a secret. */
75
+ default?: string | null;
76
+ secret: boolean;
77
+ }
78
+ export type SkillValue = {
79
+ from: 'param';
80
+ name: string;
81
+ } | {
82
+ from: 'literal';
83
+ text: string;
84
+ };
85
+ export type SkillAction = {
86
+ kind: 'click';
87
+ target: ElementRef;
88
+ } | {
89
+ kind: 'setValue';
90
+ target: ElementRef;
91
+ value: SkillValue;
92
+ } | {
93
+ kind: 'keys';
94
+ keys: string;
95
+ target?: ElementRef | null;
96
+ };
97
+ export interface SkillStep {
98
+ id: string;
99
+ action: SkillAction;
100
+ /** Pause and ask the person before this step. */
101
+ requiresApproval: boolean;
102
+ screenshot?: string | null;
103
+ }
104
+ /** When a skill runs by itself. Local time of day for `day`. */
105
+ export type Schedule = {
106
+ every: 'minutes';
107
+ minutes: number;
108
+ } | {
109
+ every: 'day';
110
+ hour: number;
111
+ minute: number;
112
+ };
113
+ /** A skill's routine: at most one per skill, so it lives on the skill. */
114
+ export interface SkillRoutine {
115
+ schedule: Schedule;
116
+ /** Values for the non-secret parameters; secrets come from the host's vault. */
117
+ values: Record<string, string>;
118
+ enabled: boolean;
119
+ lastRunAt?: number | null;
120
+ }
121
+ export interface Skill {
122
+ id: string;
123
+ name: string;
124
+ program: string;
125
+ args: string[];
126
+ params: SkillParam[];
127
+ steps: SkillStep[];
128
+ sourceEpisode: string;
129
+ createdAt: number;
130
+ routine?: SkillRoutine | null;
131
+ }
132
+ export type RunStatus = 'running' | 'succeeded' | 'failed' | 'stopped' | 'denied';
133
+ export type StepOutcome = 'ok' | 'fallback' | 'failed' | 'approved' | 'denied';
134
+ /** One line of a run's audit trail. A step can have two (approved, then ok). */
135
+ export interface RunStepLog {
136
+ idx: number;
137
+ stepId: string;
138
+ outcome: StepOutcome;
139
+ detail?: string | null;
140
+ at: number;
141
+ }
142
+ export interface Run {
143
+ id: string;
144
+ skillId: string;
145
+ skillName: string;
146
+ /** `manual` or `routine`. */
147
+ trigger: string;
148
+ status: RunStatus;
149
+ startedAt: number;
150
+ endedAt?: number | null;
151
+ error?: string | null;
152
+ steps: RunStepLog[];
153
+ }
154
+ /**
155
+ * One adaptation of the private model on experience: what it learned and how the fit
156
+ * went. Measured when the adaptation ran, never estimated afterwards.
157
+ */
158
+ export interface Adaptation {
159
+ /** N of the `+expN` version this adaptation wrote. */
160
+ index: number;
161
+ version: string;
162
+ /** Episode and skill ids it learned. */
163
+ learned: string[];
164
+ passes: number;
165
+ /** Mean fit loss over the passes. */
166
+ loss: number;
167
+ at: number;
168
+ }
169
+ /** A short random id — unique enough for one person's store. */
170
+ export declare function newExperienceId(): string;
171
+ //# sourceMappingURL=types.d.ts.map