@serjm/deepseek-code 0.4.5 → 0.4.6

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 (49) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/api/index.d.ts +2 -6
  3. package/dist/api/index.d.ts.map +1 -1
  4. package/dist/api/index.js +14 -39
  5. package/dist/api/index.js.map +1 -1
  6. package/dist/config/defaults.d.ts +9 -0
  7. package/dist/config/defaults.d.ts.map +1 -1
  8. package/dist/config/defaults.js +18 -0
  9. package/dist/config/defaults.js.map +1 -1
  10. package/dist/core/agent-loop.d.ts +16 -5
  11. package/dist/core/agent-loop.d.ts.map +1 -1
  12. package/dist/core/agent-loop.js +156 -17
  13. package/dist/core/agent-loop.js.map +1 -1
  14. package/dist/core/mcp-tools.d.ts +15 -0
  15. package/dist/core/mcp-tools.d.ts.map +1 -0
  16. package/dist/core/mcp-tools.js +94 -0
  17. package/dist/core/mcp-tools.js.map +1 -0
  18. package/dist/core/metrics.d.ts +6 -1
  19. package/dist/core/metrics.d.ts.map +1 -1
  20. package/dist/core/metrics.js +17 -4
  21. package/dist/core/metrics.js.map +1 -1
  22. package/dist/tools/bash.d.ts.map +1 -1
  23. package/dist/tools/bash.js +83 -68
  24. package/dist/tools/bash.js.map +1 -1
  25. package/dist/tools/chrome-manager.d.ts.map +1 -1
  26. package/dist/tools/chrome-manager.js +5 -2
  27. package/dist/tools/chrome-manager.js.map +1 -1
  28. package/dist/tools/chrome.d.ts.map +1 -1
  29. package/dist/tools/chrome.js +8 -3
  30. package/dist/tools/chrome.js.map +1 -1
  31. package/dist/tools/process-manager.d.ts +17 -0
  32. package/dist/tools/process-manager.d.ts.map +1 -0
  33. package/dist/tools/process-manager.js +94 -0
  34. package/dist/tools/process-manager.js.map +1 -0
  35. package/dist/tools/read.d.ts.map +1 -1
  36. package/dist/tools/read.js +14 -11
  37. package/dist/tools/read.js.map +1 -1
  38. package/dist/tools/shell.d.ts +20 -0
  39. package/dist/tools/shell.d.ts.map +1 -0
  40. package/dist/tools/shell.js +100 -0
  41. package/dist/tools/shell.js.map +1 -0
  42. package/dist/tools/types.d.ts +6 -0
  43. package/dist/tools/types.d.ts.map +1 -1
  44. package/dist/tools/types.js +9 -1
  45. package/dist/tools/types.js.map +1 -1
  46. package/dist/ui/app.d.ts.map +1 -1
  47. package/dist/ui/app.js +12 -38
  48. package/dist/ui/app.js.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,94 @@
