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.
Files changed (39) hide show
  1. package/.claude/settings.local.json +10 -1
  2. package/dist/init.js +4 -0
  3. package/dist/init.js.map +1 -1
  4. package/dist/llm/ollama.d.ts +1 -0
  5. package/dist/llm/ollama.js +49 -0
  6. package/dist/llm/ollama.js.map +1 -1
  7. package/dist/llm/stream.d.ts +2 -3
  8. package/dist/llm/stream.js +22 -100
  9. package/dist/llm/stream.js.map +1 -1
  10. package/dist/parser/stream-parser.d.ts +4 -0
  11. package/dist/parser/stream-parser.js +170 -3
  12. package/dist/parser/stream-parser.js.map +1 -1
  13. package/dist/tools/index.js +42 -6
  14. package/dist/tools/index.js.map +1 -1
  15. package/dist/tui/App.js +62 -37
  16. package/dist/tui/App.js.map +1 -1
  17. package/dist/tui/InputBar.js +63 -37
  18. package/dist/tui/InputBar.js.map +1 -1
  19. package/dist/tui/components/InputArea.d.ts +2 -1
  20. package/dist/tui/components/InputArea.js +14 -4
  21. package/dist/tui/components/InputArea.js.map +1 -1
  22. package/dist/tui/components/MessageList.d.ts +2 -1
  23. package/dist/tui/components/MessageList.js +23 -5
  24. package/dist/tui/components/MessageList.js.map +1 -1
  25. package/dist/tui/components/StatusBar.js +1 -1
  26. package/dist/tui/components/StatusBar.js.map +1 -1
  27. package/dist/tui/printer.js +10 -2
  28. package/dist/tui/printer.js.map +1 -1
  29. package/dist/types.d.ts +1 -1
  30. package/package.json +1 -1
  31. package/src/llm/stream.ts +18 -82
  32. package/src/parser/stream-parser.ts +145 -3
  33. package/src/tools/index.ts +40 -6
  34. package/src/tui/App.tsx +81 -36
  35. package/src/tui/InputBar.tsx +27 -42
  36. package/src/tui/components/MessageList.tsx +33 -6
  37. package/src/tui/components/StatusBar.tsx +1 -1
  38. package/src/tui/printer.ts +11 -2
  39. 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;AAE1C,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,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"}
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"}
@@ -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;
@@ -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`;
@@ -1 +1 @@
1
- {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/llm/ollama.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/llm/ollama.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,12 @@
1
1
  import type { ChatMessage } from '../types.js';
2
- export interface StreamConfig {
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 stream(cfg: StreamConfig): Promise<void>;
12
+ export declare function chat(cfg: ChatConfig): Promise<void>;
@@ -1,127 +1,49 @@
1
- export async function stream(cfg) {
2
- if (cfg.provider === 'openai-compat') {
3
- return streamOpenAI(cfg);
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 streamOllama(cfg) {
8
- const { model, messages, baseUrl, signal, onToken, onDone, onError } = cfg;
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: true }),
12
+ body: JSON.stringify({ model, messages, stream: false }),
15
13
  signal,
16
14
  });
17
- }
18
- catch (err) {
19
- onError(toError(err));
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 onDone(full);
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 streamOpenAI(cfg) {
67
- const { model, messages, baseUrl, apiKey, signal, onToken, onDone, onError } = cfg;
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, stream: true }),
33
+ body: JSON.stringify({ model, messages }),
74
34
  signal,
75
35
  });
76
- }
77
- catch (err) {
78
- onError(toError(err));
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 onDone(full);
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));
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/llm/stream.ts"],"names":[],"mappings":"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"}
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
- const obj = JSON.parse(raw);
19
- out.push({ type: 'tool_call', content: raw, toolName: obj.name, toolArgs: obj.args ?? {} });
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":"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"}
1
+ {"version":3,"file":"stream-parser.js","sourceRoot":"","sources":["../../src/parser/stream-parser.ts"],"names":[],"mappings":"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"}
@@ -43,13 +43,29 @@ export const tools = [
43
43
  },
44
44
  {
45
45
  name: 'edit_file',
46
- description: 'Write/overwrite file content',
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
- - Read existing files before editing them
104
- - For new files that do not exist yet, call edit_file directly do not read first
105
- - read_file returns empty string for missing files, so a blank result means the file is new
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 — the ONLY exception is when writing actual file content (e.g. a .md file the user asked you to create or edit)
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
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,iEAAiE;QAC9E,MAAM,EAAE,yCAAyC;QACjD,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;YACnC,SAAS,CAAC,SAAS,CAAC,IAAc,CAAC,EAAE,OAAiB,CAAC,CAAA;YACvD,OAAO,YAAY,IAAI,EAAE,CAAA;QAC3B,CAAC;KACF;IACD;QACE,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,8EAA8E;QAC3F,MAAM,EAAE,sDAAsD;QAC9D,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;YACpD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAc,CAAC,CAAA;YACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;YAC9B,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAA;YACjE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAgB,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAA;YACzF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAgB,EAAE,MAAgB,CAAC,CAAA;YACnE,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YACxB,OAAO,YAAY,IAAI,EAAE,CAAA;QAC3B,CAAC;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,eAAe;QAC5B,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YAC1B,UAAU,CAAC,SAAS,CAAC,IAAc,CAAC,CAAC,CAAA;YACrC,OAAO,YAAY,IAAI,EAAE,CAAA;QAC3B,CAAC;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,4BAA4B;QACzC,MAAM,EAAE,uBAAuB;QAC/B,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,OAAiB,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAA;YACzG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;QACtF,CAAC;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,8CAA8C;QAC3D,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;YAC1B,SAAS,CAAC,SAAS,CAAC,IAAc,CAAC,CAAC,CAAA;YACpC,OAAO,YAAY,IAAI,EAAE,CAAA;QAC3B,CAAC;KACF;IACD;QACE,IAAI,EAAE,WAAW;QACjB,WAAW,EAAE,oCAAoC;QACjD,MAAM,EAAE,oCAAoC;QAC5C,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;YAC9B,QAAQ,CAAC,SAAS,CAAC,IAAc,CAAC,EAAE,SAAS,CAAC,EAAY,CAAC,CAAC,CAAA;YAC5D,OAAO,UAAU,IAAI,MAAM,EAAE,EAAE,CAAA;QACjC,CAAC;KACF;CACF,CAAA;AAED,MAAM,UAAU,eAAe,CAAC,KAAK,GAAG,EAAE;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BP,QAAQ;;;;;;;;;;;qFAW2E,KAAK,EAAE,CAAA;AAC5F,CAAC"}