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.
- package/dist/cli.js +21 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -20981
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.js +26 -6
- package/dist/mcp-server.js.map +1 -0
- package/dist/src/cache/semantic-cache.js +399 -0
- package/dist/src/cache/semantic-cache.js.map +1 -0
- package/dist/src/cli.js +404 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +5 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +89 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/db/init-db.js +545 -0
- package/dist/src/db/init-db.js.map +1 -0
- package/dist/src/hooks/message-part-updated.js +203 -0
- package/dist/src/hooks/message-part-updated.js.map +1 -0
- package/dist/src/hooks/message-updated.js +347 -0
- package/dist/src/hooks/message-updated.js.map +1 -0
- package/dist/src/hooks/session-compacting.js +179 -0
- package/dist/src/hooks/session-compacting.js.map +1 -0
- package/dist/src/hooks/session-completed.js +337 -0
- package/dist/src/hooks/session-completed.js.map +1 -0
- package/dist/src/hooks/session-created.js +206 -0
- package/dist/src/hooks/session-created.js.map +1 -0
- package/dist/src/hooks/tool-execute.js +267 -0
- package/dist/src/hooks/tool-execute.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +643 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/mcp/hindsight-reflect-omo.js +318 -0
- package/dist/src/mcp/hindsight-reflect-omo.js.map +1 -0
- package/dist/src/mcp/hindsight-reflect.js +838 -0
- package/dist/src/mcp/hindsight-reflect.js.map +1 -0
- package/dist/src/mcp/recall-memory-omo.js +263 -0
- package/dist/src/mcp/recall-memory-omo.js.map +1 -0
- package/dist/src/mcp/recall-memory.d.ts +6 -0
- package/dist/src/mcp/recall-memory.d.ts.map +1 -1
- package/dist/src/mcp/recall-memory.js +900 -0
- package/dist/src/mcp/recall-memory.js.map +1 -0
- package/dist/src/omo/adapter.js +583 -0
- package/dist/src/omo/adapter.js.map +1 -0
- package/dist/src/omo/types.js +44 -0
- package/dist/src/omo/types.js.map +1 -0
- package/dist/src/services/db-polling.d.ts +30 -0
- package/dist/src/services/db-polling.d.ts.map +1 -0
- package/dist/src/services/db-polling.js +97 -0
- package/dist/src/services/db-polling.js.map +1 -0
- package/dist/src/services/event-synchronizer.d.ts +15 -0
- package/dist/src/services/event-synchronizer.d.ts.map +1 -0
- package/dist/src/services/event-synchronizer.js +119 -0
- package/dist/src/services/event-synchronizer.js.map +1 -0
- package/dist/src/services/keyword.js +29 -0
- package/dist/src/services/keyword.js.map +1 -0
- package/dist/src/services/logger.js +42 -0
- package/dist/src/services/logger.js.map +1 -0
- package/dist/src/services/opencode-schema-adapter.d.ts +34 -0
- package/dist/src/services/opencode-schema-adapter.d.ts.map +1 -0
- package/dist/src/services/opencode-schema-adapter.js +96 -0
- package/dist/src/services/opencode-schema-adapter.js.map +1 -0
- package/dist/src/services/privacy.js +23 -0
- package/dist/src/services/privacy.js.map +1 -0
- package/dist/src/topic/segment-manager.js +447 -0
- package/dist/src/topic/segment-manager.js.map +1 -0
- package/dist/src/types.d.ts +20 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +8 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/embedding.js +180 -0
- package/dist/src/utils/embedding.js.map +1 -0
- package/dist/src/utils/token-budget.js +152 -0
- package/dist/src/utils/token-budget.js.map +1 -0
- 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":";;;AACA,qCAAwC;AAExC,8DAAgE;AAChE,kEAAoE;AACpE,oEAA8F;AAC9F,8DAAgE;AAChE,wDAAwF;AAExF,MAAa,iBAAiB;IACpB,IAAI,CAAO;IACX,MAAM,CAA0B;IAChC,QAAQ,GAAwB,IAAI,GAAG,EAAE,CAAC,CAAE,sBAAsB;IAClE,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,GAAG,IAAA,qBAAY,EAAC,YAAY,CAAC,CAAC;IAE5C,YAAY,IAAU,EAAE,SAA2C,EAAE;QACnE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG;YACZ,IAAI,EAAE,QAAQ;YACd,iBAAiB,EAAE,IAAI;YACvB,gBAAgB,EAAE,CAAC;YACnB,gBAAgB,EAAE,EAAE;YACpB,kBAAkB,EAAE,IAAI;YACxB,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAkB;QAClC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,oBAAoB;QACpB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO;QACzE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO;QAExE,iCAAiC;QACjC,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC3D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAExC,8CAA8C;QAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YAClC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnC,IAAI,CAAC,GAAG,MAAM;oBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,IAAI,SAAS,GAAiB,IAAI,CAAC;QACnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE,CAAC;YACzE,IAAI,CAAC;gBACH,wCAAwC;gBACxC,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAEnC,mBAAmB;gBACnB,MAAM,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEhC,oDAAoD;gBACpD,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC;oBACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAClC,mHAAmH,EACnH,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CACjC,CAAC;oBACF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;wBACpE,2BAA2B;wBAC3B,SAAS,GAAG,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;wBACjE,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;wBACtE,SAAS;oBACX,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;gBAChG,OAAO;YAET,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,SAAS,GAAG,GAAG,CAAC;gBAChB,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;oBAC3C,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE;YACzD,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO;SACxE,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,KAAkB;QAC/C,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CACnB,kFAAkF,EAClF,CAAC,KAAK,CAAC,SAAS,CAAC,CAClB,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,IAAqB;QACtC,MAAM,QAAQ,GAAsE;YAClF,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBAChC,MAAM,IAAA,sCAAoB,EACxB,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAC/H,EAAE,OAAO,EAAE,EAAE,EAAE,EACf,CAAC,EACD,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,CAC7D,CAAC;YACJ,CAAC;YACD,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBAClC,MAAM,IAAA,0CAAsB,EAC1B,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,IAAI,EAAE,YAAY,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EACxI,EAAE,EACF,CAAC,EACD,EAAE,CACH,CAAC;YACJ,CAAC;YACD,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBAClC,MAAM,IAAA,2CAAsB,EAC1B,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,kBAAkB,EAAE,OAAO,EAAE,EACjH,EAAE,EACF,CAAC,CACF,CAAC;YACJ,CAAC;YACD,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBAChC,MAAM,IAAA,sCAAoB,EACxB,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,EAChE,EAAE,EACF,CAAC,CACF,CAAC;YACJ,CAAC;YACD,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpC,MAAM,IAAA,sCAAuB,EAC3B,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,EAAE,EAC/I,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE,EAAE,EACxC,CAAC,CACF,CAAC;YACJ,CAAC;YACD,oBAAoB,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBACnC,MAAM,IAAA,qCAAsB,EAC1B,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,eAAe,IAAI,CAAC,EAAE,EAC3O,EAAE,EACF,CAAC,CACF,CAAC;YACJ,CAAC;SACF,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAChC,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;CACF;AArJD,8CAqJC"}
|
|
@@ -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"}
|