1
+ import net from 'node:net';
2
+ import { platform } from 'node:os';
3
+ import { spawnShellCommand, killProcessTree, killProcessTreeSync } from './shell.js';
4
+ const MAX_BG_OUTPUT = 16 * 1024;
5
+ const registry = new Map();
6
+ let exitHookInstalled = false;
7
+ /** Kill any still-running background processes when the CLI exits (no orphaned dev servers). */
8
+ function ensureExitHook() {
9
+ if (exitHookInstalled)
10
+ return;
11
+ exitHookInstalled = true;
12
+ process.once('exit', () => {
13
+ for (const proc of registry.values()) {
14
+ if (!proc.exited)
15
+ killProcessTreeSync(proc.pid);
16
+ }
17
+ });
18
+ }
19
+ /** Start a long-running command in the background. Returns its pid (or an error). */
20
+ export function startBackground(command) {
21
+ ensureExitHook();
22
+ const child = spawnShellCommand(command, platform() !== 'win32');
23
+ if (child.pid == null)
24
+ return { pid: null, error: 'Failed to start background process.' };
25
+ const entry = { pid: child.pid, command, child, output: '', exited: false };
26
+ registry.set(child.pid, entry);
27
+ const append = (chunk) => {
28
+ entry.output += chunk;
29
+ if (entry.output.length > MAX_BG_OUTPUT)
30
+ entry.output = entry.output.slice(-MAX_BG_OUTPUT);
31
+ };
32
+ child.stdout?.setEncoding('utf8');
33
+ child.stderr?.setEncoding('utf8');
34
+ child.stdout?.on('data', append);
35
+ child.stderr?.on('data', append);
36
+ child.on('error', (err) => { entry.exited = true; entry.exitInfo = `error: ${err.message}`; });
37
+ child.on('close', (code, signal) => {
38
+ entry.exited = true;
39
+ entry.exitInfo = `exited (code=${code ?? 'null'}${signal ? `, signal=${signal}` : ''})`;
40
+ });
41
+ return { pid: child.pid };
42
+ }
43
+ export function getBackgroundOutput(pid) {
44
+ return registry.get(pid)?.output ?? '';
45
+ }
46
+ export function isBackgroundRunning(pid) {
47
+ const proc = registry.get(pid);
48
+ return !!proc && !proc.exited;
49
+ }
50
+ export function getBackgroundExitInfo(pid) {
51
+ return registry.get(pid)?.exitInfo;
52
+ }
53
+ /** Stop a background process (kills its whole tree) and return its captured output. */
54
+ export function stopBackground(pid) {
55
+ const proc = registry.get(pid);
56
+ if (!proc)
57
+ return { stopped: false, output: '', error: `No background process with pid ${pid}.` };
58
+ if (!proc.exited)
59
+ killProcessTree(proc.child);
60
+ const output = proc.output;
61
+ registry.delete(pid);
62
+ return { stopped: true, output };
63
+ }
64
+ /** Poll a TCP port until it accepts a connection or the timeout elapses. */
65
+ export function waitForPort(port, host, timeoutMs) {
66
+ const deadline = Date.now() + timeoutMs;
67
+ return new Promise((resolve) => {
68
+ const attempt = () => {
69
+ const socket = net.connect({ port, host });
70
+ let settled = false;
71
+ const retryOrFail = () => {
72
+ if (settled)
73
+ return;
74
+ settled = true;
75
+ socket.destroy();
76
+ if (Date.now() >= deadline)
77
+ resolve(false);
78
+ else
79
+ setTimeout(attempt, 300);
80
+ };
81
+ socket.once('connect', () => {
82
+ if (settled)
83
+ return;
84
+ settled = true;
85
+ socket.destroy();
86
+ resolve(true);
87
+ });
88
+ socket.once('error', retryOrFail);
89
+ socket.setTimeout(2000, retryOrFail);
90
+ };
91
+ attempt();
92
+ });
93
+ }
94
+ //# sourceMappingURL=process-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-manager.js","sourceRoot":"","sources":["../../src/tools/process-manager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAmB,MAAM,YAAY,CAAA;AAqFvD,eAAO,MAAM,QAAQ,EAAE,IAwEtB,CAAA"}
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,IAAI,EAAmB,MAAM,YAAY,CAAA;AA0FvD,eAAO,MAAM,QAAQ,EAAE,IAwEtB,CAAA"}
@@ -13,14 +13,20 @@ const MIME_TYPES = {
13
13
  '.pdf': 'application/pdf',
14
14
  };
