oroute-cli 0.1.0 → 0.2.1

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 (72) hide show
  1. package/bin/oroute.cjs +2 -0
  2. package/dist/oroute.cjs +244533 -0
  3. package/package.json +27 -6
  4. package/dist/agent.d.ts +0 -11
  5. package/dist/agent.js +0 -569
  6. package/dist/agent.js.map +0 -1
  7. package/dist/commands.d.ts +0 -24
  8. package/dist/commands.js +0 -173
  9. package/dist/commands.js.map +0 -1
  10. package/dist/context.d.ts +0 -13
  11. package/dist/context.js +0 -110
  12. package/dist/context.js.map +0 -1
  13. package/dist/cost.d.ts +0 -18
  14. package/dist/cost.js +0 -80
  15. package/dist/cost.js.map +0 -1
  16. package/dist/history.d.ts +0 -20
  17. package/dist/history.js +0 -49
  18. package/dist/history.js.map +0 -1
  19. package/dist/hooks.d.ts +0 -13
  20. package/dist/hooks.js +0 -101
  21. package/dist/hooks.js.map +0 -1
  22. package/dist/index.d.ts +0 -2
  23. package/dist/index.js +0 -475
  24. package/dist/index.js.map +0 -1
  25. package/dist/markdown.d.ts +0 -4
  26. package/dist/markdown.js +0 -126
  27. package/dist/markdown.js.map +0 -1
  28. package/dist/memory.d.ts +0 -27
  29. package/dist/memory.js +0 -208
  30. package/dist/memory.js.map +0 -1
  31. package/dist/session.d.ts +0 -43
  32. package/dist/session.js +0 -166
  33. package/dist/session.js.map +0 -1
  34. package/dist/streaming.d.ts +0 -27
  35. package/dist/streaming.js +0 -201
  36. package/dist/streaming.js.map +0 -1
  37. package/dist/tools/editFile.d.ts +0 -34
  38. package/dist/tools/editFile.js +0 -40
  39. package/dist/tools/editFile.js.map +0 -1
  40. package/dist/tools/executeCommand.d.ts +0 -32
  41. package/dist/tools/executeCommand.js +0 -75
  42. package/dist/tools/executeCommand.js.map +0 -1
  43. package/dist/tools/glob.d.ts +0 -24
  44. package/dist/tools/glob.js +0 -128
  45. package/dist/tools/glob.js.map +0 -1
  46. package/dist/tools/index.d.ts +0 -40
  47. package/dist/tools/index.js +0 -28
  48. package/dist/tools/index.js.map +0 -1
  49. package/dist/tools/listDirectory.d.ts +0 -23
  50. package/dist/tools/listDirectory.js +0 -57
  51. package/dist/tools/listDirectory.js.map +0 -1
  52. package/dist/tools/notebook.d.ts +0 -7
  53. package/dist/tools/notebook.js +0 -76
  54. package/dist/tools/notebook.js.map +0 -1
  55. package/dist/tools/readFile.d.ts +0 -28
  56. package/dist/tools/readFile.js +0 -40
  57. package/dist/tools/readFile.js.map +0 -1
  58. package/dist/tools/readImage.d.ts +0 -25
  59. package/dist/tools/readImage.js +0 -52
  60. package/dist/tools/readImage.js.map +0 -1
  61. package/dist/tools/searchFiles.d.ts +0 -33
  62. package/dist/tools/searchFiles.js +0 -95
  63. package/dist/tools/searchFiles.js.map +0 -1
  64. package/dist/tools/writeFile.d.ts +0 -30
  65. package/dist/tools/writeFile.js +0 -54
  66. package/dist/tools/writeFile.js.map +0 -1
  67. package/dist/ui.d.ts +0 -30
  68. package/dist/ui.js +0 -79
  69. package/dist/ui.js.map +0 -1
  70. package/dist/update.d.ts +0 -10
  71. package/dist/update.js +0 -93
  72. package/dist/update.js.map +0 -1
