abmind 0.2.5 → 0.2.7-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/SUPPORTED-SURFACE.md +20 -2
  2. package/dist/cli/abmind-hook-recall.js +17 -40
  3. package/dist/cli/abmind-hook-recall.js.map +1 -1
  4. package/dist/cli/abmind-hook-store.js +10 -31
  5. package/dist/cli/abmind-hook-store.js.map +1 -1
  6. package/dist/cli/abmind-hook-wakeup.js +17 -3
  7. package/dist/cli/abmind-hook-wakeup.js.map +1 -1
  8. package/dist/cli/abmind-install.js +19 -19
  9. package/dist/cli/abmind-install.js.map +1 -1
  10. package/dist/cli/abmind-restore.js +10 -0
  11. package/dist/cli/abmind-restore.js.map +1 -1
  12. package/dist/cli/abmind-sleep.d.ts +9 -5
  13. package/dist/cli/abmind-sleep.d.ts.map +1 -1
  14. package/dist/cli/abmind-sleep.js +61 -14
  15. package/dist/cli/abmind-sleep.js.map +1 -1
  16. package/dist/cli/hook-lifecycle-adapter.d.ts +11 -0
  17. package/dist/cli/hook-lifecycle-adapter.d.ts.map +1 -0
  18. package/dist/cli/hook-lifecycle-adapter.js +33 -0
  19. package/dist/cli/hook-lifecycle-adapter.js.map +1 -0
  20. package/dist/src/context-engine.d.ts +13 -3
  21. package/dist/src/context-engine.d.ts.map +1 -1
  22. package/dist/src/context-engine.js +22 -5
  23. package/dist/src/context-engine.js.map +1 -1
  24. package/dist/src/context-orchestrator.d.ts +20 -2
  25. package/dist/src/context-orchestrator.d.ts.map +1 -1
  26. package/dist/src/context-orchestrator.js +11 -3
  27. package/dist/src/context-orchestrator.js.map +1 -1
  28. package/dist/src/context-tier-renderer.d.ts +8 -1
  29. package/dist/src/context-tier-renderer.d.ts.map +1 -1
  30. package/dist/src/context-tier-renderer.js +7 -2
  31. package/dist/src/context-tier-renderer.js.map +1 -1
  32. package/dist/src/ensure-initialized.d.ts +5 -0
  33. package/dist/src/ensure-initialized.d.ts.map +1 -1
  34. package/dist/src/ensure-initialized.js +19 -28
  35. package/dist/src/ensure-initialized.js.map +1 -1
  36. package/dist/src/fts-utils.d.ts +47 -0
  37. package/dist/src/fts-utils.d.ts.map +1 -0
  38. package/dist/src/fts-utils.js +65 -0
  39. package/dist/src/fts-utils.js.map +1 -0
  40. package/dist/src/host-integration/identity.d.ts +10 -0
  41. package/dist/src/host-integration/identity.d.ts.map +1 -0
  42. package/dist/src/host-integration/identity.js +66 -0
  43. package/dist/src/host-integration/identity.js.map +1 -0
  44. package/dist/src/host-integration/index.d.ts +5 -0
  45. package/dist/src/host-integration/index.d.ts.map +1 -0
  46. package/dist/src/host-integration/index.js +4 -0
  47. package/dist/src/host-integration/index.js.map +1 -0
  48. package/dist/src/host-integration/lifecycle.d.ts +14 -0
  49. package/dist/src/host-integration/lifecycle.d.ts.map +1 -0
  50. package/dist/src/host-integration/lifecycle.js +192 -0
  51. package/dist/src/host-integration/lifecycle.js.map +1 -0
  52. package/dist/src/host-integration/render.d.ts +5 -0
  53. package/dist/src/host-integration/render.d.ts.map +1 -0
  54. package/dist/src/host-integration/render.js +20 -0
  55. package/dist/src/host-integration/render.js.map +1 -0
  56. package/dist/src/host-integration/types.d.ts +107 -0
  57. package/dist/src/host-integration/types.d.ts.map +1 -0
  58. package/dist/src/host-integration/types.js +2 -0
  59. package/dist/src/host-integration/types.js.map +1 -0
  60. package/dist/src/imemory-system.d.ts +1 -1
  61. package/dist/src/imemory-system.d.ts.map +1 -1
  62. package/dist/src/index.d.ts +6 -4
  63. package/dist/src/index.d.ts.map +1 -1
  64. package/dist/src/index.js +3 -1
  65. package/dist/src/index.js.map +1 -1
  66. package/dist/src/maintenance-service.d.ts +11 -0
  67. package/dist/src/maintenance-service.d.ts.map +1 -1
  68. package/dist/src/maintenance-service.js +43 -0
  69. package/dist/src/maintenance-service.js.map +1 -1
  70. package/dist/src/memory-index.d.ts +0 -16
  71. package/dist/src/memory-index.d.ts.map +1 -1
  72. package/dist/src/memory-index.js +1 -60
  73. package/dist/src/memory-index.js.map +1 -1
  74. package/dist/src/memory-manager.d.ts +6 -2
  75. package/dist/src/memory-manager.d.ts.map +1 -1
  76. package/dist/src/memory-manager.js +9 -5
  77. package/dist/src/memory-manager.js.map +1 -1
  78. package/dist/src/message-store.d.ts +15 -3
  79. package/dist/src/message-store.d.ts.map +1 -1
  80. package/dist/src/message-store.js +28 -9
  81. package/dist/src/message-store.js.map +1 -1
  82. package/dist/src/openclaw-plugin/index.d.ts.map +1 -1
  83. package/dist/src/openclaw-plugin/index.js +3 -2
  84. package/dist/src/openclaw-plugin/index.js.map +1 -1
  85. package/dist/src/pi-plugin/abtars-client.d.ts +22 -0
  86. package/dist/src/pi-plugin/abtars-client.d.ts.map +1 -0
  87. package/dist/src/pi-plugin/abtars-client.js +153 -0
  88. package/dist/src/pi-plugin/abtars-client.js.map +1 -0
  89. package/dist/src/pi-plugin/abtars-tools.d.ts +8 -0
  90. package/dist/src/pi-plugin/abtars-tools.d.ts.map +1 -0
  91. package/dist/src/pi-plugin/abtars-tools.js +317 -0
  92. package/dist/src/pi-plugin/abtars-tools.js.map +1 -0
  93. package/dist/src/pi-plugin/identity.d.ts +8 -0
  94. package/dist/src/pi-plugin/identity.d.ts.map +1 -0
  95. package/dist/src/pi-plugin/identity.js +37 -0
  96. package/dist/src/pi-plugin/identity.js.map +1 -0
  97. package/dist/src/pi-plugin/index.d.ts +3 -0
  98. package/dist/src/pi-plugin/index.d.ts.map +1 -0
  99. package/dist/src/pi-plugin/index.js +139 -0
  100. package/dist/src/pi-plugin/index.js.map +1 -0
  101. package/dist/src/pi-plugin/messages.d.ts +4 -0
  102. package/dist/src/pi-plugin/messages.d.ts.map +1 -0
  103. package/dist/src/pi-plugin/messages.js +36 -0
  104. package/dist/src/pi-plugin/messages.js.map +1 -0
  105. package/dist/src/pi-plugin/pi-types.d.ts +126 -0
  106. package/dist/src/pi-plugin/pi-types.d.ts.map +1 -0
  107. package/dist/src/pi-plugin/pi-types.js +15 -0
  108. package/dist/src/pi-plugin/pi-types.js.map +1 -0
  109. package/dist/src/pi-plugin/runtime.d.ts +21 -0
  110. package/dist/src/pi-plugin/runtime.d.ts.map +1 -0
  111. package/dist/src/pi-plugin/runtime.js +60 -0
  112. package/dist/src/pi-plugin/runtime.js.map +1 -0
  113. package/dist/src/pi-plugin/tools.d.ts +11 -0
  114. package/dist/src/pi-plugin/tools.d.ts.map +1 -0
  115. package/dist/src/pi-plugin/tools.js +136 -0
  116. package/dist/src/pi-plugin/tools.js.map +1 -0
  117. package/dist/src/recall-boosts.d.ts +15 -0
  118. package/dist/src/recall-boosts.d.ts.map +1 -0
  119. package/dist/src/recall-boosts.js +159 -0
  120. package/dist/src/recall-boosts.js.map +1 -0
  121. package/dist/src/recall-engine.d.ts +0 -2
  122. package/dist/src/recall-engine.d.ts.map +1 -1
  123. package/dist/src/recall-engine.js +1 -151
  124. package/dist/src/recall-engine.js.map +1 -1
  125. package/dist/src/reconcile.d.ts +2 -0
  126. package/dist/src/reconcile.d.ts.map +1 -1
  127. package/dist/src/reconcile.js +21 -4
  128. package/dist/src/reconcile.js.map +1 -1
  129. package/dist/src/session-context.d.ts +1 -0
  130. package/dist/src/session-context.d.ts.map +1 -1
  131. package/dist/src/session-context.js +42 -23
  132. package/dist/src/session-context.js.map +1 -1
  133. package/dist/src/sleep/audit.d.ts +6 -0
  134. package/dist/src/sleep/audit.d.ts.map +1 -1
  135. package/dist/src/sleep/audit.js +6 -8
  136. package/dist/src/sleep/audit.js.map +1 -1
  137. package/dist/src/sleep/basic.d.ts +1 -1
  138. package/dist/src/sleep/basic.d.ts.map +1 -1
  139. package/dist/src/sleep/basic.js +5 -2
  140. package/dist/src/sleep/basic.js.map +1 -1
  141. package/dist/src/sleep/catchup.d.ts +17 -0
  142. package/dist/src/sleep/catchup.d.ts.map +1 -0
  143. package/dist/src/sleep/catchup.js +141 -0
  144. package/dist/src/sleep/catchup.js.map +1 -0
  145. package/dist/src/sleep/contracts.d.ts +112 -0
  146. package/dist/src/sleep/contracts.d.ts.map +1 -0
  147. package/dist/src/sleep/contracts.js +25 -0
  148. package/dist/src/sleep/contracts.js.map +1 -0
  149. package/dist/src/sleep/llm-budget.d.ts +49 -0
  150. package/dist/src/sleep/llm-budget.d.ts.map +1 -0
  151. package/dist/src/sleep/llm-budget.js +106 -0
  152. package/dist/src/sleep/llm-budget.js.map +1 -0
  153. package/dist/src/sleep/locks.d.ts +9 -5
  154. package/dist/src/sleep/locks.d.ts.map +1 -1
  155. package/dist/src/sleep/locks.js +8 -11
  156. package/dist/src/sleep/locks.js.map +1 -1
  157. package/dist/src/sleep/orchestrator.d.ts +20 -86
  158. package/dist/src/sleep/orchestrator.d.ts.map +1 -1
  159. package/dist/src/sleep/orchestrator.js +291 -755
  160. package/dist/src/sleep/orchestrator.js.map +1 -1
  161. package/dist/src/sleep/state.d.ts +15 -18
  162. package/dist/src/sleep/state.d.ts.map +1 -1
  163. package/dist/src/sleep/state.js +24 -19
  164. package/dist/src/sleep/state.js.map +1 -1
  165. package/dist/src/sleep/test-harness.d.ts +3 -1
  166. package/dist/src/sleep/test-harness.d.ts.map +1 -1
  167. package/dist/src/sleep/test-harness.js +3 -2
  168. package/dist/src/sleep/test-harness.js.map +1 -1
  169. package/dist/src/soul-seeder.d.ts +36 -0
  170. package/dist/src/soul-seeder.d.ts.map +1 -0
  171. package/dist/src/soul-seeder.js +69 -0
  172. package/dist/src/soul-seeder.js.map +1 -0
  173. package/dist/src/wake-up-builder.d.ts +3 -1
  174. package/dist/src/wake-up-builder.d.ts.map +1 -1
  175. package/dist/src/wake-up-builder.js +29 -5
  176. package/dist/src/wake-up-builder.js.map +1 -1
  177. package/package.json +20 -2
