@saccolabs/tars 1.0.34 → 1.0.35

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 (32) hide show
  1. package/context/config/settings.json-template +11 -5
  2. package/dist/discord/discord-bot.js +1 -1
  3. package/dist/discord/message-formatter.js +40 -6
  4. package/dist/discord/message-formatter.js.map +1 -1
  5. package/dist/supervisor/gemini-cli.d.ts +0 -11
  6. package/dist/supervisor/gemini-cli.js +0 -154
  7. package/dist/supervisor/gemini-cli.js.map +1 -1
  8. package/dist/supervisor/heartbeat-service.d.ts +14 -1
  9. package/dist/supervisor/heartbeat-service.js +48 -16
  10. package/dist/supervisor/heartbeat-service.js.map +1 -1
  11. package/dist/supervisor/main.js +20 -23
  12. package/dist/supervisor/main.js.map +1 -1
  13. package/dist/supervisor/session-manager.d.ts +16 -1
  14. package/dist/supervisor/session-manager.js +43 -1
  15. package/dist/supervisor/session-manager.js.map +1 -1
  16. package/dist/supervisor/supervisor.d.ts +4 -6
  17. package/dist/supervisor/supervisor.js +24 -29
  18. package/dist/supervisor/supervisor.js.map +1 -1
  19. package/extensions/memory/dist/server.d.ts +1 -0
  20. package/extensions/memory/dist/server.js +190 -0
  21. package/extensions/memory/dist/server.js.map +1 -0
  22. package/extensions/memory/dist/store.d.ts +25 -0
  23. package/extensions/memory/dist/store.js +128 -0
  24. package/extensions/memory/dist/store.js.map +1 -0
  25. package/extensions/memory/gemini-extension.json +14 -0
  26. package/extensions/memory/package-lock.json +1173 -0
  27. package/extensions/memory/package.json +17 -0
  28. package/extensions/memory/src/server.ts +210 -0
  29. package/extensions/memory/src/store.ts +161 -0
  30. package/extensions/memory/tsconfig.json +14 -0
  31. package/package.json +2 -2
  32. package/src/prompts/system.md +7 -2