package/dist/markdown.js DELETED
@@ -1,126 +0,0 @@
1
- /**
2
- * A3: Markdown Terminal Rendering — regex-based ANSI formatting for terminal output.
3
- */
4
- import { GREEN, GRAY, BOLD, DIM, RESET, CYAN, YELLOW, MAGENTA, BLUE } from './ui.js';
5
- const BG_GRAY = '\x1b[48;5;237m';
6
- const ITALIC = '\x1b[3m';
7
- const UNDERLINE = '\x1b[4m';
8
- /** Keyword sets for basic syntax highlighting in code blocks */
9
- const JS_KEYWORDS = new Set([
10
- 'const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while',
11
- 'class', 'import', 'export', 'from', 'default', 'async', 'await', 'try',
12
- 'catch', 'throw', 'new', 'typeof', 'instanceof', 'switch', 'case', 'break',
13
- 'continue', 'true', 'false', 'null', 'undefined', 'this', 'extends', 'implements',
14
- 'interface', 'type', 'enum', 'namespace', 'readonly', 'abstract', 'static',
15
- 'private', 'protected', 'public', 'yield', 'of', 'in', 'do',
16
- ]);
17
- function highlightCode(line) {
18
- // Highlight strings
19
- let result = line.replace(/(["'`])(?:(?!\1|\\).|\\.)*?\1/g, `${GREEN}$&${RESET}${GRAY}`);
20
- // Highlight comments
21
- result = result.replace(/(\/\/.*)$/gm, `${DIM}$1${RESET}${GRAY}`);
22
- // Highlight keywords (word boundaries)
23
- result = result.replace(/\b(\w+)\b/g, (match) => {
24
- if (JS_KEYWORDS.has(match))
25
- return `${YELLOW}${match}${RESET}${GRAY}`;
26
- return match;
27
- });
28
- // Highlight numbers
29
- result = result.replace(/\b(\d+\.?\d*)\b/g, `${MAGENTA}$1${RESET}${GRAY}`);
30
- return result;
31
- }
32
- /**
33
- * Render markdown text with ANSI escape codes for terminal display.
34
- */
35
- export function renderMarkdown(text) {
36
- const lines = text.split('\n');
37
- const output = [];
38
- let inCodeBlock = false;
39
- let codeBlockLang = '';
40
- for (const line of lines) {
41
- // Code block fence
42
- if (line.trimStart().startsWith('```')) {
43
- if (!inCodeBlock) {
44
- inCodeBlock = true;
45
- codeBlockLang = line.trimStart().slice(3).trim();
46
- output.push(`${DIM} ${'─'.repeat(40)}${RESET}`);
47
- continue;
48
- }
49
- else {
50
- inCodeBlock = false;
51
- codeBlockLang = '';
52
- output.push(`${DIM} ${'─'.repeat(40)}${RESET}`);
53
- continue;
54
- }
55
- }
56
- // Inside code block
57
- if (inCodeBlock) {
58
- const highlighted = highlightCode(line);
59
- output.push(`${GRAY} ${highlighted}${RESET}`);
60
- continue;
61
- }
62
- // Headings
63
- const h3Match = line.match(/^###\s+(.*)/);
64
- if (h3Match) {
65
- output.push(`${BOLD}${GREEN} ${h3Match[1]}${RESET}`);
66
- continue;
67
- }
68
- const h2Match = line.match(/^##\s+(.*)/);
69
- if (h2Match) {
70
- output.push(`${BOLD}${GREEN} ${h2Match[1]}${RESET}`);
71
- continue;
72
- }
73
- const h1Match = line.match(/^#\s+(.*)/);
74
- if (h1Match) {
75
- output.push(`${BOLD}${GREEN}${h1Match[1]}${RESET}`);
76
- continue;
77
- }
78
- // Blockquote
79
- if (line.trimStart().startsWith('> ')) {
80
- const content = line.trimStart().slice(2);
81
- output.push(`${DIM} ${GRAY}│ ${content}${RESET}`);
82
- continue;
83
- }
84
- // Unordered list
85
- const listMatch = line.match(/^(\s*)[-*]\s+(.*)/);
86
- if (listMatch) {
87
- const indent = listMatch[1] ?? '';
88
- const content = formatInline(listMatch[2] ?? '');
89
- output.push(`${indent}${GREEN} *${RESET} ${content}`);
90
- continue;
91
- }
92
- // Ordered list
93
- const olMatch = line.match(/^(\s*)(\d+)\.\s+(.*)/);
94
- if (olMatch) {
95
- const indent = olMatch[1] ?? '';
96
- const num = olMatch[2] ?? '';
97
- const content = formatInline(olMatch[3] ?? '');
98
- output.push(`${indent}${GREEN} ${num}.${RESET} ${content}`);
99
- continue;
100
- }
101
- // Horizontal rule
102
- if (/^[-*_]{3,}\s*$/.test(line.trim())) {
103
- output.push(`${DIM} ${'─'.repeat(40)}${RESET}`);
104
- continue;
105
- }
106
- // Regular text with inline formatting
107
- output.push(formatInline(line));
108
- }
109
- return output.join('\n');
110
- }
111
- /** Apply inline markdown formatting */
112
- function formatInline(text) {
113
- let result = text;
114
- // Bold + italic
115
- result = result.replace(/\*\*\*(.*?)\*\*\*/g, `${BOLD}${ITALIC}$1${RESET}`);
116
- // Bold
117
- result = result.replace(/\*\*(.*?)\*\*/g, `${BOLD}$1${RESET}`);
118
- // Italic
119
- result = result.replace(/(?<!\*)\*([^*]+?)\*(?!\*)/g, `${DIM}$1${RESET}`);
120
- // Inline code
121
- result = result.replace(/`([^`]+?)`/g, `${BG_GRAY}${CYAN} $1 ${RESET}`);
122
- // Links: [text](url)
123
- result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, `${UNDERLINE}${BLUE}$1${RESET}${DIM} ($2)${RESET}`);
124
- return result;
125
- }
126
- //# sourceMappingURL=markdown.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
package/dist/memory.d.ts DELETED
@@ -1,27 +0,0 @@
1
- type MemoryType = 'user' | 'feedback' | 'project' | 'reference';
2
- interface Memory {
3
- name: string;
4
- type: MemoryType;
5
- description: string;
6
- content: string;
7
- created: string;
8
- }
9
- /** Save a memory to disk */
10
- export declare function saveMemory(type: MemoryType, name: string, content: string, description?: string): void;
11
- /** Load all memories */
12
- export declare function loadAllMemories(): Memory[];
13
- /** Load memories relevant to a given cwd (project memories match by path) */
14
- export declare function loadMemories(cwd: string): Memory[];
15
- /** Search memories by keyword */
16
- export declare function searchMemories(query: string): Memory[];
17
- /** Delete a memory by name */
18
- export declare function deleteMemory(name: string): boolean;
19
- /** Build memory context string for system prompt injection */
20
- export declare function buildMemoryContext(cwd: string): string;
21
- /** Handle /remember command */
22
- export declare function handleRememberCommand(arg: string): void;
23
- /** Handle /memories command */
24
- export declare function handleMemoriesCommand(): void;
25
- /** Handle /forget command */
26
- export declare function handleForgetCommand(arg: string): void;
27
- export {};
package/dist/memory.js DELETED
@@ -1,208 +0,0 @@
1
- /**
2
- * C5: Memory System — persistent memories stored as markdown files.
3
- */
4
- import * as fs from 'node:fs';
5
- import * as path from 'node:path';
6
- import * as os from 'node:os';
7
- import { GREEN, GRAY, BOLD, RESET, YELLOW, WHITE, DIM } from './ui.js';
8
- const MEMORY_DIR = path.join(os.homedir(), '.oroute', 'memory');
9
- const MEMORY_INDEX = path.join(MEMORY_DIR, 'MEMORY.md');
10
- /** Ensure memory directory exists */
11
- function ensureMemoryDir() {
12
- if (!fs.existsSync(MEMORY_DIR)) {
13
- fs.mkdirSync(MEMORY_DIR, { recursive: true });
14
- }
15
- }
16
- /** Generate a safe filename from a memory name */
17
- function toFilename(name) {
18
- return name
19
- .toLowerCase()
20
- .replace(/[^a-z0-9_-]/g, '_')
21
- .replace(/_+/g, '_')
22
- .slice(0, 60) + '.md';
23
- }
24
- /** Parse frontmatter from a memory markdown file */
25
- function parseMemoryFile(content) {
26
- const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
27
- if (!frontmatterMatch)
28
- return null;
29
- const frontmatter = frontmatterMatch[1];
30
- const body = frontmatterMatch[2].trim();
31
- const fields = {};
32
- for (const line of frontmatter.split('\n')) {
33
- const colonIdx = line.indexOf(':');
34
- if (colonIdx === -1)
35
- continue;
36
- const key = line.slice(0, colonIdx).trim();
37
- const value = line.slice(colonIdx + 1).trim();
38
- fields[key] = value;
39
- }
40
- if (!fields['name'] || !fields['type'])
41
- return null;
42
- return {
43
- name: fields['name'],
44
- type: fields['type'],
45
- description: fields['description'] ?? '',
46
- content: body,
47
- created: fields['created'] ?? '',
48
- };
49
- }
50
- /** Save a memory to disk */
51
- export function saveMemory(type, name, content, description) {
52
- ensureMemoryDir();
53
- const filename = toFilename(name);
54
- const filePath = path.join(MEMORY_DIR, filename);
55
- const now = new Date().toISOString();
56
- const fileContent = `---
57
- name: ${name}
58
- type: ${type}
59
- description: ${description ?? name}
60
- created: ${now}
61
- ---
62
- ${content}
63
- `;
64
- fs.writeFileSync(filePath, fileContent);
65
- updateIndex();
66
- }
67
- /** Load all memories */
68
- export function loadAllMemories() {
69
- ensureMemoryDir();
70
- const files = fs.readdirSync(MEMORY_DIR)
71
- .filter(f => f.endsWith('.md') && f !== 'MEMORY.md');
72
- const memories = [];
73
- for (const file of files) {
74
- try {
75
- const content = fs.readFileSync(path.join(MEMORY_DIR, file), 'utf-8');
76
- const memory = parseMemoryFile(content);
77
- if (memory)
78
- memories.push(memory);
79
- }
80
- catch {
81
- // Skip corrupt files
82
- }
83
- }
84
- return memories;
85
- }
86
- /** Load memories relevant to a given cwd (project memories match by path) */
87
- export function loadMemories(cwd) {
88
- const all = loadAllMemories();
89
- // Return all non-project memories + project memories matching cwd
90
- return all.filter(m => {
91
- if (m.type !== 'project')
92
- return true;
93
- // Project memories are relevant if their content mentions the cwd basename
94
- const projectName = path.basename(cwd).toLowerCase();
95
- return m.content.toLowerCase().includes(projectName) || m.name.toLowerCase().includes(projectName);
96
- });
97
- }
98
- /** Search memories by keyword */
99
- export function searchMemories(query) {
100
- const all = loadAllMemories();
101
- const lowerQuery = query.toLowerCase();
102
- return all.filter(m => m.name.toLowerCase().includes(lowerQuery) ||
103
- m.content.toLowerCase().includes(lowerQuery) ||
104
- m.description.toLowerCase().includes(lowerQuery));
105
- }
106
- /** Delete a memory by name */
107
- export function deleteMemory(name) {
108
- ensureMemoryDir();
109
- const filename = toFilename(name);
110
- const filePath = path.join(MEMORY_DIR, filename);
111
- if (fs.existsSync(filePath)) {
112
- fs.unlinkSync(filePath);
113
- updateIndex();
114
- return true;
115
- }
116
- // Try finding by exact name match in files
117
- const files = fs.readdirSync(MEMORY_DIR)
118
- .filter(f => f.endsWith('.md') && f !== 'MEMORY.md');
119
- for (const file of files) {
120
- try {
121
- const content = fs.readFileSync(path.join(MEMORY_DIR, file), 'utf-8');
122
- const memory = parseMemoryFile(content);
123
- if (memory && memory.name.toLowerCase() === name.toLowerCase()) {
124
- fs.unlinkSync(path.join(MEMORY_DIR, file));
125
- updateIndex();
126
- return true;
127
- }
128
- }
129
- catch {
130
- continue;
131
- }
132
- }
133
- return false;
134
- }
135
- /** Update the MEMORY.md index file */
136
- function updateIndex() {
137
- ensureMemoryDir();
138
- const memories = loadAllMemories();
139
- const lines = ['# O\'Route Memory Index\n'];
140
- lines.push(`Last updated: ${new Date().toISOString()}\n`);
141
- const grouped = {};
142
- for (const m of memories) {
143
- if (!grouped[m.type])
144
- grouped[m.type] = [];
145
- grouped[m.type].push(m);
146
- }
147
- for (const [type, mems] of Object.entries(grouped)) {
148
- lines.push(`## ${type}`);
149
- for (const m of mems) {
150
- lines.push(`- **${m.name}**: ${m.description}`);
151
- }
152
- lines.push('');
153
- }
154
- fs.writeFileSync(MEMORY_INDEX, lines.join('\n'));
155
- }
156
- /** Build memory context string for system prompt injection */
157
- export function buildMemoryContext(cwd) {
158
- const memories = loadMemories(cwd);
159
- if (memories.length === 0)
160
- return '';
161
- const parts = ['--- Memories ---'];
162
- for (const m of memories.slice(0, 10)) {
163
- parts.push(`[${m.type}] ${m.name}: ${m.content.slice(0, 200)}`);
164
- }
165
- parts.push('--- End Memories ---');
166
- return parts.join('\n');
167
- }
168
- /** Handle /remember command */
169
- export function handleRememberCommand(arg) {
170
- if (!arg) {
171
- console.log(`${YELLOW} Usage: /remember <text to remember>${RESET}`);
172
- return;
173
- }
174
- // Extract name from first sentence or use truncated text
175
- const name = arg.length > 50 ? arg.slice(0, 50) : arg;
176
- saveMemory('feedback', name, arg);
177
- console.log(`${GREEN} Remembered: ${name}${RESET}`);
178
- }
179
- /** Handle /memories command */
180
- export function handleMemoriesCommand() {
181
- const memories = loadAllMemories();
182
- if (memories.length === 0) {
183
- console.log(`${GRAY} No memories saved. Use /remember <text> to add one.${RESET}`);
184
- return;
185
- }
186
- console.log();
187
- console.log(`${BOLD} Memories${RESET}`);
188
- console.log(`${GRAY} ${'─'.repeat(40)}${RESET}`);
189
- for (const m of memories) {
190
- console.log(`${GREEN} [${m.type}]${RESET} ${WHITE}${m.name}${RESET}`);
191
- console.log(`${DIM} ${m.content.slice(0, 80)}${m.content.length > 80 ? '...' : ''}${RESET}`);
192
- }
193
- console.log();
194
- }
195
- /** Handle /forget command */
196
- export function handleForgetCommand(arg) {
197
- if (!arg) {
198
- console.log(`${YELLOW} Usage: /forget <memory name>${RESET}`);
199
- return;
200
- }
201
- if (deleteMemory(arg)) {
202
- console.log(`${GREEN} Forgot: ${arg}${RESET}`);
203
- }
204
- else {
205
- console.log(`${YELLOW} Memory not found: ${arg}${RESET}`);
206
- }
207
- }
208
- //# sourceMappingURL=memory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
package/dist/session.d.ts DELETED
@@ -1,43 +0,0 @@
1
- import type { SessionStats } from './cost.js';
2
- interface Message {
3
- role: string;
4
- content: string | Array<{
5
- type: string;
6
- [key: string]: unknown;
7
- }>;
8
- }
9
- interface SavedSession {
10
- name?: string;
11
- cwd: string;
12
- messages: Message[];
13
- stats: SessionStats;
14
- startTime: number;
15
- endTime: number;
16
- messageCount: number;
17
- }
18
- interface SessionListEntry {
19
- id: string;
20
- name?: string;
21
- cwd: string;
22
- messageCount: number;
23
- date: string;
24
- }
25
- /** Save a conversation session to disk */
26
- export declare function saveSession(messages: Message[], stats: SessionStats, cwd: string, name?: string): string;
27
- /** Auto-save session on exit if conversation has >2 messages */
28
- export declare function autoSaveSession(messages: Message[], stats: SessionStats, cwd: string): void;
29
- /** List saved sessions (most recent first) */
30
- export declare function listSessions(limit?: number): SessionListEntry[];
31
- /** Load a saved session by id (filename without .json) */
32
- export declare function loadSession(id: string): SavedSession | null;
33
- /** Print session list */
34
- export declare function printSessionList(): void;
35
- /** Handle /save command */
36
- export declare function handleSaveCommand(arg: string, messages: Message[], stats: SessionStats, cwd: string): void;
37
- /** Handle /resume command — returns loaded messages or null */
38
- export declare function handleResumeCommand(arg: string): {
39
- messages: Message[];
40
- stats: SessionStats;
41
- cwd: string;
42
- } | null;
43
- export {};
package/dist/session.js DELETED
@@ -1,166 +0,0 @@
1
- /**
2
- * B7: Session Save/Restore — persist and resume conversation sessions.
3
- */
4
- import * as fs from 'node:fs';
5
- import * as path from 'node:path';
6
- import * as os from 'node:os';
7
- import { GREEN, GRAY, BOLD, RESET, YELLOW, WHITE, DIM } from './ui.js';
8
- const SESSIONS_DIR = path.join(os.homedir(), '.oroute', 'sessions');
9
- /** Ensure the sessions directory exists */
10
- function ensureSessionsDir() {
11
- if (!fs.existsSync(SESSIONS_DIR)) {
12
- fs.mkdirSync(SESSIONS_DIR, { recursive: true });
13
- }
14
- }
15
- /** Save a conversation session to disk */
16
- export function saveSession(messages, stats, cwd, name) {
17
- ensureSessionsDir();
18
- const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
19
- const filename = name
20
- ? `${timestamp}_${name.replace(/[^a-zA-Z0-9_-]/g, '_')}.json`
21
- : `${timestamp}.json`;
22
- const filePath = path.join(SESSIONS_DIR, filename);
23
- const session = {
24
- name,
25
- cwd,
26
- messages,
27
- stats,
28
- startTime: stats.startTime,
29
- endTime: Date.now(),
30
- messageCount: messages.length,
31
- };
32
- fs.writeFileSync(filePath, JSON.stringify(session, null, 2));
33
- return filename;
34
- }
35
- /** Auto-save session on exit if conversation has >2 messages */
36
- export function autoSaveSession(messages, stats, cwd) {
37
- if (messages.length <= 2)
38
- return;
39
- try {
40
- saveSession(messages, stats, cwd);
41
- }
42
- catch {
43
- // Silent fail on auto-save
44
- }
45
- }
46
- /** List saved sessions (most recent first) */
47
- export function listSessions(limit = 10) {
48
- ensureSessionsDir();
49
- const files = fs.readdirSync(SESSIONS_DIR)
50
- .filter(f => f.endsWith('.json'))
51
- .sort()
52
- .reverse()
53
- .slice(0, limit);
54
- const entries = [];
55
- for (const file of files) {
56
- try {
57
- const filePath = path.join(SESSIONS_DIR, file);
58
- const raw = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
59
- const id = file.replace('.json', '');
60
- entries.push({
61
- id,
62
- name: raw.name,
63
- cwd: raw.cwd,
64
- messageCount: raw.messageCount ?? raw.messages.length,
65
- date: new Date(raw.startTime).toLocaleString(),
66
- });
67
- }
68
- catch {
69
- // Skip corrupt files
70
- }
71
- }
72
- return entries;
73
- }
74
- /** Load a saved session by id (filename without .json) */
75
- export function loadSession(id) {
76
- ensureSessionsDir();
77
- // Try exact match first
78
- const exactPath = path.join(SESSIONS_DIR, `${id}.json`);
79
- if (fs.existsSync(exactPath)) {
80
- try {
81
- return JSON.parse(fs.readFileSync(exactPath, 'utf-8'));
82
- }
83
- catch {
84
- return null;
85
- }
86
- }
87
- // Try partial match (user might type just the first few chars)
88
- const files = fs.readdirSync(SESSIONS_DIR)
89
- .filter(f => f.endsWith('.json') && f.startsWith(id))
90
- .sort()
91
- .reverse();
92
- if (files.length === 0)
93
- return null;
94
- const filePath = path.join(SESSIONS_DIR, files[0]);
95
- try {
96
- return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
97
- }
98
- catch {
99
- return null;
100
- }
101
- }
102
- /** Print session list */
103
- export function printSessionList() {
104
- const sessions = listSessions(10);
105
- if (sessions.length === 0) {
106
- console.log(`${GRAY} No saved sessions.${RESET}`);
107
- return;
108
- }
109
- console.log();
110
- console.log(`${BOLD} Saved Sessions${RESET}`);
111
- console.log(`${GRAY} ${'─'.repeat(50)}${RESET}`);
112
- for (let i = 0; i < sessions.length; i++) {
113
- const s = sessions[i];
114
- const label = s.name ? `${WHITE}${s.name}${RESET}` : `${DIM}unnamed${RESET}`;
115
- console.log(`${GREEN} ${i + 1}.${RESET} ${label} — ${GRAY}${s.messageCount} msgs, ${s.date}${RESET}`);
116
- console.log(`${GRAY} ${s.cwd}${RESET}`);
117
- console.log(`${DIM} id: ${s.id.slice(0, 30)}...${RESET}`);
118
- }
119
- console.log();
120
- }
121
- /** Handle /save command */
122
- export function handleSaveCommand(arg, messages, stats, cwd) {
123
- if (messages.length === 0) {
124
- console.log(`${YELLOW} Nothing to save (no messages).${RESET}`);
125
- return;
126
- }
127
- const name = arg || undefined;
128
- const filename = saveSession(messages, stats, cwd, name);
129
- console.log(`${GREEN} Session saved: ${filename}${RESET}`);
130
- }
131
- /** Handle /resume command — returns loaded messages or null */
132
- export function handleResumeCommand(arg) {
133
- if (!arg) {
134
- // Show list and ask user to specify
135
- printSessionList();
136
- console.log(`${GRAY} Usage: /resume <id or number>${RESET}`);
137
- return null;
138
- }
139
- // Check if arg is a number (index from list)
140
- const index = parseInt(arg, 10);
141
- if (!isNaN(index) && index > 0) {
142
- const sessions = listSessions(10);
143
- const session = sessions[index - 1];
144
- if (!session) {
145
- console.log(`${YELLOW} Session #${index} not found.${RESET}`);
146
- return null;
147
- }
148
- return loadAndPrint(session.id);
149
- }
150
- // Try as session id
151
- return loadAndPrint(arg);
152
- }
153
- function loadAndPrint(id) {
154
- const session = loadSession(id);
155
- if (!session) {
156
- console.log(`${YELLOW} Session not found: ${id}${RESET}`);
157
- return null;
158
- }
159
- console.log(`${GREEN} Resumed session: ${session.name ?? 'unnamed'} (${session.messages.length} messages)${RESET}`);
160
- return {
161
- messages: session.messages,
162
- stats: session.stats,
163
- cwd: session.cwd,
164
- };
165
- }
166
- //# sourceMappingURL=session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAGvE,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;AAyBpE,2CAA2C;AAC3C,SAAS,iBAAiB;IACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,0CAA0C;AAC1C,MAAM,UAAU,WAAW,CACzB,QAAmB,EACnB,KAAmB,EACnB,GAAW,EACX,IAAa;IAEb,iBAAiB,EAAE,CAAC;IAEpB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI;QACnB,CAAC,CAAC,GAAG,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,OAAO;QAC7D,CAAC,CAAC,GAAG,SAAS,OAAO,CAAC;IACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEnD,MAAM,OAAO,GAAiB;QAC5B,IAAI;QACJ,GAAG;QACH,QAAQ;QACR,KAAK;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;QACnB,YAAY,EAAE,QAAQ,CAAC,MAAM;KAC9B,CAAC;IAEF,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,eAAe,CAC7B,QAAmB,EACnB,KAAmB,EACnB,GAAW;IAEX,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO;IAEjC,IAAI,CAAC;QACH,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,2BAA2B;IAC7B,CAAC;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,YAAY,CAAC,KAAK,GAAG,EAAE;IACrC,iBAAiB,EAAE,CAAC;IAEpB,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC;SACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAChC,IAAI,EAAE;SACN,OAAO,EAAE;SACT,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEnB,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;YAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAiB,CAAC;YAC3E,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAErC,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE;gBACF,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM;gBACrD,IAAI,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,cAAc,EAAE;aAC/C,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,qBAAqB;QACvB,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,iBAAiB,EAAE,CAAC;IAEpB,wBAAwB;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IACxD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAiB,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,+DAA+D;IAC/D,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,YAAY,CAAC;SACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;SACpD,IAAI,EAAE;SACN,OAAO,EAAE,CAAC;IAEb,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAiB,CAAC;IACxE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,gBAAgB;IAC9B,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IAElC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,uBAAuB,KAAK,EAAE,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,mBAAmB,KAAK,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;IAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,UAAU,KAAK,EAAE,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,CAAC,YAAY,UAAU,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC;QACvG,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,QAAmB,EACnB,KAAmB,EACnB,GAAW;IAEX,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,mCAAmC,KAAK,EAAE,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,IAAI,SAAS,CAAC;IAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACzD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,oBAAoB,QAAQ,GAAG,KAAK,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CACjC,GAAW;IAEX,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,oCAAoC;QACpC,gBAAgB,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,kCAAkC,KAAK,EAAE,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6CAA6C;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,cAAc,KAAK,cAAc,KAAK,EAAE,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAClC,CAAC;IAED,oBAAoB;IACpB,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,wBAAwB,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,sBAAsB,OAAO,CAAC,IAAI,IAAI,SAAS,KAAK,OAAO,CAAC,QAAQ,CAAC,MAAM,aAAa,KAAK,EAAE,CAAC,CAAC;IACrH,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC;AACJ,CAAC"}
@@ -1,27 +0,0 @@
1
- /** A content block accumulated during streaming */
2
- export interface StreamedContentBlock {
3
- type: 'text' | 'tool_use';
4
- text?: string;
5
- id?: string;
6
- name?: string;
7
- inputJson?: string;
8
- input?: Record<string, unknown>;
9
- }
10
- export interface StreamResult {
11
- contentBlocks: StreamedContentBlock[];
12
- stopReason: string | null;
13
- usage: {
14
- input_tokens: number;
15
- output_tokens: number;
16
- };
17
- model: string;
18
- routingMetadata?: {
19
- provider: string;
20
- taskComplexity: number;
21
- totalLatencyMs: number;
22
- };
23
- }
24
- /** Parse an SSE stream from a fetch Response into structured result */
25
- export declare function parseSSEStream(response: Response, onTextDelta: (text: string) => void): Promise<StreamResult>;
26
- /** Check if a Response is SSE (streaming) */
27
- export declare function isSSEResponse(response: Response): boolean;