@@ -7,11 +7,15 @@
7
7
  *
8
8
  * Fast path (everything current): 1 SELECT + N existsSync = <1ms.
9
9
  * Pattern: idempotent seed + versioned migrations.
10
+ *
11
+ * Note (#1323, #1324): SOUL.md is personalized and owned by `soul-seeder`.
12
+ * Lazy-init seed of the OTHER core files (agent_notes, memory-tools, etc.)
13
+ * remains this module's job; SOUL.md is explicitly skipped to avoid
14
+ * clobbering the personalized copy on every MemoryManager.initialize().
10
15
  */
11
- import { existsSync, mkdirSync, copyFileSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
16
+ import { existsSync, mkdirSync, copyFileSync, readdirSync } from "node:fs";
12
17
  import { join, dirname } from "node:path";
13
18
  import { fileURLToPath } from "node:url";
14
- import { logWarn } from "./mem-logger.js";
15
19
  const MIGRATIONS = [
16
20
  // #824: recall quality feedback columns
17
21
  (db) => {
@@ -25,50 +29,37 @@ const MIGRATIONS = [
25
29
  catch { /* exists */ }
26
30
  },
27
31
  ];
28
- /** Resolve bundled templates/core/ dir (works from src/ and dist/). */
32
+ /** Resolve bundled templates/memory/core/ dir (works from src/ and dist/). */
29
33
  function templatesDir() {
30
34
  const here = dirname(fileURLToPath(import.meta.url));
31
- // src/ → up 1 to pkg root → templates/core
32
- const srcSide = join(here, "..", "templates", "core");
35
+ // src/ → up 1 to pkg root → templates/memory/core
36
+ const srcSide = join(here, "..", "templates", "memory", "core");
33
37
  if (existsSync(srcSide))
34
38
  return srcSide;
35
- // dist/src/ → up 2 to pkg root → templates/core
36
- return join(here, "..", "..", "templates", "core");
39
+ // dist/src/ → up 2 to pkg root → templates/memory/core
40
+ return join(here, "..", "..", "templates", "memory", "core");
37
41
  }
42
+ /** Files in templates/memory/core/ that lazy-init must NOT seed. */
43
+ const LAZY_INIT_SKIP = new Set([
44
+ "SOUL.md", // personalized at install time via soul-seeder
45
+ ]);
38
46
  function ensureCoreFiles(dataDir) {
39
47
  const tplDir = templatesDir();
40
48
  if (!existsSync(tplDir))
41
49
  return;
42
50
  const coreDir = join(dataDir, "core");
43
51
  mkdirSync(coreDir, { recursive: true });
44
- // Read agentName from manifest for template substitution
45
- const manifestPath = join(dataDir, "..", "manifest.json");
46
- let agentName = null;
47
- try {
48
- const manifest = JSON.parse(readFileSync(manifestPath, "utf-8"));
49
- agentName = manifest.agentName ?? null;
50
- }
51
- catch { /* no manifest — fresh or corrupt */ }
52
52
  for (const file of readdirSync(tplDir)) {
53
+ if (LAZY_INIT_SKIP.has(file))
54
+ continue;
53
55
  const dst = join(coreDir, file);
54
56
  if (!existsSync(dst)) {
55
- if (file === "SOUL.md" && agentName) {
56
- let content = readFileSync(join(tplDir, file), "utf-8");
57
- content = content.replaceAll("<agentName>", agentName);
58
- writeFileSync(dst, content, { mode: 0o600 });
59
- }
60
- else if (file === "SOUL.md" && !agentName) {
61
- logWarn("ensure-init", "No agentName in manifest — SOUL.md seeded with <agentName> placeholder. Run abmind install to fix.");
62
- copyFileSync(join(tplDir, file), dst);
63
- }
64
- else {
65
- copyFileSync(join(tplDir, file), dst);
66
- }
57
+ copyFileSync(join(tplDir, file), dst);
67
58
  }
68
59
  }
69
60
  }
70
61
  function ensureSchema(db) {
71
- db.exec("CREATE TABLE IF NOT EXISTS _meta (key TEXT PRIMARY KEY, value TEXT)");
62
+ db.exec("CREATE TABLE IF NOT EXISTS _meta (key TEXT PRIMARY KEY, value)");
72
63
  const row = db.prepare("SELECT value FROM _meta WHERE key = 'schema_version'").get();
73
64
  const current = parseInt(row?.value ?? "0", 10);
74
65
  if (current < MIGRATIONS.length) {
@@ -1 +1 @@
1
- {"version":3,"file":"ensure-initialized.js","sourceRoot":"","sources":["../../src/ensure-initialized.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ensure-initialized.js","sourceRoot":"","sources":["../../src/ensure-initialized.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * fts-utils.ts — FTS5 query sanitization, row scoring, and recency/emotion helpers.
3
+ * Extracted from memory-index.ts (#1229).
4
+ */
5
+ import type { MemorySearchResult } from "./mem-types.js";
6
+ /** Weight applied to the log1p emotion boost in search ranking. */
7
+ export declare const EMOTION_BOOST_WEIGHT = 0.5;
8
+ /** Compute recency factor with emotion override. */
9
+ export declare function recencyFactor(createdAt: number, emotionScore: number): number;
10
+ /** Strip diacritical marks (accents) from a string using Unicode NFD decomposition. */
11
+ export declare function stripAccents(str: string): string;
12
+ /**
13
+ * Sanitize a raw query string for safe use in an FTS5 MATCH clause.
14
+ *
15
+ * Wraps each whitespace-delimited token in double quotes (stripping any
16
+ * internal quotes) with a trailing `*` for prefix matching. Quoting
17
+ * neutralizes all FTS5 operators (OR, NOT, NEAR, ^, *, :, -, etc.)
18
+ * without needing a blacklist. Prefix matching is critical for
19
+ * agglutinative languages (e.g. Hungarian) where "jelszó" needs to
20
+ * match "jelszóra", "jelszót", etc.
21
+ * Returns empty string if no valid tokens remain.
22
+ */
23
+ export declare function sanitizeFtsQuery(query: string, mode?: "or" | "and"): string;
24
+ /** Row shape returned by extracted memory FTS queries. */
25
+ export type ExtractedFtsRow = {
26
+ id: number;
27
+ content_en: string;
28
+ content_original: string;
29
+ memory_type: string;
30
+ created_at: number;
31
+ preserve_original: number;
32
+ emotion_score: number;
33
+ recall_count: number;
34
+ relevance_score: number;
35
+ source_message_ids: string | null;
36
+ trust: number | null;
37
+ integrity: number | null;
38
+ credibility: number | null;
39
+ classification: number | null;
40
+ rank: number;
41
+ tier: string | null;
42
+ };
43
+ /** Compute final score for an extracted memory FTS row. */
44
+ export declare function scoreExtractedRow(row: ExtractedFtsRow, baseScore: number): number;
45
+ /** Map an extracted memory FTS row to a MemorySearchResult. */
46
+ export declare function mapExtractedRow(row: ExtractedFtsRow, score: number): MemorySearchResult;
47
+ //# sourceMappingURL=fts-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts-utils.d.ts","sourceRoot":"","sources":["../../src/fts-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,mEAAmE;AACnE,eAAO,MAAM,oBAAoB,MAAM,CAAC;AAIxC,oDAAoD;AACpD,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAK7E;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,IAAI,GAAG,KAAa,GAAG,MAAM,CAKlF;AAED,0DAA0D;AAC1D,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAC9E,UAAU,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IACrE,YAAY,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3E,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAClE,CAAC;AAEF,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQjF;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAevF"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * fts-utils.ts — FTS5 query sanitization, row scoring, and recency/emotion helpers.
3
+ * Extracted from memory-index.ts (#1229).
4
+ */
5
+ import { getAbmindEnv } from "./env-schema.js";
6
+ /** Weight applied to the log1p emotion boost in search ranking. */
7
+ export const EMOTION_BOOST_WEIGHT = 0.5;
8
+ // Time-decay: recent memories score higher, emotional ones resist decay
9
+ /** Compute recency factor with emotion override. */
10
+ export function recencyFactor(createdAt, emotionScore) {
11
+ const ageDays = (Date.now() - createdAt) / (24 * 3600000);
12
+ const decay = Math.max(getAbmindEnv().recallDecayFloor, 1 - ageDays / getAbmindEnv().recallDecayDays);
13
+ const emotionBoost = 1 + Math.abs(emotionScore) * getAbmindEnv().recallEmotionBoost;
14
+ return decay * emotionBoost;
15
+ }
16
+ /** Strip diacritical marks (accents) from a string using Unicode NFD decomposition. */
17
+ export function stripAccents(str) {
18
+ return str.normalize("NFD").replace(/[\u0300-\u036f]/g, "");
19
+ }
20
+ /**
21
+ * Sanitize a raw query string for safe use in an FTS5 MATCH clause.
22
+ *
23
+ * Wraps each whitespace-delimited token in double quotes (stripping any
24
+ * internal quotes) with a trailing `*` for prefix matching. Quoting
25
+ * neutralizes all FTS5 operators (OR, NOT, NEAR, ^, *, :, -, etc.)
26
+ * without needing a blacklist. Prefix matching is critical for
27
+ * agglutinative languages (e.g. Hungarian) where "jelszó" needs to
28
+ * match "jelszóra", "jelszót", etc.
29
+ * Returns empty string if no valid tokens remain.
30
+ */
31
+ export function sanitizeFtsQuery(query, mode = "and") {
32
+ const tokens = query.split(/\s+/).filter(Boolean);
33
+ if (tokens.length === 0)
34
+ return "";
35
+ const joiner = mode === "or" ? " OR " : " ";
36
+ return tokens.map((t) => `"${t.replace(/"/g, "")}"*`).join(joiner);
37
+ }
38
+ /** Compute final score for an extracted memory FTS row. */
39
+ export function scoreExtractedRow(row, baseScore) {
40
+ const emotionBoost = EMOTION_BOOST_WEIGHT * Math.log(1 + Math.abs(row.emotion_score));
41
+ const recallBoost = 0.1 * (row.recall_count ?? 0);
42
+ const relevanceBoost = (row.relevance_score ?? 0) > 0 ? 0.2 : 0;
43
+ const trustFactor = 0.5 + 0.5 * (row.trust ?? 0) / 3;
44
+ const credibilityFactor = (row.credibility !== null && row.credibility <= 2) ? 1.25 : 1;
45
+ const tierBoost = row.tier === "core" ? 1.3 : 1;
46
+ return (baseScore + emotionBoost) * (1 + recallBoost) * (1 + relevanceBoost) * trustFactor * credibilityFactor * tierBoost * recencyFactor(row.created_at, row.emotion_score);
47
+ }
48
+ /** Map an extracted memory FTS row to a MemorySearchResult. */
49
+ export function mapExtractedRow(row, score) {
50
+ return {
51
+ id: row.id,
52
+ content: row.content_en,
53
+ content_original: row.content_original,
54
+ memory_type: row.memory_type,
55
+ created_at: row.created_at,
56
+ source_message_ids: row.source_message_ids ?? undefined,
57
+ trust: row.trust ?? 0,
58
+ integrity: row.integrity ?? 2,
59
+ credibility: row.credibility ?? 6,
60
+ classification: row.classification ?? 1,
61
+ tier: "extracted",
62
+ score,
63
+ };
64
+ }
65
+ //# sourceMappingURL=fts-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts-utils.js","sourceRoot":"","sources":["../../src/fts-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ExecutionIdentity, HostDiagnostic } from "./types.js";
2
+ export declare function isValidIdentityField(value: string): boolean;
3
+ export interface ValidatedIdentity {
4
+ identity: ExecutionIdentity;
5
+ diagnostics: readonly HostDiagnostic[];
6
+ }
7
+ export declare function validateIdentity(raw: ExecutionIdentity): ValidatedIdentity;
8
+ export declare function canAutoWrite(identity: ExecutionIdentity, writerId: string): boolean;
9
+ export declare function buildProvenance(identity: ExecutionIdentity, writerId: string, operation: string): string;
10
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/host-integration/identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAIpE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;CACxC;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,iBAAiB,GAAG,iBAAiB,CAuD1E;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnF;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAExG"}
@@ -0,0 +1,66 @@
1
+ const CONTROL_CHAR = /[\x00-\x1f\x7f-\x9f]/;
2
+ export function isValidIdentityField(value) {
3
+ const trimmed = value.trim();
4
+ return trimmed.length > 0 && !CONTROL_CHAR.test(trimmed);
5
+ }
6
+ export function validateIdentity(raw) {
7
+ const diagnostics = [];
8
+ const fields = [
9
+ { key: "principalId", value: raw.principalId },
10
+ { key: "conversationId", value: raw.conversationId },
11
+ { key: "executionId", value: raw.executionId },
12
+ { key: "host", value: raw.host },
13
+ { key: "origin", value: raw.origin },
14
+ { key: "automaticWriteOwner", value: raw.automaticWriteOwner },
15
+ ];
16
+ for (const { key, value } of fields) {
17
+ if (!value || !value.trim()) {
18
+ diagnostics.push({
19
+ operation: "validateIdentity",
20
+ code: "EMPTY_IDENTITY_FIELD",
21
+ message: `Identity field '${key}' is empty`,
22
+ });
23
+ }
24
+ else if (CONTROL_CHAR.test(value)) {
25
+ diagnostics.push({
26
+ operation: "validateIdentity",
27
+ code: "CONTROL_CHAR_IN_IDENTITY",
28
+ message: `Identity field '${key}' contains control characters`,
29
+ });
30
+ }
31
+ }
32
+ if (raw.parentExecutionId !== undefined) {
33
+ const trimmed = raw.parentExecutionId.trim();
34
+ if (!trimmed) {
35
+ diagnostics.push({
36
+ operation: "validateIdentity",
37
+ code: "EMPTY_PARENT_EXECUTION_ID",
38
+ message: "Optional field 'parentExecutionId' is present but empty",
39
+ });
40
+ }
41
+ else if (CONTROL_CHAR.test(raw.parentExecutionId)) {
42
+ diagnostics.push({
43
+ operation: "validateIdentity",
44
+ code: "CONTROL_CHAR_IN_PARENT_EXECUTION_ID",
45
+ message: "Optional field 'parentExecutionId' contains control characters",
46
+ });
47
+ }
48
+ }
49
+ const identity = {
50
+ principalId: raw.principalId.trim(),
51
+ conversationId: raw.conversationId.trim(),
52
+ executionId: raw.executionId.trim(),
53
+ parentExecutionId: raw.parentExecutionId?.trim() || undefined,
54
+ host: raw.host.trim(),
55
+ origin: raw.origin.trim(),
56
+ automaticWriteOwner: raw.automaticWriteOwner.trim(),
57
+ };
58
+ return { identity, diagnostics };
59
+ }
60
+ export function canAutoWrite(identity, writerId) {
61
+ return identity.automaticWriteOwner === writerId;
62
+ }
63
+ export function buildProvenance(identity, writerId, operation) {
64
+ return `${identity.host}:${writerId}:${operation}`;
65
+ }
66
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/host-integration/identity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { ExecutionIdentity, HostLifecycleOptions, AutomaticRecallPolicy, StartSessionInput, StartSessionResult, PrepareTurnInput, PrepareTurnResult, RecallHit, CompleteTurnInput, CompleteTurnResult, ExplicitRecallInput, RecallOperationResult, ExplicitStoreInput, HostDiagnostic, } from "./types.js";
2
+ export { validateIdentity, isValidIdentityField, canAutoWrite, buildProvenance } from "./identity.js";
3
+ export { HostMemoryLifecycle } from "./lifecycle.js";
4
+ export { renderWakeUp, renderRecallContext } from "./render.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/host-integration/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,SAAS,EACT,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { validateIdentity, isValidIdentityField, canAutoWrite, buildProvenance } from "./identity.js";
2
+ export { HostMemoryLifecycle } from "./lifecycle.js";
3
+ export { renderWakeUp, renderRecallContext } from "./render.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/host-integration/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { MemoryManager } from "../memory-manager.js";
2
+ import type { HostLifecycleOptions, StartSessionInput, StartSessionResult, PrepareTurnInput, PrepareTurnResult, CompleteTurnInput, CompleteTurnResult, ExplicitRecallInput, RecallOperationResult, ExplicitStoreInput } from "./types.js";
3
+ export declare class HostMemoryLifecycle {
4
+ private memory;
5
+ private options;
6
+ constructor(memory: MemoryManager, options: HostLifecycleOptions);
7
+ startSession(input: StartSessionInput): Promise<StartSessionResult>;
8
+ prepareTurn(input: PrepareTurnInput): Promise<PrepareTurnResult>;
9
+ completeTurn(input: CompleteTurnInput): CompleteTurnResult;
10
+ recall(input: ExplicitRecallInput): Promise<RecallOperationResult>;
11
+ store(input: ExplicitStoreInput): Promise<import("../mem-types.js").InstantStoreResult>;
12
+ private fail;
13
+ }
14
+ //# sourceMappingURL=lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/host-integration/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,KAAK,EAEV,oBAAoB,EAEpB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAiBpB,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAuB;gBAE1B,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,oBAAoB;IAQ1D,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiBnE,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAoCtE,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,kBAAkB;IAkDpD,MAAM,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAuClE,KAAK,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,OAAO,iBAAiB,EAAE,kBAAkB,CAAC;IA6B7F,OAAO,CAAC,IAAI;CAmBb"}
@@ -0,0 +1,192 @@
1
+ import { validateIdentity, canAutoWrite, buildProvenance } from "./identity.js";
2
+ import { renderWakeUp, renderRecallContext } from "./render.js";
3
+ function clampPolicy(policy) {
4
+ return {
5
+ limit: Math.max(1, Math.min(50, Math.floor(policy.limit))),
6
+ maxChars: Math.max(1, Math.floor(policy.maxChars)),
7
+ minScore: policy.minScore !== undefined ? Math.max(0, Math.min(1, policy.minScore)) : 0,
8
+ maxClassification: policy.maxClassification !== undefined
9
+ ? Math.min(2, Math.max(0, Math.floor(policy.maxClassification)))
10
+ : 2,
11
+ };
12
+ }
13
+ function makeDiagnostic(operation, code, message) {
14
+ return { operation, code, message };
15
+ }
16
+ export class HostMemoryLifecycle {
17
+ memory;
18
+ options;
19
+ constructor(memory, options) {
20
+ this.memory = memory;
21
+ this.options = {
22
+ writerId: options.writerId,
23
+ failOpen: options.failOpen !== false,
24
+ };
25
+ }
26
+ async startSession(input) {
27
+ try {
28
+ const { identity, diagnostics: idDiag } = validateIdentity(input.identity);
29
+ const allDiags = [...idDiag];
30
+ if (idDiag.length > 0) {
31
+ return { ok: false, context: "", diagnostics: allDiags };
32
+ }
33
+ const maxChars = Math.max(1, Math.floor(input.maxChars));
34
+ const context = renderWakeUp(this.memory, maxChars);
35
+ return { ok: true, context, diagnostics: allDiags };
36
+ }
37
+ catch (err) {
38
+ return this.fail("startSession", err);
39
+ }
40
+ }
41
+ async prepareTurn(input) {
42
+ try {
43
+ const { identity, diagnostics: idDiag } = validateIdentity(input.identity);
44
+ const allDiags = [...idDiag];
45
+ if (idDiag.length > 0) {
46
+ return { context: "", hits: [], diagnostics: allDiags };
47
+ }
48
+ const policy = clampPolicy(input.policy);
49
+ const result = await this.memory.recallSearch({
50
+ translated: [...input.query.translated],
51
+ original: input.query.original,
52
+ userId: identity.principalId,
53
+ limit: policy.limit,
54
+ maxClassification: policy.maxClassification,
55
+ });
56
+ const hits = result.results
57
+ .filter(h => h.score >= policy.minScore)
58
+ .map(h => ({
59
+ content: h.content,
60
+ date: h.date,
61
+ score: h.score,
62
+ classification: h.classification,
63
+ }));
64
+ const context = renderRecallContext(hits, policy.maxChars);
65
+ return { context, hits, diagnostics: allDiags };
66
+ }
67
+ catch (err) {
68
+ return this.fail("prepareTurn", err, { context: "", hits: [], diagnostics: [] });
69
+ }
70
+ }
71
+ completeTurn(input) {
72
+ try {
73
+ const { identity, diagnostics: idDiag } = validateIdentity(input.identity);
74
+ if (idDiag.length > 0) {
75
+ return { status: "failed", diagnostic: idDiag[0] };
76
+ }
77
+ if (!canAutoWrite(identity, this.options.writerId)) {
78
+ return { status: "skipped", reason: "not_owner" };
79
+ }
80
+ if (!input.user?.content?.trim() && !input.assistant?.content?.trim()) {
81
+ return { status: "skipped", reason: "empty" };
82
+ }
83
+ const messageIds = [];
84
+ const now = Date.now();
85
+ if (input.user?.content?.trim()) {
86
+ const id = this.memory.recordMessage({
87
+ userId: identity.principalId,
88
+ sessionId: identity.conversationId,
89
+ role: "user",
90
+ content: input.user.content,
91
+ timestamp: input.user.timestamp ?? now - 1,
92
+ });
93
+ if (id !== null)
94
+ messageIds.push(id);
95
+ }
96
+ if (input.assistant?.content?.trim()) {
97
+ const id = this.memory.recordMessage({
98
+ userId: identity.principalId,
99
+ sessionId: identity.conversationId,
100
+ role: "assistant",
101
+ content: input.assistant.content,
102
+ timestamp: input.assistant.timestamp ?? now,
103
+ });
104
+ if (id !== null)
105
+ messageIds.push(id);
106
+ }
107
+ if (messageIds.length === 0) {
108
+ return { status: "skipped", reason: "rejected" };
109
+ }
110
+ return { status: "recorded", messageIds };
111
+ }
112
+ catch (err) {
113
+ return this.fail("completeTurn", err);
114
+ }
115
+ }
116
+ async recall(input) {
117
+ try {
118
+ const { identity, diagnostics: idDiag } = validateIdentity(input.identity);
119
+ const allDiags = [...idDiag];
120
+ if (idDiag.length > 0) {
121
+ return { context: "", hits: [], diagnostics: allDiags };
122
+ }
123
+ const limit = input.limit !== undefined ? Math.max(1, Math.min(50, Math.floor(input.limit))) : 5;
124
+ const maxClassification = input.maxClassification !== undefined
125
+ ? Math.max(0, Math.min(3, Math.floor(input.maxClassification)))
126
+ : undefined;
127
+ const result = await this.memory.recallSearch({
128
+ translated: [...input.query.translated],
129
+ original: input.query.original,
130
+ userId: identity.principalId,
131
+ limit,
132
+ maxClassification,
133
+ });
134
+ const hits = result.results
135
+ .filter(h => input.minScore === undefined || h.score >= input.minScore)
136
+ .map(h => ({
137
+ content: h.content,
138
+ date: h.date,
139
+ score: h.score,
140
+ classification: h.classification,
141
+ }));
142
+ const context = renderRecallContext(hits, 10000);
143
+ return { context, hits, diagnostics: allDiags };
144
+ }
145
+ catch (err) {
146
+ return this.fail("recall", err, { context: "", hits: [], diagnostics: [] });
147
+ }
148
+ }
149
+ async store(input) {
150
+ try {
151
+ const { identity } = validateIdentity(input.identity);
152
+ return await this.memory.editor.instantStore({
153
+ userId: identity.principalId,
154
+ contentEn: input.contentEn,
155
+ contentOriginal: input.contentOriginal,
156
+ memoryType: input.memoryType,
157
+ emotionScore: input.emotionScore,
158
+ emotionTags: input.emotionTags,
159
+ emotionContext: input.emotionContext,
160
+ keyword: input.keyword,
161
+ confidence: input.confidence,
162
+ sourceMessageIds: input.sourceMessageIds,
163
+ classification: input.classification,
164
+ trust: input.trust,
165
+ integrity: input.integrity,
166
+ credibility: input.credibility,
167
+ topic: input.topic,
168
+ createdBy: buildProvenance(identity, this.options.writerId, "store"),
169
+ });
170
+ }
171
+ catch (err) {
172
+ return this.fail("store", err, {
173
+ stored: false, memoriesCount: 0, error: String(err),
174
+ });
175
+ }
176
+ }
177
+ fail(operation, err, fallback) {
178
+ const diagnostic = makeDiagnostic(operation, err instanceof Error ? err.name : "UNKNOWN", err instanceof Error ? err.message : String(err));
179
+ if (!this.options.failOpen)
180
+ throw err;
181
+ if (fallback !== undefined)
182
+ return fallback;
183
+ if (operation === "startSession") {
184
+ return { ok: false, context: "", diagnostics: [diagnostic] };
185
+ }
186
+ if (operation === "completeTurn") {
187
+ return { status: "failed", diagnostic };
188
+ }
189
+ return { context: "", hits: [], diagnostics: [diagnostic] };
190
+ }
191
+ }
192
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/host-integration/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { RecallHit } from "./types.js";
2
+ import type { MemoryManager } from "../memory-manager.js";
3
+ export declare function renderWakeUp(memory: MemoryManager, maxChars: number): string;
4
+ export declare function renderRecallContext(hits: readonly RecallHit[], maxChars: number): string;
5
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/host-integration/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBxF"}
@@ -0,0 +1,20 @@
1
+ export function renderWakeUp(memory, maxChars) {
2
+ return memory.buildWakeUp(maxChars);
3
+ }
4
+ export function renderRecallContext(hits, maxChars) {
5
+ if (hits.length === 0)
6
+ return "";
7
+ const lines = ["[abmind memory context]"];
8
+ let total = lines[0].length + 1;
9
+ for (const hit of hits) {
10
+ const line = `- (${hit.date}) ${hit.content}`.replace(/\s+/g, " ").trim();
11
+ if (total + line.length + 1 > maxChars)
12
+ break;
13
+ lines.push(line);
14
+ total += line.length + 1;
15
+ }
16
+ if (lines.length === 1)
17
+ return "";
18
+ return lines.join("\n") + "\n";
19
+ }
20
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../src/host-integration/render.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAAC,MAAqB,EAAE,QAAgB;IAClE,OAAO,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAA0B,EAAE,QAAgB;IAC9E,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,KAAK,GAAa,CAAC,yBAAyB,CAAC,CAAC;IACpD,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAEjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1E,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ;YAAE,MAAM;QAC9C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC"}