@windagency/valora-plugin-memory-vault 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @windagency/valora-plugin-memory-vault might be problematic. Click here for more details.

Files changed (94) hide show
  1. package/dist/config-schema.d.ts +134 -0
  2. package/dist/config-schema.d.ts.map +1 -0
  3. package/dist/config-schema.js +61 -0
  4. package/dist/config-schema.js.map +1 -0
  5. package/dist/consolidation/cluster.d.ts +17 -0
  6. package/dist/consolidation/cluster.d.ts.map +1 -0
  7. package/dist/consolidation/cluster.js +59 -0
  8. package/dist/consolidation/cluster.js.map +1 -0
  9. package/dist/consolidation-service.d.ts +75 -0
  10. package/dist/consolidation-service.d.ts.map +1 -0
  11. package/dist/consolidation-service.js +373 -0
  12. package/dist/consolidation-service.js.map +1 -0
  13. package/dist/constants.d.ts +30 -0
  14. package/dist/constants.d.ts.map +1 -0
  15. package/dist/constants.js +30 -0
  16. package/dist/constants.js.map +1 -0
  17. package/dist/decay.d.ts +51 -0
  18. package/dist/decay.d.ts.map +1 -0
  19. package/dist/decay.js +59 -0
  20. package/dist/decay.js.map +1 -0
  21. package/dist/embeddings/embedder.port.d.ts +9 -0
  22. package/dist/embeddings/embedder.port.d.ts.map +1 -0
  23. package/dist/embeddings/embedder.port.js +2 -0
  24. package/dist/embeddings/embedder.port.js.map +1 -0
  25. package/dist/embeddings/llm-provider-embedder.d.ts +26 -0
  26. package/dist/embeddings/llm-provider-embedder.d.ts.map +1 -0
  27. package/dist/embeddings/llm-provider-embedder.js +34 -0
  28. package/dist/embeddings/llm-provider-embedder.js.map +1 -0
  29. package/dist/embeddings/resolve-embedder.d.ts +27 -0
  30. package/dist/embeddings/resolve-embedder.d.ts.map +1 -0
  31. package/dist/embeddings/resolve-embedder.js +38 -0
  32. package/dist/embeddings/resolve-embedder.js.map +1 -0
  33. package/dist/embeddings/vector-store.d.ts +35 -0
  34. package/dist/embeddings/vector-store.d.ts.map +1 -0
  35. package/dist/embeddings/vector-store.js +174 -0
  36. package/dist/embeddings/vector-store.js.map +1 -0
  37. package/dist/extraction-service.d.ts +33 -0
  38. package/dist/extraction-service.d.ts.map +1 -0
  39. package/dist/extraction-service.js +168 -0
  40. package/dist/extraction-service.js.map +1 -0
  41. package/dist/index.d.ts +42 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +6498 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/manager.d.ts +62 -0
  46. package/dist/manager.d.ts.map +1 -0
  47. package/dist/manager.js +377 -0
  48. package/dist/manager.js.map +1 -0
  49. package/dist/migration/auto-migrate.d.ts +20 -0
  50. package/dist/migration/auto-migrate.d.ts.map +1 -0
  51. package/dist/migration/auto-migrate.js +49 -0
  52. package/dist/migration/auto-migrate.js.map +1 -0
  53. package/dist/migration/json-to-vault.d.ts +10 -0
  54. package/dist/migration/json-to-vault.d.ts.map +1 -0
  55. package/dist/migration/json-to-vault.js +88 -0
  56. package/dist/migration/json-to-vault.js.map +1 -0
  57. package/dist/migration/vault-version.d.ts +4 -0
  58. package/dist/migration/vault-version.d.ts.map +1 -0
  59. package/dist/migration/vault-version.js +19 -0
  60. package/dist/migration/vault-version.js.map +1 -0
  61. package/dist/retrieval/cosine-ann.d.ts +13 -0
  62. package/dist/retrieval/cosine-ann.d.ts.map +1 -0
  63. package/dist/retrieval/cosine-ann.js +26 -0
  64. package/dist/retrieval/cosine-ann.js.map +1 -0
  65. package/dist/retrieval/spreading-activation.d.ts +12 -0
  66. package/dist/retrieval/spreading-activation.d.ts.map +1 -0
  67. package/dist/retrieval/spreading-activation.js +70 -0
  68. package/dist/retrieval/spreading-activation.js.map +1 -0
  69. package/dist/store.d.ts +38 -0
  70. package/dist/store.d.ts.map +1 -0
  71. package/dist/store.js +192 -0
  72. package/dist/store.js.map +1 -0
  73. package/dist/vault/default-vault-dir.d.ts +17 -0
  74. package/dist/vault/default-vault-dir.d.ts.map +1 -0
  75. package/dist/vault/default-vault-dir.js +23 -0
  76. package/dist/vault/default-vault-dir.js.map +1 -0
  77. package/dist/vault/file-format.d.ts +44 -0
  78. package/dist/vault/file-format.d.ts.map +1 -0
  79. package/dist/vault/file-format.js +214 -0
  80. package/dist/vault/file-format.js.map +1 -0
  81. package/dist/vault/vault-index.d.ts +28 -0
  82. package/dist/vault/vault-index.d.ts.map +1 -0
  83. package/dist/vault/vault-index.js +98 -0
  84. package/dist/vault/vault-index.js.map +1 -0
  85. package/dist/vault/vault-store.d.ts +75 -0
  86. package/dist/vault/vault-store.d.ts.map +1 -0
  87. package/dist/vault/vault-store.js +369 -0
  88. package/dist/vault/vault-store.js.map +1 -0
  89. package/dist/vault-memory-provider.d.ts +53 -0
  90. package/dist/vault-memory-provider.d.ts.map +1 -0
  91. package/dist/vault-memory-provider.js +139 -0
  92. package/dist/vault-memory-provider.js.map +1 -0
  93. package/package.json +58 -0
  94. package/valora-plugin.json +10 -0
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Vault-specific configuration schema.
3
+ *
4
+ * All vault-tuning knobs live under `plugins.memory-vault.*`; the host's
5
+ * `memory.*` block owns only `{enabled, provider}`. This schema is the
6
+ * bundled vault's own source of truth, read from the raw plugin namespace
7
+ * via `parseVaultPluginConfig()`.
8
+ */
9
+ import { z } from 'zod';
10
+ export declare const VAULT_PLUGIN_CONFIG_SCHEMA: z.ZodObject<
11
+ {
12
+ decision_half_life_days: z.ZodDefault<z.ZodNumber>;
13
+ embedding: z.ZodOptional<
14
+ z.ZodObject<
15
+ {
16
+ batch_size: z.ZodDefault<z.ZodNumber>;
17
+ dim: z.ZodDefault<z.ZodNumber>;
18
+ model: z.ZodDefault<z.ZodString>;
19
+ provider: z.ZodDefault<z.ZodString>;
20
+ },
21
+ 'strip',
22
+ z.ZodTypeAny,
23
+ {
24
+ batch_size: number;
25
+ dim: number;
26
+ model: string;
27
+ provider: string;
28
+ },
29
+ {
30
+ batch_size?: number | undefined;
31
+ dim?: number | undefined;
32
+ model?: string | undefined;
33
+ provider?: string | undefined;
34
+ }
35
+ >
36
+ >;
37
+ episodic_half_life_days: z.ZodDefault<z.ZodNumber>;
38
+ error_half_life_multiplier: z.ZodDefault<z.ZodNumber>;
39
+ injection_strength_threshold: z.ZodDefault<z.ZodNumber>;
40
+ injection_token_budget: z.ZodDefault<z.ZodNumber>;
41
+ max_entries_per_store: z.ZodDefault<z.ZodNumber>;
42
+ prune_threshold: z.ZodDefault<z.ZodNumber>;
43
+ recall: z.ZodOptional<
44
+ z.ZodObject<
45
+ {
46
+ co_access_increment: z.ZodDefault<z.ZodNumber>;
47
+ seed_k: z.ZodDefault<z.ZodNumber>;
48
+ walk_decay: z.ZodDefault<z.ZodNumber>;
49
+ walk_depth: z.ZodDefault<z.ZodNumber>;
50
+ },
51
+ 'strip',
52
+ z.ZodTypeAny,
53
+ {
54
+ co_access_increment: number;
55
+ seed_k: number;
56
+ walk_decay: number;
57
+ walk_depth: number;
58
+ },
59
+ {
60
+ co_access_increment?: number | undefined;
61
+ seed_k?: number | undefined;
62
+ walk_decay?: number | undefined;
63
+ walk_depth?: number | undefined;
64
+ }
65
+ >
66
+ >;
67
+ retrieval_boost_days: z.ZodDefault<z.ZodNumber>;
68
+ semantic_half_life_days: z.ZodDefault<z.ZodNumber>;
69
+ },
70
+ 'strip',
71
+ z.ZodTypeAny,
72
+ {
73
+ decision_half_life_days: number;
74
+ episodic_half_life_days: number;
75
+ error_half_life_multiplier: number;
76
+ injection_strength_threshold: number;
77
+ injection_token_budget: number;
78
+ max_entries_per_store: number;
79
+ prune_threshold: number;
80
+ retrieval_boost_days: number;
81
+ semantic_half_life_days: number;
82
+ embedding?:
83
+ | {
84
+ batch_size: number;
85
+ dim: number;
86
+ model: string;
87
+ provider: string;
88
+ }
89
+ | undefined;
90
+ recall?:
91
+ | {
92
+ co_access_increment: number;
93
+ seed_k: number;
94
+ walk_decay: number;
95
+ walk_depth: number;
96
+ }
97
+ | undefined;
98
+ },
99
+ {
100
+ decision_half_life_days?: number | undefined;
101
+ embedding?:
102
+ | {
103
+ batch_size?: number | undefined;
104
+ dim?: number | undefined;
105
+ model?: string | undefined;
106
+ provider?: string | undefined;
107
+ }
108
+ | undefined;
109
+ episodic_half_life_days?: number | undefined;
110
+ error_half_life_multiplier?: number | undefined;
111
+ injection_strength_threshold?: number | undefined;
112
+ injection_token_budget?: number | undefined;
113
+ max_entries_per_store?: number | undefined;
114
+ prune_threshold?: number | undefined;
115
+ recall?:
116
+ | {
117
+ co_access_increment?: number | undefined;
118
+ seed_k?: number | undefined;
119
+ walk_decay?: number | undefined;
120
+ walk_depth?: number | undefined;
121
+ }
122
+ | undefined;
123
+ retrieval_boost_days?: number | undefined;
124
+ semantic_half_life_days?: number | undefined;
125
+ }
126
+ >;
127
+ export type VaultPluginConfig = z.infer<typeof VAULT_PLUGIN_CONFIG_SCHEMA>;
128
+ /**
129
+ * Parse the raw `plugins['memory-vault']` subtree into a fully-defaulted
130
+ * {@link VaultPluginConfig}. Returns the all-defaults config when the
131
+ * subtree is missing or empty.
132
+ */
133
+ export declare function parseVaultPluginConfig(raw: unknown): VaultPluginConfig;
134
+ //# sourceMappingURL=config-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.d.ts","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmCxB,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYrC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE3E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAEtE"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Vault-specific configuration schema.
3
+ *
4
+ * All vault-tuning knobs live under `plugins.memory-vault.*`; the host's
5
+ * `memory.*` block owns only `{enabled, provider}`. This schema is the
6
+ * bundled vault's own source of truth, read from the raw plugin namespace
7
+ * via `parseVaultPluginConfig()`.
8
+ */
9
+ import { z } from 'zod';
10
+ import {
11
+ DEFAULT_MEMORY_DECISION_HALF_LIFE_DAYS,
12
+ DEFAULT_MEMORY_EMBED_BATCH_SIZE,
13
+ DEFAULT_MEMORY_EMBED_DIM,
14
+ DEFAULT_MEMORY_EMBED_MODEL,
15
+ DEFAULT_MEMORY_EPISODIC_HALF_LIFE_DAYS,
16
+ DEFAULT_MEMORY_ERROR_HALF_LIFE_MULTIPLIER,
17
+ DEFAULT_MEMORY_INJECTION_STRENGTH_THRESHOLD,
18
+ DEFAULT_MEMORY_INJECTION_TOKEN_BUDGET,
19
+ DEFAULT_MEMORY_MAX_ENTRIES_PER_STORE,
20
+ DEFAULT_MEMORY_PRUNE_THRESHOLD,
21
+ DEFAULT_MEMORY_RECALL_CO_ACCESS_INCREMENT,
22
+ DEFAULT_MEMORY_RECALL_SEED_K,
23
+ DEFAULT_MEMORY_RECALL_WALK_DECAY,
24
+ DEFAULT_MEMORY_RECALL_WALK_DEPTH,
25
+ DEFAULT_MEMORY_RETRIEVAL_BOOST_DAYS,
26
+ DEFAULT_MEMORY_SEMANTIC_HALF_LIFE_DAYS
27
+ } from './constants.js';
28
+ const VAULT_EMBEDDING_SCHEMA = z.object({
29
+ batch_size: z.number().min(1).max(256).default(DEFAULT_MEMORY_EMBED_BATCH_SIZE),
30
+ dim: z.number().min(1).default(DEFAULT_MEMORY_EMBED_DIM),
31
+ model: z.string().default(DEFAULT_MEMORY_EMBED_MODEL),
32
+ provider: z.string().default('auto')
33
+ });
34
+ const VAULT_RECALL_SCHEMA = z.object({
35
+ co_access_increment: z.number().min(0).default(DEFAULT_MEMORY_RECALL_CO_ACCESS_INCREMENT),
36
+ seed_k: z.number().min(1).max(100).default(DEFAULT_MEMORY_RECALL_SEED_K),
37
+ walk_decay: z.number().min(0).max(1).default(DEFAULT_MEMORY_RECALL_WALK_DECAY),
38
+ walk_depth: z.number().min(0).max(10).default(DEFAULT_MEMORY_RECALL_WALK_DEPTH)
39
+ });
40
+ export const VAULT_PLUGIN_CONFIG_SCHEMA = z.object({
41
+ decision_half_life_days: z.number().min(1).max(365).default(DEFAULT_MEMORY_DECISION_HALF_LIFE_DAYS),
42
+ embedding: VAULT_EMBEDDING_SCHEMA.optional(),
43
+ episodic_half_life_days: z.number().min(1).max(365).default(DEFAULT_MEMORY_EPISODIC_HALF_LIFE_DAYS),
44
+ error_half_life_multiplier: z.number().min(1).max(10).default(DEFAULT_MEMORY_ERROR_HALF_LIFE_MULTIPLIER),
45
+ injection_strength_threshold: z.number().min(0).max(1).default(DEFAULT_MEMORY_INJECTION_STRENGTH_THRESHOLD),
46
+ injection_token_budget: z.number().min(100).max(10000).default(DEFAULT_MEMORY_INJECTION_TOKEN_BUDGET),
47
+ max_entries_per_store: z.number().min(10).max(10000).default(DEFAULT_MEMORY_MAX_ENTRIES_PER_STORE),
48
+ prune_threshold: z.number().min(0).max(1).default(DEFAULT_MEMORY_PRUNE_THRESHOLD),
49
+ recall: VAULT_RECALL_SCHEMA.optional(),
50
+ retrieval_boost_days: z.number().min(0).max(30).default(DEFAULT_MEMORY_RETRIEVAL_BOOST_DAYS),
51
+ semantic_half_life_days: z.number().min(1).max(365).default(DEFAULT_MEMORY_SEMANTIC_HALF_LIFE_DAYS)
52
+ });
53
+ /**
54
+ * Parse the raw `plugins['memory-vault']` subtree into a fully-defaulted
55
+ * {@link VaultPluginConfig}. Returns the all-defaults config when the
56
+ * subtree is missing or empty.
57
+ */
58
+ export function parseVaultPluginConfig(raw) {
59
+ return VAULT_PLUGIN_CONFIG_SCHEMA.parse(raw ?? {});
60
+ }
61
+ //# sourceMappingURL=config-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../src/config-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACN,sCAAsC,EACtC,+BAA+B,EAC/B,wBAAwB,EACxB,0BAA0B,EAC1B,sCAAsC,EACtC,yCAAyC,EACzC,2CAA2C,EAC3C,qCAAqC,EACrC,oCAAoC,EACpC,8BAA8B,EAC9B,yCAAyC,EACzC,4BAA4B,EAC5B,gCAAgC,EAChC,gCAAgC,EAChC,mCAAmC,EACnC,sCAAsC,EACtC,MAAM,gBAAgB,CAAC;AAExB,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,+BAA+B,CAAC;IAC/E,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,wBAAwB,CAAC;IACxD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,0BAA0B,CAAC;IACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;CACpC,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,yCAAyC,CAAC;IACzF,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC;IACxE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gCAAgC,CAAC;IAC9E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,gCAAgC,CAAC;CAC/E,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC;IACnG,SAAS,EAAE,sBAAsB,CAAC,QAAQ,EAAE;IAC5C,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC;IACnG,0BAA0B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,yCAAyC,CAAC;IACxG,4BAA4B,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,2CAA2C,CAAC;IAC3G,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,qCAAqC,CAAC;IACrG,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC;IAClG,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,8BAA8B,CAAC;IACjF,MAAM,EAAE,mBAAmB,CAAC,QAAQ,EAAE;IACtC,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,mCAAmC,CAAC;IAC5F,uBAAuB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,sCAAsC,CAAC;CACnG,CAAC,CAAC;AAIH;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IAClD,OAAO,0BAA0B,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { MemoryEntry } from '@windagency/valora-plugin-api';
2
+ import type { VectorStore } from '../embeddings/vector-store.js';
3
+ export declare function centroidSummary(cluster: MemoryEntry[]): string;
4
+ /**
5
+ * Cluster entries whose embedding cosine similarity meets `threshold`.
6
+ *
7
+ * The implementation is order-independent: it sorts the input by `entry.id`
8
+ * before clustering, performs a Union-Find pass over all pairwise comparisons,
9
+ * and emits clusters of size ≥ 2 in deterministic order. The same logical
10
+ * input always produces the same output (audit finding H12).
11
+ */
12
+ export declare function cosineClusters(
13
+ entries: MemoryEntry[],
14
+ vectorStore: VectorStore,
15
+ threshold: number
16
+ ): MemoryEntry[][];
17
+ //# sourceMappingURL=cluster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster.d.ts","sourceRoot":"","sources":["../../src/consolidation/cluster.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAcjE,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAE9D;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,EAAE,CAanH"}
@@ -0,0 +1,59 @@
1
+ import { cosineSimilarity } from '../retrieval/cosine-ann.js';
2
+ export function centroidSummary(cluster) {
3
+ return cluster.reduce((longest, e) => (e.content.length > longest.content.length ? e : longest)).content;
4
+ }
5
+ /**
6
+ * Cluster entries whose embedding cosine similarity meets `threshold`.
7
+ *
8
+ * The implementation is order-independent: it sorts the input by `entry.id`
9
+ * before clustering, performs a Union-Find pass over all pairwise comparisons,
10
+ * and emits clusters of size ≥ 2 in deterministic order. The same logical
11
+ * input always produces the same output (audit finding H12).
12
+ */
13
+ export function cosineClusters(entries, vectorStore, threshold) {
14
+ const vectored = collectVectored(entries, vectorStore);
15
+ if (vectored.length === 0) return [];
16
+ const parent = new Array(vectored.length).fill(0).map((_, i) => i);
17
+ for (let i = 0; i < vectored.length; i++) {
18
+ for (let j = i + 1; j < vectored.length; j++) {
19
+ const score = cosineSimilarity(vectored[i].vec, vectored[j].vec);
20
+ if (score >= threshold) union(parent, i, j);
21
+ }
22
+ }
23
+ return collectClusters(parent, vectored);
24
+ }
25
+ function collectClusters(parent, vectored) {
26
+ const groups = new Map();
27
+ for (let i = 0; i < vectored.length; i++) {
28
+ const root = find(parent, i);
29
+ const list = groups.get(root) ?? [];
30
+ list.push(vectored[i].entry);
31
+ groups.set(root, list);
32
+ }
33
+ return [...groups.values()].filter((m) => m.length >= 2);
34
+ }
35
+ function collectVectored(entries, vectorStore) {
36
+ const vectored = [];
37
+ for (const entry of entries) {
38
+ const vec = vectorStore.read(entry.id);
39
+ if (vec !== null) vectored.push({ entry, vec });
40
+ }
41
+ // Byte-order sort — locale-independent and deterministic across environments.
42
+ vectored.sort((a, b) => (a.entry.id < b.entry.id ? -1 : a.entry.id > b.entry.id ? 1 : 0));
43
+ return vectored;
44
+ }
45
+ function find(parent, i) {
46
+ while (parent[i] !== i) {
47
+ parent[i] = parent[parent[i]];
48
+ i = parent[i];
49
+ }
50
+ return i;
51
+ }
52
+ function union(parent, a, b) {
53
+ const ra = find(parent, a);
54
+ const rb = find(parent, b);
55
+ if (ra === rb) return;
56
+ if (ra < rb) parent[rb] = ra;
57
+ else parent[ra] = rb;
58
+ }
59
+ //# sourceMappingURL=cluster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cluster.js","sourceRoot":"","sources":["../../src/consolidation/cluster.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAY9D,MAAM,UAAU,eAAe,CAAC,OAAsB;IACrD,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAC1G,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,OAAsB,EAAE,WAAwB,EAAE,SAAiB;IACjG,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACvD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC;YACnE,IAAI,KAAK,IAAI,SAAS;gBAAE,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;IACF,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,eAAe,CAAC,MAAgB,EAAE,QAAyB;IACnE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,eAAe,CAAC,OAAsB,EAAE,WAAwB;IACxE,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,GAAG,KAAK,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,SAAS,IAAI,CAAC,MAAgB,EAAE,CAAS;IACxC,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAE,CAAC;QAChC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,CAAC;AACV,CAAC;AAED,SAAS,KAAK,CAAC,MAAgB,EAAE,CAAS,EAAE,CAAS;IACpD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3B,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO;IACtB,IAAI,EAAE,GAAG,EAAE;QAAE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;;QACxB,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Memory Consolidation Service.
3
+ *
4
+ * Orchestrates the full consolidation cycle for the agent memory system:
5
+ * 1. Prune decayed entries below the strength threshold
6
+ * 2. Run git-based invalidation to weaken memories referencing changed files
7
+ * 3. Detect similar episodic entries and merge them into semantic patterns
8
+ * 4. Auto-promote high-access verified entries to semantic store
9
+ *
10
+ * Designed to be called from the `valora consolidate` CLI command
11
+ * or as a post-feedback automatic maintenance step.
12
+ */
13
+ import type { ConsolidationOptions, ConsolidationResult, MemoryStorePort } from '@windagency/valora-plugin-api';
14
+ import type { EmbedderPort } from './embeddings/embedder.port.js';
15
+ import { type ProviderLookup } from './embeddings/resolve-embedder.js';
16
+ export type { ConsolidationOptions, ConsolidationResult };
17
+ /**
18
+ * Optional callback invoked after consolidation finishes. The host wires
19
+ * this to its `pipeline-emitter` so the existing observability surface
20
+ * remains. When omitted (e.g. plugin-direct usage or tests), no event is
21
+ * emitted.
22
+ */
23
+ export type ConsolidationCompleteListener = (_result: ConsolidationResult) => void;
24
+ /**
25
+ * Optional context the host supplies so the package does not depend on
26
+ * `config/loader` or `output/pipeline-emitter`. When absent, the service
27
+ * uses a sensible 30-day default for the semantic half-life and emits
28
+ * no completion event.
29
+ */
30
+ export interface ConsolidationServiceContext {
31
+ /** Listener for consolidation-complete events (host wires to pipeline-emitter). */
32
+ onComplete?: ConsolidationCompleteListener;
33
+ /** Provider lookup so cosine consolidation can resolve an embedder. */
34
+ providerLookup?: ProviderLookup;
35
+ /** Override the semantic half-life used for cosine-merged entries. */
36
+ semanticHalfLifeDays?: number;
37
+ }
38
+ export declare class MemoryConsolidationService {
39
+ private readonly context;
40
+ private readonly embedder?;
41
+ private readonly manager;
42
+ private readonly store;
43
+ constructor(store?: MemoryStorePort, embedder?: EmbedderPort, context?: ConsolidationServiceContext);
44
+ /**
45
+ * Build a service with the embedder resolved from the host-provided
46
+ * `providerLookup`. Used by the singleton helper and the CLI entry
47
+ * points so cosine consolidation fires automatically when a provider
48
+ * with `embed?()` is available.
49
+ *
50
+ * Without a provider lookup, the service is constructed embedder-less
51
+ * and falls back to the Jaccard merge path.
52
+ */
53
+ static create(context?: ConsolidationServiceContext): Promise<MemoryConsolidationService>;
54
+ consolidate(options?: ConsolidationOptions): Promise<ConsolidationResult>;
55
+ private autoPromoteEntries;
56
+ private buildCluster;
57
+ private mergeCluster;
58
+ private readSemanticHalfLifeOrDefault;
59
+ /** Groups episodic entries by their primary tag; entries with no tags are excluded. */
60
+ private buildTagGroups;
61
+ private mergeClusterCosine;
62
+ private mergeCosine;
63
+ private mergeEpisodicEntries;
64
+ private mergeJaccard;
65
+ private runGitInvalidation;
66
+ }
67
+ /**
68
+ * Returns the shared {@link MemoryConsolidationService} for this process,
69
+ * resolving the configured embedder on first use so cosine consolidation can
70
+ * fire when a provider implements `embed?()`. Subsequent calls return the same
71
+ * instance without re-resolving.
72
+ */
73
+ export declare function getMemoryConsolidation(): Promise<MemoryConsolidationService>;
74
+ export declare function resetMemoryConsolidation(): void;
75
+ //# sourceMappingURL=consolidation-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consolidation-service.d.ts","sourceRoot":"","sources":["../src/consolidation-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACX,oBAAoB,EACpB,mBAAmB,EAGnB,eAAe,EACf,MAAM,+BAA+B,CAAC;AAIvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAmB,MAAM,kCAAkC,CAAC;AAOxF,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,CAAC;AAE1D;;;;;GAKG;AAEH,MAAM,MAAM,6BAA6B,GAAG,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,WAAW,2BAA2B;IAC3C,mFAAmF;IACnF,UAAU,CAAC,EAAE,6BAA6B,CAAC;IAC3C,uEAAuE;IACvE,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAgDD,qBAAa,0BAA0B;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAe;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;gBAE5B,KAAK,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,OAAO,GAAE,2BAAgC;IAOvG;;;;;;;;OAQG;WACU,MAAM,CAAC,OAAO,GAAE,2BAAgC,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAU7F,WAAW,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC;YAoDrE,kBAAkB;IAgBhC,OAAO,CAAC,YAAY;YAmBN,YAAY;IAoC1B,OAAO,CAAC,6BAA6B;IAIrC,uFAAuF;IACvF,OAAO,CAAC,cAAc;YAWR,kBAAkB;YA0ClB,WAAW;YA0BX,oBAAoB;YASpB,YAAY;YA2BZ,kBAAkB;CA6DhC;AAsBD;;;;;GAKG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,0BAA0B,CAAC,CAOlF;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAG/C"}