@xfabric/memory 0.2.9 → 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 -1
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +244 -9
- 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,29 +1,50 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* OpenCode plugin for semantic memory search
|
|
3
|
-
* Exposes memory_search and
|
|
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
|
|
4
6
|
*/
|
|
5
7
|
import { tool } from "@opencode-ai/plugin/tool";
|
|
6
8
|
import { homedir } from "node:os";
|
|
7
9
|
import { join } from "node:path";
|
|
8
10
|
import { MemoryManager } from "../memory-manager.js";
|
|
11
|
+
import { DEFAULT_MEMORY_FLUSH_PROMPT, DEFAULT_MEMORY_FLUSH_SYSTEM_PROMPT, } from "../flush/index.js";
|
|
9
12
|
let manager = null;
|
|
10
13
|
/**
|
|
11
|
-
* Get the XDG data directory for
|
|
14
|
+
* Get the XDG data directory for memory storage
|
|
12
15
|
* Follows XDG Base Directory Specification
|
|
13
16
|
*/
|
|
14
17
|
function getDataDir() {
|
|
15
18
|
const xdgDataHome = process.env.XDG_DATA_HOME || join(homedir(), ".local", "share");
|
|
16
19
|
return join(xdgDataHome, "memory");
|
|
17
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
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generate a default filename based on current date
|
|
30
|
+
*/
|
|
31
|
+
function generateDefaultFilename() {
|
|
32
|
+
const now = new Date();
|
|
33
|
+
const yyyy = now.getFullYear();
|
|
34
|
+
const mm = String(now.getMonth() + 1).padStart(2, "0");
|
|
35
|
+
const dd = String(now.getDate()).padStart(2, "0");
|
|
36
|
+
return `${yyyy}-${mm}-${dd}.md`;
|
|
37
|
+
}
|
|
18
38
|
async function getManager() {
|
|
19
39
|
if (!manager) {
|
|
20
40
|
const memoryDir = getDataDir();
|
|
41
|
+
const sessionsDir = getSessionsDir();
|
|
21
42
|
// Ensure memory directories exist (base + subfolder for markdown files)
|
|
22
43
|
const { mkdir } = await import("node:fs/promises");
|
|
23
44
|
await mkdir(join(memoryDir, "memory"), { recursive: true });
|
|
24
|
-
|
|
45
|
+
const config = {
|
|
25
46
|
agentId: "opencode-agent",
|
|
26
|
-
workspaceDir: memoryDir,
|
|
47
|
+
workspaceDir: memoryDir,
|
|
27
48
|
provider: "auto",
|
|
28
49
|
remote: {
|
|
29
50
|
apiKey: process.env.OPENROUTER_API_KEY || process.env.OPENAI_API_KEY,
|
|
@@ -33,19 +54,53 @@ async function getManager() {
|
|
|
33
54
|
},
|
|
34
55
|
sync: {
|
|
35
56
|
enabled: true,
|
|
36
|
-
onSearch: true,
|
|
57
|
+
onSearch: true,
|
|
58
|
+
syncSessions: true,
|
|
59
|
+
sessions: {
|
|
60
|
+
deltaBytes: 4096,
|
|
61
|
+
deltaMessages: 5,
|
|
62
|
+
},
|
|
37
63
|
},
|
|
38
|
-
|
|
64
|
+
sessionsDir,
|
|
65
|
+
};
|
|
66
|
+
// Add sessionFormat for OpenCode
|
|
67
|
+
config.sessionFormat = "opencode";
|
|
68
|
+
manager = await MemoryManager.create(config);
|
|
39
69
|
}
|
|
40
70
|
return manager;
|
|
41
71
|
}
|
|
72
|
+
/**
|
|
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
|
|
93
|
+
*/
|
|
94
|
+
const MEMORY_FLUSH_SYSTEM = DEFAULT_MEMORY_FLUSH_SYSTEM_PROMPT;
|
|
95
|
+
const MEMORY_FLUSH_USER = DEFAULT_MEMORY_FLUSH_PROMPT;
|
|
42
96
|
export const MemoryPlugin = async (_input) => {
|
|
43
97
|
const memoryDir = getDataDir();
|
|
44
98
|
return {
|
|
45
99
|
tool: {
|
|
46
100
|
memory_search: tool({
|
|
47
|
-
description: "Search semantic memory for relevant information from indexed markdown files. " +
|
|
48
|
-
"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.",
|
|
49
104
|
args: {
|
|
50
105
|
query: tool.schema.string().describe("Natural language search query"),
|
|
51
106
|
maxResults: tool.schema
|
|
@@ -62,7 +117,7 @@ export const MemoryPlugin = async (_input) => {
|
|
|
62
117
|
if (results.length === 0) {
|
|
63
118
|
return JSON.stringify({
|
|
64
119
|
status: "no_results",
|
|
65
|
-
message: "No matching content found in memory.",
|
|
120
|
+
message: "No matching content found in memory or session history.",
|
|
66
121
|
query: args.query,
|
|
67
122
|
});
|
|
68
123
|
}
|
|
@@ -70,6 +125,7 @@ export const MemoryPlugin = async (_input) => {
|
|
|
70
125
|
status: "success",
|
|
71
126
|
results: results.map((r) => ({
|
|
72
127
|
path: r.path,
|
|
128
|
+
source: r.source,
|
|
73
129
|
lines: `${r.startLine}-${r.endLine}`,
|
|
74
130
|
score: r.score.toFixed(3),
|
|
75
131
|
snippet: r.snippet,
|
|
@@ -127,6 +183,185 @@ export const MemoryPlugin = async (_input) => {
|
|
|
127
183
|
}
|
|
128
184
|
},
|
|
129
185
|
}),
|
|
186
|
+
memory_write: tool({
|
|
187
|
+
description: "Write content to a memory file for durable storage. " +
|
|
188
|
+
"Use this to save important information like user preferences, decisions, facts, or TODOs. " +
|
|
189
|
+
"Content is stored as markdown and will be searchable via memory_search.",
|
|
190
|
+
args: {
|
|
191
|
+
content: tool.schema
|
|
192
|
+
.string()
|
|
193
|
+
.describe("The content to write (markdown format recommended)"),
|
|
194
|
+
filename: tool.schema
|
|
195
|
+
.string()
|
|
196
|
+
.optional()
|
|
197
|
+
.describe("Filename to write to (default: YYYY-MM-DD.md based on current date). Use memory/ prefix for subdirectory."),
|
|
198
|
+
append: tool.schema
|
|
199
|
+
.boolean()
|
|
200
|
+
.optional()
|
|
201
|
+
.describe("If true, append to existing file instead of overwriting (default: true)"),
|
|
202
|
+
},
|
|
203
|
+
async execute(args) {
|
|
204
|
+
try {
|
|
205
|
+
const mgr = await getManager();
|
|
206
|
+
// Determine filename
|
|
207
|
+
let filename = args.filename?.trim();
|
|
208
|
+
if (!filename) {
|
|
209
|
+
filename = `memory/${generateDefaultFilename()}`;
|
|
210
|
+
}
|
|
211
|
+
// Ensure it's in memory subdirectory if no path specified
|
|
212
|
+
if (!filename.includes("/")) {
|
|
213
|
+
filename = `memory/${filename}`;
|
|
214
|
+
}
|
|
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
|
+
});
|
|
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
|
+
});
|
|
283
|
+
}
|
|
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();
|
|
300
|
+
return JSON.stringify({
|
|
301
|
+
status: "success",
|
|
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
|
+
},
|
|
325
|
+
}, null, 2);
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
return JSON.stringify({
|
|
329
|
+
status: "error",
|
|
330
|
+
error: error instanceof Error ? error.message : String(error),
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
},
|
|
334
|
+
}),
|
|
335
|
+
},
|
|
336
|
+
// Memory flush hook - triggered before session compaction
|
|
337
|
+
"experimental.session.compacting": async (_input, output) => {
|
|
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
|
+
}
|
|
130
365
|
},
|
|
131
366
|
};
|
|
132
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"}
|