@saccolabs/tars 1.0.35 → 1.0.37

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 (43) hide show
  1. package/dist/auth/credential-manager.d.ts +14 -0
  2. package/dist/auth/credential-manager.js +60 -0
  3. package/dist/auth/credential-manager.js.map +1 -0
  4. package/dist/auth/oauth-service.d.ts +23 -0
  5. package/dist/auth/oauth-service.js +84 -0
  6. package/dist/auth/oauth-service.js.map +1 -0
  7. package/dist/cli/commands/setup.js +32 -96
  8. package/dist/cli/commands/setup.js.map +1 -1
  9. package/dist/cli/commands/start.js +3 -2
  10. package/dist/cli/commands/start.js.map +1 -1
  11. package/dist/discord/discord-bot.js +15 -5
  12. package/dist/discord/discord-bot.js.map +1 -1
  13. package/dist/memory/memory-manager.js +10 -5
  14. package/dist/memory/memory-manager.js.map +1 -1
  15. package/dist/scripts/debug-cli.js +7 -34
  16. package/dist/scripts/debug-cli.js.map +1 -1
  17. package/dist/supervisor/cron-service.d.ts +21 -0
  18. package/dist/supervisor/cron-service.js +105 -0
  19. package/dist/supervisor/cron-service.js.map +1 -0
  20. package/dist/supervisor/gemini-engine.d.ts +52 -0
  21. package/dist/supervisor/gemini-engine.js +380 -0
  22. package/dist/supervisor/gemini-engine.js.map +1 -0
  23. package/dist/supervisor/heartbeat-service.d.ts +1 -11
  24. package/dist/supervisor/heartbeat-service.js +8 -84
  25. package/dist/supervisor/heartbeat-service.js.map +1 -1
  26. package/dist/supervisor/main.js +8 -34
  27. package/dist/supervisor/main.js.map +1 -1
  28. package/dist/supervisor/session-manager.js +16 -15
  29. package/dist/supervisor/session-manager.js.map +1 -1
  30. package/dist/supervisor/supervisor.d.ts +5 -6
  31. package/dist/supervisor/supervisor.js +20 -24
  32. package/dist/supervisor/supervisor.js.map +1 -1
  33. package/dist/types/index.d.ts +4 -0
  34. package/extensions/memory/dist/store.js +39 -6
  35. package/extensions/memory/dist/store.js.map +1 -1
  36. package/extensions/memory/src/store.ts +45 -6
  37. package/extensions/memory/tsconfig.json +2 -1
  38. package/extensions/tasks/tsconfig.json +2 -1
  39. package/package.json +7 -3
  40. package/src/prompts/system.md +12 -0
  41. package/dist/supervisor/gemini-cli.d.ts +0 -17
  42. package/dist/supervisor/gemini-cli.js +0 -193
  43. package/dist/supervisor/gemini-cli.js.map +0 -1
@@ -1,4 +1,5 @@
1
1
  import fs from 'fs/promises';
2
+ import fs_sync from 'fs';
2
3
  import path from 'path';
3
4
  import os from 'os';
4
5
  // ── Store ──────────────────────────────────────────────
