opencode-memory-plugin 0.1.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.
Files changed (102) hide show
  1. package/README.md +73 -0
  2. package/dist/compression/compressor.d.ts +86 -0
  3. package/dist/compression/compressor.d.ts.map +1 -0
  4. package/dist/compression/compressor.js +142 -0
  5. package/dist/compression/compressor.js.map +1 -0
  6. package/dist/compression/parser.d.ts +73 -0
  7. package/dist/compression/parser.d.ts.map +1 -0
  8. package/dist/compression/parser.js +139 -0
  9. package/dist/compression/parser.js.map +1 -0
  10. package/dist/compression/pipeline.d.ts +73 -0
  11. package/dist/compression/pipeline.d.ts.map +1 -0
  12. package/dist/compression/pipeline.js +205 -0
  13. package/dist/compression/pipeline.js.map +1 -0
  14. package/dist/compression/privacy.d.ts +8 -0
  15. package/dist/compression/privacy.d.ts.map +1 -0
  16. package/dist/compression/privacy.js +30 -0
  17. package/dist/compression/privacy.js.map +1 -0
  18. package/dist/compression/prompts.d.ts +24 -0
  19. package/dist/compression/prompts.d.ts.map +1 -0
  20. package/dist/compression/prompts.js +106 -0
  21. package/dist/compression/prompts.js.map +1 -0
  22. package/dist/compression/quality.d.ts +48 -0
  23. package/dist/compression/quality.d.ts.map +1 -0
  24. package/dist/compression/quality.js +159 -0
  25. package/dist/compression/quality.js.map +1 -0
  26. package/dist/config.d.ts +114 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +265 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/context/generator.d.ts +28 -0
  31. package/dist/context/generator.d.ts.map +1 -0
  32. package/dist/context/generator.js +80 -0
  33. package/dist/context/generator.js.map +1 -0
  34. package/dist/hooks/chat-message.d.ts +14 -0
  35. package/dist/hooks/chat-message.d.ts.map +1 -0
  36. package/dist/hooks/chat-message.js +35 -0
  37. package/dist/hooks/chat-message.js.map +1 -0
  38. package/dist/hooks/compaction.d.ts +13 -0
  39. package/dist/hooks/compaction.d.ts.map +1 -0
  40. package/dist/hooks/compaction.js +22 -0
  41. package/dist/hooks/compaction.js.map +1 -0
  42. package/dist/hooks/events.d.ts +52 -0
  43. package/dist/hooks/events.d.ts.map +1 -0
  44. package/dist/hooks/events.js +138 -0
  45. package/dist/hooks/events.js.map +1 -0
  46. package/dist/hooks/system-transform.d.ts +14 -0
  47. package/dist/hooks/system-transform.d.ts.map +1 -0
  48. package/dist/hooks/system-transform.js +26 -0
  49. package/dist/hooks/system-transform.js.map +1 -0
  50. package/dist/hooks/tool-after.d.ts +26 -0
  51. package/dist/hooks/tool-after.d.ts.map +1 -0
  52. package/dist/hooks/tool-after.js +88 -0
  53. package/dist/hooks/tool-after.js.map +1 -0
  54. package/dist/index.d.ts +11 -0
  55. package/dist/index.d.ts.map +1 -0
  56. package/dist/index.js +79 -0
  57. package/dist/index.js.map +1 -0
  58. package/dist/logger.d.ts +60 -0
  59. package/dist/logger.d.ts.map +1 -0
  60. package/dist/logger.js +91 -0
  61. package/dist/logger.js.map +1 -0
  62. package/dist/storage/db.d.ts +22 -0
  63. package/dist/storage/db.d.ts.map +1 -0
  64. package/dist/storage/db.js +198 -0
  65. package/dist/storage/db.js.map +1 -0
  66. package/dist/storage/schema.d.ts +2473 -0
  67. package/dist/storage/schema.d.ts.map +1 -0
  68. package/dist/storage/schema.js +100 -0
  69. package/dist/storage/schema.js.map +1 -0
  70. package/dist/storage/store.d.ts +376 -0
  71. package/dist/storage/store.d.ts.map +1 -0
  72. package/dist/storage/store.js +1025 -0
  73. package/dist/storage/store.js.map +1 -0
  74. package/dist/tools/memory-forget.d.ts +11 -0
  75. package/dist/tools/memory-forget.d.ts.map +1 -0
  76. package/dist/tools/memory-forget.js +249 -0
  77. package/dist/tools/memory-forget.js.map +1 -0
  78. package/dist/tools/memory-get.d.ts +10 -0
  79. package/dist/tools/memory-get.d.ts.map +1 -0
  80. package/dist/tools/memory-get.js +50 -0
  81. package/dist/tools/memory-get.js.map +1 -0
  82. package/dist/tools/memory-search.d.ts +11 -0
  83. package/dist/tools/memory-search.d.ts.map +1 -0
  84. package/dist/tools/memory-search.js +38 -0
  85. package/dist/tools/memory-search.js.map +1 -0
  86. package/dist/tools/memory-stats.d.ts +39 -0
  87. package/dist/tools/memory-stats.d.ts.map +1 -0
  88. package/dist/tools/memory-stats.js +121 -0
  89. package/dist/tools/memory-stats.js.map +1 -0
  90. package/dist/tools/memory-timeline.d.ts +10 -0
  91. package/dist/tools/memory-timeline.d.ts.map +1 -0
  92. package/dist/tools/memory-timeline.js +49 -0
  93. package/dist/tools/memory-timeline.js.map +1 -0
  94. package/dist/types.d.ts +178 -0
  95. package/dist/types.d.ts.map +1 -0
  96. package/dist/types.js +4 -0
  97. package/dist/types.js.map +1 -0
  98. package/dist/utils.d.ts +130 -0
  99. package/dist/utils.d.ts.map +1 -0
  100. package/dist/utils.js +308 -0
  101. package/dist/utils.js.map +1 -0
  102. package/package.json +36 -0
