fivocell 4.8.0 → 4.9.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 (30) hide show
  1. package/dist/__tests__/auto-handoff.test.d.ts +2 -0
  2. package/dist/__tests__/auto-handoff.test.d.ts.map +1 -0
  3. package/dist/__tests__/auto-handoff.test.js +65 -0
  4. package/dist/__tests__/auto-handoff.test.js.map +1 -0
  5. package/dist/__tests__/memory-digest.test.d.ts +2 -0
  6. package/dist/__tests__/memory-digest.test.d.ts.map +1 -0
  7. package/dist/__tests__/memory-digest.test.js +20 -0
  8. package/dist/__tests__/memory-digest.test.js.map +1 -0
  9. package/dist/__tests__/semantic-memory.test.d.ts +2 -0
  10. package/dist/__tests__/semantic-memory.test.d.ts.map +1 -0
  11. package/dist/__tests__/semantic-memory.test.js +31 -0
  12. package/dist/__tests__/semantic-memory.test.js.map +1 -0
  13. package/dist/walls/06-memory/stores/auto-handoff.d.ts +13 -0
  14. package/dist/walls/06-memory/stores/auto-handoff.d.ts.map +1 -0
  15. package/dist/walls/06-memory/stores/auto-handoff.js +149 -0
  16. package/dist/walls/06-memory/stores/auto-handoff.js.map +1 -0
  17. package/dist/walls/06-memory/stores/memory-digest.d.ts +13 -0
  18. package/dist/walls/06-memory/stores/memory-digest.d.ts.map +1 -0
  19. package/dist/walls/06-memory/stores/memory-digest.js +44 -0
  20. package/dist/walls/06-memory/stores/memory-digest.js.map +1 -0
  21. package/dist/walls/06-memory/stores/semantic-memory.d.ts +23 -0
  22. package/dist/walls/06-memory/stores/semantic-memory.d.ts.map +1 -0
  23. package/dist/walls/06-memory/stores/semantic-memory.js +119 -0
  24. package/dist/walls/06-memory/stores/semantic-memory.js.map +1 -0
  25. package/dist/walls/07-runtime/cli/cli.js +73 -0
  26. package/dist/walls/07-runtime/cli/cli.js.map +1 -1
  27. package/dist/walls/07-runtime/daemon/server.d.ts.map +1 -1
  28. package/dist/walls/07-runtime/daemon/server.js +32 -0
  29. package/dist/walls/07-runtime/daemon/server.js.map +1 -1
  30. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auto-handoff.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-handoff.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/auto-handoff.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const fs = __importStar(require("fs"));
