miii-cli 0.1.7 → 0.2.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.
- package/.claude/settings.local.json +10 -1
- package/dist/init.js +4 -0
- package/dist/init.js.map +1 -1
- package/dist/llm/ollama.d.ts +1 -0
- package/dist/llm/ollama.js +49 -0
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/stream.d.ts +2 -3
- package/dist/llm/stream.js +22 -100
- package/dist/llm/stream.js.map +1 -1
- package/dist/parser/stream-parser.d.ts +4 -0
- package/dist/parser/stream-parser.js +170 -3
- package/dist/parser/stream-parser.js.map +1 -1
- package/dist/tools/index.js +42 -6
- package/dist/tools/index.js.map +1 -1
- package/dist/tui/App.js +62 -37
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/InputBar.js +63 -37
- package/dist/tui/InputBar.js.map +1 -1
- package/dist/tui/components/InputArea.d.ts +2 -1
- package/dist/tui/components/InputArea.js +14 -4
- package/dist/tui/components/InputArea.js.map +1 -1
- package/dist/tui/components/MessageList.d.ts +2 -1
- package/dist/tui/components/MessageList.js +23 -5
- package/dist/tui/components/MessageList.js.map +1 -1
- package/dist/tui/components/StatusBar.js +1 -1
- package/dist/tui/components/StatusBar.js.map +1 -1
- package/dist/tui/printer.js +10 -2
- package/dist/tui/printer.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/package.json +1 -1
- package/src/llm/stream.ts +18 -82
- package/src/parser/stream-parser.ts +145 -3
- package/src/tools/index.ts +40 -6
- package/src/tui/App.tsx +81 -36
- package/src/tui/InputBar.tsx +27 -42
- package/src/tui/components/MessageList.tsx +33 -6
- package/src/tui/components/StatusBar.tsx +1 -1
- package/src/tui/printer.ts +11 -2
- package/src/types.ts +1 -1
|
@@ -13,7 +13,16 @@
|
|
|
13
13
|
"Bash(npm run *)",
|
|
14
14
|
"Bash(npm publish *)",
|
|
15
15
|
"Bash(npm pkg *)",
|
|
16
|
-
"Bash(npm version *)"
|
|
16
|
+
"Bash(npm version *)",
|
|
17
|
+
"Bash(chmod +x *)",
|
|
18
|
+
"Bash(git grep *)",
|
|
19
|
+
"Bash(npm link *)",
|
|
20
|
+
"Bash(node -e \"const {appendFileSync} = require\\('fs'\\); appendFileSync\\('/tmp/miii-test.log', 'test\\\\n'\\); console.log\\('ok'\\)\")",
|
|
21
|
+
"Read(//tmp/**)",
|
|
22
|
+
"Read(//private/tmp/**)",
|
|
23
|
+
"Read(//Users/akshay/**)",
|
|
24
|
+
"Bash(tsx --version)",
|
|
25
|
+
"Bash(node -e ' *)"
|
|
17
26
|
]
|
|
18
27
|
}
|
|
19
28
|
}
|
package/dist/init.js
CHANGED
|
@@ -5,6 +5,7 @@ import { loadConfig } from './config.js';
|
|
|
5
5
|
import { SkillLoader } from './skills/loader.js';
|
|
6
6
|
import { InputBar } from './tui/InputBar.js';
|
|
7
7
|
import { welcome } from './tui/printer.js';
|
|
8
|
+
import { ensureOllama } from './llm/ollama.js';
|
|
8
9
|
export async function lazyInit() {
|
|
9
10
|
const argv = minimist(process.argv.slice(2), {
|
|
10
11
|
string: ['model', 'url', 'provider', 'session'],
|
|
@@ -17,6 +18,9 @@ export async function lazyInit() {
|
|
|
17
18
|
config.baseUrl = argv.url;
|
|
18
19
|
if (argv.provider)
|
|
19
20
|
config.provider = argv.provider;
|
|
21
|
+
if (config.provider === 'ollama') {
|
|
22
|
+
await ensureOllama(config.baseUrl);
|
|
23
|
+
}
|
|
20
24
|
const skills = new SkillLoader();
|
|
21
25
|
await skills.loadAll();
|
|
22
26
|
// Print welcome banner to scrollback BEFORE Ink starts
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAC3C,MAAM,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC;QAC/C,KAAK,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE;KAC7D,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;IACzC,IAAI,IAAI,CAAC,GAAG;QAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAA;IACvC,IAAI,IAAI,CAAC,QAAQ;QAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAkC,CAAA;IAE5E,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAA;IAChC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAA;IAEtB,uDAAuD;IACvD,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;IAErD,6DAA6D;IAC7D,4EAA4E;IAC5E,MAAM,WAAW,GAAI,IAAI,CAAC,OAAkB,IAAI,SAAS,CAAA;IAEzD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,EAC3F,EAAE,WAAW,EAAE,KAAK,EAAE,CACvB,CAAA;IAED,MAAM,aAAa,EAAE,CAAA;AACvB,CAAC"}
|
package/dist/llm/ollama.d.ts
CHANGED
|
@@ -6,4 +6,5 @@ export interface OllamaModel {
|
|
|
6
6
|
}
|
|
7
7
|
export declare function listModels(baseUrl: string): Promise<OllamaModel[]>;
|
|
8
8
|
export declare function pullModel(baseUrl: string, name: string, onProgress: (status: string, pct: number | undefined) => void, signal?: AbortSignal): Promise<void>;
|
|
9
|
+
export declare function ensureOllama(baseUrl: string): Promise<void>;
|
|
9
10
|
export declare function fmtSize(bytes: number): string;
|
package/dist/llm/ollama.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { execSync, spawn } from 'child_process';
|
|
1
2
|
export async function listModels(baseUrl) {
|
|
2
3
|
const res = await fetch(`${baseUrl}/api/tags`);
|
|
3
4
|
if (!res.ok)
|
|
@@ -41,6 +42,54 @@ export async function pullModel(baseUrl, name, onProgress, signal) {
|
|
|
41
42
|
reader.releaseLock();
|
|
42
43
|
}
|
|
43
44
|
}
|
|
45
|
+
export async function ensureOllama(baseUrl) {
|
|
46
|
+
if (await isReachable(baseUrl))
|
|
47
|
+
return;
|
|
48
|
+
if (!isBinaryInstalled()) {
|
|
49
|
+
process.stderr.write('\nOllama not found. Install it:\n\n');
|
|
50
|
+
if (process.platform === 'darwin') {
|
|
51
|
+
process.stderr.write(' brew install ollama\n');
|
|
52
|
+
process.stderr.write(' — or download: https://ollama.ai/download\n');
|
|
53
|
+
}
|
|
54
|
+
else if (process.platform === 'linux') {
|
|
55
|
+
process.stderr.write(' curl -fsSL https://ollama.ai/install.sh | sh\n');
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
process.stderr.write(' https://ollama.ai/download\n');
|
|
59
|
+
}
|
|
60
|
+
process.stderr.write('\nThen run: ollama serve\n\n');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
process.stderr.write('Ollama not running — starting ollama serve...\n');
|
|
64
|
+
spawn('ollama', ['serve'], { detached: true, stdio: 'ignore' }).unref();
|
|
65
|
+
for (let i = 0; i < 12; i++) {
|
|
66
|
+
await new Promise(r => setTimeout(r, 500));
|
|
67
|
+
if (await isReachable(baseUrl)) {
|
|
68
|
+
process.stderr.write('Ollama ready.\n');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
process.stderr.write('Could not start Ollama. Run manually: ollama serve\n');
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
async function isReachable(baseUrl) {
|
|
76
|
+
try {
|
|
77
|
+
const res = await fetch(`${baseUrl}/api/tags`, { signal: AbortSignal.timeout(2000) });
|
|
78
|
+
return res.ok;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function isBinaryInstalled() {
|
|
85
|
+
try {
|
|
86
|
+
execSync(process.platform === 'win32' ? 'where ollama' : 'which ollama', { stdio: 'ignore' });
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
44
93
|
export function fmtSize(bytes) {
|
|
45
94
|
if (bytes >= 1e9)
|
|
46
95
|
return `${(bytes / 1e9).toFixed(1)}GB`;
|
package/dist/llm/ollama.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/llm/ollama.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/llm/ollama.ts"],"names":[],"mappings":"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"}
|
package/dist/llm/stream.d.ts
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import type { ChatMessage } from '../types.js';
|
|
2
|
-
export interface
|
|
2
|
+
export interface ChatConfig {
|
|
3
3
|
provider: 'ollama' | 'openai-compat';
|
|
4
4
|
model: string;
|
|
5
5
|
baseUrl: string;
|
|
6
6
|
apiKey?: string;
|
|
7
7
|
messages: ChatMessage[];
|
|
8
8
|
signal?: AbortSignal;
|
|
9
|
-
onToken: (token: string) => void;
|
|
10
9
|
onDone: (fullText: string) => void | Promise<void>;
|
|
11
10
|
onError: (err: Error) => void;
|
|
12
11
|
}
|
|
13
|
-
export declare function
|
|
12
|
+
export declare function chat(cfg: ChatConfig): Promise<void>;
|
package/dist/llm/stream.js
CHANGED
|
@@ -1,127 +1,49 @@
|
|
|
1
|
-
export async function
|
|
2
|
-
if (cfg.provider === 'openai-compat')
|
|
3
|
-
return
|
|
4
|
-
|
|
5
|
-
return streamOllama(cfg);
|
|
1
|
+
export async function chat(cfg) {
|
|
2
|
+
if (cfg.provider === 'openai-compat')
|
|
3
|
+
return chatOpenAI(cfg);
|
|
4
|
+
return chatOllama(cfg);
|
|
6
5
|
}
|
|
7
|
-
async function
|
|
8
|
-
const { model, messages, baseUrl, signal,
|
|
9
|
-
let res;
|
|
6
|
+
async function chatOllama(cfg) {
|
|
7
|
+
const { model, messages, baseUrl, signal, onDone, onError } = cfg;
|
|
10
8
|
try {
|
|
11
|
-
res = await fetch(`${baseUrl}/api/chat`, {
|
|
9
|
+
const res = await fetch(`${baseUrl}/api/chat`, {
|
|
12
10
|
method: 'POST',
|
|
13
11
|
headers: { 'Content-Type': 'application/json' },
|
|
14
|
-
body: JSON.stringify({ model, messages, stream:
|
|
12
|
+
body: JSON.stringify({ model, messages, stream: false }),
|
|
15
13
|
signal,
|
|
16
14
|
});
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
if (!res.ok) {
|
|
23
|
-
onError(new Error(`Ollama ${res.status}: ${await res.text()}`));
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
const reader = res.body.getReader();
|
|
27
|
-
const dec = new TextDecoder();
|
|
28
|
-
let full = '';
|
|
29
|
-
let buf = '';
|
|
30
|
-
try {
|
|
31
|
-
while (true) {
|
|
32
|
-
const { done, value } = await reader.read();
|
|
33
|
-
if (done)
|
|
34
|
-
break;
|
|
35
|
-
buf += dec.decode(value, { stream: true });
|
|
36
|
-
const lines = buf.split('\n');
|
|
37
|
-
buf = lines.pop() ?? '';
|
|
38
|
-
for (const line of lines) {
|
|
39
|
-
if (!line.trim())
|
|
40
|
-
continue;
|
|
41
|
-
try {
|
|
42
|
-
const obj = JSON.parse(line);
|
|
43
|
-
const tok = obj?.message?.content ?? '';
|
|
44
|
-
if (tok) {
|
|
45
|
-
onToken(tok);
|
|
46
|
-
full += tok;
|
|
47
|
-
}
|
|
48
|
-
if (obj?.done) {
|
|
49
|
-
await onDone(full);
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
catch { }
|
|
54
|
-
}
|
|
15
|
+
if (!res.ok) {
|
|
16
|
+
onError(new Error(`Ollama ${res.status}: ${await res.text()}`));
|
|
17
|
+
return;
|
|
55
18
|
}
|
|
56
|
-
await
|
|
19
|
+
const obj = await res.json();
|
|
20
|
+
await onDone(obj?.message?.content ?? '');
|
|
57
21
|
}
|
|
58
22
|
catch (err) {
|
|
59
23
|
if (err?.name !== 'AbortError')
|
|
60
24
|
onError(toError(err));
|
|
61
25
|
}
|
|
62
|
-
finally {
|
|
63
|
-
reader.releaseLock();
|
|
64
|
-
}
|
|
65
26
|
}
|
|
66
|
-
async function
|
|
67
|
-
const { model, messages, baseUrl, apiKey, signal,
|
|
68
|
-
let res;
|
|
27
|
+
async function chatOpenAI(cfg) {
|
|
28
|
+
const { model, messages, baseUrl, apiKey, signal, onDone, onError } = cfg;
|
|
69
29
|
try {
|
|
70
|
-
res = await fetch(`${baseUrl}/v1/chat/completions`, {
|
|
30
|
+
const res = await fetch(`${baseUrl}/v1/chat/completions`, {
|
|
71
31
|
method: 'POST',
|
|
72
32
|
headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${apiKey ?? 'local'}` },
|
|
73
|
-
body: JSON.stringify({ model, messages
|
|
33
|
+
body: JSON.stringify({ model, messages }),
|
|
74
34
|
signal,
|
|
75
35
|
});
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
if (!res.ok) {
|
|
82
|
-
onError(new Error(`LLM ${res.status}: ${await res.text()}`));
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
const reader = res.body.getReader();
|
|
86
|
-
const dec = new TextDecoder();
|
|
87
|
-
let full = '';
|
|
88
|
-
let buf = '';
|
|
89
|
-
try {
|
|
90
|
-
while (true) {
|
|
91
|
-
const { done, value } = await reader.read();
|
|
92
|
-
if (done)
|
|
93
|
-
break;
|
|
94
|
-
buf += dec.decode(value, { stream: true });
|
|
95
|
-
const lines = buf.split('\n');
|
|
96
|
-
buf = lines.pop() ?? '';
|
|
97
|
-
for (const line of lines) {
|
|
98
|
-
const trimmed = line.replace(/^data:\s*/, '').trim();
|
|
99
|
-
if (!trimmed || trimmed === '[DONE]')
|
|
100
|
-
continue;
|
|
101
|
-
try {
|
|
102
|
-
const obj = JSON.parse(trimmed);
|
|
103
|
-
const tok = obj?.choices?.[0]?.delta?.content ?? '';
|
|
104
|
-
if (tok) {
|
|
105
|
-
onToken(tok);
|
|
106
|
-
full += tok;
|
|
107
|
-
}
|
|
108
|
-
if (obj?.choices?.[0]?.finish_reason) {
|
|
109
|
-
await onDone(full);
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
catch { }
|
|
114
|
-
}
|
|
36
|
+
if (!res.ok) {
|
|
37
|
+
onError(new Error(`LLM ${res.status}: ${await res.text()}`));
|
|
38
|
+
return;
|
|
115
39
|
}
|
|
116
|
-
await
|
|
40
|
+
const obj = await res.json();
|
|
41
|
+
await onDone(obj?.choices?.[0]?.message?.content ?? '');
|
|
117
42
|
}
|
|
118
43
|
catch (err) {
|
|
119
44
|
if (err?.name !== 'AbortError')
|
|
120
45
|
onError(toError(err));
|
|
121
46
|
}
|
|
122
|
-
finally {
|
|
123
|
-
reader.releaseLock();
|
|
124
|
-
}
|
|
125
47
|
}
|
|
126
48
|
function toError(e) {
|
|
127
49
|
return e instanceof Error ? e : new Error(String(e));
|
package/dist/llm/stream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/llm/stream.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/llm/stream.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,GAAe;IACxC,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe;QAAE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAA;IAC5D,OAAO,UAAU,CAAC,GAAG,CAAC,CAAA;AACxB,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAe;IACvC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAA;IACjE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,WAAW,EAAE;YAC7C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACxD,MAAM;SACP,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QACxF,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC5B,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;IAC3C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAAa,EAAE,IAAI,KAAK,YAAY;YAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;IAClE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,GAAe;IACvC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAA;IACzE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,sBAAsB,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,UAAU,MAAM,IAAI,OAAO,EAAE,EAAE;YAC7F,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;YACzC,MAAM;SACP,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QACrF,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC5B,MAAM,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;IACzD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAAa,EAAE,IAAI,KAAK,YAAY;YAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;IAClE,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,CAAU;IACzB,OAAO,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACtD,CAAC"}
|
|
@@ -9,6 +9,10 @@ export interface ParsedTool {
|
|
|
9
9
|
toolArgs: Record<string, unknown>;
|
|
10
10
|
}
|
|
11
11
|
export type ParsedItem = ParsedText | ParsedTool;
|
|
12
|
+
export declare function extractBareToolCall(text: string): {
|
|
13
|
+
name: string;
|
|
14
|
+
args: Record<string, unknown>;
|
|
15
|
+
} | null;
|
|
12
16
|
export declare class StreamParser {
|
|
13
17
|
private buf;
|
|
14
18
|
private inTool;
|
|
@@ -1,5 +1,147 @@
|
|
|
1
|
+
import { appendFileSync } from 'fs';
|
|
1
2
|
const OPEN = '<tool_call>';
|
|
2
3
|
const CLOSE = '</tool_call>';
|
|
4
|
+
const CTAG_OPEN = '<content>';
|
|
5
|
+
const CTAG_CLOSE = '</content>';
|
|
6
|
+
const OLD_OPEN = '<old>';
|
|
7
|
+
const OLD_CLOSE = '</old>';
|
|
8
|
+
const NEW_OPEN = '<new>';
|
|
9
|
+
const NEW_CLOSE = '</new>';
|
|
10
|
+
const DEBUG_LOG = '/tmp/miii-debug.log';
|
|
11
|
+
function dbg(msg) {
|
|
12
|
+
try {
|
|
13
|
+
appendFileSync(DEBUG_LOG, `[${new Date().toISOString()}] ${msg}\n`);
|
|
14
|
+
}
|
|
15
|
+
catch { }
|
|
16
|
+
}
|
|
17
|
+
// Fix literal newlines/tabs inside JSON string values — common LLM output mistake
|
|
18
|
+
function sanitizeJson(s) {
|
|
19
|
+
let result = '';
|
|
20
|
+
let inString = false;
|
|
21
|
+
let escaped = false;
|
|
22
|
+
for (const ch of s) {
|
|
23
|
+
if (escaped) {
|
|
24
|
+
result += ch;
|
|
25
|
+
escaped = false;
|
|
26
|
+
}
|
|
27
|
+
else if (ch === '\\' && inString) {
|
|
28
|
+
result += ch;
|
|
29
|
+
escaped = true;
|
|
30
|
+
}
|
|
31
|
+
else if (ch === '"') {
|
|
32
|
+
result += ch;
|
|
33
|
+
inString = !inString;
|
|
34
|
+
}
|
|
35
|
+
else if (inString && ch === '\n') {
|
|
36
|
+
result += '\\n';
|
|
37
|
+
}
|
|
38
|
+
else if (inString && ch === '\r') {
|
|
39
|
+
result += '\\r';
|
|
40
|
+
}
|
|
41
|
+
else if (inString && ch === '\t') {
|
|
42
|
+
result += '\\t';
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
result += ch;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
function parseToolJson(s) {
|
|
51
|
+
try {
|
|
52
|
+
return JSON.parse(s);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return JSON.parse(sanitizeJson(s));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Find end of a JSON object starting at `from`, correctly tracking strings
|
|
59
|
+
function findJsonEnd(text, from) {
|
|
60
|
+
let depth = 0, inStr = false, escaped = false;
|
|
61
|
+
for (let i = from; i < text.length; i++) {
|
|
62
|
+
const ch = text[i];
|
|
63
|
+
if (escaped) {
|
|
64
|
+
escaped = false;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (ch === '\\' && inStr) {
|
|
68
|
+
escaped = true;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (ch === '"') {
|
|
72
|
+
inStr = !inStr;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (inStr)
|
|
76
|
+
continue;
|
|
77
|
+
if (ch === '{')
|
|
78
|
+
depth++;
|
|
79
|
+
else if (ch === '}') {
|
|
80
|
+
depth--;
|
|
81
|
+
if (depth === 0)
|
|
82
|
+
return i;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return -1;
|
|
86
|
+
}
|
|
87
|
+
// For file-writing tools: content field may have unescaped chars — extract with lastIndexOf heuristic
|
|
88
|
+
function extractFileToolArgs(text, toolName) {
|
|
89
|
+
if (!text.includes(`"${toolName}"`))
|
|
90
|
+
return null;
|
|
91
|
+
const args = {};
|
|
92
|
+
const pathM = text.match(/"path"\s*:\s*"([^"]*)"/);
|
|
93
|
+
if (pathM)
|
|
94
|
+
args.path = pathM[1];
|
|
95
|
+
// content is always the last string field — find its opening quote, take to last " before final }}
|
|
96
|
+
const ctIdx = text.indexOf('"content"');
|
|
97
|
+
if (ctIdx !== -1) {
|
|
98
|
+
const colon = text.indexOf(':', ctIdx);
|
|
99
|
+
const openQ = text.indexOf('"', colon + 1);
|
|
100
|
+
const lastBrace = text.lastIndexOf('}');
|
|
101
|
+
const closeQ = text.lastIndexOf('"', lastBrace - 1);
|
|
102
|
+
if (openQ !== -1 && closeQ > openQ) {
|
|
103
|
+
const raw = text.slice(openQ + 1, closeQ);
|
|
104
|
+
args.content = raw
|
|
105
|
+
.replace(/\\n/g, '\n').replace(/\\r/g, '\r').replace(/\\t/g, '\t')
|
|
106
|
+
.replace(/\\"/g, '"').replace(/\\\\/g, '\\');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// For patch_file: extract old/new fields
|
|
110
|
+
const oldM = text.match(/"old"\s*:\s*"([\s\S]*?)"(?:\s*,|\s*\})/);
|
|
111
|
+
if (oldM)
|
|
112
|
+
args.old = oldM[1].replace(/\\n/g, '\n').replace(/\\"/g, '"');
|
|
113
|
+
const newM = text.match(/"new"\s*:\s*"([\s\S]*?)"(?:\s*,|\s*\})/);
|
|
114
|
+
if (newM)
|
|
115
|
+
args.new = newM[1].replace(/\\n/g, '\n').replace(/\\"/g, '"');
|
|
116
|
+
return Object.keys(args).length > 0 ? args : null;
|
|
117
|
+
}
|
|
118
|
+
// Extract a bare tool-call JSON from arbitrary text (LLM skipped <tool_call> wrapper)
|
|
119
|
+
export function extractBareToolCall(text) {
|
|
120
|
+
// First try standard JSON parsing
|
|
121
|
+
let pos = 0;
|
|
122
|
+
while (true) {
|
|
123
|
+
const start = text.indexOf('{"name"', pos);
|
|
124
|
+
if (start === -1)
|
|
125
|
+
break;
|
|
126
|
+
const end = findJsonEnd(text, start);
|
|
127
|
+
if (end === -1)
|
|
128
|
+
break;
|
|
129
|
+
try {
|
|
130
|
+
const obj = parseToolJson(text.slice(start, end + 1));
|
|
131
|
+
if (typeof obj.name === 'string')
|
|
132
|
+
return { name: obj.name, args: (obj.args ?? {}) };
|
|
133
|
+
}
|
|
134
|
+
catch { }
|
|
135
|
+
pos = start + 1;
|
|
136
|
+
}
|
|
137
|
+
// Fallback: content-aware extraction for file-writing tools (immune to unescaped chars)
|
|
138
|
+
for (const name of ['edit_file', 'create_file', 'patch_file']) {
|
|
139
|
+
const args = extractFileToolArgs(text, name);
|
|
140
|
+
if (args)
|
|
141
|
+
return { name, args };
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
3
145
|
export class StreamParser {
|
|
4
146
|
buf = '';
|
|
5
147
|
inTool = false;
|
|
@@ -15,10 +157,35 @@ export class StreamParser {
|
|
|
15
157
|
this.buf = this.buf.slice(end + CLOSE.length);
|
|
16
158
|
this.inTool = false;
|
|
17
159
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
160
|
+
dbg(`raw block (${raw.length} chars): ${raw.slice(0, 300)}`);
|
|
161
|
+
// Extract named content blocks so file content never needs JSON escaping
|
|
162
|
+
const extraArgs = {};
|
|
163
|
+
let jsonPart = raw;
|
|
164
|
+
function extractBlock(open, close, key) {
|
|
165
|
+
const s = raw.indexOf(open), e = raw.indexOf(close);
|
|
166
|
+
if (s === -1 || e === -1 || e <= s)
|
|
167
|
+
return;
|
|
168
|
+
let val = raw.slice(s + open.length, e);
|
|
169
|
+
if (val.startsWith('\n'))
|
|
170
|
+
val = val.slice(1);
|
|
171
|
+
if (val.endsWith('\n'))
|
|
172
|
+
val = val.slice(0, -1);
|
|
173
|
+
extraArgs[key] = val;
|
|
174
|
+
// shrink jsonPart to before the first block
|
|
175
|
+
const blockStart = raw.indexOf(open);
|
|
176
|
+
if (blockStart < jsonPart.length)
|
|
177
|
+
jsonPart = raw.slice(0, blockStart).trim();
|
|
178
|
+
}
|
|
179
|
+
extractBlock(CTAG_OPEN, CTAG_CLOSE, 'content');
|
|
180
|
+
extractBlock(OLD_OPEN, OLD_CLOSE, 'old');
|
|
181
|
+
extractBlock(NEW_OPEN, NEW_CLOSE, 'new');
|
|
182
|
+
const obj = parseToolJson(jsonPart);
|
|
183
|
+
obj.args = { ...(obj.args ?? {}), ...extraArgs };
|
|
184
|
+
dbg(`parsed ok: name=${obj.name} args_keys=${Object.keys(obj.args).join(',')}`);
|
|
185
|
+
out.push({ type: 'tool_call', content: raw, toolName: obj.name, toolArgs: obj.args });
|
|
20
186
|
}
|
|
21
|
-
catch {
|
|
187
|
+
catch (e) {
|
|
188
|
+
dbg(`parse FAILED: ${e} | raw: ${raw.slice(0, 300)}`);
|
|
22
189
|
out.push({ type: 'text', content: `${OPEN}${raw}${CLOSE}` });
|
|
23
190
|
}
|
|
24
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-parser.js","sourceRoot":"","sources":["../../src/parser/stream-parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stream-parser.js","sourceRoot":"","sources":["../../src/parser/stream-parser.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.js
CHANGED
|
@@ -43,13 +43,29 @@ export const tools = [
|
|
|
43
43
|
},
|
|
44
44
|
{
|
|
45
45
|
name: 'edit_file',
|
|
46
|
-
description: '
|
|
46
|
+
description: 'Overwrite entire file — use only for new files or full rewrites',
|
|
47
47
|
params: '{"path": "string", "content": "string"}',
|
|
48
48
|
execute: async ({ path, content }) => {
|
|
49
49
|
writeFile(guardPath(path), content);
|
|
50
50
|
return `written: ${path}`;
|
|
51
51
|
},
|
|
52
52
|
},
|
|
53
|
+
{
|
|
54
|
+
name: 'patch_file',
|
|
55
|
+
description: 'Replace an exact string in a file — use for targeted edits to existing files',
|
|
56
|
+
params: '{"path": "string", "old": "string", "new": "string"}',
|
|
57
|
+
execute: async ({ path, old: oldStr, new: newStr }) => {
|
|
58
|
+
const safe = guardPath(path);
|
|
59
|
+
const current = readFile(safe);
|
|
60
|
+
if (!current)
|
|
61
|
+
throw new Error(`file not found or empty: ${path}`);
|
|
62
|
+
if (!current.includes(oldStr))
|
|
63
|
+
throw new Error(`old text not found in ${path}`);
|
|
64
|
+
const updated = current.replace(oldStr, newStr);
|
|
65
|
+
writeFile(safe, updated);
|
|
66
|
+
return `patched: ${path}`;
|
|
67
|
+
},
|
|
68
|
+
},
|
|
53
69
|
{
|
|
54
70
|
name: 'delete_file',
|
|
55
71
|
description: 'Delete a file',
|
|
@@ -96,19 +112,39 @@ Use tools by emitting:
|
|
|
96
112
|
{"name": "tool_name", "args": {...}}
|
|
97
113
|
</tool_call>
|
|
98
114
|
|
|
115
|
+
Put file content in named blocks (never inside JSON — avoids escaping errors):
|
|
116
|
+
|
|
117
|
+
For edit_file / create_file use <content> block:
|
|
118
|
+
<tool_call>
|
|
119
|
+
{"name": "edit_file", "args": {"path": "src/foo.ts"}}
|
|
120
|
+
<content>
|
|
121
|
+
full file content here
|
|
122
|
+
</content>
|
|
123
|
+
</tool_call>
|
|
124
|
+
|
|
125
|
+
For patch_file use <old> and <new> blocks:
|
|
126
|
+
<tool_call>
|
|
127
|
+
{"name": "patch_file", "args": {"path": "src/foo.ts"}}
|
|
128
|
+
<old>
|
|
129
|
+
exact text to replace
|
|
130
|
+
</old>
|
|
131
|
+
<new>
|
|
132
|
+
replacement text
|
|
133
|
+
</new>
|
|
134
|
+
</tool_call>
|
|
135
|
+
|
|
99
136
|
Tools:
|
|
100
137
|
${toolDocs}
|
|
101
138
|
|
|
102
139
|
Rules:
|
|
103
|
-
-
|
|
104
|
-
-
|
|
105
|
-
- read_file
|
|
106
|
-
- Show the full content when creating or editing
|
|
140
|
+
- To modify an existing file: use patch_file with the exact old text and new replacement — do NOT rewrite the whole file
|
|
141
|
+
- To create a new file: use edit_file with full content in the <content> block
|
|
142
|
+
- read_file before patch_file so you know the exact text to match
|
|
107
143
|
- Never delete without confirming
|
|
108
144
|
- Be concise
|
|
109
145
|
- Output plain text only — never use markdown formatting in your responses
|
|
110
146
|
- No headers (no #, ##), no bold (**text**), no italic (*text*), no bullet points with *, no horizontal rules (---)
|
|
111
|
-
- No fenced code blocks with backticks in prose
|
|
147
|
+
- No fenced code blocks with backticks in prose
|
|
112
148
|
- Use plain indentation and labels for structure. This is a terminal, not a chat UI${extra}`;
|
|
113
149
|
}
|
|
114
150
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC5G,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAA;AAEhC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;AAC3B,MAAM,eAAe,GAAG,MAAM,CAAA;AAS9B,MAAM,CAAC,MAAM,KAAK,GAAW;IAC3B;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,oBAAoB;QACjC,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YAC1B,IAAI,CAAC;gBAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,IAAc,CAAC,CAAC,CAAA;YAAC,CAAC;YAClD,OAAO,CAAC,EAAE,CAAC;gBAAC,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAA;YAAC,CAAC;QAClD,CAAC;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,yBAAyB;QACtC,MAAM,EAAE,uDAAuD;QAC/D,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE,EAAE;YAC7C,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,IAAc,CAAC,EAAE,SAAoB,CAAC,CAAA;YAC1E,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,OAAO,SAAS,CAAA;YACrC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjF,CAAC;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,kDAAkD;QAC/D,MAAM,EAAE,yCAAyC;QACjD,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YACnC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAc,CAAC,CAAA;YACtC,IAAI,UAAU,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,EAAE,CAAC,CAAA;YACrE,SAAS,CAAC,IAAI,EAAE,OAAiB,CAAC,CAAA;YAClC,OAAO,YAAY,IAAI,EAAE,CAAA;QAC3B,CAAC;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|