true-mem 1.0.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/dist/adapters/opencode/index.d.ts +11 -0
  4. package/dist/adapters/opencode/index.d.ts.map +1 -0
  5. package/dist/adapters/opencode/index.js +676 -0
  6. package/dist/adapters/opencode/index.js.map +1 -0
  7. package/dist/adapters/opencode/injection.d.ts +52 -0
  8. package/dist/adapters/opencode/injection.d.ts.map +1 -0
  9. package/dist/adapters/opencode/injection.js +93 -0
  10. package/dist/adapters/opencode/injection.js.map +1 -0
  11. package/dist/config.d.ts +9 -0
  12. package/dist/config.d.ts.map +1 -0
  13. package/dist/config.js +61 -0
  14. package/dist/config.js.map +1 -0
  15. package/dist/extraction/queue.d.ts +35 -0
  16. package/dist/extraction/queue.d.ts.map +1 -0
  17. package/dist/extraction/queue.js +75 -0
  18. package/dist/extraction/queue.js.map +1 -0
  19. package/dist/index.d.ts +14 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +2900 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/logger.d.ts +6 -0
  24. package/dist/logger.d.ts.map +1 -0
  25. package/dist/logger.js +30 -0
  26. package/dist/logger.js.map +1 -0
  27. package/dist/memory/classifier.d.ts +78 -0
  28. package/dist/memory/classifier.d.ts.map +1 -0
  29. package/dist/memory/classifier.js +363 -0
  30. package/dist/memory/classifier.js.map +1 -0
  31. package/dist/memory/embeddings.d.ts +41 -0
  32. package/dist/memory/embeddings.d.ts.map +1 -0
  33. package/dist/memory/embeddings.js +98 -0
  34. package/dist/memory/embeddings.js.map +1 -0
  35. package/dist/memory/negative-patterns.d.ts +32 -0
  36. package/dist/memory/negative-patterns.d.ts.map +1 -0
  37. package/dist/memory/negative-patterns.js +71 -0
  38. package/dist/memory/negative-patterns.js.map +1 -0
  39. package/dist/memory/patterns.d.ts +110 -0
  40. package/dist/memory/patterns.d.ts.map +1 -0
  41. package/dist/memory/patterns.js +623 -0
  42. package/dist/memory/patterns.js.map +1 -0
  43. package/dist/memory/reconsolidate.d.ts +57 -0
  44. package/dist/memory/reconsolidate.d.ts.map +1 -0
  45. package/dist/memory/reconsolidate.js +96 -0
  46. package/dist/memory/reconsolidate.js.map +1 -0
  47. package/dist/memory/role-patterns.d.ts +50 -0
  48. package/dist/memory/role-patterns.d.ts.map +1 -0
  49. package/dist/memory/role-patterns.js +188 -0
  50. package/dist/memory/role-patterns.js.map +1 -0
  51. package/dist/shutdown.d.ts +31 -0
  52. package/dist/shutdown.d.ts.map +1 -0
  53. package/dist/shutdown.js +120 -0
  54. package/dist/shutdown.js.map +1 -0
  55. package/dist/storage/database.d.ts +77 -0
  56. package/dist/storage/database.d.ts.map +1 -0
  57. package/dist/storage/database.js +590 -0
  58. package/dist/storage/database.js.map +1 -0
  59. package/dist/storage/sqlite-adapter.d.ts +35 -0
  60. package/dist/storage/sqlite-adapter.d.ts.map +1 -0
  61. package/dist/storage/sqlite-adapter.js +99 -0
  62. package/dist/storage/sqlite-adapter.js.map +1 -0
  63. package/dist/types.d.ts +266 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +63 -0
  66. package/dist/types.js.map +1 -0
  67. package/package.json +54 -0
