opcode-pg-memory 2.2.8 → 2.3.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 (76) hide show
  1. package/dist/cli.js +232 -214
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +30 -21006
  5. package/dist/index.js.map +1 -0
  6. package/dist/mcp-server.js +319 -302
  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 +642 -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 +33 -0
  49. package/dist/src/services/db-polling.d.ts.map +1 -0
  50. package/dist/src/services/db-polling.js +104 -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 +100 -0
  61. package/dist/src/services/opencode-schema-adapter.d.ts.map +1 -0
  62. package/dist/src/services/opencode-schema-adapter.js +192 -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 +5 -4
@@ -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,33 @@
1
+ /**
2
+ * OpenCode SQLite → PostgreSQL 轮询同步器
3
+ *
4
+ * 通过 OpenCodeSchemaAdapter 读取 SQLite 增量变化,构造 PluginEvent 并委托给 EventSynchronizer。
5
+ * 基于真实 OpenCode 数据库结构编写:
6
+ * - session: 扁平列 (id, title, time_created, agent, model)
7
+ * - message: data TEXT (JSON) → role, agent, modelID, tokens, time
8
+ * - part: data TEXT (JSON) → type(text/tool), tool, callID, state
9
+ * - event: data TEXT (JSON), type, aggregate_id, seq
10
+ */
11
+ import { Pool } from 'pg';
12
+ import { EventSynchronizer } from './event-synchronizer';
13
+ export interface DBPollingConfig {
14
+ intervalMs: number;
15
+ backoffBaseMs: number;
16
+ backoffMaxMs: number;
17
+ }
18
+ export declare class OpenCodeDBPollingSource {
19
+ private pool;
20
+ private synchronizer;
21
+ private config;
22
+ private adapter;
23
+ private timer;
24
+ private lastSyncTime;
25
+ private currentInterval;
26
+ private knownSessions;
27
+ constructor(pool: Pool, synchronizer: EventSynchronizer, config?: Partial<DBPollingConfig>);
28
+ start(): Promise<void>;
29
+ stop(): void;
30
+ private sync;
31
+ private event;
32
+ }
33
+ //# 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;;;;;;;;;GASG;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,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB;AAQD,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,aAAa,CAAqB;gBAE9B,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAQpF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B,IAAI,IAAI,IAAI;YAKE,IAAI;IAqDlB,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,104 @@
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
+ backoffBaseMs: 1000,
10
+ backoffMaxMs: 60000,
11
+ };
12
+ class OpenCodeDBPollingSource {
13
+ pool;
14
+ synchronizer;
15
+ config;
16
+ adapter;
17
+ timer = null;
18
+ lastSyncTime = 0;
19
+ currentInterval;
20
+ knownSessions = new Set();
21
+ constructor(pool, synchronizer, config) {
22
+ this.pool = pool;
23
+ this.synchronizer = synchronizer;
24
+ this.config = { ...DEFAULT_CONFIG, ...config };
25
+ this.adapter = new opencode_schema_adapter_1.OpenCodeSchemaAdapter();
26
+ this.currentInterval = this.config.intervalMs;
27
+ }
28
+ async start() {
29
+ if (!this.adapter.connect()) {
30
+ logger.warn('SQLite not available, polling disabled');
31
+ return;
32
+ }
33
+ // Load known sessions from PG
34
+ try {
35
+ const result = await this.pool.query('SELECT opencode_session_id FROM session_map');
36
+ for (const row of result.rows)
37
+ this.knownSessions.add(row.opencode_session_id);
38
+ }
39
+ catch { }
40
+ logger.info('DB polling started', { interval: this.config.intervalMs, knownSessions: this.knownSessions.size });
41
+ this.timer = setInterval(() => this.sync(), this.currentInterval);
42
+ }
43
+ stop() {
44
+ if (this.timer) {
45
+ clearInterval(this.timer);
46
+ this.timer = null;
47
+ }
48
+ this.adapter.close();
49
+ }
50
+ async sync() {
51
+ if (!this.adapter.isConnected() && !this.adapter.connect())
52
+ return;
53
+ try {
54
+ // 1. Sync new sessions
55
+ const sessions = this.adapter.getRecentSessions();
56
+ for (const s of sessions) {
57
+ if (!this.knownSessions.has(s.id)) {
58
+ this.knownSessions.add(s.id);
59
+ await this.synchronizer.handleEvent(this.event('session.created', s.id, { title: s.title, agent: s.agent }));
60
+ }
61
+ }
62
+ // 2. Sync recent messages (parse from JSON)
63
+ const messages = this.adapter.getRecentMessages(this.lastSyncTime || undefined);
64
+ for (const m of messages) {
65
+ if (!this.knownSessions.has(m.session_id))
66
+ continue;
67
+ const role = m.meta?.role || 'unknown';
68
+ const agent = m.meta?.agent || m.meta?.modelID || undefined;
69
+ // Emit message.updated event
70
+ await this.synchronizer.handleEvent(this.event('message.updated', m.session_id, {
71
+ message: { id: m.id, role, agent },
72
+ message_id: m.id,
73
+ }));
74
+ // 3. For each message, check its parts for tool calls
75
+ const toolCalls = this.adapter.getToolCallsByMessage(m.id);
76
+ for (const tc of toolCalls) {
77
+ await this.synchronizer.handleEvent(this.event('tool.execute.after', m.session_id, {
78
+ toolName: tc.tool || 'unknown',
79
+ callID: tc.callID,
80
+ result: {
81
+ success: tc.state?.status === 'completed',
82
+ data: tc.state?.output,
83
+ error: tc.state?.status === 'failed' ? tc.state?.output : undefined,
84
+ },
85
+ executionTimeMs: 0,
86
+ parameters: tc.state?.input || {},
87
+ }));
88
+ }
89
+ }
90
+ this.lastSyncTime = Date.now();
91
+ this.currentInterval = this.config.intervalMs; // Reset on success
92
+ }
93
+ catch (err) {
94
+ logger.warn('DB polling sync failed', { error: err.message });
95
+ this.currentInterval = Math.min(this.currentInterval * 2, this.config.backoffMaxMs);
96
+ logger.info('Backing off', { nextInterval: this.currentInterval });
97
+ }
98
+ }
99
+ event(type, sessionId, data) {
100
+ return { id: `${type}:${sessionId}:${Date.now()}`, type, sessionId, timestamp: Date.now(), version: 1, source: 'poll', data };
101
+ }
102
+ }
103
+ exports.OpenCodeDBPollingSource = OpenCodeDBPollingSource;
104
+ //# 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,100 @@
1
+ export interface SQLiteSession {
2
+ id: string;
3
+ title?: string;
4
+ time_created?: number;
5
+ agent?: string;
6
+ model?: string;
7
+ }
8
+ /** 从 message.data JSON 中解析出的消息元数据 */
9
+ export interface ParsedMessageMeta {
10
+ role?: string;
11
+ agent?: string;
12
+ modelID?: string;
13
+ providerID?: string;
14
+ mode?: string;
15
+ variant?: string;
16
+ tokens?: {
17
+ input: number;
18
+ output: number;
19
+ total: number;
20
+ reasoning: number;
21
+ cache: {
22
+ read: number;
23
+ write: number;
24
+ };
25
+ };
26
+ cost?: number;
27
+ finish?: string;
28
+ time?: {
29
+ created: number;
30
+ completed?: number;
31
+ };
32
+ parentID?: string;
33
+ }
34
+ /** part.data JSON 中解析出的事件 */
35
+ export interface ParsedPart {
36
+ type: 'text' | 'tool' | 'image' | 'audio' | 'reasoning';
37
+ text?: string;
38
+ tool?: string;
39
+ callID?: string;
40
+ state?: {
41
+ status: string;
42
+ input?: Record<string, any>;
43
+ output?: any;
44
+ filepath?: string;
45
+ };
46
+ synthetic?: boolean;
47
+ time?: {
48
+ start: number;
49
+ end?: number;
50
+ };
51
+ }
52
+ export declare class OpenCodeSchemaAdapter {
53
+ private db;
54
+ private path;
55
+ private drizzleVersion;
56
+ constructor(customPath?: string);
57
+ connect(): boolean;
58
+ private detectDrizzleVersion;
59
+ isConnected(): boolean;
60
+ getDrizzleVersion(): number;
61
+ getRecentSessions(): SQLiteSession[];
62
+ getSessionById(id: string): SQLiteSession | null;
63
+ /** 从 message.data JSON 中解析元数据 */
64
+ parseMessageMeta(raw: string): ParsedMessageMeta | null;
65
+ /** 获取指定会话的全部消息(含 JSON 解析) */
66
+ getMessagesBySession(sessionId: string): Array<{
67
+ id: string;
68
+ meta: ParsedMessageMeta | null;
69
+ }>;
70
+ /** 获取增量消息(time_created > sinceTime) */
71
+ getRecentMessages(sinceTime?: number): Array<{
72
+ id: string;
73
+ session_id: string;
74
+ meta: ParsedMessageMeta | null;
75
+ }>;
76
+ /** 从 part.data JSON 中解析出部件信息 */
77
+ parsePart(raw: string): ParsedPart | null;
78
+ /** 获取指定消息的全部部件 */
79
+ getPartsByMessage(messageId: string): ParsedPart[];
80
+ /** 获取指定消息中的工具调用部件 */
81
+ getToolCallsByMessage(messageId: string): ParsedPart[];
82
+ /** 获取指定会话的全部工具调用(两段式:message → part) */
83
+ getToolCallsBySession(sessionId: string): Array<{
84
+ messageId: string;
85
+ tool: string;
86
+ callID?: string;
87
+ input?: any;
88
+ output?: any;
89
+ status?: string;
90
+ }>;
91
+ /** 检查数据库是否可访问 */
92
+ healthCheck(): {
93
+ ok: boolean;
94
+ drizzleVersion: number;
95
+ sessionCount: number;
96
+ messageCount: number;
97
+ };
98
+ close(): void;
99
+ }
100
+ //# 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":"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"}