opcode-pg-memory 2.2.7 → 2.3.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 (76) hide show
  1. package/dist/cli.js +21 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +30 -20981
  5. package/dist/index.js.map +1 -0
  6. package/dist/mcp-server.js +26 -6
  7. package/dist/mcp-server.js.map +1 -0
  8. package/dist/src/cache/semantic-cache.js +399 -0
  9. package/dist/src/cache/semantic-cache.js.map +1 -0
  10. package/dist/src/cli.js +404 -0
  11. package/dist/src/cli.js.map +1 -0
  12. package/dist/src/config.d.ts +5 -0
  13. package/dist/src/config.d.ts.map +1 -1
  14. package/dist/src/config.js +89 -0
  15. package/dist/src/config.js.map +1 -0
  16. package/dist/src/db/init-db.js +545 -0
  17. package/dist/src/db/init-db.js.map +1 -0
  18. package/dist/src/hooks/message-part-updated.js +203 -0
  19. package/dist/src/hooks/message-part-updated.js.map +1 -0
  20. package/dist/src/hooks/message-updated.js +347 -0
  21. package/dist/src/hooks/message-updated.js.map +1 -0
  22. package/dist/src/hooks/session-compacting.js +179 -0
  23. package/dist/src/hooks/session-compacting.js.map +1 -0
  24. package/dist/src/hooks/session-completed.js +337 -0
  25. package/dist/src/hooks/session-completed.js.map +1 -0
  26. package/dist/src/hooks/session-created.js +206 -0
  27. package/dist/src/hooks/session-created.js.map +1 -0
  28. package/dist/src/hooks/tool-execute.js +267 -0
  29. package/dist/src/hooks/tool-execute.js.map +1 -0
  30. package/dist/src/index.d.ts +1 -0
  31. package/dist/src/index.d.ts.map +1 -1
  32. package/dist/src/index.js +643 -0
  33. package/dist/src/index.js.map +1 -0
  34. package/dist/src/mcp/hindsight-reflect-omo.js +318 -0
  35. package/dist/src/mcp/hindsight-reflect-omo.js.map +1 -0
  36. package/dist/src/mcp/hindsight-reflect.js +838 -0
  37. package/dist/src/mcp/hindsight-reflect.js.map +1 -0
  38. package/dist/src/mcp/recall-memory-omo.js +263 -0
  39. package/dist/src/mcp/recall-memory-omo.js.map +1 -0
  40. package/dist/src/mcp/recall-memory.d.ts +6 -0
  41. package/dist/src/mcp/recall-memory.d.ts.map +1 -1
  42. package/dist/src/mcp/recall-memory.js +900 -0
  43. package/dist/src/mcp/recall-memory.js.map +1 -0
  44. package/dist/src/omo/adapter.js +583 -0
  45. package/dist/src/omo/adapter.js.map +1 -0
  46. package/dist/src/omo/types.js +44 -0
  47. package/dist/src/omo/types.js.map +1 -0
  48. package/dist/src/services/db-polling.d.ts +30 -0
  49. package/dist/src/services/db-polling.d.ts.map +1 -0
  50. package/dist/src/services/db-polling.js +97 -0
  51. package/dist/src/services/db-polling.js.map +1 -0
  52. package/dist/src/services/event-synchronizer.d.ts +15 -0
  53. package/dist/src/services/event-synchronizer.d.ts.map +1 -0
  54. package/dist/src/services/event-synchronizer.js +119 -0
  55. package/dist/src/services/event-synchronizer.js.map +1 -0
  56. package/dist/src/services/keyword.js +29 -0
  57. package/dist/src/services/keyword.js.map +1 -0
  58. package/dist/src/services/logger.js +42 -0
  59. package/dist/src/services/logger.js.map +1 -0
  60. package/dist/src/services/opencode-schema-adapter.d.ts +34 -0
  61. package/dist/src/services/opencode-schema-adapter.d.ts.map +1 -0
  62. package/dist/src/services/opencode-schema-adapter.js +96 -0
  63. package/dist/src/services/opencode-schema-adapter.js.map +1 -0
  64. package/dist/src/services/privacy.js +23 -0
  65. package/dist/src/services/privacy.js.map +1 -0
  66. package/dist/src/topic/segment-manager.js +447 -0
  67. package/dist/src/topic/segment-manager.js.map +1 -0
  68. package/dist/src/types.d.ts +20 -2
  69. package/dist/src/types.d.ts.map +1 -1
  70. package/dist/src/types.js +8 -0
  71. package/dist/src/types.js.map +1 -0
  72. package/dist/src/utils/embedding.js +180 -0
  73. package/dist/src/utils/embedding.js.map +1 -0
  74. package/dist/src/utils/token-budget.js +152 -0
  75. package/dist/src/utils/token-budget.js.map +1 -0
  76. package/package.json +6 -6
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /**
3
+ * Oh My OpenAgent (OmO) 适配层类型定义
4
+ *
5
+ * 定义 OmO 特有的类型和接口,用于多 Agent 环境下的记忆管理
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.DEFAULT_OMO_CONFIG = void 0;
9
+ // OmO 默认配置
10
+ exports.DEFAULT_OMO_CONFIG = {
11
+ enabled: true,
12
+ integrationMode: 'infrastructure',
13
+ infrastructureMode: {
14
+ priority: 'high',
15
+ reservedForAgents: ['*'], // 所有 Agent
16
+ disabledOmOHooks: [
17
+ 'omo.context.injection', // 禁用 OmO 的上下文注入,使用我们的
18
+ 'omo.wisdom.accumulation' // 禁用 OmO 的 Wisdom,使用 hindsight_reflect
19
+ ]
20
+ },
21
+ skillMode: {
22
+ skillName: 'long-term-memory',
23
+ autoInject: true,
24
+ injectTiming: 'pre-task'
25
+ },
26
+ agentIsolation: {
27
+ enabled: true,
28
+ sharedTiers: ['permanent', 'project'],
29
+ isolatedTiers: ['session', 'agent']
30
+ },
31
+ wisdomIntegration: {
32
+ enabled: true,
33
+ syncToOmO: true,
34
+ useOmOWisdom: false,
35
+ conflictResolution: 'merge'
36
+ },
37
+ tokenBudgetCoordination: {
38
+ enabled: true,
39
+ respectOmOBudget: true,
40
+ budgetAllocation: 'equal',
41
+ maxOmOContextRatio: 0.7
42
+ }
43
+ };
44
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/omo/types.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAkFH,WAAW;AACE,QAAA,kBAAkB,GAAc;IAC3C,OAAO,EAAE,IAAI;IACb,eAAe,EAAE,gBAAgB;IAEjC,kBAAkB,EAAE;QAClB,QAAQ,EAAE,MAAM;QAChB,iBAAiB,EAAE,CAAC,GAAG,CAAC,EAAE,WAAW;QACrC,gBAAgB,EAAE;YAChB,uBAAuB,EAAG,sBAAsB;YAChD,yBAAyB,CAAC,uCAAuC;SAClE;KACF;IAED,SAAS,EAAE;QACT,SAAS,EAAE,kBAAkB;QAC7B,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,UAAU;KACzB;IAED,cAAc,EAAE;QACd,OAAO,EAAE,IAAI;QACb,WAAW,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;QACrC,aAAa,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;KACpC;IAED,iBAAiB,EAAE;QACjB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,KAAK;QACnB,kBAAkB,EAAE,OAAO;KAC5B;IAED,uBAAuB,EAAE;QACvB,OAAO,EAAE,IAAI;QACb,gBAAgB,EAAE,IAAI;QACtB,gBAAgB,EAAE,OAAO;QACzB,kBAAkB,EAAE,GAAG;KACxB;CACF,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * OpenCode SQLite → PostgreSQL 轮询同步器
3
+ *
4
+ * 通过 OpenCodeSchemaAdapter 读取 SQLite 增量变化,构造 PluginEvent 并委托给 EventSynchronizer。
5
+ * 不依赖 OpenCode 事件总线,兼容 TUI/CLI/Desktop/WebView 所有模式。
6
+ */
7
+ import { Pool } from 'pg';
8
+ import { EventSynchronizer } from './event-synchronizer';
9
+ export interface DBPollingConfig {
10
+ intervalMs: number;
11
+ maxBatchSize: number;
12
+ backoffBaseMs: number;
13
+ backoffMaxMs: number;
14
+ }
15
+ export declare class OpenCodeDBPollingSource {
16
+ private pool;
17
+ private synchronizer;
18
+ private config;
19
+ private adapter;
20
+ private timer;
21
+ private lastSyncTime;
22
+ private currentInterval;
23
+ private sessionIds;
24
+ constructor(pool: Pool, synchronizer: EventSynchronizer, config?: Partial<DBPollingConfig>);
25
+ start(): Promise<void>;
26
+ stop(): void;
27
+ private sync;
28
+ private makeEvent;
29
+ }
30
+ //# sourceMappingURL=db-polling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-polling.d.ts","sourceRoot":"","sources":["../../../src/services/db-polling.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAMzD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AASD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,UAAU,CAAqB;gBAE3B,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAQpF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB5B,IAAI,IAAI,IAAI;YAKE,IAAI;IAmClB,OAAO,CAAC,SAAS;CAWlB"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenCodeDBPollingSource = void 0;
4
+ const opencode_schema_adapter_1 = require("./opencode-schema-adapter");
5
+ const logger_1 = require("./logger");
6
+ const logger = (0, logger_1.createLogger)('db-polling');
7
+ const DEFAULT_CONFIG = {
8
+ intervalMs: 5000,
9
+ maxBatchSize: 100,
10
+ backoffBaseMs: 1000,
11
+ backoffMaxMs: 60000,
12
+ };
13
+ class OpenCodeDBPollingSource {
14
+ pool;
15
+ synchronizer;
16
+ config;
17
+ adapter;
18
+ timer = null;
19
+ lastSyncTime = 0;
20
+ currentInterval;
21
+ sessionIds = new Set();
22
+ constructor(pool, synchronizer, config) {
23
+ this.pool = pool;
24
+ this.synchronizer = synchronizer;
25
+ this.config = { ...DEFAULT_CONFIG, ...config };
26
+ this.adapter = new opencode_schema_adapter_1.OpenCodeSchemaAdapter();
27
+ this.currentInterval = this.config.intervalMs;
28
+ }
29
+ async start() {
30
+ if (!this.adapter.connect()) {
31
+ logger.warn('DB polling: SQLite not available, skipping');
32
+ return;
33
+ }
34
+ // Load already-known session IDs from PG
35
+ try {
36
+ const result = await this.pool.query('SELECT opencode_session_id FROM session_map');
37
+ for (const row of result.rows)
38
+ this.sessionIds.add(row.opencode_session_id);
39
+ }
40
+ catch { }
41
+ logger.info('DB polling started', { interval: this.config.intervalMs, knownSessions: this.sessionIds.size });
42
+ this.timer = setInterval(() => this.sync(), this.currentInterval);
43
+ }
44
+ stop() {
45
+ if (this.timer) {
46
+ clearInterval(this.timer);
47
+ this.timer = null;
48
+ }
49
+ this.adapter.close();
50
+ }
51
+ async sync() {
52
+ // Reconnect if needed (SQLite might have been reopened)
53
+ if (!this.adapter.isConnected()) {
54
+ if (!this.adapter.connect())
55
+ return;
56
+ }
57
+ try {
58
+ // 1. Sync new sessions
59
+ const sessions = this.adapter.getRecentSessions();
60
+ for (const s of sessions) {
61
+ if (!this.sessionIds.has(s.id)) {
62
+ this.sessionIds.add(s.id);
63
+ await this.synchronizer.handleEvent(this.makeEvent('session.created', s.id, { projectId: null }));
64
+ }
65
+ }
66
+ // 2. Sync new messages as observations
67
+ const messages = this.adapter.getRecentMessages(this.lastSyncTime || undefined);
68
+ for (const m of messages) {
69
+ if (!this.sessionIds.has(m.session_id))
70
+ continue;
71
+ await this.synchronizer.handleEvent(this.makeEvent('message.updated', m.session_id, { message: m }));
72
+ }
73
+ // Update tracking
74
+ this.lastSyncTime = Date.now();
75
+ this.currentInterval = this.config.intervalMs; // Reset on success
76
+ }
77
+ catch (err) {
78
+ logger.warn('DB polling sync failed', { error: err.message });
79
+ // Exponential backoff: double interval up to max
80
+ this.currentInterval = Math.min(this.currentInterval * 2, this.config.backoffMaxMs);
81
+ logger.info('DB polling backing off', { nextInterval: this.currentInterval });
82
+ }
83
+ }
84
+ makeEvent(type, sessionId, data) {
85
+ return {
86
+ id: `${type}:${sessionId}:${Date.now()}`,
87
+ type,
88
+ sessionId,
89
+ timestamp: Date.now(),
90
+ version: 1,
91
+ source: 'poll',
92
+ data,
93
+ };
94
+ }
95
+ }
96
+ exports.OpenCodeDBPollingSource = OpenCodeDBPollingSource;
97
+ //# sourceMappingURL=db-polling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-polling.js","sourceRoot":"","sources":["../../../src/services/db-polling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Pool } from 'pg';
2
+ import type { PluginEvent, EventSynchronizerConfig } from '../types';
3
+ export declare class EventSynchronizer {
4
+ private pool;
5
+ private config;
6
+ private dedupSet;
7
+ private stopped;
8
+ private logger;
9
+ constructor(pool: Pool, config?: Partial<EventSynchronizerConfig>);
10
+ handleEvent(event: PluginEvent): Promise<void>;
11
+ private ensureSessionMap;
12
+ private getHandler;
13
+ private sleep;
14
+ }
15
+ //# sourceMappingURL=event-synchronizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-synchronizer.d.ts","sourceRoot":"","sources":["../../../src/services/event-synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,OAAO,KAAK,EAAE,WAAW,EAAmB,uBAAuB,EAAY,MAAM,UAAU,CAAC;AAOhG,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAA8B;gBAEhC,IAAI,EAAE,IAAI,EAAE,MAAM,GAAE,OAAO,CAAC,uBAAuB,CAAM;IAY/D,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;YAsEtC,gBAAgB;IAO9B,OAAO,CAAC,UAAU;IAkDlB,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventSynchronizer = void 0;
4
+ const logger_1 = require("./logger");
5
+ const session_created_1 = require("../hooks/session-created");
6
+ const session_completed_1 = require("../hooks/session-completed");
7
+ const session_compacting_1 = require("../hooks/session-compacting");
8
+ const message_updated_1 = require("../hooks/message-updated");
9
+ const tool_execute_1 = require("../hooks/tool-execute");
10
+ class EventSynchronizer {
11
+ pool;
12
+ config;
13
+ dedupSet = new Map(); // eventId → timestamp
14
+ stopped = false;
15
+ logger = (0, logger_1.createLogger)('event-sync');
16
+ constructor(pool, config = {}) {
17
+ this.pool = pool;
18
+ this.config = {
19
+ mode: 'hybrid',
20
+ pollingIntervalMs: 5000,
21
+ retryMaxAttempts: 3,
22
+ retryBaseDelayMs: 50,
23
+ eventDedupWindowMs: 5000,
24
+ ...config,
25
+ };
26
+ }
27
+ async handleEvent(event) {
28
+ if (this.stopped)
29
+ return;
30
+ // 1. Mode filtering
31
+ if (this.config.mode === 'event-only' && event.source === 'poll')
32
+ return;
33
+ if (this.config.mode === 'poll-only' && event.source === 'hook')
34
+ return;
35
+ // 2. Dedup within sliding window
36
+ const dedupKey = `${event.type}:${event.sessionId}:${event.version}`;
37
+ const lastTime = this.dedupSet.get(dedupKey) || 0;
38
+ if (Date.now() - lastTime < this.config.eventDedupWindowMs) {
39
+ this.logger.debug('Duplicate event skipped', { key: dedupKey });
40
+ return;
41
+ }
42
+ this.dedupSet.set(dedupKey, Date.now());
43
+ // 3. Clean old dedup entries (keep last 1000)
44
+ if (this.dedupSet.size > 1000) {
45
+ const cutoff = Date.now() - 60000;
46
+ for (const [k, t] of this.dedupSet) {
47
+ if (t < cutoff)
48
+ this.dedupSet.delete(k);
49
+ }
50
+ }
51
+ // 4. Dispatch to handler (with retry for version conflicts)
52
+ const handler = this.getHandler(event.type);
53
+ if (!handler) {
54
+ this.logger.warn('No handler for event', { type: event.type });
55
+ return;
56
+ }
57
+ let lastError = null;
58
+ for (let attempt = 0; attempt <= this.config.retryMaxAttempts; attempt++) {
59
+ try {
60
+ // Ensure session_map entry exists first
61
+ await this.ensureSessionMap(event);
62
+ // Call the handler
63
+ await handler(event, this.pool);
64
+ // Optimistic locking: update version on session_map
65
+ if (event.version > 0) {
66
+ const result = await this.pool.query('UPDATE session_map SET version = version + 1 WHERE opencode_session_id = $1 AND (version = $2 OR version IS NULL)', [event.sessionId, event.version]);
67
+ if (result.rowCount === 0 && attempt < this.config.retryMaxAttempts) {
68
+ // Version conflict — retry
69
+ lastError = new Error(`Version conflict for ${event.sessionId}`);
70
+ await this.sleep(this.config.retryBaseDelayMs * Math.pow(2, attempt));
71
+ continue;
72
+ }
73
+ }
74
+ this.logger.debug('Event processed', { type: event.type, sessionId: event.sessionId, attempt });
75
+ return;
76
+ }
77
+ catch (err) {
78
+ lastError = err;
79
+ if (attempt < this.config.retryMaxAttempts) {
80
+ await this.sleep(this.config.retryBaseDelayMs * Math.pow(2, attempt));
81
+ }
82
+ }
83
+ }
84
+ this.logger.error('Event processing failed after retries', {
85
+ type: event.type, sessionId: event.sessionId, error: lastError?.message,
86
+ });
87
+ }
88
+ async ensureSessionMap(event) {
89
+ await this.pool.query('INSERT INTO session_map (opencode_session_id) VALUES ($1) ON CONFLICT DO NOTHING', [event.sessionId]);
90
+ }
91
+ getHandler(type) {
92
+ const handlers = {
93
+ 'session.created': async (e, p) => {
94
+ await (0, session_created_1.handleSessionCreated)({ session: { id: e.sessionId, projectId: e.data?.projectId, model: { id: '', contextLimit: 128000, name: '' }, messages: [] } }, { context: {} }, p, { contextLimitRatio: 0.05, minTokens: 500, maxTokens: 4000 });
95
+ },
96
+ 'session.completed': async (e, p) => {
97
+ await (0, session_completed_1.handleSessionCompleted)({ session: { id: e.sessionId, messageCount: e.data?.messageCount || 0, durationMs: e.data?.durationMs || 0 }, summary: e.data?.summary }, {}, p, {});
98
+ },
99
+ 'session.compacted': async (e, p) => {
100
+ await (0, session_compacting_1.handleSessionCompacted)({ session: { id: e.sessionId }, messagesToCompact: e.data?.messagesToCompact || [], compactionStrategy: 'prune' }, {}, p);
101
+ },
102
+ 'message.updated': async (e, p) => {
103
+ await (0, message_updated_1.handleMessageUpdated)({ session: { id: e.sessionId }, message: e.data?.message || {} }, {}, p);
104
+ },
105
+ 'tool.execute.before': async (e, p) => {
106
+ await (0, tool_execute_1.handleToolExecuteBefore)({ session: { id: e.sessionId }, tool: { name: e.data?.toolName || '', parameters: e.data?.parameters || {} }, messageId: e.data?.callID || '' }, { parameters: e.data?.parameters || {} }, p);
107
+ },
108
+ 'tool.execute.after': async (e, p) => {
109
+ await (0, tool_execute_1.handleToolExecuteAfter)({ session: { id: e.sessionId }, tool: { name: e.data?.toolName || '', parameters: e.data?.parameters || {} }, result: e.data?.result || { success: true }, messageId: e.data?.callID || '', executionTimeMs: e.data?.executionTimeMs || 0 }, {}, p);
110
+ },
111
+ };
112
+ return handlers[type] || null;
113
+ }
114
+ sleep(ms) {
115
+ return new Promise(resolve => setTimeout(resolve, ms));
116
+ }
117
+ }
118
+ exports.EventSynchronizer = EventSynchronizer;
119
+ //# sourceMappingURL=event-synchronizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-synchronizer.js","sourceRoot":"","sources":["../../../src/services/event-synchronizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MEMORY_NUDGE_MESSAGE = void 0;
4
+ exports.removeCodeBlocks = removeCodeBlocks;
5
+ exports.detectMemoryKeyword = detectMemoryKeyword;
6
+ const CODE_BLOCK_PATTERN = /```[\s\S]*?```/g;
7
+ const INLINE_CODE_PATTERN = /`[^`]+`/g;
8
+ const DEFAULT_KEYWORDS = [
9
+ 'remember', 'memorize', 'save\\s+this', 'note\\s+this',
10
+ 'keep\\s+in\\s+mind', "don'?t\\s+forget", 'learn\\s+this',
11
+ 'store\\s+this', 'record\\s+this', 'make\\s+a\\s+note',
12
+ 'take\\s+note', 'jot\\s+down', 'commit\\s+to\\s+memory',
13
+ 'remember\\s+that', 'never\\s+forget', 'always\\s+remember',
14
+ ];
15
+ const MEMORY_KEYWORD_RE = new RegExp(`\\b(${DEFAULT_KEYWORDS.join('|')})\\b`, 'i');
16
+ function removeCodeBlocks(text) {
17
+ return text.replace(CODE_BLOCK_PATTERN, '').replace(INLINE_CODE_PATTERN, '');
18
+ }
19
+ function detectMemoryKeyword(text) {
20
+ if (!text)
21
+ return false;
22
+ return MEMORY_KEYWORD_RE.test(removeCodeBlocks(text));
23
+ }
24
+ exports.MEMORY_NUDGE_MESSAGE = `[MEMORY TRIGGER DETECTED]
25
+ The user wants you to remember something important.
26
+ Consider using the following tools to persist this knowledge:
27
+ - recall_memory: to retrieve related context
28
+ - The pg-memory plugin will automatically record this session's observations for future use.`;
29
+ //# sourceMappingURL=keyword.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyword.js","sourceRoot":"","sources":["../../../src/services/keyword.ts"],"names":[],"mappings":";;;AAeA,4CAEC;AAED,kDAGC;AAtBD,MAAM,kBAAkB,GAAG,iBAAiB,CAAC;AAC7C,MAAM,mBAAmB,GAAG,UAAU,CAAC;AAEvC,MAAM,gBAAgB,GAAG;IACvB,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc;IACtD,oBAAoB,EAAE,kBAAkB,EAAE,eAAe;IACzD,eAAe,EAAE,gBAAgB,EAAE,mBAAmB;IACtD,cAAc,EAAE,aAAa,EAAE,wBAAwB;IACvD,kBAAkB,EAAE,iBAAiB,EAAE,oBAAoB;CAC5D,CAAC;AAEF,MAAM,iBAAiB,GAAG,IAAI,MAAM,CAClC,OAAO,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAC7C,CAAC;AAEF,SAAgB,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAC/E,CAAC;AAED,SAAgB,mBAAmB,CAAC,IAAY;IAC9C,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,OAAO,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;AACxD,CAAC;AAEY,QAAA,oBAAoB,GAAG;;;;6FAIyD,CAAC"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLogger = createLogger;
4
+ const LEVEL_MAP = {
5
+ debug: 0,
6
+ info: 1,
7
+ warn: 2,
8
+ error: 3,
9
+ };
10
+ const LEVEL_NAMES = {
11
+ debug: 'DEBUG',
12
+ info: 'INFO',
13
+ warn: 'WARN',
14
+ error: 'ERROR',
15
+ };
16
+ function getConfiguredLevel() {
17
+ const env = process.env.PG_MEMORY_LOG_LEVEL ?? 'info';
18
+ const level = env.toLowerCase();
19
+ if (level in LEVEL_MAP) {
20
+ return LEVEL_MAP[level];
21
+ }
22
+ return LEVEL_MAP.info;
23
+ }
24
+ const currentLevel = getConfiguredLevel();
25
+ function log(level, module, msg, data) {
26
+ if (currentLevel > LEVEL_MAP[level]) {
27
+ return;
28
+ }
29
+ const line = data !== undefined
30
+ ? `[PG Memory] [${LEVEL_NAMES[level]}] [${module}] ${msg} ${JSON.stringify(data)}\n`
31
+ : `[PG Memory] [${LEVEL_NAMES[level]}] [${module}] ${msg}\n`;
32
+ process.stderr.write(line);
33
+ }
34
+ function createLogger(module) {
35
+ return {
36
+ debug: (msg, data) => log('debug', module, msg, data),
37
+ info: (msg, data) => log('info', module, msg, data),
38
+ warn: (msg, data) => log('warn', module, msg, data),
39
+ error: (msg, data) => log('error', module, msg, data),
40
+ };
41
+ }
42
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/services/logger.ts"],"names":[],"mappings":";;AA8CA,oCAOC;AAnDD,MAAM,SAAS,GAA6B;IAC1C,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,MAAM,WAAW,GAA6B;IAC5C,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,SAAS,kBAAkB;IACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,MAAM,CAAC;IACtD,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAc,CAAC;IAC5C,IAAI,KAAK,IAAI,SAAS,EAAE,CAAC;QACvB,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC,IAAI,CAAC;AACxB,CAAC;AAED,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;AAS1C,SAAS,GAAG,CAAC,KAAe,EAAE,MAAc,EAAE,GAAW,EAAE,IAAc;IACvE,IAAI,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS;QAC7B,CAAC,CAAC,gBAAgB,WAAW,CAAC,KAAK,CAAC,MAAM,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI;QACpF,CAAC,CAAC,gBAAgB,WAAW,CAAC,KAAK,CAAC,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC;IAE/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC;AAED,SAAgB,YAAY,CAAC,MAAc;IACzC,OAAO;QACL,KAAK,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QACvE,IAAI,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QACrE,IAAI,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;QACrE,KAAK,EAAE,CAAC,GAAW,EAAE,IAAc,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;KACxE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface SQLiteSession {
2
+ id: string;
3
+ title?: string;
4
+ time_created?: number;
5
+ agent?: string;
6
+ model?: string;
7
+ msg_ids?: string;
8
+ }
9
+ export interface SQLiteMessage {
10
+ id: string;
11
+ session_id: string;
12
+ role: string;
13
+ content: string;
14
+ time_created?: number;
15
+ tokens_input?: number;
16
+ tokens_output?: number;
17
+ model_id?: string;
18
+ agent?: string;
19
+ }
20
+ export declare class OpenCodeSchemaAdapter {
21
+ private db;
22
+ private path;
23
+ private version;
24
+ constructor(customPath?: string);
25
+ connect(): boolean;
26
+ private detectSchemaVersion;
27
+ isConnected(): boolean;
28
+ getVersion(): number;
29
+ getRecentSessions(): SQLiteSession[];
30
+ getRecentMessages(sinceTime?: number): SQLiteMessage[];
31
+ getSessionById(id: string): SQLiteSession | null;
32
+ close(): void;
33
+ }
34
+ //# sourceMappingURL=opencode-schema-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-schema-adapter.d.ts","sourceRoot":"","sources":["../../../src/services/opencode-schema-adapter.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAAa;gBAEhB,UAAU,CAAC,EAAE,MAAM;IAI/B,OAAO,IAAI,OAAO;IAalB,OAAO,CAAC,mBAAmB;IAO3B,WAAW,IAAI,OAAO;IAEtB,UAAU,IAAI,MAAM;IAEpB,iBAAiB,IAAI,aAAa,EAAE;IAapC,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAoBtD,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAOhD,KAAK,IAAI,IAAI;CAMd"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenCodeSchemaAdapter = void 0;
4
+ const logger_1 = require("./logger");
5
+ const path_1 = require("path");
6
+ const os_1 = require("os");
7
+ const logger = (0, logger_1.createLogger)('schema-adapter');
8
+ class OpenCodeSchemaAdapter {
9
+ db = null;
10
+ path;
11
+ version = 0;
12
+ constructor(customPath) {
13
+ this.path = customPath || (0, path_1.join)((0, os_1.homedir)(), '.local', 'share', 'opencode', 'opencode.db');
14
+ }
15
+ connect() {
16
+ if (this.db)
17
+ return true;
18
+ try {
19
+ const { Database } = require('bun:sqlite');
20
+ this.db = new Database(this.path);
21
+ this.detectSchemaVersion();
22
+ return true;
23
+ }
24
+ catch (err) {
25
+ logger.warn('Failed to connect to OpenCode SQLite', { path: this.path, error: err.message });
26
+ return false;
27
+ }
28
+ }
29
+ detectSchemaVersion() {
30
+ try {
31
+ const row = this.db?.query('PRAGMA user_version').get();
32
+ this.version = row?.user_version || 0;
33
+ }
34
+ catch {
35
+ this.version = 0;
36
+ }
37
+ }
38
+ isConnected() { return this.db !== null; }
39
+ getVersion() { return this.version; }
40
+ getRecentSessions() {
41
+ if (!this.db)
42
+ return [];
43
+ try {
44
+ return this.db.query(`
45
+ SELECT id, title, time_created, agent, model
46
+ FROM session WHERE type = 'chat' ORDER BY time_created ASC
47
+ `).all();
48
+ }
49
+ catch (err) {
50
+ logger.warn('Failed to query sessions', { error: err.message });
51
+ return [];
52
+ }
53
+ }
54
+ getRecentMessages(sinceTime) {
55
+ if (!this.db)
56
+ return [];
57
+ try {
58
+ let sql = `SELECT m.id, m.session_id, m.role, m.content, m.time_created,
59
+ m.tokens_input, m.tokens_output, m.model_id, m.agent
60
+ FROM message m JOIN session s ON m.session_id = s.id
61
+ WHERE s.type = 'chat'`;
62
+ const params = [];
63
+ if (sinceTime) {
64
+ sql += ` AND m.time_created > ?`;
65
+ params.push(sinceTime);
66
+ }
67
+ sql += ` ORDER BY m.time_created ASC`;
68
+ return this.db.query(sql).all(...params);
69
+ }
70
+ catch (err) {
71
+ logger.warn('Failed to query messages', { error: err.message });
72
+ return [];
73
+ }
74
+ }
75
+ getSessionById(id) {
76
+ if (!this.db)
77
+ return null;
78
+ try {
79
+ return this.db.query('SELECT id, title, time_created FROM session WHERE id = ?').get(id) || null;
80
+ }
81
+ catch {
82
+ return null;
83
+ }
84
+ }
85
+ close() {
86
+ if (this.db) {
87
+ try {
88
+ this.db.close();
89
+ }
90
+ catch { }
91
+ this.db = null;
92
+ }
93
+ }
94
+ }
95
+ exports.OpenCodeSchemaAdapter = OpenCodeSchemaAdapter;
96
+ //# sourceMappingURL=opencode-schema-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-schema-adapter.js","sourceRoot":"","sources":["../../../src/services/opencode-schema-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.containsPrivateTag = containsPrivateTag;
4
+ exports.stripPrivateContent = stripPrivateContent;
5
+ exports.isFullyPrivate = isFullyPrivate;
6
+ const PRIVATE_TAG_RE = /<private>[\s\S]*?<\/private>/gi;
7
+ function containsPrivateTag(content) {
8
+ if (!content)
9
+ return false;
10
+ return PRIVATE_TAG_RE.test(content);
11
+ }
12
+ function stripPrivateContent(content) {
13
+ if (!content)
14
+ return content;
15
+ return content.replace(PRIVATE_TAG_RE, '[REDACTED]');
16
+ }
17
+ function isFullyPrivate(content) {
18
+ if (!content)
19
+ return false;
20
+ const stripped = stripPrivateContent(content).trim();
21
+ return stripped === '[REDACTED]' || stripped === '';
22
+ }
23
+ //# sourceMappingURL=privacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"privacy.js","sourceRoot":"","sources":["../../../src/services/privacy.ts"],"names":[],"mappings":";;AAEA,gDAGC;AAED,kDAGC;AAED,wCAIC;AAhBD,MAAM,cAAc,GAAG,gCAAgC,CAAC;AAExD,SAAgB,kBAAkB,CAAC,OAAe;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,SAAgB,mBAAmB,CAAC,OAAe;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AACvD,CAAC;AAED,SAAgB,cAAc,CAAC,OAAe;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,OAAO,QAAQ,KAAK,YAAY,IAAI,QAAQ,KAAK,EAAE,CAAC;AACtD,CAAC"}