agent-knowledge 1.0.13 → 1.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 (57) hide show
  1. package/CHANGELOG.md +25 -1
  2. package/README.md +60 -31
  3. package/dist/embeddings/{claude.d.ts → anthropic.d.ts} +2 -2
  4. package/dist/embeddings/anthropic.d.ts.map +1 -0
  5. package/dist/embeddings/{claude.js → anthropic.js} +2 -2
  6. package/dist/embeddings/anthropic.js.map +1 -0
  7. package/dist/embeddings/factory.js +4 -4
  8. package/dist/embeddings/factory.js.map +1 -1
  9. package/dist/embeddings/types.d.ts +1 -1
  10. package/dist/embeddings/types.d.ts.map +1 -1
  11. package/dist/embeddings/types.js +1 -1
  12. package/dist/embeddings/types.js.map +1 -1
  13. package/dist/knowledge/distill.d.ts +1 -1
  14. package/dist/knowledge/distill.js +2 -2
  15. package/dist/knowledge/distill.js.map +1 -1
  16. package/dist/server.js +2 -2
  17. package/dist/server.js.map +1 -1
  18. package/dist/sessions/adapters/aider.d.ts +3 -0
  19. package/dist/sessions/adapters/aider.d.ts.map +1 -0
  20. package/dist/sessions/adapters/aider.js +140 -0
  21. package/dist/sessions/adapters/aider.js.map +1 -0
  22. package/dist/sessions/adapters/cline.d.ts +3 -0
  23. package/dist/sessions/adapters/cline.d.ts.map +1 -0
  24. package/dist/sessions/adapters/cline.js +74 -0
  25. package/dist/sessions/adapters/cline.js.map +1 -0
  26. package/dist/sessions/adapters/continue.d.ts +3 -0
  27. package/dist/sessions/adapters/continue.d.ts.map +1 -0
  28. package/dist/sessions/adapters/continue.js +74 -0
  29. package/dist/sessions/adapters/continue.js.map +1 -0
  30. package/dist/sessions/adapters/index.d.ts +25 -0
  31. package/dist/sessions/adapters/index.d.ts.map +1 -0
  32. package/dist/sessions/adapters/index.js +21 -0
  33. package/dist/sessions/adapters/index.js.map +1 -0
  34. package/dist/sessions/adapters/opencode.d.ts +3 -0
  35. package/dist/sessions/adapters/opencode.d.ts.map +1 -0
  36. package/dist/sessions/adapters/opencode.js +88 -0
  37. package/dist/sessions/adapters/opencode.js.map +1 -0
  38. package/dist/sessions/parser.d.ts +12 -2
  39. package/dist/sessions/parser.d.ts.map +1 -1
  40. package/dist/sessions/parser.js +137 -20
  41. package/dist/sessions/parser.js.map +1 -1
  42. package/dist/sessions/summary.d.ts.map +1 -1
  43. package/dist/sessions/summary.js +20 -0
  44. package/dist/sessions/summary.js.map +1 -1
  45. package/dist/types.d.ts +3 -2
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/types.js +22 -12
  48. package/dist/types.js.map +1 -1
  49. package/dist/vectorstore/store.d.ts +1 -1
  50. package/dist/vectorstore/store.js +2 -2
  51. package/dist/vectorstore/store.js.map +1 -1
  52. package/docs/ARCHITECTURE.md +67 -10
  53. package/docs/DASHBOARD.md +4 -3
  54. package/docs/SETUP.md +84 -38
  55. package/package.json +2 -2
  56. package/dist/embeddings/claude.d.ts.map +0 -1
  57. package/dist/embeddings/claude.js.map +0 -1
