kumo-cli 1.0.4 → 1.0.5
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.
- package/dist/claude/fileHistory.js +55 -11
- package/dist/claude/fileHistory.js.map +1 -1
- package/dist/handlers/promptImages.js +113 -0
- package/dist/handlers/promptImages.js.map +1 -0
- package/dist/handlers/promptImages.test.js +52 -0
- package/dist/handlers/promptImages.test.js.map +1 -0
- package/dist/handlers/runtimeHandlers.js +15 -3
- package/dist/handlers/runtimeHandlers.js.map +1 -1
- package/dist/handlers/sessionHandlers.js +51 -0
- package/dist/handlers/sessionHandlers.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pty/spawn.js +31 -5
- package/dist/pty/spawn.js.map +1 -1
- package/dist/pty/spawn.test.js +16 -0
- package/dist/pty/spawn.test.js.map +1 -0
- package/dist/services/checkpointService.js +113 -0
- package/dist/services/checkpointService.js.map +1 -0
- package/dist/services/checkpointService.test.js +61 -0
- package/dist/services/checkpointService.test.js.map +1 -0
- package/dist/services/cliRuntime.js.map +1 -1
- package/dist/services/sessionRollbackService.js +195 -0
- package/dist/services/sessionRollbackService.js.map +1 -0
- package/dist/services/sessionRollbackService.test.js +142 -0
- package/dist/services/sessionRollbackService.test.js.map +1 -0
- package/dist/services/sessionService.js +33 -7
- package/dist/services/sessionService.js.map +1 -1
- package/package.json +2 -2
- package/scripts/run-tests.mjs +1 -0
|
@@ -12,21 +12,65 @@ function toNativePath(filePath) {
|
|
|
12
12
|
}
|
|
13
13
|
return filePath;
|
|
14
14
|
}
|
|
15
|
+
function buildFileHistoryEntries(sessionId, filePath) {
|
|
16
|
+
const native = toNativePath(filePath);
|
|
17
|
+
const resolved = path.resolve(native);
|
|
18
|
+
const hash = crypto.createHash('sha256').update(resolved).digest('hex').slice(0, 16);
|
|
19
|
+
const historyDir = path.join(os.homedir(), '.claude', 'file-history', sessionId);
|
|
20
|
+
if (!fs.existsSync(historyDir))
|
|
21
|
+
return [];
|
|
22
|
+
return fs.readdirSync(historyDir)
|
|
23
|
+
.filter((entry) => entry.startsWith(`${hash}@v`))
|
|
24
|
+
.map((entry) => {
|
|
25
|
+
const version = parseInt(entry.split('@v')[1] ?? '', 10);
|
|
26
|
+
return {
|
|
27
|
+
version,
|
|
28
|
+
fileName: entry,
|
|
29
|
+
filePath: resolved,
|
|
30
|
+
snapshotPath: path.join(historyDir, entry),
|
|
31
|
+
};
|
|
32
|
+
})
|
|
33
|
+
.filter((entry) => Number.isFinite(entry.version))
|
|
34
|
+
.sort((left, right) => left.version - right.version);
|
|
35
|
+
}
|
|
36
|
+
export function listFileHistoryEntries(sessionId, filePath) {
|
|
37
|
+
try {
|
|
38
|
+
return buildFileHistoryEntries(sessionId, filePath);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export function readFileHistoryVersion(sessionId, filePath, version) {
|
|
45
|
+
try {
|
|
46
|
+
const entry = buildFileHistoryEntries(sessionId, filePath).find((item) => item.version === version);
|
|
47
|
+
if (!entry)
|
|
48
|
+
return null;
|
|
49
|
+
return fs.readFileSync(entry.snapshotPath, 'utf-8');
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function readLatestFileHistory(sessionId, filePath) {
|
|
56
|
+
try {
|
|
57
|
+
const entries = buildFileHistoryEntries(sessionId, filePath);
|
|
58
|
+
const entry = entries[entries.length - 1];
|
|
59
|
+
if (!entry)
|
|
60
|
+
return null;
|
|
61
|
+
return fs.readFileSync(entry.snapshotPath, 'utf-8');
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
15
67
|
// read the previous version of a file from ~/.claude/file-history; returns null if not found or first write
|
|
16
68
|
export function readFileHistoryPrev(sessionId, filePath) {
|
|
17
69
|
try {
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
const hash = crypto.createHash('sha256').update(resolved).digest('hex').slice(0, 16);
|
|
21
|
-
const historyDir = path.join(os.homedir(), '.claude', 'file-history', sessionId);
|
|
22
|
-
if (!fs.existsSync(historyDir))
|
|
23
|
-
return null;
|
|
24
|
-
const versions = fs.readdirSync(historyDir)
|
|
25
|
-
.filter((entry) => entry.startsWith(`${hash}@v`))
|
|
26
|
-
.sort((left, right) => parseInt(left.split('@v')[1], 10) - parseInt(right.split('@v')[1], 10));
|
|
27
|
-
if (versions.length < 2)
|
|
70
|
+
const entries = buildFileHistoryEntries(sessionId, filePath);
|
|
71
|
+
if (entries.length < 2)
|
|
28
72
|
return null;
|
|
29
|
-
return fs.readFileSync(
|
|
73
|
+
return fs.readFileSync(entries[entries.length - 2].snapshotPath, 'utf-8');
|
|
30
74
|
}
|
|
31
75
|
catch {
|
|
32
76
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileHistory.js","sourceRoot":"","sources":["../../src/claude/fileHistory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,MAAM,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"fileHistory.js","sourceRoot":"","sources":["../../src/claude/fileHistory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
export const PROMPT_IMAGE_MAX_COUNT = 3;
|
|
6
|
+
export const PROMPT_IMAGE_MAX_BYTES = 5 * 1024 * 1024;
|
|
7
|
+
const MIME_EXTENSIONS = {
|
|
8
|
+
'image/jpeg': '.jpg',
|
|
9
|
+
'image/png': '.png',
|
|
10
|
+
'image/gif': '.gif',
|
|
11
|
+
'image/webp': '.webp',
|
|
12
|
+
};
|
|
13
|
+
export function parsePromptImages(raw) {
|
|
14
|
+
if (raw === undefined)
|
|
15
|
+
return [];
|
|
16
|
+
if (!Array.isArray(raw) || raw.length > PROMPT_IMAGE_MAX_COUNT)
|
|
17
|
+
throw new Error('invalid image attachment');
|
|
18
|
+
return raw.map((item) => {
|
|
19
|
+
if (!item || typeof item !== 'object')
|
|
20
|
+
throw new Error('invalid image attachment');
|
|
21
|
+
const image = item;
|
|
22
|
+
const { name, mimeType, dataBase64, sizeBytes } = image;
|
|
23
|
+
if (typeof name !== 'string' || typeof mimeType !== 'string' || typeof dataBase64 !== 'string')
|
|
24
|
+
throw new Error('invalid image attachment');
|
|
25
|
+
if (typeof sizeBytes !== 'number' || !Number.isFinite(sizeBytes))
|
|
26
|
+
throw new Error('invalid image attachment');
|
|
27
|
+
if (!MIME_EXTENSIONS[mimeType])
|
|
28
|
+
throw new Error('invalid image attachment');
|
|
29
|
+
if (sizeBytes < 0 || sizeBytes > PROMPT_IMAGE_MAX_BYTES)
|
|
30
|
+
throw new Error('invalid image attachment');
|
|
31
|
+
return { name, mimeType, dataBase64, sizeBytes };
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
export async function materializePromptImages(images) {
|
|
35
|
+
if (images.length === 0)
|
|
36
|
+
return [];
|
|
37
|
+
const dir = path.join(os.tmpdir(), 'kumo-claude-images', `${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
38
|
+
await mkdir(dir, { recursive: true });
|
|
39
|
+
const files = [];
|
|
40
|
+
for (let i = 0; i < images.length; i += 1) {
|
|
41
|
+
const image = images[i];
|
|
42
|
+
const ext = MIME_EXTENSIONS[image.mimeType];
|
|
43
|
+
const base = sanitizeImageName(image.name, i);
|
|
44
|
+
const file = path.join(dir, `${base}${ext}`);
|
|
45
|
+
const bytes = Buffer.from(image.dataBase64, 'base64');
|
|
46
|
+
if (bytes.length !== image.sizeBytes || bytes.length > PROMPT_IMAGE_MAX_BYTES)
|
|
47
|
+
throw new Error('invalid image attachment');
|
|
48
|
+
await writeFile(file, bytes);
|
|
49
|
+
files.push(file);
|
|
50
|
+
}
|
|
51
|
+
return files;
|
|
52
|
+
}
|
|
53
|
+
export function buildPromptWithImages(text, imagePaths) {
|
|
54
|
+
return imagePaths.length === 0 ? text : `${text} ${imagePaths.join(' ')}`.trim();
|
|
55
|
+
}
|
|
56
|
+
export function persistPromptImages(prompt, images) {
|
|
57
|
+
if (images.length === 0)
|
|
58
|
+
return;
|
|
59
|
+
const file = promptImageStorePath();
|
|
60
|
+
const records = readPromptImageRecords();
|
|
61
|
+
records.push({ prompt, images, createdAt: new Date().toISOString() });
|
|
62
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
63
|
+
fs.writeFileSync(file, JSON.stringify(records.slice(-200)), 'utf-8');
|
|
64
|
+
}
|
|
65
|
+
export function readPromptImageRecords() {
|
|
66
|
+
const file = promptImageStorePath();
|
|
67
|
+
if (!fs.existsSync(file))
|
|
68
|
+
return [];
|
|
69
|
+
try {
|
|
70
|
+
const raw = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
71
|
+
return Array.isArray(raw) ? raw.filter(isPromptImageRecord) : [];
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function hydratePromptImages(messages) {
|
|
78
|
+
const records = readPromptImageRecords();
|
|
79
|
+
if (records.length === 0)
|
|
80
|
+
return messages;
|
|
81
|
+
const used = new Set();
|
|
82
|
+
return messages.map((message) => {
|
|
83
|
+
if (message.role !== 'user' || message.images?.length)
|
|
84
|
+
return message;
|
|
85
|
+
const normalized = normalizePrompt(message.content);
|
|
86
|
+
const index = records.findIndex((record, i) => !used.has(i) && normalized === normalizePrompt(record.prompt));
|
|
87
|
+
if (index < 0)
|
|
88
|
+
return message;
|
|
89
|
+
used.add(index);
|
|
90
|
+
return { ...message, images: records[index].images };
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function sanitizeImageName(name, index) {
|
|
94
|
+
const parsed = path.parse(name).name || `image-${index + 1}`;
|
|
95
|
+
const safe = parsed.replace(/[^a-zA-Z0-9._-]/g, '-').slice(0, 64);
|
|
96
|
+
return safe || `image-${index + 1}`;
|
|
97
|
+
}
|
|
98
|
+
function promptImageStorePath() {
|
|
99
|
+
return path.join(os.homedir(), '.kumo', 'prompt-images', `${sanitizeStoreName(process.cwd())}.json`);
|
|
100
|
+
}
|
|
101
|
+
function sanitizeStoreName(value) {
|
|
102
|
+
return value.replace(/[^a-zA-Z0-9._-]/g, '-').slice(0, 160) || 'default';
|
|
103
|
+
}
|
|
104
|
+
function normalizePrompt(value) {
|
|
105
|
+
return value.replace(/\[Image #\d+\]/g, '').replace(/\s+/g, ' ').trim();
|
|
106
|
+
}
|
|
107
|
+
function isPromptImageRecord(value) {
|
|
108
|
+
if (!value || typeof value !== 'object')
|
|
109
|
+
return false;
|
|
110
|
+
const record = value;
|
|
111
|
+
return typeof record.prompt === 'string' && Array.isArray(record.images);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=promptImages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptImages.js","sourceRoot":"","sources":["../../src/handlers/promptImages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import { access, readFile } from 'node:fs/promises';
|
|
7
|
+
import { buildPromptWithImages, hydratePromptImages, materializePromptImages, parsePromptImages, persistPromptImages, PROMPT_IMAGE_MAX_BYTES } from './promptImages.js';
|
|
8
|
+
function withTempHome(run) {
|
|
9
|
+
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'kumo-images-'));
|
|
10
|
+
const previousHome = process.env.USERPROFILE;
|
|
11
|
+
const previousCwd = process.cwd();
|
|
12
|
+
fs.mkdirSync(path.join(tempDir, 'project'), { recursive: true });
|
|
13
|
+
process.env.USERPROFILE = tempDir;
|
|
14
|
+
process.chdir(path.join(tempDir, 'project'));
|
|
15
|
+
try {
|
|
16
|
+
run();
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
process.chdir(previousCwd);
|
|
20
|
+
if (previousHome)
|
|
21
|
+
process.env.USERPROFILE = previousHome;
|
|
22
|
+
else
|
|
23
|
+
delete process.env.USERPROFILE;
|
|
24
|
+
fs.rmSync(tempDir, { recursive: true, force: true });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
test('parsePromptImages accepts supported image payloads', () => {
|
|
28
|
+
const images = parsePromptImages([{ name: 'photo.png', mimeType: 'image/png', dataBase64: 'AQID', sizeBytes: 3 }]);
|
|
29
|
+
assert.deepEqual(images, [{ name: 'photo.png', mimeType: 'image/png', dataBase64: 'AQID', sizeBytes: 3 }]);
|
|
30
|
+
});
|
|
31
|
+
test('parsePromptImages rejects unsupported mime and size', () => {
|
|
32
|
+
assert.throws(() => parsePromptImages([{ name: 'photo.bmp', mimeType: 'image/bmp', dataBase64: 'AQID', sizeBytes: 3 }]));
|
|
33
|
+
assert.throws(() => parsePromptImages([{ name: 'photo.png', mimeType: 'image/png', dataBase64: 'AQID', sizeBytes: PROMPT_IMAGE_MAX_BYTES + 1 }]));
|
|
34
|
+
});
|
|
35
|
+
test('materializePromptImages writes image files with mime extension', async () => {
|
|
36
|
+
const [file] = await materializePromptImages([{ name: '../bad name.png', mimeType: 'image/png', dataBase64: 'AQID', sizeBytes: 3 }]);
|
|
37
|
+
assert.ok(file.endsWith('.png'));
|
|
38
|
+
await access(file);
|
|
39
|
+
assert.deepEqual([...await readFile(file)], [1, 2, 3]);
|
|
40
|
+
});
|
|
41
|
+
test('buildPromptWithImages appends image paths without extra labels', () => {
|
|
42
|
+
assert.equal(buildPromptWithImages('look', ['C:\\tmp\\a.png']), 'look C:\\tmp\\a.png');
|
|
43
|
+
});
|
|
44
|
+
test('hydratePromptImages restores images by normalized prompt', () => {
|
|
45
|
+
withTempHome(() => {
|
|
46
|
+
const image = { name: 'photo.png', mimeType: 'image/png', dataBase64: 'AQID', sizeBytes: 3 };
|
|
47
|
+
persistPromptImages('so sánh', [image]);
|
|
48
|
+
const messages = hydratePromptImages([{ role: 'user', content: '[Image #2]so sánh', images: [] }]);
|
|
49
|
+
assert.deepEqual(messages[0]?.images, [image]);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=promptImages.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptImages.test.js","sourceRoot":"","sources":["../../src/handlers/promptImages.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { clearCredentials } from '../auth/credentialsStore.js';
|
|
2
2
|
import { log } from '../core/logger.js';
|
|
3
3
|
import { handleTunnelRequest } from '../services/tunnelService.js';
|
|
4
|
+
import { buildPromptWithImages, materializePromptImages, parsePromptImages, persistPromptImages } from './promptImages.js';
|
|
4
5
|
// create handlers for auth, pairing, prompt, and tunnel lifecycle messages
|
|
5
6
|
export function createRuntimeHandlers() {
|
|
6
7
|
return {
|
|
8
|
+
ws_registered: () => { },
|
|
7
9
|
paired: (_msg, ctx) => {
|
|
8
10
|
log('[pairing] paired with app');
|
|
9
11
|
console.log('\n\x1b[32m✓ App paired! Launching Claude...\x1b[0m\n');
|
|
@@ -19,15 +21,25 @@ export function createRuntimeHandlers() {
|
|
|
19
21
|
console.error('\x1b[33mrun `kumo` again to pair with a new device.\x1b[0m');
|
|
20
22
|
process.exit(1);
|
|
21
23
|
},
|
|
22
|
-
send_prompt: (msg, ctx) => {
|
|
24
|
+
send_prompt: async (msg, ctx) => {
|
|
23
25
|
const text = msg['text'];
|
|
24
26
|
if (!text)
|
|
25
27
|
return;
|
|
28
|
+
let prompt = text;
|
|
29
|
+
try {
|
|
30
|
+
const images = parsePromptImages(msg['images']);
|
|
31
|
+
persistPromptImages(text, images);
|
|
32
|
+
prompt = buildPromptWithImages(text, await materializePromptImages(images));
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
ctx.send({ type: 'notification', level: 'warning', message: 'invalid image attachment' });
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
26
38
|
if (ctx.claude.getProcess()) {
|
|
27
|
-
ctx.claude.dispatchPrompt(
|
|
39
|
+
ctx.claude.dispatchPrompt(prompt);
|
|
28
40
|
return;
|
|
29
41
|
}
|
|
30
|
-
ctx.setPendingPrompt(
|
|
42
|
+
ctx.setPendingPrompt(prompt);
|
|
31
43
|
},
|
|
32
44
|
select_option: (msg, ctx) => {
|
|
33
45
|
const value = msg['value'];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtimeHandlers.js","sourceRoot":"","sources":["../../src/handlers/runtimeHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,mBAAmB,EAAyB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"runtimeHandlers.js","sourceRoot":"","sources":["../../src/handlers/runtimeHandlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { log } from '../core/logger.js';
|
|
2
2
|
import * as sessionService from '../services/sessionService.js';
|
|
3
|
+
import * as sessionRollbackService from '../services/sessionRollbackService.js';
|
|
3
4
|
import { loadSessionList } from '../services/sessionListService.js';
|
|
4
5
|
// create handlers for session history, session list, and effort updates
|
|
5
6
|
export function createSessionHandlers() {
|
|
@@ -55,6 +56,56 @@ export function createSessionHandlers() {
|
|
|
55
56
|
ctx.claude.args = sessionService.removeResumeArgs(ctx.claude.args);
|
|
56
57
|
await ctx.claude.spawn();
|
|
57
58
|
},
|
|
59
|
+
request_rollback_preview: async (msg, ctx) => {
|
|
60
|
+
const sessionId = typeof msg['sessionId'] === 'string' ? msg['sessionId'] : undefined;
|
|
61
|
+
const turnId = typeof msg['turnId'] === 'string' ? msg['turnId'] : undefined;
|
|
62
|
+
const messageIndex = typeof msg['messageIndex'] === 'number' ? msg['messageIndex'] : undefined;
|
|
63
|
+
const cwdArg = typeof msg['cwd'] === 'string' ? msg['cwd'] : undefined;
|
|
64
|
+
if (!sessionId || !turnId)
|
|
65
|
+
return;
|
|
66
|
+
try {
|
|
67
|
+
const preview = sessionRollbackService.buildRollbackPreview(sessionId, turnId, cwdArg, messageIndex);
|
|
68
|
+
if (!preview) {
|
|
69
|
+
ctx.send({ type: 'rollback_error', sessionId, turnId, message: 'rollback preview not found' });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
ctx.send({ type: 'rollback_preview', ...preview });
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
log(`[rollback_preview] error: ${error}`);
|
|
76
|
+
ctx.send({ type: 'rollback_error', sessionId, turnId, message: String(error) });
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
confirm_rollback: async (msg, ctx) => {
|
|
80
|
+
const sessionId = typeof msg['sessionId'] === 'string' ? msg['sessionId'] : undefined;
|
|
81
|
+
const turnId = typeof msg['turnId'] === 'string' ? msg['turnId'] : undefined;
|
|
82
|
+
const messageIndex = typeof msg['messageIndex'] === 'number' ? msg['messageIndex'] : undefined;
|
|
83
|
+
const cwdArg = typeof msg['cwd'] === 'string' ? msg['cwd'] : undefined;
|
|
84
|
+
if (!sessionId || !turnId)
|
|
85
|
+
return;
|
|
86
|
+
try {
|
|
87
|
+
const applied = sessionRollbackService.applyRollback(sessionId, turnId, cwdArg, messageIndex);
|
|
88
|
+
if (!applied) {
|
|
89
|
+
ctx.send({ type: 'rollback_error', sessionId, turnId, message: 'rollback target not found' });
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const messages = sessionRollbackService.loadRolledBackHistory(sessionId, cwdArg);
|
|
93
|
+
ctx.send({ type: 'session_history', sessionId, messages });
|
|
94
|
+
ctx.send({ type: 'rollback_applied', ...applied });
|
|
95
|
+
ctx.send({ type: 'composer_prefill', sessionId, turnId, prompt: applied.prompt });
|
|
96
|
+
ctx.scheduleScannerAtEnd();
|
|
97
|
+
if (applied.startsNewSession)
|
|
98
|
+
ctx.setCurrentSessionId(null);
|
|
99
|
+
ctx.claude.args = applied.startsNewSession
|
|
100
|
+
? sessionService.removeResumeArgs(ctx.claude.args)
|
|
101
|
+
: [...sessionService.removeResumeArgs(ctx.claude.args), '--resume', sessionId];
|
|
102
|
+
await ctx.claude.spawn();
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
log(`[confirm_rollback] error: ${error}`);
|
|
106
|
+
ctx.send({ type: 'rollback_error', sessionId, turnId, message: String(error) });
|
|
107
|
+
}
|
|
108
|
+
},
|
|
58
109
|
set_effort: async (msg, ctx) => {
|
|
59
110
|
const effort = msg['effort'];
|
|
60
111
|
if (typeof effort !== 'string')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionHandlers.js","sourceRoot":"","sources":["../../src/handlers/sessionHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,KAAK,cAAc,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAIpE,wEAAwE;AACxE,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,oBAAoB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,KAAK,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC;YACnF,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC;gBAC1E,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC7C,GAAG,CAAC,uBAAuB,QAAQ,CAAC,MAAM,WAAW,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC;gBACtC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACjC,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,WAAW,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC;YAClG,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,KAAK,CAAY,CAAC,CAAC,CAAC,SAAS,CAAC;YACnF,IAAI,CAAC,SAAS;gBAAE,OAAO;YACvB,IAAI,CAAC;gBACH,MAAM,cAAc,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;gBAC1D,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC;gBAC1E,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,uBAAuB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC1C,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAW,CAAC;YAC7C,IAAI,CAAC,SAAS;gBAAE,OAAO;YACvB,GAAG,CAAC,sCAAsC,SAAS,EAAE,CAAC,CAAC;YACvD,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjE,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,cAAc,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAC9D,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,0BAA0B,QAAQ,CAAC,MAAM,iBAAiB,SAAS,EAAE,CAAC,CAAC;gBAC3E,GAAG,CAAC,oBAAoB,EAAE,CAAC;gBAC3B,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,GAAG,cAAc,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC/F,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,GAAG,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC;gBACjD,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QACD,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACtC,GAAG,CAAC,+BAA+B,CAAC,CAAC;YACrC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjE,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,cAAc,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,OAAO;YACvC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAqB,CAAC,CAAC;YACvC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"sessionHandlers.js","sourceRoot":"","sources":["../../src/handlers/sessionHandlers.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -103,6 +103,7 @@ async function main() {
|
|
|
103
103
|
onAuthError: () => { ws.close(); },
|
|
104
104
|
scheduleScannerAtEnd: () => { startScannerAtEnd = true; },
|
|
105
105
|
getCurrentSessionId: () => currentSessionId,
|
|
106
|
+
setCurrentSessionId: (sessionId) => { currentSessionId = sessionId; },
|
|
106
107
|
setPendingPrompt: (text) => { pendingPrompt = text; },
|
|
107
108
|
});
|
|
108
109
|
ws = new WsClient(createWsOpenHandler({
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GAEjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5G,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/pty/spawn.js
CHANGED
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import { execSync } from 'node:child_process';
|
|
2
|
+
import fs from 'node:fs';
|
|
2
3
|
import os from 'node:os';
|
|
3
4
|
import * as pty from 'node-pty';
|
|
4
|
-
|
|
5
|
-
|
|
5
|
+
const CLAUDE_PACKAGE = '@anthropic-ai/claude-code';
|
|
6
|
+
// install claude cli globally when it is missing from the host machine
|
|
7
|
+
function installClaudeCli() {
|
|
8
|
+
console.log(`[kumo-cli] claude cli not found, installing ${CLAUDE_PACKAGE}...`);
|
|
9
|
+
execSync(`npm install -g --allow-scripts=${CLAUDE_PACKAGE} ${CLAUDE_PACKAGE}`, { stdio: 'inherit' });
|
|
10
|
+
}
|
|
11
|
+
// resolve full path to claude cli and install it once when unavailable
|
|
12
|
+
export function getClaudeCmd() {
|
|
6
13
|
if (os.platform() === 'win32') {
|
|
7
14
|
try {
|
|
8
15
|
const r = execSync('where claude.cmd', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
@@ -12,7 +19,18 @@ function getClaudeCmd() {
|
|
|
12
19
|
}
|
|
13
20
|
catch { }
|
|
14
21
|
const appData = process.env['APPDATA'] ?? '';
|
|
15
|
-
|
|
22
|
+
const fallback = `${appData}\\npm\\claude.cmd`;
|
|
23
|
+
if (appData && fs.existsSync(fallback))
|
|
24
|
+
return fallback;
|
|
25
|
+
installClaudeCli();
|
|
26
|
+
try {
|
|
27
|
+
const r = execSync('where claude.cmd', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
28
|
+
const first = r.split('\n')[0].trim();
|
|
29
|
+
if (first)
|
|
30
|
+
return first;
|
|
31
|
+
}
|
|
32
|
+
catch { }
|
|
33
|
+
return fallback;
|
|
16
34
|
}
|
|
17
35
|
try {
|
|
18
36
|
const r = execSync('which claude', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
@@ -20,6 +38,13 @@ function getClaudeCmd() {
|
|
|
20
38
|
return r.split('\n')[0].trim();
|
|
21
39
|
}
|
|
22
40
|
catch { }
|
|
41
|
+
installClaudeCli();
|
|
42
|
+
try {
|
|
43
|
+
const r = execSync('which claude', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
|
|
44
|
+
if (r)
|
|
45
|
+
return r.split('\n')[0].trim();
|
|
46
|
+
}
|
|
47
|
+
catch { }
|
|
23
48
|
return 'claude';
|
|
24
49
|
}
|
|
25
50
|
const CLAUDE_CMD = getClaudeCmd();
|
|
@@ -70,8 +95,9 @@ export function spawnClaude(args, _onThinking, onPtyData, onResize, onSpawn, cwd
|
|
|
70
95
|
});
|
|
71
96
|
return { pty: child, cleanup: () => { process.stdin.removeListener('data', stdinHandler); } };
|
|
72
97
|
}
|
|
73
|
-
// send a line to the claude pty with
|
|
98
|
+
// send a line to the claude pty and submit it with bracketed paste plus enter
|
|
74
99
|
export function writeToProcess(child, text) {
|
|
75
|
-
child.write(text
|
|
100
|
+
child.write(`\x1b[200~${text}\x1b[201~`);
|
|
101
|
+
setTimeout(() => child.write('\r'), 50);
|
|
76
102
|
}
|
|
77
103
|
//# sourceMappingURL=spawn.js.map
|
package/dist/pty/spawn.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/pty/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAWhC,
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../../src/pty/spawn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAWhC,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAEnD,uEAAuE;AACvE,SAAS,gBAAgB;IACvB,OAAO,CAAC,GAAG,CAAC,+CAA+C,cAAc,KAAK,CAAC,CAAC;IAChF,QAAQ,CAAC,kCAAkC,cAAc,IAAI,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AACvG,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,YAAY;IAC1B,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACtG,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,QAAQ,GAAG,GAAG,OAAO,mBAAmB,CAAC;QAC/C,IAAI,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QACxD,gBAAgB,EAAE,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACtG,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClG,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,gBAAgB,EAAE,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClG,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IACV,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,GAAG,YAAY,EAAE,CAAC;AAElC,uEAAuE;AACvE,MAAM,UAAU,WAAW,CACzB,IAAc,EACd,WAAsC,EACtC,SAAqB,EACrB,QAAmB,EACnB,OAAiB,EACjB,WAAoB,EACpB,QAA6C;IAE7C,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,KAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAE5D,MAAM,OAAO,GAA2B,EAAE,GAAI,OAAO,CAAC,GAA8B,EAAE,CAAC;IACvF,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,SAAS;gBAAE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;;gBAClC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE;QACpC,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG;QACnC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;QAC/B,GAAG,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE;QACjC,GAAG,EAAE,OAAO;QACZ,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;KACzC,CAAC,CAAC;IAEH,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAEjB,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACpB,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,MAAM,YAAY,GAAG,CAAC,IAAY,EAAQ,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEvC,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC/B,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,GAAG,CAAC;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACzB,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChG,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,cAAc,CAAC,KAAe,EAAE,IAAY;IAC1D,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,WAAW,CAAC,CAAC;IACzC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import test from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
const spawnSource = readFileSync(path.join(import.meta.dirname, 'spawn.ts'), 'utf8');
|
|
6
|
+
test('spawn resolves claude by installing official cli when missing', () => {
|
|
7
|
+
assert.match(spawnSource, /@anthropic-ai\/claude-code/);
|
|
8
|
+
assert.match(spawnSource, /npm install -g --allow-scripts=\$\{CLAUDE_PACKAGE\} \$\{CLAUDE_PACKAGE\}/);
|
|
9
|
+
assert.match(spawnSource, /installClaudeCli\(\)/);
|
|
10
|
+
});
|
|
11
|
+
test('writeToProcess uses bracketed paste before enter submit', () => {
|
|
12
|
+
assert.match(spawnSource, /\\x1b\[200~/);
|
|
13
|
+
assert.match(spawnSource, /\\x1b\[201~/);
|
|
14
|
+
assert.match(spawnSource, /setTimeout\(\(\) => child\.write\('\\r'\), 50\)/);
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=spawn.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.test.js","sourceRoot":"","sources":["../../src/pty/spawn.test.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;AAErF,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;IACzE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,0EAA0E,CAAC,CAAC;IACtG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACnE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACzC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,iDAAiD,CAAC,CAAC;AAC/E,CAAC,CAAC,CAAC"}
|