claude-mem-opencode 0.0.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.
- package/README.md +391 -0
- package/dist/bundle/claude-mem-opencode.js +542 -0
- package/dist/bundle/index.d.ts +13 -0
- package/dist/bundle/index.d.ts.map +1 -0
- package/dist/bundle/index.js.map +1 -0
- package/dist/bundle/package.json +10 -0
- package/dist/bundle/skill/SKILL.md +118 -0
- package/dist/bundle/skill/operations/search.md +178 -0
- package/dist/bundle/skill/operations/timeline.md +269 -0
- package/dist/bundle/skill/operations/workflow.md +375 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +164 -0
- package/dist/cli.js.map +1 -0
- package/dist/integration/context-injector.d.ts +19 -0
- package/dist/integration/context-injector.d.ts.map +1 -0
- package/dist/integration/context-injector.js +47 -0
- package/dist/integration/context-injector.js.map +1 -0
- package/dist/integration/event-listeners.d.ts +41 -0
- package/dist/integration/event-listeners.d.ts.map +1 -0
- package/dist/integration/event-listeners.js +156 -0
- package/dist/integration/event-listeners.js.map +1 -0
- package/dist/integration/index.d.ts +66 -0
- package/dist/integration/index.d.ts.map +1 -0
- package/dist/integration/index.js +127 -0
- package/dist/integration/index.js.map +1 -0
- package/dist/integration/session-mapper.d.ts +39 -0
- package/dist/integration/session-mapper.d.ts.map +1 -0
- package/dist/integration/session-mapper.js +63 -0
- package/dist/integration/session-mapper.js.map +1 -0
- package/dist/integration/test.d.ts +6 -0
- package/dist/integration/test.d.ts.map +1 -0
- package/dist/integration/test.js +73 -0
- package/dist/integration/test.js.map +1 -0
- package/dist/integration/utils/logger.d.ts +15 -0
- package/dist/integration/utils/logger.d.ts.map +1 -0
- package/dist/integration/utils/logger.js +26 -0
- package/dist/integration/utils/logger.js.map +1 -0
- package/dist/integration/utils/privacy.d.ts +32 -0
- package/dist/integration/utils/privacy.d.ts.map +1 -0
- package/dist/integration/utils/privacy.js +62 -0
- package/dist/integration/utils/privacy.js.map +1 -0
- package/dist/integration/utils/project-name.d.ts +16 -0
- package/dist/integration/utils/project-name.d.ts.map +1 -0
- package/dist/integration/utils/project-name.js +28 -0
- package/dist/integration/utils/project-name.js.map +1 -0
- package/dist/integration/version-checker.d.ts +52 -0
- package/dist/integration/version-checker.d.ts.map +1 -0
- package/dist/integration/version-checker.js +121 -0
- package/dist/integration/version-checker.js.map +1 -0
- package/dist/integration/worker-client.d.ts +94 -0
- package/dist/integration/worker-client.d.ts.map +1 -0
- package/dist/integration/worker-client.js +188 -0
- package/dist/integration/worker-client.js.map +1 -0
- package/dist/test.d.ts +6 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +73 -0
- package/dist/test.js.map +1 -0
- package/package.json +69 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscribe to OpenCode Bus events and bridge to claude-mem
|
|
3
|
+
* Adapted to use real OpenCode APIs (with fallback for testing)
|
|
4
|
+
*/
|
|
5
|
+
import { SessionMapper } from './session-mapper.js';
|
|
6
|
+
import { ProjectNameExtractor } from './utils/project-name.js';
|
|
7
|
+
import { PrivacyTagStripper } from './utils/privacy.js';
|
|
8
|
+
let Bus = null;
|
|
9
|
+
let Session = null;
|
|
10
|
+
let MessageV2 = null;
|
|
11
|
+
try {
|
|
12
|
+
const busModule = await import('@/bus');
|
|
13
|
+
Bus = busModule.Bus;
|
|
14
|
+
const sessionModule = await import('@/session');
|
|
15
|
+
Session = sessionModule.Session;
|
|
16
|
+
MessageV2 = sessionModule.MessageV2;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
console.log('[EVENT_LISTENERS] OpenCode APIs not available - running in standalone mode');
|
|
20
|
+
}
|
|
21
|
+
export class EventListeners {
|
|
22
|
+
workerClient;
|
|
23
|
+
sessionMapper;
|
|
24
|
+
projectNameExtractor;
|
|
25
|
+
privacyStripper;
|
|
26
|
+
promptNumberTracker = new Map();
|
|
27
|
+
constructor(workerClient) {
|
|
28
|
+
this.workerClient = workerClient;
|
|
29
|
+
this.sessionMapper = new SessionMapper();
|
|
30
|
+
this.projectNameExtractor = new ProjectNameExtractor();
|
|
31
|
+
this.privacyStripper = new PrivacyTagStripper();
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Subscribe to all relevant OpenCode events using real Bus API
|
|
35
|
+
*/
|
|
36
|
+
async initialize() {
|
|
37
|
+
if (!Bus || !Session || !MessageV2) {
|
|
38
|
+
console.log('[EVENT_LISTENERS] OpenCode APIs not available - event listeners will be initialized via manual calls');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
console.log('[EVENT_LISTENERS] Initializing OpenCode event listeners...');
|
|
42
|
+
Bus.subscribe(Session.Event.Created, this.handleSessionCreated.bind(this));
|
|
43
|
+
Bus.subscribe(MessageV2.Event.PartUpdated, this.handleMessagePartUpdated.bind(this));
|
|
44
|
+
Bus.subscribe(Session.Event.Updated, this.handleSessionUpdated.bind(this));
|
|
45
|
+
console.log('[EVENT_LISTENERS] Subscribed to OpenCode Bus events');
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Handle session creation - initialize claude-mem session
|
|
49
|
+
* Uses real Session.Info from OpenCode
|
|
50
|
+
*/
|
|
51
|
+
async handleSessionCreated(event) {
|
|
52
|
+
const { info } = event.properties;
|
|
53
|
+
const project = this.projectNameExtractor.extract(info.directory);
|
|
54
|
+
const openCodeSessionId = info.id;
|
|
55
|
+
const title = info.title || 'New session';
|
|
56
|
+
console.log(`[EVENT_LISTENERS] Session created: ${openCodeSessionId}`);
|
|
57
|
+
try {
|
|
58
|
+
const response = await this.workerClient.initSession({
|
|
59
|
+
contentSessionId: openCodeSessionId,
|
|
60
|
+
project,
|
|
61
|
+
prompt: title
|
|
62
|
+
});
|
|
63
|
+
if (response.skipped) {
|
|
64
|
+
console.log(`[EVENT_LISTENERS] Session marked as private: ${openCodeSessionId}`);
|
|
65
|
+
console.log(`[EVENT_LISTENERS] Reason: ${response.reason}`);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
this.sessionMapper.mapOpenCodeToClaudeMem(openCodeSessionId, response.sessionDbId);
|
|
69
|
+
this.promptNumberTracker.set(openCodeSessionId, response.promptNumber);
|
|
70
|
+
console.log(`[EVENT_LISTENERS] Mapped ${openCodeSessionId} → ${response.sessionDbId}`);
|
|
71
|
+
console.log(`[EVENT_LISTENERS] Project: ${project}, Prompt #${response.promptNumber}`);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
console.error(`[EVENT_LISTENERS] Failed to initialize session ${openCodeSessionId}:`, error);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Handle message part updates - capture tool usage
|
|
79
|
+
* Uses real MessageV2.Part from OpenCode
|
|
80
|
+
*/
|
|
81
|
+
async handleMessagePartUpdated(event) {
|
|
82
|
+
const { part } = event.properties;
|
|
83
|
+
if (part.type !== 'tool_call') {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const toolName = part.name;
|
|
87
|
+
const toolArgs = part.args;
|
|
88
|
+
const toolResult = part.result || '';
|
|
89
|
+
const sessionId = part.sessionID;
|
|
90
|
+
const cwd = part.cwd || process.cwd();
|
|
91
|
+
const claudeMemSessionId = this.sessionMapper.getClaudeMemSessionId(sessionId);
|
|
92
|
+
if (!claudeMemSessionId) {
|
|
93
|
+
console.log(`[EVENT_LISTENERS] No claude-mem session for: ${sessionId}`);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const promptNumber = this.getPromptNumber(sessionId);
|
|
97
|
+
console.log(`[EVENT_LISTENERS] Tool usage: ${sessionId} - ${toolName}`);
|
|
98
|
+
try {
|
|
99
|
+
const strippedArgs = this.privacyStripper.stripFromJson(toolArgs);
|
|
100
|
+
const strippedResult = this.privacyStripper.stripFromText(toolResult);
|
|
101
|
+
await this.workerClient.addObservation({
|
|
102
|
+
sessionDbId: claudeMemSessionId,
|
|
103
|
+
promptNumber,
|
|
104
|
+
toolName,
|
|
105
|
+
toolInput: strippedArgs,
|
|
106
|
+
toolOutput: strippedResult,
|
|
107
|
+
cwd,
|
|
108
|
+
timestamp: Date.now()
|
|
109
|
+
});
|
|
110
|
+
console.log(`[EVENT_LISTENERS] Added observation: ${claudeMemSessionId} - ${toolName}`);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
console.error(`[EVENT_LISTENERS] Failed to add observation:`, error);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Handle session updates - check for completion
|
|
118
|
+
* Uses real Session.Info from OpenCode
|
|
119
|
+
*/
|
|
120
|
+
async handleSessionUpdated(event) {
|
|
121
|
+
const { info } = event.properties;
|
|
122
|
+
if (!info.time.archived) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const openCodeSessionId = info.id;
|
|
126
|
+
console.log(`[EVENT_LISTENERS] Session archived: ${openCodeSessionId}`);
|
|
127
|
+
const claudeMemSessionId = this.sessionMapper.getClaudeMemSessionId(openCodeSessionId);
|
|
128
|
+
if (!claudeMemSessionId) {
|
|
129
|
+
console.log(`[EVENT_LISTENERS] No claude-mem session for: ${openCodeSessionId}`);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
try {
|
|
133
|
+
await this.workerClient.completeSession(claudeMemSessionId);
|
|
134
|
+
console.log(`[EVENT_LISTENERS] Completed session: ${claudeMemSessionId}`);
|
|
135
|
+
this.sessionMapper.unmapSession(openCodeSessionId);
|
|
136
|
+
this.promptNumberTracker.delete(openCodeSessionId);
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
console.error(`[EVENT_LISTENERS] Failed to complete session:`, error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get current prompt number for a session
|
|
144
|
+
*/
|
|
145
|
+
getPromptNumber(sessionId) {
|
|
146
|
+
return this.promptNumberTracker.get(sessionId) ?? 1;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Increment prompt number for a session
|
|
150
|
+
*/
|
|
151
|
+
incrementPromptNumber(sessionId) {
|
|
152
|
+
const current = this.promptNumberTracker.get(sessionId) ?? 1;
|
|
153
|
+
this.promptNumberTracker.set(sessionId, current + 1);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=event-listeners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-listeners.js","sourceRoot":"","sources":["../../src/integration/event-listeners.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main entry point for claude-mem OpenCode integration
|
|
3
|
+
* Initializes worker client, event listeners, and context injection
|
|
4
|
+
*/
|
|
5
|
+
import { WorkerClient } from './worker-client.js';
|
|
6
|
+
import { EventListeners } from './event-listeners.js';
|
|
7
|
+
import { ContextInjector } from './context-injector.js';
|
|
8
|
+
export declare class ClaudeMemIntegration {
|
|
9
|
+
private workerClient;
|
|
10
|
+
private eventListeners;
|
|
11
|
+
private contextInjector;
|
|
12
|
+
private projectNameExtractor;
|
|
13
|
+
private logger;
|
|
14
|
+
private initialized;
|
|
15
|
+
private memoryAvailable;
|
|
16
|
+
constructor(workerUrl?: string);
|
|
17
|
+
/**
|
|
18
|
+
* Initialize integration
|
|
19
|
+
*/
|
|
20
|
+
initialize(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Get integration status
|
|
23
|
+
*/
|
|
24
|
+
getStatus(): Promise<{
|
|
25
|
+
initialized: boolean;
|
|
26
|
+
workerReady: boolean;
|
|
27
|
+
workerUrl: string;
|
|
28
|
+
currentProject: string;
|
|
29
|
+
}>;
|
|
30
|
+
/**
|
|
31
|
+
* Get project context
|
|
32
|
+
*/
|
|
33
|
+
getProjectContext(project?: string): Promise<string | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Search memories
|
|
36
|
+
*/
|
|
37
|
+
searchMemory(query: string, options?: {
|
|
38
|
+
limit?: number;
|
|
39
|
+
type?: 'all' | 'code' | 'file' | 'web' | 'bash';
|
|
40
|
+
project?: string;
|
|
41
|
+
}): Promise<any>;
|
|
42
|
+
/**
|
|
43
|
+
* Shutdown integration
|
|
44
|
+
*/
|
|
45
|
+
shutdown(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Get worker client (for advanced usage)
|
|
48
|
+
*/
|
|
49
|
+
getWorkerClient(): WorkerClient;
|
|
50
|
+
/**
|
|
51
|
+
* Get event listeners (for advanced usage)
|
|
52
|
+
*/
|
|
53
|
+
getEventListeners(): EventListeners;
|
|
54
|
+
/**
|
|
55
|
+
* Get context injector (for advanced usage)
|
|
56
|
+
*/
|
|
57
|
+
getContextInjector(): ContextInjector;
|
|
58
|
+
/**
|
|
59
|
+
* Check if memory features are available
|
|
60
|
+
*/
|
|
61
|
+
isMemoryAvailable(): boolean;
|
|
62
|
+
}
|
|
63
|
+
declare const defaultInstance: ClaudeMemIntegration;
|
|
64
|
+
export default ClaudeMemIntegration;
|
|
65
|
+
export { defaultInstance };
|
|
66
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integration/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAMvD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,WAAW,CAAiB;IACpC,OAAO,CAAC,eAAe,CAAiB;gBAE5B,SAAS,GAAE,MAAiC;IAYxD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BjC;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC;QACzB,WAAW,EAAE,OAAO,CAAA;QACpB,WAAW,EAAE,OAAO,CAAA;QACpB,SAAS,EAAE,MAAM,CAAA;QACjB,cAAc,EAAE,MAAM,CAAA;KACvB,CAAC;IAYF;;OAEG;IACG,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUjE;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA;QAC/C,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,GAAG,OAAO,CAAC,GAAG,CAAC;IAShB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;OAEG;IACH,eAAe,IAAI,YAAY;IAI/B;;OAEG;IACH,iBAAiB,IAAI,cAAc;IAInC;;OAEG;IACH,kBAAkB,IAAI,eAAe;IAIrC;;OAEG;IACH,iBAAiB,IAAI,OAAO;CAG7B;AAGD,QAAA,MAAM,eAAe,sBAA6B,CAAA;AAGlD,eAAe,oBAAoB,CAAA;AACnC,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main entry point for claude-mem OpenCode integration
|
|
3
|
+
* Initializes worker client, event listeners, and context injection
|
|
4
|
+
*/
|
|
5
|
+
import { WorkerClient } from './worker-client.js';
|
|
6
|
+
import { EventListeners } from './event-listeners.js';
|
|
7
|
+
import { ContextInjector } from './context-injector.js';
|
|
8
|
+
import { ProjectNameExtractor } from './utils/project-name.js';
|
|
9
|
+
import { Logger } from './utils/logger.js';
|
|
10
|
+
export class ClaudeMemIntegration {
|
|
11
|
+
workerClient;
|
|
12
|
+
eventListeners;
|
|
13
|
+
contextInjector;
|
|
14
|
+
projectNameExtractor;
|
|
15
|
+
logger;
|
|
16
|
+
initialized = false;
|
|
17
|
+
memoryAvailable = false;
|
|
18
|
+
constructor(workerUrl = 'http://localhost:37777') {
|
|
19
|
+
this.workerClient = new WorkerClient(workerUrl.includes('localhost') ?
|
|
20
|
+
parseInt(workerUrl.split(':')[1] || '37777') :
|
|
21
|
+
37777);
|
|
22
|
+
this.eventListeners = new EventListeners(this.workerClient);
|
|
23
|
+
this.contextInjector = new ContextInjector(this.workerClient);
|
|
24
|
+
this.projectNameExtractor = new ProjectNameExtractor();
|
|
25
|
+
this.logger = new Logger('CLAUDE_MEM');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Initialize integration
|
|
29
|
+
*/
|
|
30
|
+
async initialize() {
|
|
31
|
+
if (this.initialized) {
|
|
32
|
+
console.log('[CLAUDE_MEM] Integration already initialized');
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
console.log('[CLAUDE_MEM] Initializing claude-mem integration...');
|
|
37
|
+
console.log(`[CLAUDE_MEM] Worker port: ${this.workerClient.getPort() || '37777'}`);
|
|
38
|
+
const ready = await this.workerClient.waitForReady(30000);
|
|
39
|
+
if (!ready) {
|
|
40
|
+
throw new Error('Worker service not ready after 30s. Is worker running?');
|
|
41
|
+
}
|
|
42
|
+
console.log('[CLAUDE_MEM] Worker service is ready');
|
|
43
|
+
await this.eventListeners.initialize();
|
|
44
|
+
this.initialized = true;
|
|
45
|
+
this.memoryAvailable = true;
|
|
46
|
+
console.log('[CLAUDE_MEM] Integration initialized successfully');
|
|
47
|
+
console.log('[CLAUDE_MEM] Project:', this.projectNameExtractor.getCurrentProject());
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('[CLAUDE_MEM] Initialization failed:', error);
|
|
51
|
+
console.warn('[CLAUDE_MEM] Continuing anyway, but expect potential issues');
|
|
52
|
+
this.memoryAvailable = false;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get integration status
|
|
57
|
+
*/
|
|
58
|
+
async getStatus() {
|
|
59
|
+
const workerReady = this.memoryAvailable &&
|
|
60
|
+
(await this.workerClient.healthCheck());
|
|
61
|
+
return {
|
|
62
|
+
initialized: this.initialized,
|
|
63
|
+
workerReady,
|
|
64
|
+
currentProject: this.projectNameExtractor.getCurrentProject(),
|
|
65
|
+
workerUrl: `http://localhost:${this.workerClient.getPort() || '37777'}`
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Get project context
|
|
70
|
+
*/
|
|
71
|
+
async getProjectContext(project) {
|
|
72
|
+
if (!this.memoryAvailable) {
|
|
73
|
+
this.logger.warn('Memory features are not available');
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
const projectToUse = project || this.projectNameExtractor.getCurrentProject();
|
|
77
|
+
return this.contextInjector.injectContext(projectToUse);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Search memories
|
|
81
|
+
*/
|
|
82
|
+
async searchMemory(query, options) {
|
|
83
|
+
if (!this.memoryAvailable) {
|
|
84
|
+
this.logger.warn('Memory features are not available');
|
|
85
|
+
throw new Error('Memory features not available');
|
|
86
|
+
}
|
|
87
|
+
return this.workerClient.search(query, options);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Shutdown integration
|
|
91
|
+
*/
|
|
92
|
+
async shutdown() {
|
|
93
|
+
this.logger.info('Shutting down integration');
|
|
94
|
+
this.initialized = false;
|
|
95
|
+
this.memoryAvailable = false;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get worker client (for advanced usage)
|
|
99
|
+
*/
|
|
100
|
+
getWorkerClient() {
|
|
101
|
+
return this.workerClient;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get event listeners (for advanced usage)
|
|
105
|
+
*/
|
|
106
|
+
getEventListeners() {
|
|
107
|
+
return this.eventListeners;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get context injector (for advanced usage)
|
|
111
|
+
*/
|
|
112
|
+
getContextInjector() {
|
|
113
|
+
return this.contextInjector;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if memory features are available
|
|
117
|
+
*/
|
|
118
|
+
isMemoryAvailable() {
|
|
119
|
+
return this.memoryAvailable;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Create singleton instance for convenience
|
|
123
|
+
const defaultInstance = new ClaudeMemIntegration();
|
|
124
|
+
// Export the class as default, and the singleton as a named export
|
|
125
|
+
export default ClaudeMemIntegration;
|
|
126
|
+
export { defaultInstance };
|
|
127
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integration/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map OpenCode session IDs to claude-mem session IDs
|
|
3
|
+
*/
|
|
4
|
+
export declare class SessionMapper {
|
|
5
|
+
private mapping;
|
|
6
|
+
/**
|
|
7
|
+
* Map OpenCode session ID to claude-mem session ID
|
|
8
|
+
*/
|
|
9
|
+
mapOpenCodeToClaudeMem(openCodeSessionId: string, claudeMemSessionId: number): void;
|
|
10
|
+
/**
|
|
11
|
+
* Get claude-mem session ID for OpenCode session
|
|
12
|
+
*/
|
|
13
|
+
getClaudeMemSessionId(openCodeSessionId: string): number | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Get OpenCode session ID for claude-mem session
|
|
16
|
+
*/
|
|
17
|
+
getOpenCodeSessionId(claudeMemSessionId: number): string | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Remove session mapping
|
|
20
|
+
*/
|
|
21
|
+
unmapSession(openCodeSessionId: string): void;
|
|
22
|
+
/**
|
|
23
|
+
* Get all mappings
|
|
24
|
+
*/
|
|
25
|
+
getAllMappings(): Map<string, number>;
|
|
26
|
+
/**
|
|
27
|
+
* Check if session is mapped
|
|
28
|
+
*/
|
|
29
|
+
hasSession(openCodeSessionId: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Get number of mappings
|
|
32
|
+
*/
|
|
33
|
+
size(): number;
|
|
34
|
+
/**
|
|
35
|
+
* Clear all mappings
|
|
36
|
+
*/
|
|
37
|
+
clear(): void;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=session-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-mapper.d.ts","sourceRoot":"","sources":["../../src/integration/session-mapper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAiC;IAEhD;;OAEG;IACH,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,IAAI;IAKnF;;OAEG;IACH,qBAAqB,CAAC,iBAAiB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIpE;;OAEG;IACH,oBAAoB,CAAC,kBAAkB,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASpE;;OAEG;IACH,YAAY,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAK7C;;OAEG;IACH,cAAc,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAIrC;;OAEG;IACH,UAAU,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO;IAI9C;;OAEG;IACH,IAAI,IAAI,MAAM;IAId;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map OpenCode session IDs to claude-mem session IDs
|
|
3
|
+
*/
|
|
4
|
+
export class SessionMapper {
|
|
5
|
+
mapping = new Map();
|
|
6
|
+
/**
|
|
7
|
+
* Map OpenCode session ID to claude-mem session ID
|
|
8
|
+
*/
|
|
9
|
+
mapOpenCodeToClaudeMem(openCodeSessionId, claudeMemSessionId) {
|
|
10
|
+
this.mapping.set(openCodeSessionId, claudeMemSessionId);
|
|
11
|
+
console.log(`[SESSION_MAPPER] Mapped ${openCodeSessionId} → ${claudeMemSessionId}`);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get claude-mem session ID for OpenCode session
|
|
15
|
+
*/
|
|
16
|
+
getClaudeMemSessionId(openCodeSessionId) {
|
|
17
|
+
return this.mapping.get(openCodeSessionId);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get OpenCode session ID for claude-mem session
|
|
21
|
+
*/
|
|
22
|
+
getOpenCodeSessionId(claudeMemSessionId) {
|
|
23
|
+
for (const [openCodeId, claudeMemId] of this.mapping.entries()) {
|
|
24
|
+
if (claudeMemId === claudeMemSessionId) {
|
|
25
|
+
return openCodeId;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Remove session mapping
|
|
32
|
+
*/
|
|
33
|
+
unmapSession(openCodeSessionId) {
|
|
34
|
+
this.mapping.delete(openCodeSessionId);
|
|
35
|
+
console.log(`[SESSION_MAPPER] Unmapped ${openCodeSessionId}`);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get all mappings
|
|
39
|
+
*/
|
|
40
|
+
getAllMappings() {
|
|
41
|
+
return new Map(this.mapping);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Check if session is mapped
|
|
45
|
+
*/
|
|
46
|
+
hasSession(openCodeSessionId) {
|
|
47
|
+
return this.mapping.has(openCodeSessionId);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get number of mappings
|
|
51
|
+
*/
|
|
52
|
+
size() {
|
|
53
|
+
return this.mapping.size;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Clear all mappings
|
|
57
|
+
*/
|
|
58
|
+
clear() {
|
|
59
|
+
this.mapping.clear();
|
|
60
|
+
console.log('[SESSION_MAPPER] Cleared all mappings');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=session-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-mapper.js","sourceRoot":"","sources":["../../src/integration/session-mapper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,aAAa;IAChB,OAAO,GAAwB,IAAI,GAAG,EAAE,CAAA;IAEhD;;OAEG;IACH,sBAAsB,CAAC,iBAAyB,EAAE,kBAA0B;QAC1E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAAA;QACvD,OAAO,CAAC,GAAG,CAAC,2BAA2B,iBAAiB,MAAM,kBAAkB,EAAE,CAAC,CAAA;IACrF,CAAC;IAED;;OAEG;IACH,qBAAqB,CAAC,iBAAyB;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAC5C,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,kBAA0B;QAC7C,KAAK,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/D,IAAI,WAAW,KAAK,kBAAkB,EAAE,CAAC;gBACvC,OAAO,UAAU,CAAA;YACnB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,iBAAyB;QACpC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAA;QACtC,OAAO,CAAC,GAAG,CAAC,6BAA6B,iBAAiB,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,iBAAyB;QAClC,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAC5C,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAA;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACpB,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;IACtD,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/integration/test.ts"],"names":[],"mappings":";AAEA;;GAEG"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Test script for claude-mem OpenCode integration
|
|
4
|
+
*/
|
|
5
|
+
import { ClaudeMemIntegration } from './index.js';
|
|
6
|
+
async function testIntegration() {
|
|
7
|
+
console.log('='.repeat(60));
|
|
8
|
+
console.log('claude-mem OpenCode Integration Test');
|
|
9
|
+
console.log('='.repeat(60));
|
|
10
|
+
console.log();
|
|
11
|
+
const integration = new ClaudeMemIntegration();
|
|
12
|
+
try {
|
|
13
|
+
// Test 1: Initialize integration
|
|
14
|
+
console.log('Test 1: Initializing integration...');
|
|
15
|
+
await integration.initialize();
|
|
16
|
+
console.log('✅ PASS: Integration initialized');
|
|
17
|
+
console.log();
|
|
18
|
+
// Test 2: Check status
|
|
19
|
+
console.log('Test 2: Getting integration status...');
|
|
20
|
+
const status = await integration.getStatus();
|
|
21
|
+
console.log('Status:');
|
|
22
|
+
console.log(` - Initialized: ${status.initialized}`);
|
|
23
|
+
console.log(` - Worker Ready: ${status.workerReady}`);
|
|
24
|
+
console.log(` - Project: ${status.currentProject}`);
|
|
25
|
+
console.log(` - Worker URL: ${status.workerUrl}`);
|
|
26
|
+
console.log('✅ PASS: Status retrieved');
|
|
27
|
+
console.log();
|
|
28
|
+
// Test 3: Get project context
|
|
29
|
+
console.log('Test 3: Getting project context...');
|
|
30
|
+
const context = await integration.getProjectContext();
|
|
31
|
+
if (context) {
|
|
32
|
+
console.log(`✅ PASS: Got context (${context.length} chars)`);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
console.log('⚠️ WARN: No context available (expected for new project)');
|
|
36
|
+
}
|
|
37
|
+
console.log();
|
|
38
|
+
// Test 4: Search memory
|
|
39
|
+
console.log('Test 4: Searching memory...');
|
|
40
|
+
try {
|
|
41
|
+
const searchResults = await integration.searchMemory('test');
|
|
42
|
+
console.log(`✅ PASS: Search returned ${Array.isArray(searchResults) ? searchResults.length : 'results'}`);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.log('⚠️ WARN: Search failed (expected for empty database)');
|
|
46
|
+
console.log(` Error: ${error}`);
|
|
47
|
+
}
|
|
48
|
+
console.log();
|
|
49
|
+
// Test 5: Shutdown
|
|
50
|
+
console.log('Test 5: Shutting down integration...');
|
|
51
|
+
await integration.shutdown();
|
|
52
|
+
console.log('✅ PASS: Integration shut down');
|
|
53
|
+
console.log();
|
|
54
|
+
console.log('='.repeat(60));
|
|
55
|
+
console.log('All tests completed!');
|
|
56
|
+
console.log('='.repeat(60));
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
console.error('❌ FAIL: Test failed');
|
|
61
|
+
console.error(` Error: ${error}`);
|
|
62
|
+
console.log();
|
|
63
|
+
console.log('Troubleshooting:');
|
|
64
|
+
console.log(' 1. Ensure worker is running: npm run worker:start');
|
|
65
|
+
console.log(' 2. Check worker health: curl http://localhost:37777/api/health');
|
|
66
|
+
console.log(' 3. Check worker logs: npm run worker:tail');
|
|
67
|
+
console.log();
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Run tests
|
|
72
|
+
testIntegration();
|
|
73
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/integration/test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare enum LogLevel {
|
|
2
|
+
DEBUG = 0,
|
|
3
|
+
INFO = 1,
|
|
4
|
+
WARN = 2,
|
|
5
|
+
ERROR = 3
|
|
6
|
+
}
|
|
7
|
+
export declare class Logger {
|
|
8
|
+
private context;
|
|
9
|
+
constructor(context: string);
|
|
10
|
+
debug(message: string, ...args: any[]): void;
|
|
11
|
+
info(message: string, ...args: any[]): void;
|
|
12
|
+
warn(message: string, ...args: any[]): void;
|
|
13
|
+
error(message: string, ...args: any[]): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/integration/utils/logger.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,qBAAa,MAAM;IACjB,OAAO,CAAC,OAAO,CAAQ;gBAEX,OAAO,EAAE,MAAM;IAI3B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIpC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAGtC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export var LogLevel;
|
|
2
|
+
(function (LogLevel) {
|
|
3
|
+
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
4
|
+
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
5
|
+
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
6
|
+
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
7
|
+
})(LogLevel || (LogLevel = {}));
|
|
8
|
+
export class Logger {
|
|
9
|
+
context;
|
|
10
|
+
constructor(context) {
|
|
11
|
+
this.context = context;
|
|
12
|
+
}
|
|
13
|
+
debug(message, ...args) {
|
|
14
|
+
console.log(`[${this.context}] [DEBUG] ${message}`, ...args);
|
|
15
|
+
}
|
|
16
|
+
info(message, ...args) {
|
|
17
|
+
console.log(`[${this.context}] [INFO] ${message}`, ...args);
|
|
18
|
+
}
|
|
19
|
+
warn(message, ...args) {
|
|
20
|
+
console.warn(`[${this.context}] [WARN] ${message}`, ...args);
|
|
21
|
+
}
|
|
22
|
+
error(message, ...args) {
|
|
23
|
+
console.error(`[${this.context}] [ERROR] ${message}`, ...args);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/integration/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,yCAAS,CAAA;IACT,uCAAQ,CAAA;IACR,uCAAQ,CAAA;IACR,yCAAS,CAAA;AACX,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB;AAED,MAAM,OAAO,MAAM;IACT,OAAO,CAAQ;IAEvB,YAAY,OAAe;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,aAAa,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;IAC9D,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,YAAY,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;IAC7D,CAAC;IAED,IAAI,CAAC,OAAe,EAAE,GAAG,IAAW;QAClC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,YAAY,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;IAC9D,CAAC;IAED,KAAK,CAAC,OAAe,EAAE,GAAG,IAAW;QACnC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,aAAa,OAAO,EAAE,EAAE,GAAG,IAAI,CAAC,CAAA;IAChE,CAAC;CACF"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip privacy tags from text and JSON
|
|
3
|
+
* Consistent with claude-mem's tag-stripping logic
|
|
4
|
+
*/
|
|
5
|
+
export declare class PrivacyTagStripper {
|
|
6
|
+
private readonly PRIVATE_TAG_REGEX;
|
|
7
|
+
private readonly CONTEXT_TAG_REGEX;
|
|
8
|
+
/**
|
|
9
|
+
* Strip privacy tags from text
|
|
10
|
+
*/
|
|
11
|
+
stripFromText(text: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Strip privacy tags from JSON (recursive)
|
|
14
|
+
*/
|
|
15
|
+
stripFromJson(obj: any): any;
|
|
16
|
+
/**
|
|
17
|
+
* Check if text contains only private content
|
|
18
|
+
*/
|
|
19
|
+
isFullyPrivate(text: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Check if text contains privacy tags
|
|
22
|
+
*/
|
|
23
|
+
hasPrivacyTags(text: string): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Count privacy tags in text
|
|
26
|
+
*/
|
|
27
|
+
countPrivacyTags(text: string): {
|
|
28
|
+
private: number;
|
|
29
|
+
context: number;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=privacy.d.ts.map
|