@devflow-tools/memory-engine 0.17.8 → 0.18.1

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 (155) hide show
  1. package/LICENSE +21 -0
  2. package/dist/consolidator.d.ts.map +1 -1
  3. package/dist/consolidator.js +2 -0
  4. package/dist/consolidator.js.map +1 -1
  5. package/dist/embedding-model-store.d.ts +1 -4
  6. package/dist/embedding-model-store.d.ts.map +1 -1
  7. package/dist/embedding-model-store.js +3 -75
  8. package/dist/embedding-model-store.js.map +1 -1
  9. package/dist/embedding-provider.d.ts +3 -2
  10. package/dist/embedding-provider.d.ts.map +1 -1
  11. package/dist/embedding-provider.js +151 -43
  12. package/dist/embedding-provider.js.map +1 -1
  13. package/dist/hybrid-search.d.ts +5 -1
  14. package/dist/hybrid-search.d.ts.map +1 -1
  15. package/dist/hybrid-search.js +92 -56
  16. package/dist/hybrid-search.js.map +1 -1
  17. package/dist/index.d.ts +16 -3
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +8 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/lease-store.d.ts.map +1 -1
  22. package/dist/lease-store.js +30 -0
  23. package/dist/lease-store.js.map +1 -1
  24. package/dist/memory-command-service.d.ts +73 -0
  25. package/dist/memory-command-service.d.ts.map +1 -0
  26. package/dist/memory-command-service.js +283 -0
  27. package/dist/memory-command-service.js.map +1 -0
  28. package/dist/memory-engine.d.ts +19 -15
  29. package/dist/memory-engine.d.ts.map +1 -1
  30. package/dist/memory-engine.js +207 -158
  31. package/dist/memory-engine.js.map +1 -1
  32. package/dist/memory-episode-repository.d.ts +77 -0
  33. package/dist/memory-episode-repository.d.ts.map +1 -0
  34. package/dist/memory-episode-repository.js +262 -0
  35. package/dist/memory-episode-repository.js.map +1 -0
  36. package/dist/memory-fact-provider-port.d.ts +83 -0
  37. package/dist/memory-fact-provider-port.d.ts.map +1 -0
  38. package/dist/memory-fact-provider-port.js +22 -0
  39. package/dist/memory-fact-provider-port.js.map +1 -0
  40. package/dist/memory-fact-validator.d.ts +16 -0
  41. package/dist/memory-fact-validator.d.ts.map +1 -0
  42. package/dist/memory-fact-validator.js +52 -0
  43. package/dist/memory-fact-validator.js.map +1 -0
  44. package/dist/memory-gate.d.ts +14 -17
  45. package/dist/memory-gate.d.ts.map +1 -1
  46. package/dist/memory-gate.js +369 -329
  47. package/dist/memory-gate.js.map +1 -1
  48. package/dist/memory-identity-compiler.d.ts +18 -0
  49. package/dist/memory-identity-compiler.d.ts.map +1 -0
  50. package/dist/memory-identity-compiler.js +26 -0
  51. package/dist/memory-identity-compiler.js.map +1 -0
  52. package/dist/memory-index-projector.d.ts +22 -0
  53. package/dist/memory-index-projector.d.ts.map +1 -0
  54. package/dist/memory-index-projector.js +11 -0
  55. package/dist/memory-index-projector.js.map +1 -0
  56. package/dist/memory-lifecycle-reducer.d.ts +21 -0
  57. package/dist/memory-lifecycle-reducer.d.ts.map +1 -0
  58. package/dist/memory-lifecycle-reducer.js +34 -0
  59. package/dist/memory-lifecycle-reducer.js.map +1 -0
  60. package/dist/memory-maintenance.d.ts +1 -4
  61. package/dist/memory-maintenance.d.ts.map +1 -1
  62. package/dist/memory-maintenance.js +3 -20
  63. package/dist/memory-maintenance.js.map +1 -1
  64. package/dist/memory-query-service.d.ts +24 -0
  65. package/dist/memory-query-service.d.ts.map +1 -0
  66. package/dist/memory-query-service.js +180 -0
  67. package/dist/memory-query-service.js.map +1 -0
  68. package/dist/memory-relevance.d.ts +16 -1
  69. package/dist/memory-relevance.d.ts.map +1 -1
  70. package/dist/memory-relevance.js +83 -139
  71. package/dist/memory-relevance.js.map +1 -1
  72. package/dist/memory-store.d.ts +52 -36
  73. package/dist/memory-store.d.ts.map +1 -1
  74. package/dist/memory-store.js +406 -704
  75. package/dist/memory-store.js.map +1 -1
  76. package/dist/semantic-memory-compiler.d.ts +0 -2
  77. package/dist/semantic-memory-compiler.d.ts.map +1 -1
  78. package/dist/semantic-memory-compiler.js +4 -4
  79. package/dist/semantic-memory-compiler.js.map +1 -1
  80. package/dist/session-summarizer.d.ts +3 -0
  81. package/dist/session-summarizer.d.ts.map +1 -1
  82. package/dist/session-summarizer.js.map +1 -1
  83. package/dist/signal-analyzer.d.ts +2 -2
  84. package/dist/signal-analyzer.d.ts.map +1 -1
  85. package/dist/signal-analyzer.js +10 -16
  86. package/dist/signal-analyzer.js.map +1 -1
  87. package/package.json +14 -5
  88. package/dist/lease-store.test.d.ts +0 -2
  89. package/dist/lease-store.test.d.ts.map +0 -1
  90. package/dist/lease-store.test.js +0 -182
  91. package/dist/lease-store.test.js.map +0 -1
  92. package/dist/migrations/v10-to-v11.d.ts +0 -3
  93. package/dist/migrations/v10-to-v11.d.ts.map +0 -1
  94. package/dist/migrations/v10-to-v11.js +0 -21
  95. package/dist/migrations/v10-to-v11.js.map +0 -1
  96. package/dist/migrations/v11-to-v12.d.ts +0 -66
  97. package/dist/migrations/v11-to-v12.d.ts.map +0 -1
  98. package/dist/migrations/v11-to-v12.js +0 -577
  99. package/dist/migrations/v11-to-v12.js.map +0 -1
  100. package/dist/migrations/v12-to-v13.d.ts +0 -3
  101. package/dist/migrations/v12-to-v13.d.ts.map +0 -1
  102. package/dist/migrations/v12-to-v13.js +0 -50
  103. package/dist/migrations/v12-to-v13.js.map +0 -1
  104. package/dist/migrations/v2-to-v3.d.ts +0 -3
  105. package/dist/migrations/v2-to-v3.d.ts.map +0 -1
  106. package/dist/migrations/v2-to-v3.js +0 -122
  107. package/dist/migrations/v2-to-v3.js.map +0 -1
  108. package/dist/migrations/v2-to-v3.test.d.ts +0 -2
  109. package/dist/migrations/v2-to-v3.test.d.ts.map +0 -1
  110. package/dist/migrations/v2-to-v3.test.js +0 -88
  111. package/dist/migrations/v2-to-v3.test.js.map +0 -1
  112. package/dist/migrations/v3-to-v4.d.ts +0 -3
  113. package/dist/migrations/v3-to-v4.d.ts.map +0 -1
  114. package/dist/migrations/v3-to-v4.js +0 -97
  115. package/dist/migrations/v3-to-v4.js.map +0 -1
  116. package/dist/migrations/v4-to-v5.d.ts +0 -3
  117. package/dist/migrations/v4-to-v5.d.ts.map +0 -1
  118. package/dist/migrations/v4-to-v5.js +0 -34
  119. package/dist/migrations/v4-to-v5.js.map +0 -1
  120. package/dist/migrations/v4-to-v5.test.d.ts +0 -2
  121. package/dist/migrations/v4-to-v5.test.d.ts.map +0 -1
  122. package/dist/migrations/v4-to-v5.test.js +0 -32
  123. package/dist/migrations/v4-to-v5.test.js.map +0 -1
  124. package/dist/migrations/v6-to-v7.d.ts +0 -3
  125. package/dist/migrations/v6-to-v7.d.ts.map +0 -1
  126. package/dist/migrations/v6-to-v7.js +0 -18
  127. package/dist/migrations/v6-to-v7.js.map +0 -1
  128. package/dist/migrations/v6-to-v7.test.d.ts +0 -2
  129. package/dist/migrations/v6-to-v7.test.d.ts.map +0 -1
  130. package/dist/migrations/v6-to-v7.test.js +0 -33
  131. package/dist/migrations/v6-to-v7.test.js.map +0 -1
  132. package/dist/migrations/v7-to-v8.d.ts +0 -3
  133. package/dist/migrations/v7-to-v8.d.ts.map +0 -1
  134. package/dist/migrations/v7-to-v8.js +0 -20
  135. package/dist/migrations/v7-to-v8.js.map +0 -1
  136. package/dist/migrations/v8-to-v9.d.ts +0 -3
  137. package/dist/migrations/v8-to-v9.d.ts.map +0 -1
  138. package/dist/migrations/v8-to-v9.js +0 -18
  139. package/dist/migrations/v8-to-v9.js.map +0 -1
  140. package/dist/migrations/v9-to-v10.d.ts +0 -3
  141. package/dist/migrations/v9-to-v10.d.ts.map +0 -1
  142. package/dist/migrations/v9-to-v10.js +0 -45
  143. package/dist/migrations/v9-to-v10.js.map +0 -1
  144. package/dist/migrations/v9-to-v10.test.d.ts +0 -2
  145. package/dist/migrations/v9-to-v10.test.d.ts.map +0 -1
  146. package/dist/migrations/v9-to-v10.test.js +0 -40
  147. package/dist/migrations/v9-to-v10.test.js.map +0 -1
  148. package/dist/preference-conflicts.test.d.ts +0 -2
  149. package/dist/preference-conflicts.test.d.ts.map +0 -1
  150. package/dist/preference-conflicts.test.js +0 -80
  151. package/dist/preference-conflicts.test.js.map +0 -1
  152. package/dist/semantic-memory.test.d.ts +0 -2
  153. package/dist/semantic-memory.test.d.ts.map +0 -1
  154. package/dist/semantic-memory.test.js +0 -61
  155. package/dist/semantic-memory.test.js.map +0 -1