@@ -0,0 +1,140 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join, basename } from 'path';
4
+ const PREFIX = 'aider://';
5
+ const HISTORY_FILE = '.aider.chat.history.md';
6
+ const LLM_HISTORY_FILE = '.aider.llm.history';
7
+ function findAiderProjects() {
8
+ // Scan common development directories for aider history files
9
+ const home = homedir();
10
+ const candidates = [
11
+ join(home, 'projects'),
12
+ join(home, 'code'),
13
+ join(home, 'dev'),
14
+ join(home, 'src'),
15
+ join(home, 'repos'),
16
+ join(home, 'workspace'),
17
+ ];
18
+ const found = [];
19
+ for (const dir of candidates) {
20
+ if (!existsSync(dir))
21
+ continue;
22
+ try {
23
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
24
+ if (!entry.isDirectory())
25
+ continue;
26
+ const projectDir = join(dir, entry.name);
27
+ if (existsSync(join(projectDir, HISTORY_FILE)) ||
28
+ existsSync(join(projectDir, LLM_HISTORY_FILE))) {
29
+ found.push(projectDir);
30
+ }
31
+ }
32
+ }
33
+ catch {
34
+ // skip
35
+ }
36
+ }
37
+ return found;
38
+ }
39
+ export const aiderAdapter = {
40
+ prefix: 'aider',
41
+ name: 'Aider',
42
+ isAvailable() {
43
+ return findAiderProjects().length > 0;
44
+ },
45
+ discoverProjects() {
46
+ return findAiderProjects().map((dir) => ({
47
+ name: `aider-${basename(dir)}`,
48
+ path: `${PREFIX}project:${dir}`,
49
+ }));
50
+ },
51
+ listSessions(projectDescriptor) {
52
+ const dir = projectDescriptor.replace(`${PREFIX}project:`, '');
53
+ const sessions = [];
54
+ const mdPath = join(dir, HISTORY_FILE);
55
+ if (existsSync(mdPath)) {
56
+ sessions.push({ id: 'chat-history', file: `${PREFIX}md:${mdPath}` });
57
+ }
58
+ const jsonlPath = join(dir, LLM_HISTORY_FILE);
59
+ if (existsSync(jsonlPath)) {
60
+ sessions.push({ id: 'llm-history', file: `${PREFIX}jsonl:${jsonlPath}` });
61
+ }
62
+ return sessions;
63
+ },
64
+ parseSession(descriptor) {
65
+ if (descriptor.startsWith(`${PREFIX}md:`)) {
66
+ return parseAiderMarkdown(descriptor.replace(`${PREFIX}md:`, ''));
67
+ }
68
+ if (descriptor.startsWith(`${PREFIX}jsonl:`)) {
69
+ return parseAiderJsonl(descriptor.replace(`${PREFIX}jsonl:`, ''));
70
+ }
71
+ return [];
72
+ },
73
+ };
74
+ function parseAiderMarkdown(filePath) {
75
+ if (!existsSync(filePath))
76
+ return [];
77
+ try {
78
+ const raw = readFileSync(filePath, 'utf-8');
79
+ const entries = [];
80
+ // Aider markdown uses #### headings for user messages, rest is assistant
81
+ const sections = raw.split(/^####\s+/m);
82
+ for (const section of sections) {
83
+ if (!section.trim())
84
+ continue;
85
+ const lines = section.split('\n');
86
+ const firstLine = lines[0]?.trim();
87
+ if (!firstLine)
88
+ continue;
89
+ // First line after #### is the user message
90
+ entries.push({
91
+ type: 'user',
92
+ message: { role: 'user', content: firstLine },
93
+ });
94
+ // Rest is assistant response
95
+ const response = lines.slice(1).join('\n').trim();
96
+ if (response) {
97
+ entries.push({
98
+ type: 'assistant',
99
+ message: { role: 'assistant', content: response },
100
+ });
101
+ }
102
+ }
103
+ return entries;
104
+ }
105
+ catch {
106
+ return [];
107
+ }
108
+ }
109
+ function parseAiderJsonl(filePath) {
110
+ if (!existsSync(filePath))
111
+ return [];
112
+ try {
113
+ const raw = readFileSync(filePath, 'utf-8');
114
+ const entries = [];
115
+ for (const line of raw.split('\n')) {
116
+ if (!line.trim())
117
+ continue;
118
+ try {
119
+ const msg = JSON.parse(line);
120
+ if (msg.role === 'user' || msg.role === 'assistant') {
121
+ entries.push({
122
+ type: msg.role,
123
+ message: {
124
+ role: msg.role,
125
+ content: typeof msg.content === 'string' ? msg.content : JSON.stringify(msg.content),
126
+ },
127
+ });
128
+ }
129
+ }
130
+ catch {
131
+ // skip malformed lines
132
+ }
133
+ }
134
+ return entries;
135
+ }
136
+ catch {
137
+ return [];
138
+ }
139
+ }
140
+ //# sourceMappingURL=aider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aider.js","sourceRoot":"","sources":["../../../src/sessions/adapters/aider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SessionAdapter } from './index.js';
2
+ export declare const clineAdapter: SessionAdapter;
3
+ //# sourceMappingURL=cline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.d.ts","sourceRoot":"","sources":["../../../src/sessions/adapters/cline.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAgCjD,eAAO,MAAM,YAAY,EAAE,cAwD1B,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ const PREFIX = 'cline://';
5
+ function getTasksDir() {
6
+ const platform = process.platform;
7
+ const home = homedir();
8
+ const ext = 'saoudrizwan.claude-dev';
9
+ if (platform === 'win32') {
10
+ return join(process.env.APPDATA || join(home, 'AppData', 'Roaming'), 'Code', 'User', 'globalStorage', ext, 'tasks');
11
+ }
12
+ else if (platform === 'darwin') {
13
+ return join(home, 'Library', 'Application Support', 'Code', 'User', 'globalStorage', ext, 'tasks');
14
+ }
15
+ return join(home, '.config', 'Code', 'User', 'globalStorage', ext, 'tasks');
16
+ }
17
+ export const clineAdapter = {
18
+ prefix: 'cline',
19
+ name: 'Cline',
20
+ isAvailable() {
21
+ return existsSync(getTasksDir());
22
+ },
23
+ discoverProjects() {
24
+ return [{ name: 'cline', path: `${PREFIX}tasks` }];
25
+ },
26
+ listSessions(_projectDescriptor) {
27
+ const tasksDir = getTasksDir();
28
+ if (!existsSync(tasksDir))
29
+ return [];
30
+ try {
31
+ return readdirSync(tasksDir, { withFileTypes: true })
32
+ .filter((d) => d.isDirectory())
33
+ .filter((d) => existsSync(join(tasksDir, d.name, 'api_conversation_history.json')))
34
+ .map((d) => ({ id: d.name, file: `${PREFIX}task:${d.name}` }));
35
+ }
36
+ catch {
37
+ return [];
38
+ }
39
+ },
40
+ parseSession(descriptor) {
41
+ const taskId = descriptor.replace(`${PREFIX}task:`, '');
42
+ const filePath = join(getTasksDir(), taskId, 'api_conversation_history.json');
43
+ if (!existsSync(filePath))
44
+ return [];
45
+ try {
46
+ const messages = JSON.parse(readFileSync(filePath, 'utf-8'));
47
+ if (!Array.isArray(messages))
48
+ return [];
49
+ return messages
50
+ .filter((m) => m.role === 'user' || m.role === 'assistant')
51
+ .map((m) => {
52
+ let content = '';
53
+ if (typeof m.content === 'string') {
54
+ content = m.content;
55
+ }
56
+ else if (Array.isArray(m.content)) {
57
+ content = m.content
58
+ .filter((p) => p.type === 'text')
59
+ .map((p) => p.text || '')
60
+ .join('\n');
61
+ }
62
+ return {
63
+ type: m.role,
64
+ message: { role: m.role, content },
65
+ };
66
+ })
67
+ .filter((e) => e.message?.content);
68
+ }
69
+ catch {
70
+ return [];
71
+ }
72
+ },
73
+ };
74
+ //# sourceMappingURL=cline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cline.js","sourceRoot":"","sources":["../../../src/sessions/adapters/cline.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,SAAS,WAAW;IAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,wBAAwB,CAAC;IACrC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,IAAI,CACT,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EACvD,MAAM,EACN,MAAM,EACN,eAAe,EACf,GAAG,EACH,OAAO,CACR,CAAC;IACJ,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,IAAI,CACT,IAAI,EACJ,SAAS,EACT,qBAAqB,EACrB,MAAM,EACN,MAAM,EACN,eAAe,EACf,GAAG,EACH,OAAO,CACR,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAmB;IAC1C,MAAM,EAAE,OAAO;IACf,IAAI,EAAE,OAAO;IAEb,WAAW;QACT,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,gBAAgB;QACd,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,YAAY,CAAC,kBAA0B;QACrC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,OAAO,WAAW,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;iBAClD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;iBAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,+BAA+B,CAAC,CAAC,CAAC;iBAClF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,YAAY,CAAC,UAAkB;QAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,MAAM,OAAO,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,+BAA+B,CAAC,CAAC;QAC9E,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAAE,OAAO,EAAE,CAAC;YAExC,OAAO,QAAQ;iBACZ,MAAM,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;iBACnF,GAAG,CAAC,CAAC,CAA0B,EAAE,EAAE;gBAClC,IAAI,OAAO,GAAG,EAAE,CAAC;gBACjB,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBAClC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;gBACtB,CAAC;qBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpC,OAAO,GAAI,CAAC,CAAC,OAA0C;yBACpD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;yBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,CAAC,CAAC,IAAe,IAAI,EAAE,CAAC;yBACpC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;gBACD,OAAO;oBACL,IAAI,EAAE,CAAC,CAAC,IAAc;oBACtB,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAc,EAAE,OAAO,EAAE;iBAC7B,CAAC;YACpB,CAAC,CAAC;iBACD,MAAM,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SessionAdapter } from './index.js';
2
+ export declare const continueAdapter: SessionAdapter;
3
+ //# sourceMappingURL=continue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue.d.ts","sourceRoot":"","sources":["../../../src/sessions/adapters/continue.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAQjD,eAAO,MAAM,eAAe,EAAE,cAyE7B,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ const PREFIX = 'continue://';
5
+ function getSessionsDir() {
6
+ return join(homedir(), '.continue', 'sessions');
7
+ }
8
+ export const continueAdapter = {
9
+ prefix: 'continue',
10
+ name: 'Continue.dev',
11
+ isAvailable() {
12
+ return existsSync(getSessionsDir());
13
+ },
14
+ discoverProjects() {
15
+ // Group sessions by workspaceDirectory, or return single project
16
+ return [{ name: 'continue', path: `${PREFIX}sessions` }];
17
+ },
18
+ listSessions() {
19
+ const dir = getSessionsDir();
20
+ if (!existsSync(dir))
21
+ return [];
22
+ try {
23
+ return readdirSync(dir)
24
+ .filter((f) => f.endsWith('.json'))
25
+ .map((f) => ({
26
+ id: f.replace('.json', ''),
27
+ file: `${PREFIX}session:${join(dir, f)}`,
28
+ }));
29
+ }
30
+ catch {
31
+ return [];
32
+ }
33
+ },
34
+ parseSession(descriptor) {
35
+ const filePath = descriptor.replace(`${PREFIX}session:`, '');
36
+ if (!existsSync(filePath))
37
+ return [];
38
+ try {
39
+ const session = JSON.parse(readFileSync(filePath, 'utf-8'));
40
+ if (!session.history || !Array.isArray(session.history))
41
+ return [];
42
+ return session.history
43
+ .filter((h) => h.message &&
44
+ (h.message.role === 'user' ||
45
+ h.message.role === 'assistant'))
46
+ .map((h) => {
47
+ let content = '';
48
+ const msg = h.message;
49
+ if (typeof msg.content === 'string') {
50
+ content = msg.content;
51
+ }
52
+ else if (Array.isArray(msg.content)) {
53
+ content = msg.content
54
+ .filter((p) => typeof p === 'string' ||
55
+ (typeof p === 'object' &&
56
+ p !== null &&
57
+ p.type === 'text'))
58
+ .map((p) => typeof p === 'string' ? p : p.text || '')
59
+ .join('\n');
60
+ }
61
+ return {
62
+ type: msg.role,
63
+ sessionId: session.sessionId,
64
+ message: { role: msg.role, content },
65
+ };
66
+ })
67
+ .filter((e) => e.message?.content);
68
+ }
69
+ catch {
70
+ return [];
71
+ }
72
+ },
73
+ };
74
+ //# sourceMappingURL=continue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue.js","sourceRoot":"","sources":["../../../src/sessions/adapters/continue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { SessionEntry } from '../parser.js';
2
+ export interface SessionAdapter {
3
+ /** Unique prefix for virtual descriptors (e.g. "opencode", "cline") */
4
+ prefix: string;
5
+ /** Human-readable name */
6
+ name: string;
7
+ /** Check if this source is available on this machine */
8
+ isAvailable(): boolean;
9
+ /** Discover projects/groups */
10
+ discoverProjects(): Array<{
11
+ name: string;
12
+ path: string;
13
+ }>;
14
+ /** List sessions within a project */
15
+ listSessions(projectDescriptor: string): Array<{
16
+ id: string;
17
+ file: string;
18
+ }>;
19
+ /** Parse a session into normalized SessionEntry[] */
20
+ parseSession(descriptor: string): SessionEntry[];
21
+ }
22
+ export declare function registerAdapter(adapter: SessionAdapter): void;
23
+ export declare function getAvailableAdapters(): SessionAdapter[];
24
+ export declare function initAdapters(): void;
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sessions/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,MAAM,EAAE,MAAM,CAAC;IACf,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,WAAW,IAAI,OAAO,CAAC;IACvB,+BAA+B;IAC/B,gBAAgB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,qCAAqC;IACrC,YAAY,CAAC,iBAAiB,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7E,qDAAqD;IACrD,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;CAClD;AAID,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,CAI7D;AAED,wBAAgB,oBAAoB,IAAI,cAAc,EAAE,CAQvD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAGnC"}
@@ -0,0 +1,21 @@
1
+ const adapters = [];
2
+ export function registerAdapter(adapter) {
3
+ if (!adapters.find((a) => a.prefix === adapter.prefix)) {
4
+ adapters.push(adapter);
5
+ }
6
+ }
7
+ export function getAvailableAdapters() {
8
+ return adapters.filter((a) => {
9
+ try {
10
+ return a.isAvailable();
11
+ }
12
+ catch {
13
+ return false;
14
+ }
15
+ });
16
+ }
17
+ export function initAdapters() {
18
+ import('./opencode.js').then((m) => registerAdapter(m.openCodeAdapter)).catch(() => { });
19
+ import('./cline.js').then((m) => registerAdapter(m.clineAdapter)).catch(() => { });
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sessions/adapters/index.ts"],"names":[],"mappings":"AAiBA,MAAM,QAAQ,GAAqB,EAAE,CAAC;AAEtC,MAAM,UAAU,eAAe,CAAC,OAAuB;IACrD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACvD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAC3B,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACxF,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { SessionAdapter } from './index.js';
2
+ export declare const openCodeAdapter: SessionAdapter;
3
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/sessions/adapters/opencode.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAWjD,eAAO,MAAM,eAAe,EAAE,cAiF7B,CAAC"}
@@ -0,0 +1,88 @@
1
+ import { existsSync } from 'fs';
2
+ import { homedir } from 'os';
3
+ import { join } from 'path';
4
+ import { createRequire } from 'module';
5
+ const require = createRequire(import.meta.url);
6
+ function getDbPath() {
7
+ const dataDir = process.env.OPENCODE_DATA_DIR || join(homedir(), '.local', 'share', 'opencode');
8
+ return join(dataDir, 'opencode.db');
9
+ }
10
+ const PREFIX = 'opencode://';
11
+ export const openCodeAdapter = {
12
+ prefix: 'opencode',
13
+ name: 'OpenCode',
14
+ isAvailable() {
15
+ return existsSync(getDbPath());
16
+ },
17
+ discoverProjects() {
18
+ return [{ name: 'opencode', path: `${PREFIX}all` }];
19
+ },
20
+ listSessions(_projectDescriptor) {
21
+ const BetterSqlite3 = require('better-sqlite3');
22
+ const db = new BetterSqlite3(getDbPath(), { readonly: true });
23
+ try {
24
+ // Try common table/column names
25
+ const rows = db
26
+ .prepare('SELECT id FROM session ORDER BY updated_at DESC LIMIT 500')
27
+ .all();
28
+ return rows.map((r) => ({ id: r.id, file: `${PREFIX}session:${r.id}` }));
29
+ }
30
+ catch {
31
+ return [];
32
+ }
33
+ finally {
34
+ db.close();
35
+ }
36
+ },
37
+ parseSession(descriptor) {
38
+ const sessionId = descriptor.replace(`${PREFIX}session:`, '');
39
+ const BetterSqlite3 = require('better-sqlite3');
40
+ const db = new BetterSqlite3(getDbPath(), { readonly: true });
41
+ try {
42
+ const rows = db
43
+ .prepare('SELECT id, role, time_created, data FROM message WHERE session_id = ? ORDER BY time_created')
44
+ .all(sessionId);
45
+ const entries = [];
46
+ for (const row of rows) {
47
+ const role = row.role === 'user' ? 'user' : 'assistant';
48
+ let content = '';
49
+ try {
50
+ const data = JSON.parse(row.data);
51
+ // OpenCode stores parts in the data JSON
52
+ if (data.parts && Array.isArray(data.parts)) {
53
+ content = data.parts
54
+ .filter((p) => p.type === 'text')
55
+ .map((p) => p.text || p.content || '')
56
+ .join('\n');
57
+ }
58
+ else if (data.content) {
59
+ content =
60
+ typeof data.content === 'string' ? data.content : JSON.stringify(data.content);
61
+ }
62
+ else if (data.text) {
63
+ content = data.text;
64
+ }
65
+ }
66
+ catch {
67
+ content = row.data || '';
68
+ }
69
+ if (content) {
70
+ entries.push({
71
+ type: role,
72
+ timestamp: row.time_created,
73
+ sessionId,
74
+ message: { role, content },
75
+ });
76
+ }
77
+ }
78
+ return entries;
79
+ }
80
+ catch {
81
+ return [];
82
+ }
83
+ finally {
84
+ db.close();
85
+ }
86
+ },
87
+ };
88
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/sessions/adapters/opencode.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export interface SessionEntry {
2
- type: string;
2
+ type?: string;
3
+ role?: string;
3
4
  timestamp?: string;
4
5
  sessionId?: string;
5
6
  cwd?: string;
@@ -42,7 +43,16 @@ export declare function extractMessages(entries: SessionEntry[]): SessionMessage
42
43
  */
43
44
  export declare function getSessionMeta(entries: SessionEntry[]): SessionMeta;
44
45
  /**
45
- * Discover all project directories under ~/.claude/projects/
46
+ * Discover all session directories under the primary session root and any extra session roots.
47
+ *
48
+ * Extra roots are scanned as follows:
49
+ * - Cursor-style roots (containing `<workspace>/agent-transcripts/`):
50
+ * Each workspace with an `agent-transcripts/` subdirectory becomes a project
51
+ * named `cursor-<workspace>`.
52
+ * - Generic roots with subdirectories containing JSONL files:
53
+ * Each subdirectory becomes a project named `ext-<dirname>`.
54
+ * - Flat roots containing JSONL files directly:
55
+ * The root itself becomes a single project named `ext-<basename>`.
46
56
  */
47
57
  export declare function getProjectDirs(): Array<{
48
58
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/sessions/parser.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAoBjE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAuDzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,WAAW,CA2BnE;AAID;;GAEG;AACH,wBAAgB,cAAc,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAWtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAUxF"}
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/sessions/parser.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CA2BjE;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CA0EzE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,WAAW,CA6CnE;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA8EtE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBxF"}