@@ -0,0 +1,99 @@
1
+ /**
2
+ * SQLite Adapter - Runtime-agnostic SQLite interface
3
+ *
4
+ * Supports:
5
+ * - bun:sqlite (Bun runtime)
6
+ * - node:sqlite (Node.js 22+, no native addons required)
7
+ */
8
+ /**
9
+ * Detect if running in Bun
10
+ */
11
+ export function isBun() {
12
+ return typeof globalThis.Bun !== 'undefined';
13
+ }
14
+ /**
15
+ * Create a SQLite database connection using the appropriate native driver
16
+ */
17
+ export async function createDatabase(dbPath) {
18
+ if (isBun()) {
19
+ return createBunDatabase(dbPath);
20
+ }
21
+ else {
22
+ return createNodeDatabase(dbPath);
23
+ }
24
+ }
25
+ /**
26
+ * Create database using bun:sqlite
27
+ */
28
+ async function createBunDatabase(dbPath) {
29
+ // @ts-expect-error - bun:sqlite is only available in Bun runtime
30
+ const { Database } = await import('bun:sqlite');
31
+ const db = new Database(dbPath);
32
+ return {
33
+ exec(sql) {
34
+ db.exec(sql);
35
+ },
36
+ prepare(sql) {
37
+ const stmt = db.prepare(sql);
38
+ return {
39
+ run(...params) {
40
+ stmt.run(...params);
41
+ return {
42
+ changes: db.changes,
43
+ lastInsertRowid: db.lastInsertRowid,
44
+ };
45
+ },
46
+ get(...params) {
47
+ return stmt.get(...params);
48
+ },
49
+ all(...params) {
50
+ return stmt.all(...params);
51
+ },
52
+ };
53
+ },
54
+ close() {
55
+ db.close();
56
+ },
57
+ pragma(pragma) {
58
+ return db.query(`PRAGMA ${pragma}`).get();
59
+ },
60
+ };
61
+ }
62
+ /**
63
+ * Create database using node:sqlite (Node.js 22+)
64
+ */
65
+ async function createNodeDatabase(dbPath) {
66
+ // node:sqlite is synchronous — dynamic import keeps the async adapter signature uniform
67
+ const { DatabaseSync } = await import('node:sqlite');
68
+ const db = new DatabaseSync(dbPath);
69
+ return {
70
+ exec(sql) {
71
+ db.exec(sql);
72
+ },
73
+ prepare(sql) {
74
+ const stmt = db.prepare(sql);
75
+ return {
76
+ run(...params) {
77
+ const result = stmt.run(...params);
78
+ return {
79
+ changes: result.changes,
80
+ lastInsertRowid: result.lastInsertRowid,
81
+ };
82
+ },
83
+ get(...params) {
84
+ return stmt.get(...params);
85
+ },
86
+ all(...params) {
87
+ return stmt.all(...params);
88
+ },
89
+ };
90
+ },
91
+ close() {
92
+ db.close();
93
+ },
94
+ pragma(pragma) {
95
+ return db.prepare(`PRAGMA ${pragma}`).get();
96
+ },
97
+ };
98
+ }
99
+ //# sourceMappingURL=sqlite-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite-adapter.js","sourceRoot":"","sources":["../../src/storage/sqlite-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,266 @@
1
+ /**
2
+ * True-Mem Type Definitions
3
+ * Adapted from PsychMem for OpenCode
4
+ */
5
+ export type AgentType = 'opencode';
6
+ /**
7
+ * Memory classification aligned with psychological memory models
8
+ */
9
+ export type MemoryClassification = 'episodic' | 'semantic' | 'procedural' | 'bugfix' | 'learning' | 'preference' | 'decision' | 'constraint';
10
+ /**
11
+ * Memory scope determines injection behavior
12
+ */
13
+ export type MemoryScope = 'user' | 'project';
14
+ /**
15
+ * Classifications that are user-level (always injected)
16
+ */
17
+ export declare const USER_LEVEL_CLASSIFICATIONS: MemoryClassification[];
18
+ /**
19
+ * Classifications that are project-level (only injected for matching project)
20
+ */
21
+ export declare const PROJECT_LEVEL_CLASSIFICATIONS: MemoryClassification[];
22
+ export declare function isUserLevelClassification(classification: MemoryClassification): boolean;
23
+ export declare function getScopeForClassification(classification: MemoryClassification): MemoryScope;
24
+ /**
25
+ * Memory store type
26
+ */
27
+ export type MemoryStore = 'stm' | 'ltm';
28
+ /**
29
+ * Memory status for lifecycle management
30
+ */
31
+ export type MemoryStatus = 'active' | 'decayed' | 'pinned' | 'forgotten';
32
+ /**
33
+ * Message role from OpenCode SDK
34
+ */
35
+ export type MessageRole = 'user' | 'assistant' | 'system';
36
+ /**
37
+ * Role-aware context for memory extraction
38
+ */
39
+ export interface RoleAwareContext {
40
+ /**
41
+ * Primary role of the message containing the memory candidate
42
+ */
43
+ primaryRole: MessageRole;
44
+ /**
45
+ * Role-weighted score (10x for Human messages)
46
+ */
47
+ roleWeightedScore: number;
48
+ /**
49
+ * Whether Assistant context supports the memory
50
+ */
51
+ hasAssistantContext: boolean;
52
+ /**
53
+ * Full conversation with role markers
54
+ */
55
+ fullConversation: string;
56
+ }
57
+ /**
58
+ * A line with its role from the conversation
59
+ */
60
+ export interface RoleAwareLine {
61
+ text: string;
62
+ role: MessageRole;
63
+ lineNumber: number;
64
+ }
65
+ /**
66
+ * Role validation rules for memory classifications
67
+ * Determines which roles are valid sources for each classification type
68
+ */
69
+ export declare const ROLE_VALIDATION_RULES: Record<string, {
70
+ validRoles: MessageRole[];
71
+ requiresPrimary: boolean;
72
+ }>;
73
+ /**
74
+ * Weight multiplier for Human messages in signal scoring
75
+ */
76
+ export declare const HUMAN_MESSAGE_WEIGHT_MULTIPLIER = 10;
77
+ /**
78
+ * Check if a classification requires Human as primary source
79
+ */
80
+ export declare function requiresHumanPrimary(classification: string): boolean;
81
+ /**
82
+ * Check if a role is valid for a classification
83
+ */
84
+ export declare function isValidRoleForClassification(classification: string, role: MessageRole): boolean;
85
+ export interface Session {
86
+ id: string;
87
+ project: string;
88
+ startedAt: Date;
89
+ endedAt?: Date | undefined;
90
+ status: 'active' | 'completed' | 'abandoned';
91
+ metadata?: Record<string, unknown> | undefined;
92
+ transcriptPath?: string | undefined;
93
+ transcriptWatermark?: number | undefined;
94
+ messageWatermark?: number | undefined;
95
+ }
96
+ export interface Event {
97
+ id: string;
98
+ sessionId: string;
99
+ hookType: HookType;
100
+ timestamp: Date;
101
+ content: string;
102
+ toolName?: string | undefined;
103
+ toolInput?: string | undefined;
104
+ toolOutput?: string | undefined;
105
+ metadata?: Record<string, unknown> | undefined;
106
+ }
107
+ export interface MemoryUnit {
108
+ id: string;
109
+ sessionId?: string | undefined;
110
+ store: MemoryStore;
111
+ classification: MemoryClassification;
112
+ summary: string;
113
+ sourceEventIds: string[];
114
+ projectScope?: string | undefined;
115
+ createdAt: Date;
116
+ updatedAt: Date;
117
+ lastAccessedAt: Date;
118
+ recency: number;
119
+ frequency: number;
120
+ importance: number;
121
+ utility: number;
122
+ novelty: number;
123
+ confidence: number;
124
+ interference: number;
125
+ strength: number;
126
+ decayRate: number;
127
+ tags: string[];
128
+ associations: string[];
129
+ status: MemoryStatus;
130
+ version: number;
131
+ evidence: MemoryEvidence[];
132
+ embedding?: Float32Array | undefined;
133
+ }
134
+ export interface MemoryEvidence {
135
+ eventId: string;
136
+ timestamp: Date;
137
+ contribution: string;
138
+ confidenceDelta: number;
139
+ }
140
+ export type HookType = 'SessionStart' | 'UserPromptSubmit' | 'PostToolUse' | 'Stop' | 'SessionEnd';
141
+ export interface HookInput {
142
+ hookType: HookType;
143
+ sessionId: string;
144
+ timestamp: string;
145
+ data: HookData;
146
+ }
147
+ export type HookData = SessionStartData | UserPromptSubmitData | PostToolUseData | StopData | SessionEndData;
148
+ export interface SessionStartData {
149
+ project: string;
150
+ workingDirectory: string;
151
+ metadata?: Record<string, unknown>;
152
+ }
153
+ export interface UserPromptSubmitData {
154
+ prompt: string;
155
+ metadata?: Record<string, unknown>;
156
+ }
157
+ export interface PostToolUseData {
158
+ toolName: string;
159
+ toolInput: string;
160
+ toolOutput: string;
161
+ success: boolean;
162
+ duration?: number;
163
+ metadata?: Record<string, unknown>;
164
+ }
165
+ export interface StopData {
166
+ reason: 'user' | 'complete' | 'error' | 'timeout' | 'compaction';
167
+ stopReason?: string;
168
+ conversationText?: string;
169
+ summary?: string;
170
+ metadata?: Record<string, unknown>;
171
+ }
172
+ export interface SessionEndData {
173
+ reason: 'normal' | 'clear' | 'abandoned';
174
+ metadata?: Record<string, unknown>;
175
+ }
176
+ export interface HookOutput {
177
+ success: boolean;
178
+ context?: string;
179
+ error?: string;
180
+ memoriesCreated?: number;
181
+ }
182
+ export interface MemoryCandidate {
183
+ summary: string;
184
+ classification: MemoryClassification;
185
+ sourceEventIds: string[];
186
+ importanceSignals: ImportanceSignal[];
187
+ preliminaryImportance: number;
188
+ extractionMethod: string;
189
+ confidence: number;
190
+ }
191
+ export interface ImportanceSignal {
192
+ type: ImportanceSignalType;
193
+ source: string;
194
+ weight: number;
195
+ }
196
+ export type ImportanceSignalType = 'explicit_remember' | 'emphasis_cue' | 'correction' | 'repeated_request' | 'emotional_language' | 'tool_failure' | 'bug_fix' | 'decision' | 'constraint' | 'preference' | 'learning' | 'typography_emphasis' | 'correction_pattern' | 'repetition_pattern' | 'elaboration' | 'structural_enumeration' | 'meta_reference' | 'quoted_text' | 'code_block';
197
+ export interface MemoryFeatureVector {
198
+ recency: number;
199
+ frequency: number;
200
+ importance: number;
201
+ utility: number;
202
+ novelty: number;
203
+ confidence: number;
204
+ interference: number;
205
+ }
206
+ export interface ScoringWeights {
207
+ recency: number;
208
+ frequency: number;
209
+ importance: number;
210
+ utility: number;
211
+ novelty: number;
212
+ confidence: number;
213
+ interference: number;
214
+ }
215
+ export interface RetrievalQuery {
216
+ query: string;
217
+ filters?: RetrievalFilters | undefined;
218
+ limit?: number | undefined;
219
+ includeDecayed?: boolean | undefined;
220
+ }
221
+ export interface RetrievalFilters {
222
+ store?: MemoryStore;
223
+ classifications?: MemoryClassification[];
224
+ minStrength?: number;
225
+ tags?: string[];
226
+ since?: Date;
227
+ }
228
+ export interface SweepConfig {
229
+ structuralWeight: number;
230
+ signalThreshold: number;
231
+ enableRegexPatterns: boolean;
232
+ enableStructuralAnalysis: boolean;
233
+ regexConfidence: number;
234
+ structuralConfidence: number;
235
+ }
236
+ export interface OpenCodeConfig {
237
+ injectOnCompaction: boolean;
238
+ extractOnCompaction: boolean;
239
+ extractOnMessage: boolean;
240
+ maxCompactionMemories: number;
241
+ maxSessionStartMemories: number;
242
+ messageWindowSize: number;
243
+ messageImportanceThreshold: number;
244
+ }
245
+ export interface PsychMemConfig {
246
+ agentType: AgentType;
247
+ dbPath: string;
248
+ stmDecayRate: number;
249
+ ltmDecayRate: number;
250
+ stmToLtmStrengthThreshold: number;
251
+ stmToLtmFrequencyThreshold: number;
252
+ scoringWeights: ScoringWeights;
253
+ defaultRetrievalLimit: number;
254
+ maxContextTokens: number;
255
+ autoPromoteToLtm: MemoryClassification[];
256
+ maxMemoriesPerStop: number;
257
+ deduplicationThreshold: number;
258
+ sweep: SweepConfig;
259
+ opencode: OpenCodeConfig;
260
+ applyDecayOnlyToEpisodic?: boolean;
261
+ decayThreshold?: number;
262
+ }
263
+ export type { Plugin, PluginInput, Hooks } from '@opencode-ai/plugin';
264
+ export type { Message, Part } from '@opencode-ai/sdk';
265
+ export type OpenCodeEvent = import('@opencode-ai/sdk').Event;
266
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * True-Memory Type Definitions
3
+ * Adapted from PsychMem for OpenCode
4
+ */
5
+ /**
6
+ * Classifications that are user-level (always injected)
7
+ */
8
+ export const USER_LEVEL_CLASSIFICATIONS = [
9
+ 'constraint',
10
+ 'preference',
11
+ 'learning',
12
+ 'procedural',
13
+ ];
14
+ /**
15
+ * Classifications that are project-level (only injected for matching project)
16
+ */
17
+ export const PROJECT_LEVEL_CLASSIFICATIONS = [
18
+ 'decision',
19
+ 'bugfix',
20
+ 'episodic',
21
+ 'semantic',
22
+ ];
23
+ export function isUserLevelClassification(classification) {
24
+ return USER_LEVEL_CLASSIFICATIONS.includes(classification);
25
+ }
26
+ export function getScopeForClassification(classification) {
27
+ return isUserLevelClassification(classification) ? 'user' : 'project';
28
+ }
29
+ /**
30
+ * Role validation rules for memory classifications
31
+ * Determines which roles are valid sources for each classification type
32
+ */
33
+ export const ROLE_VALIDATION_RULES = {
34
+ // User-level classifications: MUST originate from Human messages
35
+ constraint: { validRoles: ['user'], requiresPrimary: true },
36
+ preference: { validRoles: ['user'], requiresPrimary: true },
37
+ learning: { validRoles: ['user'], requiresPrimary: true },
38
+ procedural: { validRoles: ['user'], requiresPrimary: true },
39
+ // Project-level classifications: Can be Assistant-acknowledged
40
+ decision: { validRoles: ['user', 'assistant'], requiresPrimary: false },
41
+ bugfix: { validRoles: ['user', 'assistant'], requiresPrimary: false },
42
+ semantic: { validRoles: ['user', 'assistant'], requiresPrimary: false },
43
+ episodic: { validRoles: ['user', 'assistant'], requiresPrimary: false },
44
+ };
45
+ /**
46
+ * Weight multiplier for Human messages in signal scoring
47
+ */
48
+ export const HUMAN_MESSAGE_WEIGHT_MULTIPLIER = 10;
49
+ /**
50
+ * Check if a classification requires Human as primary source
51
+ */
52
+ export function requiresHumanPrimary(classification) {
53
+ const rule = ROLE_VALIDATION_RULES[classification];
54
+ return rule?.requiresPrimary ?? false;
55
+ }
56
+ /**
57
+ * Check if a role is valid for a classification
58
+ */
59
+ export function isValidRoleForClassification(classification, role) {
60
+ const rule = ROLE_VALIDATION_RULES[classification];
61
+ return rule?.validRoles.includes(role) ?? true;
62
+ }
63
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA8BH;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAA2B;IAChE,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,YAAY;CACb,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAA2B;IACnE,UAAU;IACV,QAAQ;IACR,UAAU;IACV,UAAU;CACX,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,cAAoC;IAC5E,OAAO,0BAA0B,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,cAAoC;IAC5E,OAAO,yBAAyB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC;AAuDD;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA4E;IAC5G,iEAAiE;IACjE,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE;IAC3D,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE;IAC3D,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE;IACzD,UAAU,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE;IAE3D,+DAA+D;IAC/D,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE;IACvE,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE;IACrE,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE;IACvE,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE;CACxE,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,cAAsB;IACzD,MAAM,IAAI,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACnD,OAAO,IAAI,EAAE,eAAe,IAAI,KAAK,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,cAAsB,EAAE,IAAiB;IACpF,MAAM,IAAI,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;IACnD,OAAO,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AACjD,CAAC"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "true-mem",
3
+ "version": "1.0.0",
4
+ "description": "Persistent memory plugin for OpenCode with cognitive psychology-based memory management",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "scripts": {
15
+ "build": "bun build src/index.ts --outdir dist --target bun --format esm && tsc --emitDeclarationOnly",
16
+ "dev": "bun build src/index.ts --outdir dist --target bun --format esm --watch",
17
+ "typecheck": "tsc --noEmit"
18
+ },
19
+ "keywords": [
20
+ "opencode",
21
+ "ai",
22
+ "memory",
23
+ "plugin",
24
+ "persistent",
25
+ "cognitive",
26
+ "coding-assistant"
27
+ ],
28
+ "author": "rizal72",
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/rizal72/true-mem.git"
33
+ },
34
+ "bugs": {
35
+ "url": "https://github.com/rizal72/true-mem/issues"
36
+ },
37
+ "homepage": "https://github.com/rizal72/true-mem#readme",
38
+ "files": [
39
+ "dist/",
40
+ "README.md",
41
+ "LICENSE"
42
+ ],
43
+ "dependencies": {
44
+ "@opencode-ai/plugin": "^1.2.6",
45
+ "@opencode-ai/sdk": "^1.2.6",
46
+ "uuid": "^13.0.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^25.0.0",
50
+ "@types/uuid": "^10.0.0",
51
+ "bun-types": "^1.3.0",
52
+ "typescript": "^5.9.3"
53
+ }
54
+ }