package/dist/utils.js ADDED
@@ -0,0 +1,308 @@
1
+ import { mkdir, readFile } from "node:fs/promises";
2
+ import { dirname, isAbsolute, join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ const COMMENT_BLOCK_START = "/*";
5
+ const COMMENT_BLOCK_END = "*/";
6
+ const COMMENT_LINE = "//";
7
+ /**
8
+ * Creates a sortable identifier using the current timestamp and a UUID.
9
+ *
10
+ * @param now - Function that returns the current epoch time in milliseconds.
11
+ * @returns A lexicographically sortable identifier.
12
+ */
13
+ export function createSortableId(now) {
14
+ const prefix = now().toString(36).padStart(10, "0");
15
+ return `${prefix}-${crypto.randomUUID()}`;
16
+ }
17
+ /**
18
+ * Estimates token usage using a simple character-based heuristic.
19
+ *
20
+ * @param value - Text that should be converted into an estimated token count.
21
+ * @returns The estimated token count.
22
+ */
23
+ export function estimateTokenCount(value) {
24
+ return Math.max(1, Math.ceil(value.length / 4));
25
+ }
26
+ /**
27
+ * Resolves a path that may start with `~` into an absolute filesystem path.
28
+ *
29
+ * @param value - Path to resolve.
30
+ * @returns The resolved absolute or original path.
31
+ */
32
+ export function resolveHomePath(value) {
33
+ if (!value.startsWith("~")) {
34
+ return value;
35
+ }
36
+ if (value === "~") {
37
+ return homedir();
38
+ }
39
+ return join(homedir(), value.slice(2));
40
+ }
41
+ /**
42
+ * Returns the default OpenCode config directory using XDG semantics.
43
+ *
44
+ * @returns The resolved OpenCode config directory.
45
+ */
46
+ export function getOpenCodeConfigDirectory() {
47
+ const xdg = process.env.XDG_CONFIG_HOME?.trim();
48
+ if (xdg) {
49
+ return join(xdg, "opencode");
50
+ }
51
+ return join(homedir(), ".config", "opencode");
52
+ }
53
+ /**
54
+ * Ensures that the parent directory of a file path exists.
55
+ *
56
+ * @param filePath - File path whose parent should be created.
57
+ * @returns A promise that resolves after the directory exists.
58
+ */
59
+ export async function ensureParentDirectory(filePath) {
60
+ await mkdir(dirname(filePath), { recursive: true });
61
+ }
62
+ /**
63
+ * Parses a JSON or JSONC file into a typed object.
64
+ *
65
+ * @param filePath - File path to read.
66
+ * @returns The parsed object.
67
+ */
68
+ export async function readJsonFile(filePath) {
69
+ const contents = await readFile(filePath, "utf8");
70
+ return JSON.parse(stripJsonComments(contents));
71
+ }
72
+ /**
73
+ * Removes JSONC line and block comments while preserving string contents.
74
+ *
75
+ * @param value - Raw JSONC string.
76
+ * @returns A JSON string without comments.
77
+ */
78
+ export function stripJsonComments(value) {
79
+ let output = "";
80
+ let index = 0;
81
+ let inString = false;
82
+ let inLineComment = false;
83
+ let inBlockComment = false;
84
+ let quote = '"';
85
+ while (index < value.length) {
86
+ const current = value[index] ?? "";
87
+ const next = value[index + 1] ?? "";
88
+ if (inLineComment) {
89
+ if (current === "\n") {
90
+ inLineComment = false;
91
+ output += current;
92
+ }
93
+ index += 1;
94
+ continue;
95
+ }
96
+ if (inBlockComment) {
97
+ if (`${current}${next}` === COMMENT_BLOCK_END) {
98
+ inBlockComment = false;
99
+ index += 2;
100
+ continue;
101
+ }
102
+ index += 1;
103
+ continue;
104
+ }
105
+ if (inString) {
106
+ output += current;
107
+ if (current === "\\") {
108
+ output += next;
109
+ index += 2;
110
+ continue;
111
+ }
112
+ if (current === quote) {
113
+ inString = false;
114
+ }
115
+ index += 1;
116
+ continue;
117
+ }
118
+ if (`${current}${next}` === COMMENT_LINE) {
119
+ inLineComment = true;
120
+ index += 2;
121
+ continue;
122
+ }
123
+ if (`${current}${next}` === COMMENT_BLOCK_START) {
124
+ inBlockComment = true;
125
+ index += 2;
126
+ continue;
127
+ }
128
+ if (current === '"' || current === "'") {
129
+ inString = true;
130
+ quote = current;
131
+ }
132
+ output += current;
133
+ index += 1;
134
+ }
135
+ return output;
136
+ }
137
+ /**
138
+ * Parses a JSON value with a typed fallback.
139
+ *
140
+ * @param value - JSON text or nullish value.
141
+ * @param fallback - Fallback value when parsing fails.
142
+ * @returns The parsed value or the fallback.
143
+ */
144
+ export function parseJsonValue(value, fallback) {
145
+ if (!value) {
146
+ return fallback;
147
+ }
148
+ try {
149
+ return JSON.parse(value);
150
+ }
151
+ catch {
152
+ return fallback;
153
+ }
154
+ }
155
+ /**
156
+ * Serializes any JSON-compatible value.
157
+ *
158
+ * @param value - Value to serialize.
159
+ * @returns A JSON string.
160
+ */
161
+ export function serializeJson(value) {
162
+ return JSON.stringify(value);
163
+ }
164
+ /**
165
+ * Strips markdown code fences from an LLM response.
166
+ *
167
+ * @param value - Raw model output.
168
+ * @returns The unfenced content.
169
+ */
170
+ export function stripMarkdownFences(value) {
171
+ const trimmed = value.trim();
172
+ if (!trimmed.startsWith("```")) {
173
+ return trimmed;
174
+ }
175
+ return trimmed.replace(/^```[a-zA-Z0-9_-]*\s*/, "").replace(/\s*```$/, "").trim();
176
+ }
177
+ /**
178
+ * Collapses repeated whitespace for more compact storage and prompts.
179
+ *
180
+ * @param value - Raw string.
181
+ * @returns Normalized text.
182
+ */
183
+ export function normalizeWhitespace(value) {
184
+ return value.replace(/\s+/g, " ").trim();
185
+ }
186
+ /**
187
+ * Delays execution for a fixed number of milliseconds.
188
+ *
189
+ * @param milliseconds - Delay duration.
190
+ * @returns A promise that resolves after the delay.
191
+ */
192
+ export async function delay(milliseconds) {
193
+ await new Promise((resolve) => setTimeout(resolve, milliseconds));
194
+ }
195
+ /**
196
+ * Formats a relative time label from a timestamp.
197
+ *
198
+ * @param value - Epoch time in milliseconds.
199
+ * @param now - Reference clock.
200
+ * @returns A relative time label.
201
+ */
202
+ export function formatRelativeTime(value, now) {
203
+ const delta = Math.max(0, now() - value);
204
+ const minute = 60_000;
205
+ const hour = 60 * minute;
206
+ const day = 24 * hour;
207
+ if (delta < minute) {
208
+ return "just now";
209
+ }
210
+ if (delta < hour) {
211
+ return `${Math.floor(delta / minute)}m ago`;
212
+ }
213
+ if (delta < day) {
214
+ return `${Math.floor(delta / hour)}h ago`;
215
+ }
216
+ return `${Math.floor(delta / day)}d ago`;
217
+ }
218
+ /**
219
+ * Formats a timestamp as a local ISO-like date time string.
220
+ *
221
+ * @param value - Epoch time in milliseconds.
222
+ * @returns A formatted date time string.
223
+ */
224
+ export function formatTimestamp(value) {
225
+ const date = new Date(value);
226
+ const year = date.getFullYear();
227
+ const month = String(date.getMonth() + 1).padStart(2, "0");
228
+ const day = String(date.getDate()).padStart(2, "0");
229
+ const hours = String(date.getHours()).padStart(2, "0");
230
+ const minutes = String(date.getMinutes()).padStart(2, "0");
231
+ return `${year}-${month}-${day} ${hours}:${minutes}`;
232
+ }
233
+ /**
234
+ * Builds a safe FTS5 MATCH query from arbitrary user text.
235
+ *
236
+ * @param value - Raw user query.
237
+ * @returns A sanitized FTS5 query string.
238
+ */
239
+ export function sanitizeFtsQuery(value) {
240
+ const tokens = value
241
+ .split(/\s+/)
242
+ .map((part) => part.replace(/["*()]/g, " "))
243
+ .flatMap((part) => part.split(/[\/.:_-]+/))
244
+ .map((part) => part.trim())
245
+ .filter(Boolean)
246
+ .slice(0, 8);
247
+ return tokens.map((token) => `"${token.replace(/"/g, '""')}"*`).join(" AND ");
248
+ }
249
+ /**
250
+ * Parses a `provider/model` string into the model object expected by the SDK.
251
+ *
252
+ * @param value - Model string from configuration.
253
+ * @returns A parsed model selection or null when invalid.
254
+ */
255
+ export function parseModelString(value) {
256
+ if (!value) {
257
+ return null;
258
+ }
259
+ const separator = value.indexOf("/");
260
+ if (separator <= 0 || separator >= value.length - 1) {
261
+ return null;
262
+ }
263
+ return {
264
+ raw: value,
265
+ providerID: value.slice(0, separator),
266
+ modelID: value.slice(separator + 1),
267
+ };
268
+ }
269
+ /**
270
+ * Converts an absolute path into a worktree-relative path when possible.
271
+ *
272
+ * @param value - Path to normalize.
273
+ * @param worktree - Project root.
274
+ * @returns A relative or original path.
275
+ */
276
+ export function normalizeProjectPath(value, worktree) {
277
+ if (!value) {
278
+ return value;
279
+ }
280
+ if (!isAbsolute(value)) {
281
+ return value;
282
+ }
283
+ if (!value.startsWith(worktree)) {
284
+ return value;
285
+ }
286
+ return value.slice(worktree.length + Number(!worktree.endsWith("/")));
287
+ }
288
+ /**
289
+ * Checks whether a string likely contains binary-like output.
290
+ *
291
+ * @param value - Output text to inspect.
292
+ * @returns True when the content should be skipped.
293
+ */
294
+ export function isProbablyBinary(value) {
295
+ if (!value) {
296
+ return false;
297
+ }
298
+ if (value.includes("\u0000")) {
299
+ return true;
300
+ }
301
+ const sample = value.slice(0, 2048);
302
+ const controlCharacters = [...sample].filter((character) => {
303
+ const code = character.charCodeAt(0);
304
+ return code < 9 || (code > 13 && code < 32);
305
+ }).length;
306
+ return controlCharacters / sample.length > 0.1;
307
+ }
308
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "opencode-memory-plugin",
3
+ "version": "0.1.0",
4
+ "description": "Persistent cross-session memory plugin for OpenCode",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.test.json --noEmit",
22
+ "test": "bun test"
23
+ },
24
+ "dependencies": {
25
+ "@opencode-ai/plugin": "^1.2.27",
26
+ "opencode-memory-plugin": ".",
27
+ "@opencode-ai/sdk": "^1.2.27",
28
+ "ai": "^5.0.0",
29
+ "drizzle-orm": "^0.44.6",
30
+ "zod": "^4.1.8"
31
+ },
32
+ "devDependencies": {
33
+ "bun-types": "^1.3.10",
34
+ "typescript": "^5.9.2"
35
+ }
36
+ }