@xfabric/memory 0.2.10 → 0.2.11
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/flush/flush-agent.d.ts +42 -0
- package/dist/flush/flush-agent.d.ts.map +1 -0
- package/dist/flush/flush-agent.js +260 -0
- package/dist/flush/flush-agent.js.map +1 -0
- package/dist/flush/index.d.ts +6 -0
- package/dist/flush/index.d.ts.map +1 -0
- package/dist/flush/index.js +6 -0
- package/dist/flush/index.js.map +1 -0
- package/dist/flush/prompts.d.ts +38 -0
- package/dist/flush/prompts.d.ts.map +1 -0
- package/dist/flush/prompts.js +116 -0
- package/dist/flush/prompts.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/memory-manager.d.ts +38 -1
- package/dist/memory-manager.d.ts.map +1 -1
- package/dist/memory-manager.js +209 -1
- package/dist/memory-manager.js.map +1 -1
- package/dist/plugin/index.d.ts +3 -2
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +187 -40
- package/dist/plugin/index.js.map +1 -1
- package/dist/sync/index.d.ts +1 -0
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -0
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/opencode-session.d.ts +32 -0
- package/dist/sync/opencode-session.d.ts.map +1 -0
- package/dist/sync/opencode-session.js +283 -0
- package/dist/sync/opencode-session.js.map +1 -0
- package/dist/types.d.ts +179 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/dist/plugin/index.js
CHANGED
|
@@ -1,21 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* OpenCode plugin for semantic memory search
|
|
3
|
-
* Exposes memory_search, memory_get, and
|
|
4
|
-
* Includes memory flush trigger before session compaction
|
|
3
|
+
* Exposes memory_search, memory_get, memory_write, and memory_flush tools to AI agents
|
|
4
|
+
* Includes memory flush trigger before session compaction with LLM extraction support
|
|
5
|
+
* Supports indexing OpenCode session transcripts for searchable conversation history
|
|
5
6
|
*/
|
|
6
7
|
import { tool } from "@opencode-ai/plugin/tool";
|
|
7
8
|
import { homedir } from "node:os";
|
|
8
|
-
import { join
|
|
9
|
+
import { join } from "node:path";
|
|
9
10
|
import { MemoryManager } from "../memory-manager.js";
|
|
11
|
+
import { DEFAULT_MEMORY_FLUSH_PROMPT, DEFAULT_MEMORY_FLUSH_SYSTEM_PROMPT, } from "../flush/index.js";
|
|
10
12
|
let manager = null;
|
|
11
13
|
/**
|
|
12
|
-
* Get the XDG data directory for
|
|
14
|
+
* Get the XDG data directory for memory storage
|
|
13
15
|
* Follows XDG Base Directory Specification
|
|
14
16
|
*/
|
|
15
17
|
function getDataDir() {
|
|
16
18
|
const xdgDataHome = process.env.XDG_DATA_HOME || join(homedir(), ".local", "share");
|
|
17
19
|
return join(xdgDataHome, "memory");
|
|
18
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Get the OpenCode sessions directory
|
|
23
|
+
*/
|
|
24
|
+
function getSessionsDir() {
|
|
25
|
+
const xdgDataHome = process.env.XDG_DATA_HOME || join(homedir(), ".local", "share");
|
|
26
|
+
return join(xdgDataHome, "opencode", "storage", "message");
|
|
27
|
+
}
|
|
19
28
|
/**
|
|
20
29
|
* Generate a default filename based on current date
|
|
21
30
|
*/
|
|
@@ -29,12 +38,13 @@ function generateDefaultFilename() {
|
|
|
29
38
|
async function getManager() {
|
|
30
39
|
if (!manager) {
|
|
31
40
|
const memoryDir = getDataDir();
|
|
41
|
+
const sessionsDir = getSessionsDir();
|
|
32
42
|
// Ensure memory directories exist (base + subfolder for markdown files)
|
|
33
43
|
const { mkdir } = await import("node:fs/promises");
|
|
34
44
|
await mkdir(join(memoryDir, "memory"), { recursive: true });
|
|
35
|
-
|
|
45
|
+
const config = {
|
|
36
46
|
agentId: "opencode-agent",
|
|
37
|
-
workspaceDir: memoryDir,
|
|
47
|
+
workspaceDir: memoryDir,
|
|
38
48
|
provider: "auto",
|
|
39
49
|
remote: {
|
|
40
50
|
apiKey: process.env.OPENROUTER_API_KEY || process.env.OPENAI_API_KEY,
|
|
@@ -44,28 +54,53 @@ async function getManager() {
|
|
|
44
54
|
},
|
|
45
55
|
sync: {
|
|
46
56
|
enabled: true,
|
|
47
|
-
onSearch: true,
|
|
57
|
+
onSearch: true,
|
|
58
|
+
syncSessions: true,
|
|
59
|
+
sessions: {
|
|
60
|
+
deltaBytes: 4096,
|
|
61
|
+
deltaMessages: 5,
|
|
62
|
+
},
|
|
48
63
|
},
|
|
49
|
-
|
|
64
|
+
sessionsDir,
|
|
65
|
+
};
|
|
66
|
+
// Add sessionFormat for OpenCode
|
|
67
|
+
config.sessionFormat = "opencode";
|
|
68
|
+
manager = await MemoryManager.create(config);
|
|
50
69
|
}
|
|
51
70
|
return manager;
|
|
52
71
|
}
|
|
53
72
|
/**
|
|
54
73
|
* Memory flush prompt - injected before session compaction
|
|
74
|
+
* Enhanced with specific guidance for memory extraction
|
|
75
|
+
*/
|
|
76
|
+
const MEMORY_FLUSH_CONTEXT = `
|
|
77
|
+
MEMORY FLUSH: The session is about to be compacted.
|
|
78
|
+
|
|
79
|
+
Before compaction, analyze the conversation and save important information to durable memory using the memory_write tool:
|
|
80
|
+
|
|
81
|
+
1. **User Preferences** - Settings, coding style, preferred tools
|
|
82
|
+
2. **Key Decisions** - Technical choices made, rationale discussed
|
|
83
|
+
3. **Important Facts** - Project details, codebase knowledge, domain info
|
|
84
|
+
4. **TODOs & Action Items** - Pending tasks, follow-ups needed
|
|
85
|
+
5. **Context** - Information useful for future sessions
|
|
86
|
+
|
|
87
|
+
Format as markdown with clear headings. Each memory should be self-contained.
|
|
88
|
+
|
|
89
|
+
If nothing important needs to be saved, you may skip this step.
|
|
90
|
+
`.trim();
|
|
91
|
+
/**
|
|
92
|
+
* Extended memory flush context for LLM extraction
|
|
55
93
|
*/
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
"Before compaction, save any important information to durable memory using the memory_write tool.",
|
|
59
|
-
"Consider saving: user preferences, decisions made, important facts, project context, TODOs.",
|
|
60
|
-
"If nothing needs to be saved, you may skip this step.",
|
|
61
|
-
].join(" ");
|
|
94
|
+
const MEMORY_FLUSH_SYSTEM = DEFAULT_MEMORY_FLUSH_SYSTEM_PROMPT;
|
|
95
|
+
const MEMORY_FLUSH_USER = DEFAULT_MEMORY_FLUSH_PROMPT;
|
|
62
96
|
export const MemoryPlugin = async (_input) => {
|
|
63
97
|
const memoryDir = getDataDir();
|
|
64
98
|
return {
|
|
65
99
|
tool: {
|
|
66
100
|
memory_search: tool({
|
|
67
|
-
description: "Search semantic memory for relevant information from indexed markdown files. " +
|
|
68
|
-
"Use this to find past context, preferences, notes, or any stored knowledge."
|
|
101
|
+
description: "Search semantic memory for relevant information from indexed markdown files and session history. " +
|
|
102
|
+
"Use this to find past context, preferences, notes, decisions, or any stored knowledge. " +
|
|
103
|
+
"Also searches indexed conversation history from previous sessions.",
|
|
69
104
|
args: {
|
|
70
105
|
query: tool.schema.string().describe("Natural language search query"),
|
|
71
106
|
maxResults: tool.schema
|
|
@@ -82,7 +117,7 @@ export const MemoryPlugin = async (_input) => {
|
|
|
82
117
|
if (results.length === 0) {
|
|
83
118
|
return JSON.stringify({
|
|
84
119
|
status: "no_results",
|
|
85
|
-
message: "No matching content found in memory.",
|
|
120
|
+
message: "No matching content found in memory or session history.",
|
|
86
121
|
query: args.query,
|
|
87
122
|
});
|
|
88
123
|
}
|
|
@@ -90,6 +125,7 @@ export const MemoryPlugin = async (_input) => {
|
|
|
90
125
|
status: "success",
|
|
91
126
|
results: results.map((r) => ({
|
|
92
127
|
path: r.path,
|
|
128
|
+
source: r.source,
|
|
93
129
|
lines: `${r.startLine}-${r.endLine}`,
|
|
94
130
|
score: r.score.toFixed(3),
|
|
95
131
|
snippet: r.snippet,
|
|
@@ -166,7 +202,7 @@ export const MemoryPlugin = async (_input) => {
|
|
|
166
202
|
},
|
|
167
203
|
async execute(args) {
|
|
168
204
|
try {
|
|
169
|
-
const
|
|
205
|
+
const mgr = await getManager();
|
|
170
206
|
// Determine filename
|
|
171
207
|
let filename = args.filename?.trim();
|
|
172
208
|
if (!filename) {
|
|
@@ -176,30 +212,116 @@ export const MemoryPlugin = async (_input) => {
|
|
|
176
212
|
if (!filename.includes("/")) {
|
|
177
213
|
filename = `memory/${filename}`;
|
|
178
214
|
}
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
215
|
+
const result = await mgr.writeMemory(args.content, {
|
|
216
|
+
filename,
|
|
217
|
+
append: args.append,
|
|
218
|
+
});
|
|
219
|
+
if (result.success) {
|
|
220
|
+
return JSON.stringify({
|
|
221
|
+
status: "success",
|
|
222
|
+
path: result.path,
|
|
223
|
+
message: args.append !== false
|
|
224
|
+
? "Content appended to memory file"
|
|
225
|
+
: "Content written to memory file",
|
|
226
|
+
bytesWritten: result.bytesWritten,
|
|
227
|
+
}, null, 2);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
return JSON.stringify({
|
|
231
|
+
status: "error",
|
|
232
|
+
error: result.error,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
return JSON.stringify({
|
|
238
|
+
status: "error",
|
|
239
|
+
error: error instanceof Error ? error.message : String(error),
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
},
|
|
243
|
+
}),
|
|
244
|
+
memory_flush: tool({
|
|
245
|
+
description: "Manually trigger memory extraction from the current session. " +
|
|
246
|
+
"Analyzes conversation history and saves important information to durable memory. " +
|
|
247
|
+
"Use this when you want to persist important context before it's lost.",
|
|
248
|
+
args: {
|
|
249
|
+
sessionId: tool.schema
|
|
250
|
+
.string()
|
|
251
|
+
.optional()
|
|
252
|
+
.describe("Session ID to extract memories from (optional, uses current session if not specified)"),
|
|
253
|
+
},
|
|
254
|
+
async execute(args) {
|
|
255
|
+
try {
|
|
256
|
+
const mgr = await getManager();
|
|
257
|
+
const result = await mgr.flushMemories({
|
|
258
|
+
sessionId: args.sessionId,
|
|
259
|
+
onProgress: (_status) => {
|
|
260
|
+
// Progress is logged internally
|
|
261
|
+
},
|
|
262
|
+
});
|
|
263
|
+
if (result.success) {
|
|
264
|
+
if (result.noReply) {
|
|
265
|
+
return JSON.stringify({
|
|
266
|
+
status: "success",
|
|
267
|
+
message: "No important memories to save at this time.",
|
|
268
|
+
memoriesWritten: 0,
|
|
269
|
+
});
|
|
195
270
|
}
|
|
271
|
+
return JSON.stringify({
|
|
272
|
+
status: "success",
|
|
273
|
+
message: `Successfully extracted and saved ${result.memoriesWritten} memory entries.`,
|
|
274
|
+
memoriesWritten: result.memoriesWritten,
|
|
275
|
+
bytesWritten: result.bytesWritten,
|
|
276
|
+
}, null, 2);
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
return JSON.stringify({
|
|
280
|
+
status: "error",
|
|
281
|
+
error: result.error || "Failed to flush memories",
|
|
282
|
+
});
|
|
196
283
|
}
|
|
197
|
-
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
return JSON.stringify({
|
|
287
|
+
status: "error",
|
|
288
|
+
error: error instanceof Error ? error.message : String(error),
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
},
|
|
292
|
+
}),
|
|
293
|
+
memory_status: tool({
|
|
294
|
+
description: "Get the status of the memory system including indexed files, sessions, and search capabilities.",
|
|
295
|
+
args: {},
|
|
296
|
+
async execute() {
|
|
297
|
+
try {
|
|
298
|
+
const mgr = await getManager();
|
|
299
|
+
const status = mgr.getStatus();
|
|
198
300
|
return JSON.stringify({
|
|
199
301
|
status: "success",
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
302
|
+
memory: {
|
|
303
|
+
files: status.sources.memory.files,
|
|
304
|
+
chunks: status.sources.memory.chunks,
|
|
305
|
+
},
|
|
306
|
+
sessions: {
|
|
307
|
+
files: status.sources.sessions.files,
|
|
308
|
+
chunks: status.sources.sessions.chunks,
|
|
309
|
+
},
|
|
310
|
+
provider: {
|
|
311
|
+
id: status.provider.id,
|
|
312
|
+
model: status.provider.model,
|
|
313
|
+
fallbackActive: status.provider.fallbackActivated,
|
|
314
|
+
},
|
|
315
|
+
search: {
|
|
316
|
+
vectorSearch: status.vector.sqliteVecAvailable ? "sqlite-vec" : "js-fallback",
|
|
317
|
+
ftsSearch: status.fts.available,
|
|
318
|
+
},
|
|
319
|
+
sync: {
|
|
320
|
+
watching: status.sync.watching,
|
|
321
|
+
lastSync: status.sync.lastSyncAt
|
|
322
|
+
? new Date(status.sync.lastSyncAt).toISOString()
|
|
323
|
+
: null,
|
|
324
|
+
},
|
|
203
325
|
}, null, 2);
|
|
204
326
|
}
|
|
205
327
|
catch (error) {
|
|
@@ -213,8 +335,33 @@ export const MemoryPlugin = async (_input) => {
|
|
|
213
335
|
},
|
|
214
336
|
// Memory flush hook - triggered before session compaction
|
|
215
337
|
"experimental.session.compacting": async (_input, output) => {
|
|
216
|
-
//
|
|
217
|
-
|
|
338
|
+
// The compaction hook is triggered when session is about to be compacted
|
|
339
|
+
// We inject context to prompt the agent to save important memories
|
|
340
|
+
// Try to get manager for potential LLM-based extraction
|
|
341
|
+
try {
|
|
342
|
+
const mgr = await getManager();
|
|
343
|
+
const flushConfig = mgr.getFlushConfig();
|
|
344
|
+
if (flushConfig?.enabled) {
|
|
345
|
+
// Add enhanced context for memory flush
|
|
346
|
+
output.context.push(MEMORY_FLUSH_CONTEXT);
|
|
347
|
+
// Also add the system-level guidance
|
|
348
|
+
output.context.push(`
|
|
349
|
+
System guidance for memory extraction:
|
|
350
|
+
${MEMORY_FLUSH_SYSTEM}
|
|
351
|
+
|
|
352
|
+
User instruction:
|
|
353
|
+
${MEMORY_FLUSH_USER}
|
|
354
|
+
`.trim());
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
// Basic reminder if flush is disabled
|
|
358
|
+
output.context.push(MEMORY_FLUSH_CONTEXT);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
// Fallback to basic context injection
|
|
363
|
+
output.context.push(MEMORY_FLUSH_CONTEXT);
|
|
364
|
+
}
|
|
218
365
|
},
|
|
219
366
|
};
|
|
220
367
|
};
|
package/dist/plugin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/index.d.ts
CHANGED
|
@@ -2,4 +2,5 @@ export { FileWatcher, type FileWatcherOptions } from "./watcher.js";
|
|
|
2
2
|
export { SessionMonitor, type SessionMonitorOptions } from "./session-monitor.js";
|
|
3
3
|
export { minimatch } from "./minimatch.js";
|
|
4
4
|
export { onSessionTranscriptUpdate, emitSessionTranscriptUpdate, getSessionListenerCount, type SessionTranscriptUpdate, type SessionTranscriptListener, } from "./session-events.js";
|
|
5
|
+
export { scanOpenCodeSessions, buildOpenCodeSessionEntry, extractOpenCodeText, getOpenCodeSessionHistory, watchOpenCodeSessions, } from "./opencode-session.js";
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/sync/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,GAC/B,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,GAC/B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC"}
|
package/dist/sync/index.js
CHANGED
|
@@ -2,4 +2,5 @@ export { FileWatcher } from "./watcher.js";
|
|
|
2
2
|
export { SessionMonitor } from "./session-monitor.js";
|
|
3
3
|
export { minimatch } from "./minimatch.js";
|
|
4
4
|
export { onSessionTranscriptUpdate, emitSessionTranscriptUpdate, getSessionListenerCount, } from "./session-events.js";
|
|
5
|
+
export { scanOpenCodeSessions, buildOpenCodeSessionEntry, extractOpenCodeText, getOpenCodeSessionHistory, watchOpenCodeSessions, } from "./opencode-session.js";
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/sync/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,cAAc,EAA8B,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,GAGxB,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,cAAc,EAA8B,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,uBAAuB,GAGxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode session format parser
|
|
3
|
+
* Handles JSON-per-message format from ~/.local/share/opencode/storage/message/
|
|
4
|
+
*/
|
|
5
|
+
import type { OpenCodeMessage, OpenCodeSessionEntry } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Scan OpenCode session directories and return session entries
|
|
8
|
+
*/
|
|
9
|
+
export declare function scanOpenCodeSessions(basePath: string): Promise<OpenCodeSessionEntry[]>;
|
|
10
|
+
/**
|
|
11
|
+
* Build a session entry from an OpenCode session directory
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildOpenCodeSessionEntry(sessionDir: string): Promise<OpenCodeSessionEntry | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Extract text content from an OpenCode message
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractOpenCodeText(msg: OpenCodeMessage): string | null;
|
|
18
|
+
/**
|
|
19
|
+
* Get session history as formatted text (for LLM context)
|
|
20
|
+
*/
|
|
21
|
+
export declare function getOpenCodeSessionHistory(sessionDir: string, options?: {
|
|
22
|
+
maxMessages?: number;
|
|
23
|
+
includeToolResults?: boolean;
|
|
24
|
+
}): Promise<string>;
|
|
25
|
+
/**
|
|
26
|
+
* Watch for changes in OpenCode session directory
|
|
27
|
+
* Returns a cleanup function
|
|
28
|
+
*/
|
|
29
|
+
export declare function watchOpenCodeSessions(basePath: string, onSessionUpdate: (sessionId: string, sessionDir: string) => void, options?: {
|
|
30
|
+
debounceMs?: number;
|
|
31
|
+
}): () => void;
|
|
32
|
+
//# sourceMappingURL=opencode-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opencode-session.d.ts","sourceRoot":"","sources":["../../src/sync/opencode-session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EACV,eAAe,EAEf,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA0BjC;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAmEtC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAuBvE;AAsCD;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,GACA,OAAO,CAAC,MAAM,CAAC,CAoCjB;AAgCD;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,EAChE,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,MAAM,IAAI,CA6EZ"}
|