37
+ const path = __importStar(require("path"));
38
+ const database_1 = require("../walls/06-memory/database/database");
39
+ const memory_event_store_1 = require("../walls/06-memory/stores/memory-event-store");
40
+ const auto_handoff_1 = require("../walls/06-memory/stores/auto-handoff");
41
+ describe('Auto Handoff', () => {
42
+ const testDir = path.join(__dirname, '__auto-handoff-test__');
43
+ beforeAll(() => { (0, database_1.getDb)(); if (!fs.existsSync(testDir))
44
+ fs.mkdirSync(testDir, { recursive: true }); });
45
+ afterEach(() => {
46
+ const db = (0, database_1.getDb)();
47
+ db.prepare('DELETE FROM memory_events WHERE project = ?').run('handoff-auto-test');
48
+ });
49
+ afterAll(() => { try {
50
+ fs.rmSync(testDir, { recursive: true, force: true });
51
+ }
52
+ catch { } });
53
+ it('generates auto handoff', () => {
54
+ (0, memory_event_store_1.recordMemoryEvent)({ project: 'handoff-auto-test', type: 'decision', summary: 'Choose API shape', importance: 8, topic: 'api', files: ['src/api.ts'] });
55
+ const handoff = (0, auto_handoff_1.generateAutoHandoff)('handoff-auto-test', testDir);
56
+ expect(handoff.title).toContain('Auto handoff');
57
+ expect(handoff.markdown).toContain('Summary');
58
+ });
59
+ it('saves auto handoff', () => {
60
+ const handoff = (0, auto_handoff_1.generateAutoHandoff)('handoff-auto-test', testDir);
61
+ const file = (0, auto_handoff_1.saveAutoHandoff)(testDir, handoff);
62
+ expect(fs.existsSync(file)).toBe(true);
63
+ });
64
+ });
65
+ //# sourceMappingURL=auto-handoff.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-handoff.test.js","sourceRoot":"","sources":["../../src/__tests__/auto-handoff.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,mEAA6D;AAC7D,qFAAiF;AACjF,yEAA8F;AAE9F,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IAC9D,SAAS,CAAC,GAAG,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvG,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC;QACnB,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IACH,QAAQ,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,IAAA,sCAAiB,EAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QACvJ,MAAM,OAAO,GAAG,IAAA,kCAAmB,EAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAC5B,MAAM,OAAO,GAAG,IAAA,kCAAmB,EAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;QAClE,MAAM,IAAI,GAAG,IAAA,8BAAe,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memory-digest.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-digest.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/memory-digest.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const database_1 = require("../walls/06-memory/database/database");
4
+ const memory_event_store_1 = require("../walls/06-memory/stores/memory-event-store");
5
+ const memory_digest_1 = require("../walls/06-memory/stores/memory-digest");
6
+ describe('Memory Digest', () => {
7
+ beforeAll(() => { (0, database_1.getDb)(); });
8
+ afterEach(() => {
9
+ const db = (0, database_1.getDb)();
10
+ db.prepare('DELETE FROM memory_events WHERE project = ?').run('digest-test');
11
+ });
12
+ it('generates digest', () => {
13
+ (0, memory_event_store_1.recordMemoryEvent)({ project: 'digest-test', type: 'decision', summary: 'Use Jest', importance: 8, topic: 'testing' });
14
+ (0, memory_event_store_1.recordMemoryEvent)({ project: 'digest-test', type: 'error', summary: 'Build failed', importance: 7, topic: 'build' });
15
+ const digest = (0, memory_digest_1.generateMemoryDigest)('digest-test');
16
+ expect(digest.totalEvents).toBeGreaterThanOrEqual(2);
17
+ expect(digest.digestLines.length).toBeGreaterThan(0);
18
+ });
19
+ });
20
+ //# sourceMappingURL=memory-digest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-digest.test.js","sourceRoot":"","sources":["../../src/__tests__/memory-digest.test.ts"],"names":[],"mappings":";;AAAA,mEAA6D;AAC7D,qFAAiF;AACjF,2EAA+E;AAE/E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,SAAS,CAAC,GAAG,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC;QACnB,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,IAAA,sCAAiB,EAAC,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtH,IAAA,sCAAiB,EAAC,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACrH,MAAM,MAAM,GAAG,IAAA,oCAAoB,EAAC,aAAa,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=semantic-memory.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-memory.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/semantic-memory.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const database_1 = require("../walls/06-memory/database/database");
4
+ const memory_event_store_1 = require("../walls/06-memory/stores/memory-event-store");
5
+ const semantic_memory_1 = require("../walls/06-memory/stores/semantic-memory");
6
+ describe('Semantic Memory', () => {
7
+ beforeAll(() => { (0, database_1.getDb)(); });
8
+ afterEach(() => {
9
+ const db = (0, database_1.getDb)();
10
+ db.prepare('DELETE FROM memory_events WHERE project = ?').run('semantic-test');
11
+ });
12
+ it('finds semantic matches', () => {
13
+ (0, memory_event_store_1.recordMemoryEvent)({ project: 'semantic-test', type: 'error', summary: 'Login authentication bug', importance: 7, topic: 'auth' });
14
+ const results = (0, semantic_memory_1.semanticSearchMemories)({ query: 'auth issue', project: 'semantic-test' });
15
+ expect(results.length).toBeGreaterThanOrEqual(1);
16
+ });
17
+ it('gets related memories', () => {
18
+ (0, memory_event_store_1.recordMemoryEvent)({ project: 'semantic-test', type: 'decision', summary: 'Use React auth flow', importance: 8, topic: 'auth' });
19
+ (0, memory_event_store_1.recordMemoryEvent)({ project: 'semantic-test', type: 'fix', summary: 'Fix authentication redirect', importance: 7, topic: 'auth' });
20
+ const db = (0, database_1.getDb)();
21
+ const row = db.prepare('SELECT id FROM memory_events WHERE project = ? ORDER BY id ASC LIMIT 1').get('semantic-test');
22
+ const related = (0, semantic_memory_1.getRelatedMemories)(row.id, 5);
23
+ expect(Array.isArray(related)).toBe(true);
24
+ });
25
+ it('returns semantic topics', () => {
26
+ (0, memory_event_store_1.recordMemoryEvent)({ project: 'semantic-test', type: 'edit', summary: 'Improve database query', importance: 5, topic: 'database' });
27
+ const topics = (0, semantic_memory_1.getSemanticTopics)('semantic-test', 'db optimization');
28
+ expect(topics.length).toBeGreaterThanOrEqual(1);
29
+ });
30
+ });
31
+ //# sourceMappingURL=semantic-memory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-memory.test.js","sourceRoot":"","sources":["../../src/__tests__/semantic-memory.test.ts"],"names":[],"mappings":";;AAAA,mEAA6D;AAC7D,qFAAiF;AACjF,+EAA0H;AAE1H,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,SAAS,CAAC,GAAG,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC;QACnB,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,IAAA,sCAAiB,EAAC,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAClI,MAAM,OAAO,GAAG,IAAA,wCAAsB,EAAC,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;QAC1F,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,IAAA,sCAAiB,EAAC,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAChI,IAAA,sCAAiB,EAAC,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,6BAA6B,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACnI,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC;QACnB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,wEAAwE,CAAC,CAAC,GAAG,CAAC,eAAe,CAAmB,CAAC;QACxI,MAAM,OAAO,GAAG,IAAA,oCAAkB,EAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,IAAA,sCAAiB,EAAC,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,wBAAwB,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACnI,MAAM,MAAM,GAAG,IAAA,mCAAiB,EAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACrE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface AutoHandoff {
2
+ title: string;
3
+ summary: string;
4
+ files: string[];
5
+ impact: string;
6
+ verification: string[];
7
+ nextSteps: string[];
8
+ status: 'active' | 'blocked' | 'done';
9
+ markdown: string;
10
+ }
11
+ export declare function generateAutoHandoff(project: string, projectDir: string, days?: number): AutoHandoff;
12
+ export declare function saveAutoHandoff(projectDir: string, handoff: AutoHandoff): string;
13
+ //# sourceMappingURL=auto-handoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-handoff.d.ts","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/auto-handoff.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IACtC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,MAAU,GAAG,WAAW,CA4BtG;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAMhF"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateAutoHandoff = generateAutoHandoff;
37
+ exports.saveAutoHandoff = saveAutoHandoff;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const database_1 = require("../database/database");
41
+ function generateAutoHandoff(project, projectDir, days = 3) {
42
+ const db = (0, database_1.getDb)();
43
+ const since = new Date(Date.now() - days * 86400000).toISOString();
44
+ const events = db.prepare(`
45
+ SELECT type, topic, summary, files_json, importance, created_at
46
+ FROM memory_events
47
+ WHERE project = ? AND created_at >= ?
48
+ ORDER BY importance DESC, created_at DESC
49
+ LIMIT 100
50
+ `).all(project, since);
51
+ const files = collectFiles(events).slice(0, 12);
52
+ const decisions = events.filter((e) => e.type === 'decision').slice(0, 5).map((e) => e.summary);
53
+ const errors = events.filter((e) => e.type === 'error').slice(0, 5).map((e) => e.summary);
54
+ const fixes = events.filter((e) => e.type === 'fix').slice(0, 5).map((e) => e.summary);
55
+ const verifications = events.filter((e) => e.type === 'verification').slice(0, 5).map((e) => e.summary);
56
+ const topTopic = mostCommon(events.map((e) => e.topic).filter(Boolean)) || 'recent work';
57
+ const title = `Auto handoff — ${topTopic}`;
58
+ const summary = buildSummary(decisions, fixes, errors, events.length);
59
+ const impact = files.length > 0 ? `Primary impact across ${files.length} file(s), especially ${files.slice(0, 3).join(', ')}` : 'Impact not enough data';
60
+ const nextSteps = buildNextSteps(decisions, errors, verifications);
61
+ const status = errors.length > fixes.length ? 'blocked' : (events.length > 0 ? 'active' : 'done');
62
+ const markdown = buildMarkdown({ title, summary, files, impact, verification: verifications, nextSteps, status });
63
+ return { title, summary, files, impact, verification: verifications, nextSteps, status, markdown };
64
+ }
65
+ function saveAutoHandoff(projectDir, handoff) {
66
+ const dir = path.join(projectDir, '.cell', 'handoff');
67
+ if (!fs.existsSync(dir))
68
+ fs.mkdirSync(dir, { recursive: true });
69
+ const file = path.join(dir, 'current.md');
70
+ fs.writeFileSync(file, handoff.markdown, 'utf-8');
71
+ return file;
72
+ }
73
+ function collectFiles(events) {
74
+ const out = [];
75
+ for (const e of events) {
76
+ if (!e.files_json)
77
+ continue;
78
+ try {
79
+ const files = JSON.parse(e.files_json);
80
+ for (const f of files)
81
+ out.push(f);
82
+ }
83
+ catch { }
84
+ }
85
+ return [...new Set(out)];
86
+ }
87
+ function mostCommon(values) {
88
+ if (values.length === 0)
89
+ return null;
90
+ const map = new Map();
91
+ for (const v of values)
92
+ map.set(v, (map.get(v) || 0) + 1);
93
+ return [...map.entries()].sort((a, b) => b[1] - a[1])[0]?.[0] || null;
94
+ }
95
+ function buildSummary(decisions, fixes, errors, totalEvents) {
96
+ if (totalEvents === 0)
97
+ return 'No recent activity detected.';
98
+ const parts = [`${totalEvents} memory events captured recently.`];
99
+ if (decisions.length > 0)
100
+ parts.push(`Key decisions: ${decisions.slice(0, 2).join('; ')}.`);
101
+ if (fixes.length > 0)
102
+ parts.push(`Fixes applied: ${fixes.slice(0, 2).join('; ')}.`);
103
+ if (errors.length > 0)
104
+ parts.push(`Open issues/errors: ${errors.slice(0, 2).join('; ')}.`);
105
+ return parts.join(' ');
106
+ }
107
+ function buildNextSteps(decisions, errors, verifications) {
108
+ const steps = [];
109
+ if (errors.length > 0)
110
+ steps.push('Resolve remaining errors and record fixes');
111
+ if (verifications.length === 0)
112
+ steps.push('Run verification commands and log results');
113
+ if (decisions.length === 0)
114
+ steps.push('Log architectural or product decisions for context continuity');
115
+ if (steps.length === 0)
116
+ steps.push('Continue current implementation and update handoff when scope changes');
117
+ return steps;
118
+ }
119
+ function buildMarkdown(data) {
120
+ const lines = [];
121
+ lines.push(`## ${new Date().toISOString().slice(0, 16).replace('T', ' ')} - ${data.title}`);
122
+ lines.push('');
123
+ lines.push('### Summary');
124
+ lines.push(data.summary);
125
+ lines.push('');
126
+ lines.push('### Files');
127
+ for (const f of data.files)
128
+ lines.push(`- ${f}`);
129
+ lines.push('');
130
+ lines.push('### Impact');
131
+ lines.push(data.impact);
132
+ lines.push('');
133
+ lines.push('### Verification');
134
+ if (data.verification.length === 0)
135
+ lines.push('- none logged');
136
+ else
137
+ for (const v of data.verification)
138
+ lines.push(`- ${v}`);
139
+ lines.push('');
140
+ lines.push('### Status');
141
+ lines.push(`- ${data.status}`);
142
+ lines.push('');
143
+ lines.push('### Next');
144
+ for (const n of data.nextSteps)
145
+ lines.push(`- ${n}`);
146
+ lines.push('');
147
+ return lines.join('\n');
148
+ }
149
+ //# sourceMappingURL=auto-handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-handoff.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/auto-handoff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface MemoryDigest {
2
+ project: string;
3
+ totalEvents: number;
4
+ last7d: number;
5
+ decisions: number;
6
+ errors: number;
7
+ fixes: number;
8
+ topTopics: string[];
9
+ mostActiveDay: string | null;
10
+ digestLines: string[];
11
+ }
12
+ export declare function generateMemoryDigest(project: string): MemoryDigest;
13
+ //# sourceMappingURL=memory-digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-digest.d.ts","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/memory-digest.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAwClE"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateMemoryDigest = generateMemoryDigest;
4
+ const database_1 = require("../database/database");
5
+ function generateMemoryDigest(project) {
6
+ const db = (0, database_1.getDb)();
7
+ const totalRow = db.prepare('SELECT COUNT(*) as c FROM memory_events WHERE project = ?').get(project);
8
+ const since = new Date(Date.now() - 7 * 86400000).toISOString();
9
+ const recentRow = db.prepare('SELECT COUNT(*) as c FROM memory_events WHERE project = ? AND created_at >= ?').get(project, since);
10
+ const typeRows = db.prepare(`
11
+ SELECT type, COUNT(*) as c FROM memory_events WHERE project = ? GROUP BY type
12
+ `).all(project);
13
+ const topicRows = db.prepare(`
14
+ SELECT topic, COUNT(*) as c FROM memory_events
15
+ WHERE project = ? AND topic IS NOT NULL
16
+ GROUP BY topic ORDER BY c DESC LIMIT 5
17
+ `).all(project);
18
+ const dayRow = db.prepare(`
19
+ SELECT date(created_at) as d, COUNT(*) as c FROM memory_events
20
+ WHERE project = ? GROUP BY d ORDER BY c DESC LIMIT 1
21
+ `).get(project);
22
+ const map = {};
23
+ for (const r of typeRows)
24
+ map[r.type] = r.c;
25
+ const digestLines = [
26
+ `Total memories: ${totalRow.c}`,
27
+ `Last 7d: ${recentRow.c}`,
28
+ `Decisions: ${map.decision || 0}`,
29
+ `Errors/Fixes: ${map.error || 0}/${map.fix || 0}`,
30
+ `Top topics: ${topicRows.map((t) => t.topic).join(', ') || 'none'}`,
31
+ ];
32
+ return {
33
+ project,
34
+ totalEvents: totalRow.c,
35
+ last7d: recentRow.c,
36
+ decisions: map.decision || 0,
37
+ errors: map.error || 0,
38
+ fixes: map.fix || 0,
39
+ topTopics: topicRows.map((t) => t.topic),
40
+ mostActiveDay: dayRow?.d || null,
41
+ digestLines,
42
+ };
43
+ }
44
+ //# sourceMappingURL=memory-digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-digest.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/memory-digest.ts"],"names":[],"mappings":";;AAcA,oDAwCC;AAtDD,mDAA6C;AAc7C,SAAgB,oBAAoB,CAAC,OAAe;IAClD,MAAM,EAAE,GAAG,IAAA,gBAAK,GAAE,CAAC;IACnB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,2DAA2D,CAAC,CAAC,GAAG,CAAC,OAAO,CAAkB,CAAC;IACvH,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAChE,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,+EAA+E,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAkB,CAAC;IACnJ,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC;;GAE3B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAuC,CAAC;IACtD,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC;;;;GAI5B,CAAC,CAAC,GAAG,CAAC,OAAO,CAAwC,CAAC;IACvD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC;;;GAGzB,CAAC,CAAC,GAAG,CAAC,OAAO,CAAyC,CAAC;IAExD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAE5C,MAAM,WAAW,GAAG;QAClB,mBAAmB,QAAQ,CAAC,CAAC,EAAE;QAC/B,YAAY,SAAS,CAAC,CAAC,EAAE;QACzB,cAAc,GAAG,CAAC,QAAQ,IAAI,CAAC,EAAE;QACjC,iBAAiB,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE;QACjD,eAAe,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE;KACpE,CAAC;IAEF,OAAO;QACL,OAAO;QACP,WAAW,EAAE,QAAQ,CAAC,CAAC;QACvB,MAAM,EAAE,SAAS,CAAC,CAAC;QACnB,SAAS,EAAE,GAAG,CAAC,QAAQ,IAAI,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;QACtB,KAAK,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;QACnB,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QACxC,aAAa,EAAE,MAAM,EAAE,CAAC,IAAI,IAAI;QAChC,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,23 @@
1
+ export interface SemanticMemoryResult {
2
+ id: number;
3
+ project: string;
4
+ type: string;
5
+ topic: string | null;
6
+ summary: string;
7
+ importance: number;
8
+ created_at: string;
9
+ semanticScore: number;
10
+ matchedTerms: string[];
11
+ rationale: string;
12
+ }
13
+ export interface SemanticSearchOptions {
14
+ query: string;
15
+ project?: string;
16
+ limit?: number;
17
+ minImportance?: number;
18
+ days?: number;
19
+ }
20
+ export declare function semanticSearchMemories(options: SemanticSearchOptions): SemanticMemoryResult[];
21
+ export declare function getRelatedMemories(memoryId: number, limit?: number): SemanticMemoryResult[];
22
+ export declare function getSemanticTopics(project: string, query: string): string[];
23
+ //# sourceMappingURL=semantic-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-memory.d.ts","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/semantic-memory.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAmBD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,qBAAqB,GAAG,oBAAoB,EAAE,CAgC7F;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,oBAAoB,EAAE,CAS/F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAI1E"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.semanticSearchMemories = semanticSearchMemories;
4
+ exports.getRelatedMemories = getRelatedMemories;
5
+ exports.getSemanticTopics = getSemanticTopics;
6
+ const database_1 = require("../database/database");
7
+ const STOP_WORDS = new Set([
8
+ 'the', 'a', 'an', 'and', 'or', 'but', 'if', 'then', 'else', 'for', 'to', 'of', 'in', 'on', 'at', 'by', 'with', 'from', 'is', 'are', 'was', 'were', 'be', 'been', 'it', 'this', 'that', 'these', 'those', 'how', 'what', 'why', 'when', 'where', 'which'
9
+ ]);
10
+ const SYNONYMS = {
11
+ bug: ['error', 'issue', 'failure', 'problem'],
12
+ error: ['bug', 'failure', 'exception'],
13
+ fix: ['resolve', 'patch', 'repair', 'solution'],
14
+ decision: ['choice', 'selected', 'picked'],
15
+ test: ['verification', 'jest', 'spec', 'check'],
16
+ build: ['compile', 'tsc', 'bundle'],
17
+ refactor: ['cleanup', 'restructure', 'extract'],
18
+ auth: ['authentication', 'login', 'signin'],
19
+ db: ['database', 'sqlite', 'postgres', 'mysql'],
20
+ perf: ['performance', 'speed', 'latency'],
21
+ };
22
+ function semanticSearchMemories(options) {
23
+ const db = (0, database_1.getDb)();
24
+ const queryTerms = expandTerms(tokenize(options.query));
25
+ let sql = 'SELECT id, project, type, topic, summary, importance, created_at FROM memory_events WHERE 1=1';
26
+ const params = [];
27
+ if (options.project) {
28
+ sql += ' AND project = ?';
29
+ params.push(options.project);
30
+ }
31
+ if (options.minImportance !== undefined) {
32
+ sql += ' AND importance >= ?';
33
+ params.push(options.minImportance);
34
+ }
35
+ if (options.days) {
36
+ const since = new Date(Date.now() - options.days * 86400000).toISOString();
37
+ sql += ' AND created_at >= ?';
38
+ params.push(since);
39
+ }
40
+ sql += ' ORDER BY created_at DESC LIMIT 500';
41
+ const rows = db.prepare(sql).all(...params);
42
+ const results = rows.map((row) => scoreSemantic(row, queryTerms))
43
+ .filter((r) => r.semanticScore > 0)
44
+ .sort((a, b) => b.semanticScore - a.semanticScore)
45
+ .slice(0, options.limit || 20);
46
+ return results;
47
+ }
48
+ function getRelatedMemories(memoryId, limit = 10) {
49
+ const db = (0, database_1.getDb)();
50
+ const row = db.prepare('SELECT id, project, type, topic, summary, importance, created_at FROM memory_events WHERE id = ?').get(memoryId);
51
+ if (!row)
52
+ return [];
53
+ return semanticSearchMemories({ query: `${row.type} ${row.topic || ''} ${row.summary}`, project: row.project, limit: limit + 1 })
54
+ .filter((r) => r.id !== memoryId)
55
+ .slice(0, limit);
56
+ }
57
+ function getSemanticTopics(project, query) {
58
+ const results = semanticSearchMemories({ query, project, limit: 20 });
59
+ const topics = results.map((r) => r.topic).filter(Boolean);
60
+ return [...new Set(topics)].slice(0, 10);
61
+ }
62
+ function scoreSemantic(row, queryTerms) {
63
+ const haystack = `${row.type} ${row.topic || ''} ${row.summary}`.toLowerCase();
64
+ let score = 0;
65
+ const matchedTerms = [];
66
+ for (const term of queryTerms) {
67
+ if (haystack.includes(term)) {
68
+ matchedTerms.push(term);
69
+ if ((row.topic || '').toLowerCase().includes(term))
70
+ score += 30;
71
+ else if (row.summary.toLowerCase().includes(term))
72
+ score += 22;
73
+ else if (row.type.toLowerCase().includes(term))
74
+ score += 18;
75
+ else
76
+ score += 10;
77
+ }
78
+ }
79
+ score += row.importance * 4;
80
+ const ageHours = (Date.now() - new Date(row.created_at).getTime()) / 3600000;
81
+ if (ageHours < 24)
82
+ score += 15;
83
+ else if (ageHours < 24 * 7)
84
+ score += 8;
85
+ else if (ageHours < 24 * 30)
86
+ score += 4;
87
+ const typeBoost = { decision: 16, fix: 14, error: 13, pattern: 12, handoff: 10 };
88
+ score += typeBoost[row.type] || 0;
89
+ return {
90
+ ...row,
91
+ semanticScore: score,
92
+ matchedTerms,
93
+ rationale: matchedTerms.length > 0
94
+ ? `Matched ${matchedTerms.join(', ')} with importance ${row.importance}`
95
+ : `Ranked by importance ${row.importance}`,
96
+ };
97
+ }
98
+ function tokenize(input) {
99
+ return input
100
+ .toLowerCase()
101
+ .split(/[^a-z0-9_]+/)
102
+ .map((t) => t.trim())
103
+ .filter((t) => t.length >= 2 && !STOP_WORDS.has(t));
104
+ }
105
+ function expandTerms(terms) {
106
+ const out = new Set();
107
+ for (const term of terms) {
108
+ out.add(term);
109
+ for (const [key, vals] of Object.entries(SYNONYMS)) {
110
+ if (term === key || vals.includes(term)) {
111
+ out.add(key);
112
+ for (const v of vals)
113
+ out.add(v);
114
+ }
115
+ }
116
+ }
117
+ return [...out];
118
+ }
119
+ //# sourceMappingURL=semantic-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-memory.js","sourceRoot":"","sources":["../../../../src/walls/06-memory/stores/semantic-memory.ts"],"names":[],"mappings":"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"}