@@ -1,18 +0,0 @@
1
- export function applyV8ToV9Migration(db) {
2
- const columns = db.pragma('table_info(retrieval_access_log)');
3
- if (!columns.some(column => column.name === 'project')) {
4
- db.exec("ALTER TABLE retrieval_access_log ADD COLUMN project TEXT NOT NULL DEFAULT ''");
5
- }
6
- if (!columns.some(column => column.name === 'request_id')) {
7
- db.exec('ALTER TABLE retrieval_access_log ADD COLUMN request_id TEXT');
8
- }
9
- if (!columns.some(column => column.name === 'execution_id')) {
10
- db.exec('ALTER TABLE retrieval_access_log ADD COLUMN execution_id TEXT');
11
- }
12
- db.exec(`
13
- CREATE INDEX IF NOT EXISTS idx_retrieval_access_request
14
- ON retrieval_access_log(project, request_id, execution_id, timestamp);
15
- `);
16
- db.prepare('INSERT OR REPLACE INTO schema_versions (version, applied_at) VALUES (9, ?)').run(Date.now());
17
- }
18
- //# sourceMappingURL=v8-to-v9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"v8-to-v9.js","sourceRoot":"","sources":["../../src/migrations/v8-to-v9.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,EAAqB;IACxD,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,kCAAkC,CAA4B,CAAC;IACzF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;QACvD,EAAE,CAAC,IAAI,CAAC,8EAA8E,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;QAC1D,EAAE,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;QAC5D,EAAE,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAC3E,CAAC;IAED,EAAE,CAAC,IAAI,CAAC;;;GAGP,CAAC,CAAC;IACH,EAAE,CAAC,OAAO,CACR,4EAA4E,CAC7E,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACpB,CAAC"}
@@ -1,3 +0,0 @@
1
- import type Database from 'better-sqlite3';
2
- export declare function applyV9ToV10Migration(db: Database.Database): void;
3
- //# sourceMappingURL=v9-to-v10.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"v9-to-v10.d.ts","sourceRoot":"","sources":["../../src/migrations/v9-to-v10.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA+CjE"}
@@ -1,45 +0,0 @@
1
- export function applyV9ToV10Migration(db) {
2
- const columns = db.pragma('table_info(observations)');
3
- const addColumn = (name, sql) => {
4
- if (!columns.some(column => column.name === name))
5
- db.exec(sql);
6
- };
7
- addColumn('semantic_subject', "ALTER TABLE observations ADD COLUMN semantic_subject TEXT NOT NULL DEFAULT ''");
8
- addColumn('semantic_predicate', "ALTER TABLE observations ADD COLUMN semantic_predicate TEXT NOT NULL DEFAULT ''");
9
- addColumn('semantic_value', "ALTER TABLE observations ADD COLUMN semantic_value TEXT NOT NULL DEFAULT ''");
10
- addColumn('semantic_polarity', "ALTER TABLE observations ADD COLUMN semantic_polarity TEXT NOT NULL DEFAULT 'neutral'");
11
- addColumn('semantic_key', 'ALTER TABLE observations ADD COLUMN semantic_key TEXT');
12
- addColumn('facet_key', 'ALTER TABLE observations ADD COLUMN facet_key TEXT');
13
- addColumn('entities', "ALTER TABLE observations ADD COLUMN entities TEXT NOT NULL DEFAULT '[]'");
14
- addColumn('temporal', 'ALTER TABLE observations ADD COLUMN temporal TEXT');
15
- addColumn('reinforce_count', 'ALTER TABLE observations ADD COLUMN reinforce_count INTEGER NOT NULL DEFAULT 0');
16
- addColumn('last_reinforced_at', 'ALTER TABLE observations ADD COLUMN last_reinforced_at INTEGER');
17
- db.exec(`
18
- CREATE INDEX IF NOT EXISTS idx_observations_semantic_key
19
- ON observations(project, semantic_key, resolution_state, quality_status);
20
- CREATE INDEX IF NOT EXISTS idx_observations_facet_key
21
- ON observations(project, facet_key, resolution_state, quality_status);
22
-
23
- CREATE TABLE IF NOT EXISTS observation_entities (
24
- observation_id TEXT NOT NULL REFERENCES observations(id) ON DELETE CASCADE,
25
- project TEXT NOT NULL,
26
- normalized_entity TEXT NOT NULL,
27
- display_entity TEXT NOT NULL,
28
- PRIMARY KEY (observation_id, normalized_entity)
29
- );
30
- CREATE INDEX IF NOT EXISTS idx_observation_entities_lookup
31
- ON observation_entities(project, normalized_entity, observation_id);
32
-
33
- CREATE TABLE IF NOT EXISTS observation_relations (
34
- source_observation_id TEXT NOT NULL REFERENCES observations(id) ON DELETE CASCADE,
35
- target_observation_id TEXT NOT NULL REFERENCES observations(id) ON DELETE CASCADE,
36
- type TEXT NOT NULL CHECK(type IN ('related_to', 'supersedes', 'references')),
37
- created_at INTEGER NOT NULL,
38
- PRIMARY KEY (source_observation_id, target_observation_id, type)
39
- );
40
- CREATE INDEX IF NOT EXISTS idx_observation_relations_target
41
- ON observation_relations(target_observation_id, type);
42
- `);
43
- db.prepare('INSERT OR REPLACE INTO schema_versions (version, applied_at) VALUES (10, ?)').run(Date.now());
44
- }
45
- //# sourceMappingURL=v9-to-v10.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"v9-to-v10.js","sourceRoot":"","sources":["../../src/migrations/v9-to-v10.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,qBAAqB,CAAC,EAAqB;IACzD,MAAM,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAA4B,CAAC;IACjF,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,GAAW,EAAQ,EAAE;QACpD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClE,CAAC,CAAC;IAEF,SAAS,CAAC,kBAAkB,EAAE,+EAA+E,CAAC,CAAC;IAC/G,SAAS,CAAC,oBAAoB,EAAE,iFAAiF,CAAC,CAAC;IACnH,SAAS,CAAC,gBAAgB,EAAE,6EAA6E,CAAC,CAAC;IAC3G,SAAS,CAAC,mBAAmB,EAAE,uFAAuF,CAAC,CAAC;IACxH,SAAS,CAAC,cAAc,EAAE,uDAAuD,CAAC,CAAC;IACnF,SAAS,CAAC,WAAW,EAAE,oDAAoD,CAAC,CAAC;IAC7E,SAAS,CAAC,UAAU,EAAE,yEAAyE,CAAC,CAAC;IACjG,SAAS,CAAC,UAAU,EAAE,mDAAmD,CAAC,CAAC;IAC3E,SAAS,CAAC,iBAAiB,EAAE,gFAAgF,CAAC,CAAC;IAC/G,SAAS,CAAC,oBAAoB,EAAE,gEAAgE,CAAC,CAAC;IAElG,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBP,CAAC,CAAC;IAEH,EAAE,CAAC,OAAO,CACR,6EAA6E,CAC9E,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACpB,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=v9-to-v10.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"v9-to-v10.test.d.ts","sourceRoot":"","sources":["../../src/migrations/v9-to-v10.test.ts"],"names":[],"mappings":""}
@@ -1,40 +0,0 @@
1
- import Database from 'better-sqlite3';
2
- import { afterEach, describe, expect, it } from 'vitest';
3
- import { applyV9ToV10Migration } from './v9-to-v10.js';
4
- describe('v9 to v10 migration', () => {
5
- const databases = [];
6
- afterEach(() => {
7
- for (const database of databases.splice(0))
8
- database.close();
9
- });
10
- it('adds semantic storage idempotently without rewriting observations', () => {
11
- const database = new Database(':memory:');
12
- databases.push(database);
13
- database.exec(`
14
- CREATE TABLE schema_versions (version INTEGER PRIMARY KEY, applied_at INTEGER);
15
- INSERT INTO schema_versions VALUES (9, 1);
16
- CREATE TABLE observations (
17
- id TEXT PRIMARY KEY,
18
- project TEXT NOT NULL,
19
- resolution_state TEXT NOT NULL DEFAULT 'current',
20
- quality_status TEXT NOT NULL DEFAULT 'accepted',
21
- title TEXT NOT NULL,
22
- narrative TEXT NOT NULL
23
- );
24
- INSERT INTO observations (id, project, title, narrative)
25
- VALUES ('obs-1', '/project', 'Original title', 'Original narrative');
26
- `);
27
- applyV9ToV10Migration(database);
28
- applyV9ToV10Migration(database);
29
- const columns = database.pragma('table_info(observations)');
30
- expect(columns.map(column => column.name)).toEqual(expect.arrayContaining([
31
- 'semantic_subject', 'semantic_predicate', 'semantic_value', 'semantic_polarity',
32
- 'semantic_key', 'facet_key', 'entities', 'temporal', 'reinforce_count', 'last_reinforced_at',
33
- ]));
34
- expect(database.prepare('SELECT title, narrative FROM observations WHERE id = ?').get('obs-1'))
35
- .toEqual({ title: 'Original title', narrative: 'Original narrative' });
36
- expect(database.prepare('SELECT MAX(version) AS version FROM schema_versions').get())
37
- .toEqual({ version: 10 });
38
- });
39
- });
40
- //# sourceMappingURL=v9-to-v10.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"v9-to-v10.test.js","sourceRoot":"","sources":["../../src/migrations/v9-to-v10.test.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,MAAM,SAAS,GAAwB,EAAE,CAAC;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1C,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC;;;;;;;;;;;;;KAab,CAAC,CAAC;QAEH,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAChC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAEhC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,0BAA0B,CAA4B,CAAC;QACvF,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC;YACxE,kBAAkB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB;YAC/E,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,oBAAoB;SAC7F,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aAC5F,OAAO,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,EAAE,CAAC;aAClF,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=preference-conflicts.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preference-conflicts.test.d.ts","sourceRoot":"","sources":["../src/preference-conflicts.test.ts"],"names":[],"mappings":""}
@@ -1,80 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { analyzePreference, MAX_PREFERENCE_ANALYSIS_CODE_POINTS, normalizeExplicitPreferenceContent, } from './preference-conflicts.js';
3
- describe('explicit preference parsing boundaries', () => {
4
- it('extracts structured and generic facets from separate intent spans', () => {
5
- const result = analyzePreference('use pnpm and prefer semicolons');
6
- expect(result.status).toBe('high_confidence');
7
- expect(result.facets).toEqual(expect.arrayContaining([
8
- expect.objectContaining({ family: 'package_manager', value: 'pnpm', polarity: 'positive' }),
9
- expect.objectContaining({ family: 'entity:semicolons', entity: 'semicolons', polarity: 'positive' }),
10
- ]));
11
- });
12
- it('extracts generic residuals only after explicit connectors', () => {
13
- const mixed = analyzePreference('use pnpm with semicolons');
14
- const framework = analyzePreference('use React 19 syntax');
15
- expect(mixed.facets).toEqual(expect.arrayContaining([
16
- expect.objectContaining({ family: 'package_manager', value: 'pnpm' }),
17
- expect.objectContaining({ family: 'entity:semicolons', entity: 'semicolons' }),
18
- ]));
19
- expect(framework.facets).toEqual([
20
- expect.objectContaining({ family: 'version:react', value: '19' }),
21
- ]);
22
- expect(framework.facets.some(facet => facet.entity === 'syntax')).toBe(false);
23
- });
24
- it('preserves decimal versions and dot-qualified framework aliases', () => {
25
- expect(analyzePreference('Use React 18.2').facets).toEqual([
26
- expect.objectContaining({ family: 'version:react', value: '18.2' }),
27
- ]);
28
- expect(analyzePreference('Use React 18.3').facets).toEqual([
29
- expect.objectContaining({ family: 'version:react', value: '18.3' }),
30
- ]);
31
- expect(analyzePreference('Use Node.js 20').facets).toEqual([
32
- expect.objectContaining({ family: 'version:node', value: '20' }),
33
- ]);
34
- expect(analyzePreference('Use Vue.js 3').facets).toEqual([
35
- expect.objectContaining({ family: 'version:vue', value: '3' }),
36
- ]);
37
- });
38
- it('accepts bounded command-style run markers without matching narration or npm scripts', () => {
39
- expect(analyzePreference('run vitest').facets).toEqual([
40
- expect.objectContaining({ family: 'test_runner', value: 'vitest', polarity: 'positive' }),
41
- ]);
42
- expect(analyzePreference('always run jest').facets).toEqual([
43
- expect.objectContaining({ family: 'test_runner', value: 'jest', polarity: 'positive' }),
44
- ]);
45
- expect(analyzePreference('never run jest').facets).toEqual([
46
- expect.objectContaining({ family: 'test_runner', value: 'jest', polarity: 'negative' }),
47
- ]);
48
- expect(analyzePreference('we run jest').status).toBe('unclassified');
49
- expect(analyzePreference('use npm run dev').facets).toEqual([
50
- expect.objectContaining({ family: 'package_manager', value: 'npm' }),
51
- ]);
52
- });
53
- it('classifies formatting and component-library choices as exclusive policy facets', () => {
54
- expect(analyzePreference('使用 prettier 作为代码格式化方案').facets).toEqual([
55
- expect.objectContaining({ family: 'formatting', entity: 'code formatter', value: 'prettier' }),
56
- ]);
57
- expect(analyzePreference('use shadcn/ui as the component library').facets).toEqual([
58
- expect.objectContaining({ family: 'component_library', value: 'shadcn/ui' }),
59
- ]);
60
- });
61
- it.each([
62
- ['use vite-plugin-react', 'build_tool'],
63
- ['use jest-dom', 'test_runner'],
64
- ['use npm_package', 'package_manager'],
65
- ])('does not classify identifier-embedded tokens in %s', (content, forbiddenFamily) => {
66
- const result = analyzePreference(content);
67
- expect(result.facets.some(facet => facet.family === forbiddenFamily)).toBe(false);
68
- expect(result.facets).toHaveLength(1);
69
- expect(result.facets[0]?.kind).toBe('entity_polarity');
70
- });
71
- it('bounds normalization and analysis before scanning intent markers', () => {
72
- const oversized = `use semicolons ${'x'.repeat(MAX_PREFERENCE_ANALYSIS_CODE_POINTS + 2_000)} prefer pnpm`;
73
- const result = analyzePreference(oversized);
74
- const normalized = normalizeExplicitPreferenceContent(oversized);
75
- expect(result.facets.some(facet => facet.family === 'package_manager')).toBe(false);
76
- expect([...normalized].length).toBe(4_000);
77
- expect(Buffer.byteLength(normalized, 'utf8')).toBeLessThanOrEqual(16_384);
78
- });
79
- });
80
- //# sourceMappingURL=preference-conflicts.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preference-conflicts.test.js","sourceRoot":"","sources":["../src/preference-conflicts.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=semantic-memory.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic-memory.test.d.ts","sourceRoot":"","sources":["../src/semantic-memory.test.ts"],"names":[],"mappings":""}
@@ -1,61 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { extractTechnicalEntities, mergeSemanticEntities, normalizeSemanticMemory, } from './semantic-memory.js';
3
- describe('semantic memory normalization', () => {
4
- it('preserves exact technical identifiers instead of collapsing to a parent framework', () => {
5
- expect(extractTechnicalEntities('Use react-query and @tanstack/react-query; install with --legacy-peer-deps.')).toEqual([
6
- 'react-query',
7
- '@tanstack/react-query',
8
- '--legacy-peer-deps',
9
- ]);
10
- expect(mergeSemanticEntities(['react'], ['react-query'])).toEqual(['react-query']);
11
- expect(extractTechnicalEntities('VideoPlayer reads current_time from playerRef.current.'))
12
- .toEqual(expect.arrayContaining(['VideoPlayer', 'current_time', 'playerRef.current']));
13
- });
14
- it('gives equivalent Chinese and English conventions the same semantic identity', () => {
15
- const base = { project: '/project', type: 'project_convention', title: 'API convention' };
16
- const english = normalizeSemanticMemory({ ...base, narrative: 'Use react-query as the API solution.' });
17
- const chinese = normalizeSemanticMemory({ ...base, narrative: '在项目中使用 react-query 作为 API 方案。' });
18
- expect(english).toMatchObject({
19
- subject: 'API data fetching', predicate: 'use', value: 'react-query', polarity: 'positive',
20
- });
21
- expect(chinese.semanticKey).toBe(english.semanticKey);
22
- expect(chinese.facetKey).toBe(english.facetKey);
23
- });
24
- it('normalizes dependency install flags into a stable requirement facet', () => {
25
- const semantic = normalizeSemanticMemory({
26
- project: '/project',
27
- type: 'project_convention',
28
- title: 'Dependency installation',
29
- narrative: '安装或更新依赖时统一使用 --legacy-peer-deps。',
30
- });
31
- expect(semantic).toMatchObject({
32
- subject: 'dependency installation',
33
- predicate: 'require',
34
- value: '--legacy-peer-deps',
35
- entities: ['--legacy-peer-deps'],
36
- facet: 'dependency_installation',
37
- });
38
- });
39
- it('normalizes Prettier as the project formatting policy', () => {
40
- const semantic = normalizeSemanticMemory({
41
- project: '/project',
42
- type: 'project_convention',
43
- title: 'Formatting convention',
44
- narrative: '在该项目中使用 prettier 作为代码格式化的方案。',
45
- });
46
- expect(semantic).toMatchObject({
47
- subject: 'code formatter',
48
- predicate: 'use',
49
- value: 'prettier',
50
- polarity: 'positive',
51
- entities: ['prettier'],
52
- facet: 'formatting',
53
- });
54
- });
55
- it('extracts package names, flags, versions, paths, and identifiers independently', () => {
56
- expect(extractTechnicalEntities('Use @biomejs/biome --write with React 19 in src/components/Login.tsx via formatCode.')).toEqual(expect.arrayContaining([
57
- '@biomejs/biome', '--write', 'React 19', 'src/components/Login.tsx', 'formatCode',
58
- ]));
59
- });
60
- });
61
- //# sourceMappingURL=semantic-memory.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantic-memory.test.js","sourceRoot":"","sources":["../src/semantic-memory.test.ts"],"names":[],"mappings":"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"}