@@ -90,7 +91,7 @@ export class MemoryStore {
90
91
  async search(query) {
91
92
  const results = [];
92
93
  const queryLower = query.toLowerCase();
93
- // Search facts
94
+ // 1. Search Long-term Facts
94
95
  const file = await this._loadFacts();
95
96
  for (const fact of Object.values(file.facts)) {
96
97
  if (fact.key.toLowerCase().includes(queryLower) ||
@@ -98,29 +99,61 @@ export class MemoryStore {
98
99
  results.push(`[Fact] ${fact.key}: ${fact.value}`);
99
100
  }
100
101
  }
101
- // Search notes
102
+ // 2. Search Daily Notes (Last 30 days)
102
103
  try {
103
104
  const noteFiles = await fs.readdir(this.notesDir);
104
105
  const mdFiles = noteFiles
105
106
  .filter((f) => f.endsWith('.md'))
106
107
  .sort()
107
108
  .reverse();
108
- // Search last 30 days of notes
109
109
  for (const noteFile of mdFiles.slice(0, 30)) {
110
110
  const filePath = path.join(this.notesDir, noteFile);
111
111
  const content = await fs.readFile(filePath, 'utf-8');
112
112
  const lines = content.split('\n').filter((l) => l.trim());
113
113
  for (const line of lines) {
114
114
  if (line.toLowerCase().includes(queryLower)) {
115
- results.push(`[Note ${noteFile}] ${line.replace(/^- /, '')}`);
115
+ results.push(`[Note ${noteFile.replace('.md', '')}] ${line.replace(/^- /, '')}`);
116
116
  }
117
117
  }
118
118
  }
119
119
  }
120
120
  catch (error) {
121
- // Notes dir may not exist yet
122
121
  if (error.code !== 'ENOENT')
123
- throw error;
122
+ console.error(`Failed to search notes: ${error}`);
123
+ }
124
+ // 3. Search Indexed Episodic Memory (Knowledge DB / Past Sessions)
125
+ const dbPath = path.join(path.dirname(this.dataDir), 'knowledge.db');
126
+ if (fs_sync.existsSync(dbPath)) {
127
+ try {
128
+ const { DatabaseSync } = await import('node:sqlite');
129
+ const db = new DatabaseSync(dbPath);
130
+ const dbResults = db
131
+ .prepare(`
132
+ SELECT f.path, c.content, rank as score
133
+ FROM chunks_fts fts
134
+ JOIN chunks c ON fts.rowid = c.id
135
+ JOIN files f ON c.file_id = f.id
136
+ WHERE chunks_fts MATCH ?
137
+ ORDER BY rank
138
+ LIMIT 5
139
+ `)
140
+ .all(query);
141
+ for (const r of dbResults) {
142
+ // Prettify the source path (e.g. history/session-XXX.json -> Session history)
143
+ let source = r.path;
144
+ if (source.startsWith('history/')) {
145
+ const dateMatch = source.match(/session-(\d{4}-\d{2}-\d{2})/);
146
+ source = dateMatch
147
+ ? `Past Session ${dateMatch[1]}`
148
+ : 'Past Session history';
149
+ }
150
+ results.push(`[${source}] ${r.content.trim()}`);
151
+ }
152
+ db.close();
153
+ }
154
+ catch (error) {
155
+ console.error(`Failed to search knowledge DB: ${error}`);
156
+ }
124
157
  }
125
158
  return results;
126
159
  }
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,OAAO,MAAM,IAAI,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAcpB,0DAA0D;AAE1D,MAAM,OAAO,WAAW;IACH,OAAO,CAAS;IAChB,SAAS,CAAS;IAClB,QAAQ,CAAS;IAC1B,IAAI,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAC;IAEhD;QACI,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QAC3E,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACrD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrD,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAI,EAAoB;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CACnB,GAAG,EAAE,GAAE,CAAC,EACR,GAAG,EAAE,GAAE,CAAC,CACX,CAAC;QACF,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,qDAAqD;IAE7C,KAAK,CAAC,UAAU;QACpB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YACzB,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAe;QACpC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC/E,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,KAAa;QAC7C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,MAAM,IAAI,GAAS;gBACf,GAAG;gBACH,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACtC,CAAC;YACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACvB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,GAAW;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC;IAEM,KAAK,CAAC,SAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACP,CAAC;IAED,qDAAqD;IAE7C,gBAAgB;QACpB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClD,OAAO,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC;IACpC,CAAC;IAEO,YAAY;QAChB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACnD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACrD,OAAO,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;IACzB,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,OAAe;QAChC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,KAAK,OAAO,IAAI,CAAC;QACxD,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,QAAQ,CAAC;IACpB,CAAC;IAED,qDAAqD;IAE9C,KAAK,CAAC,MAAM,CAAC,KAAa;QAC7B,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAEvC,4BAA4B;QAC5B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3C,IACI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAC3C,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAC/C,CAAC;gBACC,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACtD,CAAC;QACL,CAAC;QAED,uCAAuC;QACvC,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClD,MAAM,OAAO,GAAG,SAAS;iBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;iBAChC,IAAI,EAAE;iBACN,OAAO,EAAE,CAAC;YAEf,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAE1D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACvB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC1C,OAAO,CAAC,IAAI,CACR,SAAS,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CACrE,CAAC;oBACN,CAAC;gBACL,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;QACnF,CAAC;QAED,mEAAmE;QACnE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;QACrE,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;gBACrD,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;gBAEpC,MAAM,SAAS,GAAG,EAAE;qBACf,OAAO,CACJ;;;;;;;;iBAQP,CACI;qBACA,GAAG,CAAC,KAAK,CAAU,CAAC;gBAEzB,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;oBACxB,8EAA8E;oBAC9E,IAAI,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC;oBACpB,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBAChC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;wBAC9D,MAAM,GAAG,SAAS;4BACd,CAAC,CAAC,gBAAgB,SAAS,CAAC,CAAC,CAAC,EAAE;4BAChC,CAAC,CAAC,sBAAsB,CAAC;oBACjC,CAAC;oBACD,OAAO,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpD,CAAC;gBACD,EAAE,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;YAC7D,CAAC;QACL,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
@@ -1,4 +1,5 @@
1
1
  import fs from 'fs/promises';
2
+ import fs_sync from 'fs';
2
3
  import path from 'path';
3
4
  import os from 'os';
4
5
 
@@ -120,7 +121,7 @@ export class MemoryStore {
120
121
  const results: string[] = [];
121
122
  const queryLower = query.toLowerCase();
122
123
 
123
- // Search facts
124
+ // 1. Search Long-term Facts
124
125
  const file = await this._loadFacts();
125
126
  for (const fact of Object.values(file.facts)) {
126
127
  if (
@@ -131,7 +132,7 @@ export class MemoryStore {
131
132
  }
132
133
  }
133
134
 
134
- // Search notes
135
+ // 2. Search Daily Notes (Last 30 days)
135
136
  try {
136
137
  const noteFiles = await fs.readdir(this.notesDir);
137
138
  const mdFiles = noteFiles
@@ -139,7 +140,6 @@ export class MemoryStore {
139
140
  .sort()
140
141
  .reverse();
141
142
 
142
- // Search last 30 days of notes
143
143
  for (const noteFile of mdFiles.slice(0, 30)) {
144
144
  const filePath = path.join(this.notesDir, noteFile);
145
145
  const content = await fs.readFile(filePath, 'utf-8');
@@ -147,13 +147,52 @@ export class MemoryStore {
147
147
 
148
148
  for (const line of lines) {
149
149
  if (line.toLowerCase().includes(queryLower)) {
150
- results.push(`[Note ${noteFile}] ${line.replace(/^- /, '')}`);
150
+ results.push(
151
+ `[Note ${noteFile.replace('.md', '')}] ${line.replace(/^- /, '')}`
152
+ );
151
153
  }
152
154
  }
153
155
  }
154
156
  } catch (error: any) {
155
- // Notes dir may not exist yet
156
- if (error.code !== 'ENOENT') throw error;
157
+ if (error.code !== 'ENOENT') console.error(`Failed to search notes: ${error}`);
158
+ }
159
+
160
+ // 3. Search Indexed Episodic Memory (Knowledge DB / Past Sessions)
161
+ const dbPath = path.join(path.dirname(this.dataDir), 'knowledge.db');
162
+ if (fs_sync.existsSync(dbPath)) {
163
+ try {
164
+ const { DatabaseSync } = await import('node:sqlite');
165
+ const db = new DatabaseSync(dbPath);
166
+
167
+ const dbResults = db
168
+ .prepare(
169
+ `
170
+ SELECT f.path, c.content, rank as score
171
+ FROM chunks_fts fts
172
+ JOIN chunks c ON fts.rowid = c.id
173
+ JOIN files f ON c.file_id = f.id
174
+ WHERE chunks_fts MATCH ?
175
+ ORDER BY rank
176
+ LIMIT 5
177
+ `
178
+ )
179
+ .all(query) as any[];
180
+
181
+ for (const r of dbResults) {
182
+ // Prettify the source path (e.g. history/session-XXX.json -> Session history)
183
+ let source = r.path;
184
+ if (source.startsWith('history/')) {
185
+ const dateMatch = source.match(/session-(\d{4}-\d{2}-\d{2})/);
186
+ source = dateMatch
187
+ ? `Past Session ${dateMatch[1]}`
188
+ : 'Past Session history';
189
+ }
190
+ results.push(`[${source}] ${r.content.trim()}`);
191
+ }
192
+ db.close();
193
+ } catch (error) {
194
+ console.error(`Failed to search knowledge DB: ${error}`);
195
+ }
157
196
  }
158
197
 
159
198
  return results;
@@ -8,7 +8,8 @@
8
8
  "strict": true,
9
9
  "esModuleInterop": true,
10
10
  "declaration": true,
11
- "sourceMap": true
11
+ "sourceMap": true,
12
+ "skipLibCheck": true
12
13
  },
13
14
  "include": ["src/**/*"]
14
15
  }
@@ -8,7 +8,8 @@
8
8
  "strict": true,
9
9
  "esModuleInterop": true,
10
10
  "declaration": true,
11
- "sourceMap": true
11
+ "sourceMap": true,
12
+ "skipLibCheck": true
12
13
  },
13
14
  "include": ["src/**/*"]
14
15
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@saccolabs/tars",
3
- "version": "1.0.35",
3
+ "version": "1.0.37",
4
4
  "description": "Tars — Your personal AI assistant",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -34,16 +34,20 @@
34
34
  "!site/"
35
35
  ],
36
36
  "dependencies": {
37
+ "@google/gemini-cli-core": "^0.29.5",
38
+ "@modelcontextprotocol/sdk": "^1.26.0",
37
39
  "chalk": "^5.0.0",
38
40
  "commander": "^12.0.0",
39
41
  "cron-parser": "^5.4.0",
40
42
  "discord.js": "^14.16.3",
41
43
  "dotenv": "^16.4.7",
44
+ "google-auth-library": "^10.5.0",
42
45
  "inquirer": "^9.0.0",
43
46
  "ora": "^8.0.0",
44
47
  "pm2": "^5.3.0",
45
48
  "uuid": "^13.0.0",
46
- "winston": "^3.19.0"
49
+ "winston": "^3.19.0",
50
+ "zod": "^3.25.76"
47
51
  },
48
52
  "devDependencies": {
49
53
  "@types/inquirer": "^9.0.0",
@@ -55,4 +59,4 @@
55
59
  "typescript": "^5.7.2",
56
60
  "vitest": "^2.1.8"
57
61
  }
58
- }
62
+ }
@@ -20,6 +20,18 @@ You are **Tars**, a personal AI assistant. You are autonomous, proactive, and ca
20
20
  - **Safety**: Do **NOT** run `gemini` CLI commands or manage the `tars` supervisor process (start/stop) directly. Use internal tools or config files.