15
15
  async function readAsImage(filePath) {
16
- const buffer = await readFile(filePath); // binary — no encoding
17
16
  const ext = extname(filePath).toLowerCase();
18
17
  const mime = MIME_TYPES[ext] ?? 'application/octet-stream';
19
- const base64 = buffer.toString('base64');
20
- const dataUrl = `data:${mime};base64,${base64}`;
18
+ // SVG is XML text — return its source so the model can actually read/edit it.
19
+ if (ext === '.svg') {
20
+ const svg = await readFile(filePath, 'utf-8');
21
+ return { success: true, output: svg };
22
+ }
23
+ // Binary raster image: do NOT inline base64 — this model has no vision, and the
24
+ // data URL would bloat the context by megabytes (and historically broke the API
25
+ // when turned into an image_url block). Return metadata only.
26
+ const buffer = await readFile(filePath);
21
27
  return {
22
28
  success: true,
23
- output: `[Image: ${filePath}](${dataUrl})\nSize: ${buffer.length} bytes, Type: ${mime}`,
29
+ output: `[Binary image not shown: ${filePath} ${buffer.length} bytes, ${mime}. This model cannot view images; use the chrome tool for visual/rendered checks, or read a textual asset instead.]`,
24
30
  };
25
31
  }
26
32
  async function readAsNotebook(filePath) {
@@ -36,22 +42,19 @@ async function readAsNotebook(filePath) {
36
42
  }
37
43
  async function readAsPdf(filePath) {
38
44
  const buffer = await readFile(filePath); // binary
39
- const mime = MIME_TYPES['.pdf'];
40
- const base64 = buffer.toString('base64');
41
- const dataUrl = `data:${mime};base64,${base64}`;
42
- // Naive text extraction: collect printable ASCII runs from the binary content
45
+ // Naive text extraction: collect printable ASCII runs from the binary content.
46
+ // We do NOT inline base64 (no vision; it only bloats the context).
43
47
  const extracted = extractPrintableRuns(buffer);
44
48
  if (extracted.length > 0) {
45
49
  const text = extracted.join('\n');
46
50
  return {
47
51
  success: true,
48
- output: `[PDF: ${filePath}](${dataUrl})\nSize: ${buffer.length} bytes\n\nExtracted text:\n${text}`,
52
+ output: `[PDF: ${filePath} ${buffer.length} bytes]\n\nExtracted text:\n${text}`,
49
53
  };
50
54
  }
51
- // Fallback: base64 data URL only
52
55
  return {
53
56
  success: true,
54
- output: `[PDF: ${filePath}](${dataUrl})\nSize: ${buffer.length} bytes, Type: ${mime}`,
57
+ output: `[PDF: ${filePath} ${buffer.length} bytes. No extractable text; this model cannot view the rendered PDF.]`,
55
58
  };
56
59
  }
57
60
  /** Collect consecutive printable ASCII runs (length >= 4) from a binary buffer */
@@ -1 +1 @@
1
- {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/tools/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { type ChildProcess } from 'node:child_process';
2
+ export type WindowsShell = 'powershell' | 'cmd';
3
+ /** Resolved (and cached) Windows shell. On non-Windows this is irrelevant. */
4
+ export declare function resolveWindowsShell(): WindowsShell;
5
+ /**
6
+ * Spawn a shell command through the resolved shell for this OS (PowerShell/cmd on
7
+ * Windows, /bin/sh on POSIX). `detached` should be true on POSIX so the whole
8
+ * process group can be killed later. Shared by run_shell_command and the
9
+ * background process manager.
10
+ */
11
+ export declare function spawnShellCommand(command: string, detached: boolean): ChildProcess;
12
+ /**
13
+ * Kill a child and its whole process tree. A bare `child.kill()` only signals the
14
+ * shell wrapper; on Windows the real command keeps the stdout pipe open (so the
15
+ * `close` event never fires) and on POSIX it is orphaned.
16
+ */
17
+ export declare function killProcessTree(child: ChildProcess): void;
18
+ /** Synchronous tree kill by pid — for process-exit cleanup of background tasks. */
19
+ export declare function killProcessTreeSync(pid: number): void;
20
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGxE,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,KAAK,CAAA;AA6B/C,8EAA8E;AAC9E,wBAAgB,mBAAmB,IAAK,YAAY,CAInD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,YAAY,CAOnF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAgB1D;AAED,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAMtD"}
@@ -0,0 +1,100 @@
1
+ import { spawn, spawnSync } from 'node:child_process';
2
+ import { platform } from 'node:os';
3
+ let cached = null;
4
+ /**
5
+ * Decide which Windows shell `run_shell_command` runs commands through.
6
+ *
7
+ * Default is Windows PowerShell (what the model writes naturally and what ships
8
+ * with every modern Windows), but we gracefully fall back to cmd.exe if
9
+ * PowerShell cannot actually run (locked-down execution policy, stripped image).
10
+ * Override with the DEEPSEEK_CODE_SHELL env var (`cmd` | `powershell`).
11
+ */
12
+ function detectWindowsShell() {
13
+ const override = (process.env.DEEPSEEK_CODE_SHELL ?? '').trim().toLowerCase();
14
+ if (override === 'cmd')
15
+ return 'cmd';
16
+ if (override === 'powershell' || override === 'pwsh' || override === 'ps')
17
+ return 'powershell';
18
+ try {
19
+ const probe = spawnSync('powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', 'exit 0'], {
20
+ timeout: 5000,
21
+ windowsHide: true,
22
+ });
23
+ if (!probe.error && probe.status === 0)
24
+ return 'powershell';
25
+ }
26
+ catch {
27
+ /* fall through to cmd */
28
+ }
29
+ return 'cmd';
30
+ }
31
+ /** Resolved (and cached) Windows shell. On non-Windows this is irrelevant. */
32
+ export function resolveWindowsShell() {
33
+ if (platform() !== 'win32')
34
+ return 'cmd';
35
+ if (cached === null)
36
+ cached = detectWindowsShell();
37
+ return cached;
38
+ }
39
+ /**
40
+ * Spawn a shell command through the resolved shell for this OS (PowerShell/cmd on
41
+ * Windows, /bin/sh on POSIX). `detached` should be true on POSIX so the whole
42
+ * process group can be killed later. Shared by run_shell_command and the
43
+ * background process manager.
44
+ */
45
+ export function spawnShellCommand(command, detached) {
46
+ if (platform() === 'win32') {
47
+ return resolveWindowsShell() === 'powershell'
48
+ ? spawn('powershell.exe', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-Command', command], { windowsHide: true, detached })
49
+ : spawn(command, { shell: true, windowsHide: true, detached });
50
+ }
51
+ return spawn(command, { shell: true, detached });
52
+ }
53
+ /**
54
+ * Kill a child and its whole process tree. A bare `child.kill()` only signals the
55
+ * shell wrapper; on Windows the real command keeps the stdout pipe open (so the
56
+ * `close` event never fires) and on POSIX it is orphaned.
57
+ */
58
+ export function killProcessTree(child) {
59
+ const pid = child.pid;
60
+ if (pid == null)
61
+ return;
62
+ if (platform() === 'win32') {
63
+ try {
64
+ spawn('taskkill', ['/pid', String(pid), '/t', '/f'], { windowsHide: true });
65
+ }
66
+ catch {
67
+ try {
68
+ child.kill('SIGKILL');
69
+ }
70
+ catch { /* already gone */ }
71
+ }
72
+ }
73
+ else {
74
+ try {
75
+ process.kill(-pid, 'SIGTERM');
76
+ }
77
+ catch {
78
+ try {
79
+ child.kill('SIGKILL');
80
+ }
81
+ catch { /* already gone */ }
82
+ }
83
+ }
84
+ }
85
+ /** Synchronous tree kill by pid — for process-exit cleanup of background tasks. */
86
+ export function killProcessTreeSync(pid) {
87
+ if (platform() === 'win32') {
88
+ try {
89
+ spawnSync('taskkill', ['/pid', String(pid), '/t', '/f'], { windowsHide: true, timeout: 5000 });
90
+ }
91
+ catch { /* best effort */ }
92
+ }
93
+ else {
94
+ try {
95
+ process.kill(-pid, 'SIGKILL');
96
+ }
97
+ catch { /* best effort */ }
98
+ }
99
+ }
100
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/tools/shell.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,12 @@ export interface ToolParameter {
13
13
  type: 'string' | 'number' | 'boolean' | 'array' | 'object';
14
14
  description: string;
15
15
  required?: boolean;
16
+ /** For `array` params: element schema (OpenAI requires `items`). Defaults to string. */
17
+ items?: {
18
+ type: 'string' | 'number' | 'boolean' | 'object';
19
+ };
20
+ /** Allowed values (rendered into the OpenAI schema as `enum`). */
21
+ enum?: Array<string | number>;
16
22
  }
17
23
  export interface ToolResult {
18
24
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAE7D;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAKjC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,EAAE,UAM/C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAMlC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAMjC,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ,CAAC;YACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;SACpB,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAE,WAAW,EAAE,cAAc,EAAE,GAAG,UAAU,EAAE,CA4B1E;AAKD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,aAAa,EAAE,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyDzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wFAAwF;IACxF,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAA;KAAE,CAAC;IAC7D,kEAAkE;IAClE,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;AAE7D;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,mBAAmB,CAAC;CAC/B;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAKjC,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,EAAE,UAM/C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,UAMlC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,UAMjC,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ,CAAC;YACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;SACpB,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAE,WAAW,EAAE,cAAc,EAAE,GAAG,UAAU,EAAE,CAoC1E;AAKD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,aAAa,EAAE,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAyDzB"}
@@ -50,10 +50,18 @@ export function toOpenAITools(definitions) {
50
50
  const properties = {};
51
51
  const required = [];
52
52
  for (const param of def.tool.parameters) {
53
- properties[param.name] = {
53
+ const property = {
54
54
  type: param.type,
55
55
  description: param.description,
56
56
  };
57
+ // OpenAI/DeepSeek function schema requires `items` for array params.
58
+ if (param.type === 'array') {
59
+ property.items = param.items ?? { type: 'string' };
60
+ }
61
+ if (param.enum && param.enum.length > 0) {
62
+ property.enum = param.enum;
63
+ }
64
+ properties[param.name] = property;
57
65
  if (param.required) {
58
66
  required.push(param.name);
59
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/ui/app.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,uBAAuB,CAAA;AAGzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAsB3D,UAAU,QAAQ;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,cAAc,CAAC;CACzB;AAuDD,wBAAgB,GAAG,CAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,2CA2jCjD"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/ui/app.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,uBAAuB,CAAA;AAGzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAsB3D,UAAU,QAAQ;IAChB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,EAAE,cAAc,CAAC;CACzB;AAuDD,wBAAgB,GAAG,CAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,QAAQ,2CAiiCjD"}
package/dist/ui/app.js CHANGED
@@ -112,7 +112,6 @@ export function App({ config, options }) {
112
112
  const [compactProgress, setCompactProgress] = useState(0);
113
113
  const [totalTokens, setTotalTokens] = useState(0);
114
114
  const [estimatedCost, setEstimatedCost] = useState(0);
115
- const [pendingImage, setPendingImage] = useState(null);
116
115
  const [followUpCount, setFollowUpCount] = useState(0);
117
116
  const [themePicker, setThemePicker] = useState(null);
118
117
  const [modelPicker, setModelPicker] = useState(null);
@@ -370,14 +369,10 @@ export function App({ config, options }) {
370
369
  };
371
370
  proc.__agentAbortController = abortController;
372
371
  logEvent('agent run: softCancel registered');
373
- let userContent = input;
374
- if (pendingImage) {
375
- userContent = [
376
- { type: 'text', text: input },
377
- { type: 'image_url', image_url: { url: `data:${pendingImage.mimeType};base64,${pendingImage.base64}` } },
378
- ];
379
- setPendingImage(null);
380
- }
372
+ // Images are not sent to the model: the DeepSeek API has no vision and
373
+ // rejects image_url content blocks (a single one bricks the whole session
374
+ // with a 400). Image paste shows a notice instead (see onImagePaste).
375
+ const userContent = input;
381
376
  // Show local diagnostic notice for large prompts (not sent to model)
382
377
  const charCount = input.length;
383
378
  const lineCount = (input.match(/\r\n|\r|\n/g) || []).length + 1;
@@ -610,40 +605,20 @@ export function App({ config, options }) {
610
605
  }, [messages, isProcessing, setupStep, handleApiKeySubmit, handleSlashCommand, approvalMode, config, localApiKey]);
611
606
  useInput((_input, key) => {
612
607
  const step = setupStepRef.current;
613
- // Ctrl+C is handled here because Ink raw mode delivers it as input (not a
614
- // SIGINT signal) on all platforms when exitOnCtrlC is false. The SIGINT
615
- // handler in interactive.ts is only a fallback for non-TTY runs.
616
- // - While the agent runs: first Ctrl+C aborts/pauses, never exits.
617
- // - When idle or already paused: double Ctrl+C within 3s exits.
608
+ // Ctrl+C = exit only after a double confirmation. Ink raw mode delivers it
609
+ // as input (not a SIGINT) when exitOnCtrlC is false. We intentionally do NOT
610
+ // abort the running agent on Ctrl+C aborting the in-flight work was what
611
+ // dropped the process to the shell. To steer or stop the agent mid-run, type
612
+ // a follow-up message instead (it is queued into the active run).
613
+ // - First press: show a hint, do nothing else (agent keeps running).
614
+ // - Second press within 3s: exit cleanly.
618
615
  if (key.ctrl && _input === 'c') {
619
- logEvent('useInput Ctrl+C', { isProcessing, isPaused, hasAbort: !!abortControllerRef.current, step });
620
- if (isProcessing && abortControllerRef.current && !isPaused) {
621
- logEvent('useInput Ctrl+C -> abort+pause');
622
- abortControllerRef.current.abort();
623
- setIsPaused(true);
624
- setStatusText(i18n.t('paused'));
625
- if (pendingApprovalResolveRef.current) {
626
- pendingApprovalResolveRef.current(false);
627
- pendingApprovalResolveRef.current = null;
628
- }
629
- setPendingApproval(null);
630
- // Reset exit-arming: the interrupt is the user's action this press.
631
- ctrlCExitArmedRef.current = false;
632
- if (ctrlCExitTimerRef.current) {
633
- clearTimeout(ctrlCExitTimerRef.current);
634
- ctrlCExitTimerRef.current = null;
635
- }
636
- return;
637
- }
638
- // Idle or paused — second press within the window exits.
639
616
  if (ctrlCExitArmedRef.current) {
640
- logEvent('useInput Ctrl+C -> doublePress -> exit()');
641
617
  if (ctrlCExitTimerRef.current)
642
618
  clearTimeout(ctrlCExitTimerRef.current);
643
619
  exit();
644
620
  return;
645
621
  }
646
- logEvent('useInput Ctrl+C -> firstPress armed');
647
622
  ctrlCExitArmedRef.current = true;
648
623
  addServiceNotice(i18n.t('ctrlCHint'));
649
624
  if (ctrlCExitTimerRef.current)
@@ -941,7 +916,6 @@ export function App({ config, options }) {
941
916
  setMessages([]);
942
917
  setToolCalls([]);
943
918
  setPendingApproval(null);
944
- setPendingImage(null);
945
919
  setChatEpoch(e => e + 1); // remount Static so the scrollback resets
946
920
  liveToolMessageIndexRef.current = -1;
947
921
  setServiceNotice(null);
@@ -980,6 +954,6 @@ export function App({ config, options }) {
980
954
  ].map((label, i) => (_jsx(Box, { marginLeft: 1, children: _jsxs(Text, { color: approvalCursor === i ? colors.primary : colors.text, children: [approvalCursor === i ? '> ' : ' ', label] }) }, i))), _jsx(Box, { marginLeft: 1, marginTop: 1, children: _jsx(Text, { color: colors.textMuted, children: "\u2191\u2193 \u2014 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F Enter \u2014 \u0432\u044B\u0431\u0440\u0430\u0442\u044C Esc \u2014 \u043E\u0442\u043A\u043B\u043E\u043D\u0438\u0442\u044C" }) })] })] })), pendingClear && (_jsxs(Box, { flexDirection: 'column', marginLeft: 2, marginBottom: 1, borderStyle: 'round', borderColor: colors.warning, children: [_jsx(Box, { children: _jsx(Text, { bold: true, color: colors.warning, children: "\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0438\u0441\u0442\u043E\u0440\u0438\u044E \u0447\u0430\u0442\u0430?" }) }), _jsx(Box, { marginLeft: 1, children: _jsxs(Text, { color: colors.textMuted, children: [messages.length, " \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u0443\u0434\u0430\u043B\u0435\u043D\u043E. \u041E\u0442\u043C\u0435\u043D\u0443 \u043D\u0435\u043B\u044C\u0437\u044F."] }) }), _jsxs(Box, { flexDirection: 'column', marginTop: 1, children: [['[ok] Да, очистить', '[no] Отмена'].map((label, i) => (_jsx(Box, { marginLeft: 1, children: _jsxs(Text, { color: clearCursor === i ? colors.primary : colors.text, children: [clearCursor === i ? '> ' : ' ', label] }) }, i))), _jsx(Box, { marginLeft: 1, marginTop: 1, children: _jsx(Text, { color: colors.textMuted, children: "\u2191\u2193 \u2014 \u043D\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044F Enter \u2014 \u0432\u044B\u0431\u0440\u0430\u0442\u044C Esc \u2014 \u043E\u0442\u043C\u0435\u043D\u0430" }) })] })] }))] })), _jsx(InputBar, { onSubmit: handleSubmit, disabled: false,
981
955
  // disabled is no longer tied to isProcessing — input is allowed during processing.
982
956
  // blockInput still handles approval/clear dialogs.
983
- onClear: handleClear, onExit: handleExit, isMasked: setupStep === 'apikey', isSetupMode: setupStep !== 'done', blockInput: setupStep === 'done' && (pendingApproval !== null || pendingClear), emptyHint: emptyInputHint, onImagePaste: (base64, mimeType) => setPendingImage({ base64, mimeType }) }), _jsx(StatusBar, { mode: approvalMode, status: statusText, messageCount: messages.length, isProcessing: isProcessing, isPaused: isPaused, contextPercent: contextPercent, compactProgress: compactProgress, totalTokens: totalTokens, estimatedCost: estimatedCost, model: config.model, followUpCount: followUpCount })] }));
957
+ onClear: handleClear, onExit: handleExit, isMasked: setupStep === 'apikey', isSetupMode: setupStep !== 'done', blockInput: setupStep === 'done' && (pendingApproval !== null || pendingClear), emptyHint: emptyInputHint, onImagePaste: () => addServiceNotice('[image] Эта модель не поддерживает изображения — вставка пропущена. Для проверки UI используйте /browser-test или опишите задачу текстом.') }), _jsx(StatusBar, { mode: approvalMode, status: statusText, messageCount: messages.length, isProcessing: isProcessing, isPaused: isPaused, contextPercent: contextPercent, compactProgress: compactProgress, totalTokens: totalTokens, estimatedCost: estimatedCost, model: config.model, followUpCount: followUpCount })] }));
984
958
  }
985
959
  //# sourceMappingURL=app.js.map