@@ -0,0 +1,25 @@
1
+ export interface Fact {
2
+ key: string;
3
+ value: string;
4
+ updatedAt: string;
5
+ }
6
+ export interface FactsFile {
7
+ facts: Record<string, Fact>;
8
+ }
9
+ export declare class MemoryStore {
10
+ private readonly dataDir;
11
+ private readonly factsPath;
12
+ private readonly notesDir;
13
+ private lock;
14
+ constructor();
15
+ private withLock;
16
+ private _loadFacts;
17
+ private _saveFacts;
18
+ storeFact(key: string, value: string): Promise<Fact>;
19
+ deleteFact(key: string): Promise<boolean>;
20
+ listFacts(): Promise<Fact[]>;
21
+ private getTodayFileName;
22
+ private getTimestamp;
23
+ addNote(content: string): Promise<string>;
24
+ search(query: string): Promise<string[]>;
25
+ }
@@ -0,0 +1,128 @@
1
+ import fs from 'fs/promises';
2
+ import path from 'path';
3
+ import os from 'os';
4
+ // ── Store ──────────────────────────────────────────────
5
+ export class MemoryStore {
6
+ dataDir;
7
+ factsPath;
8
+ notesDir;
9
+ lock = Promise.resolve();
10
+ constructor() {
11
+ const tarsHome = process.env.TARS_HOME || path.join(os.homedir(), '.tars');
12
+ this.dataDir = path.join(tarsHome, 'data', 'memory');
13
+ this.factsPath = path.join(this.dataDir, 'facts.json');
14
+ this.notesDir = path.join(this.dataDir, 'notes');
15
+ }
16
+ async withLock(fn) {
17
+ const result = this.lock.then(fn);
18
+ this.lock = result.then(() => { }, () => { });
19
+ return result;
20
+ }
21
+ // ── Facts (Key-Value) ─────────────────────────────
22
+ async _loadFacts() {
23
+ try {
24
+ const data = await fs.readFile(this.factsPath, 'utf-8');
25
+ return JSON.parse(data);
26
+ }
27
+ catch (error) {
28
+ if (error.code === 'ENOENT') {
29
+ return { facts: {} };
30
+ }
31
+ throw error;
32
+ }
33
+ }
34
+ async _saveFacts(file) {
35
+ await fs.mkdir(path.dirname(this.factsPath), { recursive: true });
36
+ await fs.writeFile(this.factsPath, JSON.stringify(file, null, 2), 'utf-8');
37
+ }
38
+ async storeFact(key, value) {
39
+ return this.withLock(async () => {
40
+ const file = await this._loadFacts();
41
+ const fact = {
42
+ key,
43
+ value,
44
+ updatedAt: new Date().toISOString()
45
+ };
46
+ file.facts[key] = fact;
47
+ await this._saveFacts(file);
48
+ return fact;
49
+ });
50
+ }
51
+ async deleteFact(key) {
52
+ return this.withLock(async () => {
53
+ const file = await this._loadFacts();
54
+ if (!(key in file.facts))
55
+ return false;
56
+ delete file.facts[key];
57
+ await this._saveFacts(file);
58
+ return true;
59
+ });
60
+ }
61
+ async listFacts() {
62
+ return this.withLock(async () => {
63
+ const file = await this._loadFacts();
64
+ return Object.values(file.facts);
65
+ });
66
+ }
67
+ // ── Notes (Daily Append-Only) ─────────────────────
68
+ getTodayFileName() {
69
+ const now = new Date();
70
+ const yyyy = now.getFullYear();
71
+ const mm = String(now.getMonth() + 1).padStart(2, '0');
72
+ const dd = String(now.getDate()).padStart(2, '0');
73
+ return `${yyyy}-${mm}-${dd}.md`;
74
+ }
75
+ getTimestamp() {
76
+ const now = new Date();
77
+ const hh = String(now.getHours()).padStart(2, '0');
78
+ const mm = String(now.getMinutes()).padStart(2, '0');
79
+ return `${hh}:${mm}`;
80
+ }
81
+ async addNote(content) {
82
+ await fs.mkdir(this.notesDir, { recursive: true });
83
+ const fileName = this.getTodayFileName();
84
+ const filePath = path.join(this.notesDir, fileName);
85
+ const entry = `- [${this.getTimestamp()}] ${content}\n`;
86
+ await fs.appendFile(filePath, entry, 'utf-8');
87
+ return fileName;
88
+ }
89
+ // ── Search ────────────────────────────────────────
90
+ async search(query) {
91
+ const results = [];
92
+ const queryLower = query.toLowerCase();
93
+ // Search facts
94
+ const file = await this._loadFacts();
95
+ for (const fact of Object.values(file.facts)) {
96
+ if (fact.key.toLowerCase().includes(queryLower) ||
97
+ fact.value.toLowerCase().includes(queryLower)) {
98
+ results.push(`[Fact] ${fact.key}: ${fact.value}`);
99
+ }
100
+ }
101
+ // Search notes
102
+ try {
103
+ const noteFiles = await fs.readdir(this.notesDir);
104
+ const mdFiles = noteFiles
105
+ .filter((f) => f.endsWith('.md'))
106
+ .sort()
107
+ .reverse();
108
+ // Search last 30 days of notes
109
+ for (const noteFile of mdFiles.slice(0, 30)) {
110
+ const filePath = path.join(this.notesDir, noteFile);
111
+ const content = await fs.readFile(filePath, 'utf-8');
112
+ const lines = content.split('\n').filter((l) => l.trim());
113
+ for (const line of lines) {
114
+ if (line.toLowerCase().includes(queryLower)) {
115
+ results.push(`[Note ${noteFile}] ${line.replace(/^- /, '')}`);
116
+ }
117
+ }
118
+ }
119
+ }
120
+ catch (error) {
121
+ // Notes dir may not exist yet
122
+ if (error.code !== 'ENOENT')
123
+ throw error;
124
+ }
125
+ return results;
126
+ }
127
+ }
128
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ {
2
+ "name": "tars-memory",
3
+ "version": "1.0.0",
4
+ "description": "Memory management for Tars — core facts and daily notes",
5
+ "mcpServers": {
6
+ "memory": {
7
+ "command": "node",
8
+ "args": ["${extensionPath}/dist/server.js"],
9
+ "env": {
10
+ "TARS_HOME": "~/.tars"
11
+ }
12
+ }
13
+ }
14
+ }