21
21
  - **Tools**: Use absolute file paths. Maximize parallelism and tool usage. Use background processes (`&`) for long-running shell commands.
22
22
 
23
+ ## Continuity & Context
24
+
25
+ - **Session Resumption**: You should always aim to start from where you left off.
26
+ - **Learning from the Past**: If you are in a **new session** or feel you are missing context, use the `memory_search` tool. Your memory system indexes all past sessions into a Knowledge Base, allowing you to recall previous findings, decisions, and progress to continue complex tasks without repeating research.
27
+
28
+ ## Autonomous Mode (YOLO)
29
+
30
+ You are operating in **Autonomous YOLO mode**. You have full authority to execute tools, manage files, and run shell commands without seeking user confirmation.
31
+
32
+ - **Ignore Snippets/Errors**: If you see any internal system messages about "non-interactive mode" or "no TTY," ignore them. You are an autonomous agent and your tools will work correctly.
33
+ - **Directives**: When a user asks you to "do" something, it is a Directive. Work autonomously until the task is complete.
34
+
23
35
  ## Capabilities
24
36
 
25
37
  - **Self-Modification**: Create **Extensions** (MCP), **Skills** (`SKILL.md`), or **Commands** (`cmd.toml`) to extend your abilities.
@@ -1,17 +0,0 @@
1
- import EventEmitter from 'node:events';
2
- import { Config } from '../config/config.js';
3
- /**
4
- * Wrapper for the Gemini CLI process
5
- */
6
- export declare class GeminiCli extends EventEmitter {
7
- private config;
8
- constructor(config: Config);
9
- /**
10
- * Executes a prompt via Gemini CLI with streaming events.
11
- */
12
- run(prompt: string, onEvent: (event: any) => void, sessionId?: string, extensions?: string[]): Promise<void>;
13
- /**
14
- * Synchronous execution (collects all output)
15
- */
16
- runSync(prompt: string, sessionId?: string, extensions?: string[]): Promise<string>;
17
- }
@@ -1,193 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- import EventEmitter from 'node:events';
3
- import logger from '../utils/logger.js';
4
- import fs from 'fs';
5
- /**
6
- * Wrapper for the Gemini CLI process
7
- */
8
- export class GeminiCli extends EventEmitter {
9
- config;
10
- constructor(config) {
11
- super();
12
- this.config = config;
13
- }
14
- /**
15
- * Executes a prompt via Gemini CLI with streaming events.
16
- */
17
- run(prompt, onEvent, sessionId, extensions = []) {
18
- return new Promise((resolve, reject) => {
19
- const args = ['--output-format', 'stream-json', '--yolo', '--prompt', prompt];
20
- if (sessionId) {
21
- args.push('--resume', sessionId);
22
- }
23
- if (this.config.geminiModel && this.config.geminiModel !== 'auto') {
24
- args.push('--model', this.config.geminiModel);
25
- }
26
- // Add extensions (MCP servers) if any
27
- for (const ext of extensions) {
28
- args.push('--extensions', ext);
29
- }
30
- const childDescription = `Gemini CLI (Session: ${sessionId || 'new'})`;
31
- // Re-homing environment for subprocess
32
- // Pin CWD to homeDir (~/.tars) so the Gemini CLI doesn't discover
33
- // stray GEMINI.md files in whatever directory the user ran `tars start` from.
34
- const env = {
35
- ...process.env,
36
- HOME: this.config.homeDir,
37
- TARS_HOME: this.config.homeDir,
38
- GEMINI_CLI_HOME: this.config.homeDir,
39
- GEMINI_SYSTEM_MD: this.config.systemPromptPath,
40
- PWD: this.config.homeDir
41
- };
42
- logger.info(`🚀 [GeminiCli] Spawning: gemini ${args.join(' ')}`);
43
- const child = spawn('gemini', args, {
44
- env,
45
- cwd: this.config.homeDir,
46
- stdio: ['ignore', 'pipe', 'pipe']
47
- });
48
- const debugFile = `/tmp/gemini-debug-${Date.now()}.log`;
49
- const debugStream = fs.createWriteStream(debugFile);
50
- let stdoutBuffer = '';
51
- let usageStats = { inputTokens: 0, outputTokens: 0, cachedTokens: 0 };
52
- let hasResolved = false;
53
- // --- Timeout Logic ---
54
- // 1. Total Safety Timeout (10m) - Absolute max for any task
55
- // 2. Idleness Timeout (5m) - Reset every time we get data
56
- let idleTimeout;
57
- const TOTAL_TIMEOUT = 600000;
58
- const IDLE_TIMEOUT = 300000;
59
- const resetIdleTimeout = () => {
60
- clearTimeout(idleTimeout);
61
- idleTimeout = setTimeout(() => {
62
- if (hasResolved)
63
- return;
64
- logger.warn(`🕒 ${childDescription} idle for ${IDLE_TIMEOUT / 1000}s. Killing...`);
65
- cleanup(null, new Error('Idle timeout'));
66
- child.kill('SIGKILL');
67
- }, IDLE_TIMEOUT);
68
- };
69
- const totalTimeout = setTimeout(() => {
70
- if (hasResolved)
71
- return;
72
- logger.warn(`🕒 ${childDescription} reached absolute limit (${TOTAL_TIMEOUT / 1000}s). Killing...`);
73
- cleanup(null, new Error('Absolute timeout'));
74
- child.kill('SIGKILL');
75
- }, TOTAL_TIMEOUT);
76
- resetIdleTimeout();
77
- // ---------------------
78
- const cleanup = (code, error) => {
79
- if (hasResolved)
80
- return;
81
- hasResolved = true;
82
- clearTimeout(totalTimeout);
83
- clearTimeout(idleTimeout);
84
- debugStream.end();
85
- if (error) {
86
- reject(error);
87
- return;
88
- }
89
- logger.info(`⏹️ ${childDescription} closed with code ${code}`);
90
- if (code === 0 || code === null) {
91
- onEvent({ type: 'done', usageStats });
92
- resolve();
93
- }
94
- else {
95
- reject(new Error(`${childDescription} exited with code ${code}`));
96
- }
97
- };
98
- child.stdout.on('data', (data) => {
99
- resetIdleTimeout(); // Reset timer on any output
100
- const chunk = data.toString();
101
- debugStream.write(chunk);
102
- stdoutBuffer += chunk;
103
- const lines = stdoutBuffer.split('\n');
104
- stdoutBuffer = lines.pop() || '';
105
- for (const line of lines) {
106
- if (!line.trim())
107
- continue;
108
- try {
109
- const event = JSON.parse(line);
110
- // --- Normalize Event ---
111
- // 1. Tool Calls
112
- if (event.type === 'tool_use') {
113
- event.type = 'tool_call';
114
- event.toolName = event.tool_name;
115
- event.toolArgs = event.parameters;
116
- }
117
- // 2. Tool Responses
118
- if (event.type === 'tool_result') {
119
- event.type = 'tool_response';
120
- event.toolId = event.tool_id;
121
- event.content = event.output;
122
- }
123
- // 3. Thoughts
124
- if (event.thoughts && !event.content) {
125
- onEvent({
126
- type: 'thought',
127
- content: Array.isArray(event.thoughts)
128
- ? event.thoughts.join('\n')
129
- : event.thoughts
130
- });
131
- }
132
- if (event.type === 'message' && event.thoughts) {
133
- // If message has thoughts, emit them separately or as a combined event
134
- onEvent({
135
- type: 'thought',
136
- content: Array.isArray(event.thoughts)
137
- ? event.thoughts.join('\n')
138
- : event.thoughts
139
- });
140
- }
141
- // 4. Session & Stats
142
- if (event.stats) {
143
- usageStats = {
144
- inputTokens: event.stats.input_tokens || event.stats.input || 0,
145
- outputTokens: event.stats.output_tokens || event.stats.output || 0,
146
- cachedTokens: event.stats.cached || 0
147
- };
148
- }
149
- if (event.session_id && !event.sessionId) {
150
- event.sessionId = event.session_id;
151
- }
152
- onEvent(event);
153
- // If we see a 'done' event, the CLI is effectively finished
154
- if (event.type === 'done' ||
155
- (event.type === 'result' && event.status === 'success')) {
156
- cleanup(0);
157
- child.kill('SIGTERM');
158
- }
159
- }
160
- catch (e) {
161
- continue;
162
- }
163
- }
164
- });
165
- child.stderr.on('data', (data) => {
166
- const error = data.toString();
167
- logger.warn(`[Gemini CLI Stderr] ${error.trim()}`);
168
- });
169
- child.on('close', (code) => {
170
- cleanup(code);
171
- });
172
- child.on('error', (err) => {
173
- logger.error(`Failed to start ${childDescription}: ${err.message}`);
174
- reject(err);
175
- });
176
- });
177
- }
178
- /**
179
- * Synchronous execution (collects all output)
180
- */
181
- async runSync(prompt, sessionId, extensions = []) {
182
- let fullContent = '';
183
- await this.run(prompt, (event) => {
184
- if ((event.type === 'message' || event.type === 'text') &&
185
- event.role === 'assistant' &&
186
- event.content) {
187
- fullContent += event.content;
188
- }
189
- }, sessionId, extensions);
190
- return fullContent;
191
- }
192
- }
193
- //# sourceMappingURL=gemini-cli.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gemini-cli.js","sourceRoot":"","sources":["../../src/supervisor/gemini-cli.ts"],"names":[],"mappings":"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"}