jiva-core 0.3.23-dev.322ee7e → 0.3.41-dev.fe6fe48

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 (134) hide show
  1. package/README.md +232 -560
  2. package/dist/code/agent.d.ts +105 -0
  3. package/dist/code/agent.d.ts.map +1 -0
  4. package/dist/code/agent.js +837 -0
  5. package/dist/code/agent.js.map +1 -0
  6. package/dist/code/file-lock.d.ts +15 -0
  7. package/dist/code/file-lock.d.ts.map +1 -0
  8. package/dist/code/file-lock.js +36 -0
  9. package/dist/code/file-lock.js.map +1 -0
  10. package/dist/code/lsp/client.d.ts +30 -0
  11. package/dist/code/lsp/client.d.ts.map +1 -0
  12. package/dist/code/lsp/client.js +181 -0
  13. package/dist/code/lsp/client.js.map +1 -0
  14. package/dist/code/lsp/language.d.ts +12 -0
  15. package/dist/code/lsp/language.d.ts.map +1 -0
  16. package/dist/code/lsp/language.js +145 -0
  17. package/dist/code/lsp/language.js.map +1 -0
  18. package/dist/code/lsp/manager.d.ts +39 -0
  19. package/dist/code/lsp/manager.d.ts.map +1 -0
  20. package/dist/code/lsp/manager.js +108 -0
  21. package/dist/code/lsp/manager.js.map +1 -0
  22. package/dist/code/lsp/server.d.ts +15 -0
  23. package/dist/code/lsp/server.d.ts.map +1 -0
  24. package/dist/code/lsp/server.js +78 -0
  25. package/dist/code/lsp/server.js.map +1 -0
  26. package/dist/code/tools/bash.d.ts +3 -0
  27. package/dist/code/tools/bash.d.ts.map +1 -0
  28. package/dist/code/tools/bash.js +110 -0
  29. package/dist/code/tools/bash.js.map +1 -0
  30. package/dist/code/tools/edit.d.ts +11 -0
  31. package/dist/code/tools/edit.d.ts.map +1 -0
  32. package/dist/code/tools/edit.js +459 -0
  33. package/dist/code/tools/edit.js.map +1 -0
  34. package/dist/code/tools/glob.d.ts +3 -0
  35. package/dist/code/tools/glob.d.ts.map +1 -0
  36. package/dist/code/tools/glob.js +62 -0
  37. package/dist/code/tools/glob.js.map +1 -0
  38. package/dist/code/tools/grep.d.ts +3 -0
  39. package/dist/code/tools/grep.d.ts.map +1 -0
  40. package/dist/code/tools/grep.js +147 -0
  41. package/dist/code/tools/grep.js.map +1 -0
  42. package/dist/code/tools/index.d.ts +31 -0
  43. package/dist/code/tools/index.d.ts.map +1 -0
  44. package/dist/code/tools/index.js +9 -0
  45. package/dist/code/tools/index.js.map +1 -0
  46. package/dist/code/tools/read.d.ts +3 -0
  47. package/dist/code/tools/read.d.ts.map +1 -0
  48. package/dist/code/tools/read.js +120 -0
  49. package/dist/code/tools/read.js.map +1 -0
  50. package/dist/code/tools/spawn.d.ts +3 -0
  51. package/dist/code/tools/spawn.d.ts.map +1 -0
  52. package/dist/code/tools/spawn.js +49 -0
  53. package/dist/code/tools/spawn.js.map +1 -0
  54. package/dist/code/tools/write.d.ts +3 -0
  55. package/dist/code/tools/write.d.ts.map +1 -0
  56. package/dist/code/tools/write.js +82 -0
  57. package/dist/code/tools/write.js.map +1 -0
  58. package/dist/core/agent-interface.d.ts +54 -0
  59. package/dist/core/agent-interface.d.ts.map +1 -0
  60. package/dist/core/agent-interface.js +8 -0
  61. package/dist/core/agent-interface.js.map +1 -0
  62. package/dist/core/agent-spawner.d.ts.map +1 -1
  63. package/dist/core/agent-spawner.js +3 -0
  64. package/dist/core/agent-spawner.js.map +1 -1
  65. package/dist/core/client-agent.d.ts +22 -2
  66. package/dist/core/client-agent.d.ts.map +1 -1
  67. package/dist/core/client-agent.js +145 -26
  68. package/dist/core/client-agent.js.map +1 -1
  69. package/dist/core/config.d.ts +144 -17
  70. package/dist/core/config.d.ts.map +1 -1
  71. package/dist/core/config.js +25 -1
  72. package/dist/core/config.js.map +1 -1
  73. package/dist/core/conversation-manager.d.ts +4 -1
  74. package/dist/core/conversation-manager.d.ts.map +1 -1
  75. package/dist/core/conversation-manager.js +47 -17
  76. package/dist/core/conversation-manager.js.map +1 -1
  77. package/dist/core/dual-agent.d.ts +18 -5
  78. package/dist/core/dual-agent.d.ts.map +1 -1
  79. package/dist/core/dual-agent.js +152 -59
  80. package/dist/core/dual-agent.js.map +1 -1
  81. package/dist/core/manager-agent.d.ts +38 -2
  82. package/dist/core/manager-agent.d.ts.map +1 -1
  83. package/dist/core/manager-agent.js +144 -23
  84. package/dist/core/manager-agent.js.map +1 -1
  85. package/dist/core/types/agent-context.d.ts +30 -0
  86. package/dist/core/types/agent-context.d.ts.map +1 -0
  87. package/dist/core/types/agent-context.js +8 -0
  88. package/dist/core/types/agent-context.js.map +1 -0
  89. package/dist/core/types/completion-signal.d.ts +17 -0
  90. package/dist/core/types/completion-signal.d.ts.map +1 -0
  91. package/dist/core/types/completion-signal.js +8 -0
  92. package/dist/core/types/completion-signal.js.map +1 -0
  93. package/dist/core/utils/serialize-agent-context.d.ts +23 -0
  94. package/dist/core/utils/serialize-agent-context.d.ts.map +1 -0
  95. package/dist/core/utils/serialize-agent-context.js +75 -0
  96. package/dist/core/utils/serialize-agent-context.js.map +1 -0
  97. package/dist/core/worker-agent.d.ts +14 -3
  98. package/dist/core/worker-agent.d.ts.map +1 -1
  99. package/dist/core/worker-agent.js +261 -68
  100. package/dist/core/worker-agent.js.map +1 -1
  101. package/dist/index.d.ts +6 -0
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +3 -0
  104. package/dist/index.js.map +1 -1
  105. package/dist/interfaces/cli/index.js +146 -25
  106. package/dist/interfaces/cli/index.js.map +1 -1
  107. package/dist/interfaces/cli/repl.d.ts +8 -2
  108. package/dist/interfaces/cli/repl.d.ts.map +1 -1
  109. package/dist/interfaces/cli/repl.js +39 -3
  110. package/dist/interfaces/cli/repl.js.map +1 -1
  111. package/dist/interfaces/cli/setup-wizard.d.ts.map +1 -1
  112. package/dist/interfaces/cli/setup-wizard.js +92 -0
  113. package/dist/interfaces/cli/setup-wizard.js.map +1 -1
  114. package/dist/interfaces/http/routes/chat.js +2 -2
  115. package/dist/interfaces/http/routes/chat.js.map +1 -1
  116. package/dist/interfaces/http/session-manager.d.ts +7 -4
  117. package/dist/interfaces/http/session-manager.d.ts.map +1 -1
  118. package/dist/interfaces/http/session-manager.js +56 -15
  119. package/dist/interfaces/http/session-manager.js.map +1 -1
  120. package/dist/models/base.d.ts +16 -1
  121. package/dist/models/base.d.ts.map +1 -1
  122. package/dist/models/harmony.d.ts +7 -1
  123. package/dist/models/harmony.d.ts.map +1 -1
  124. package/dist/models/harmony.js +21 -3
  125. package/dist/models/harmony.js.map +1 -1
  126. package/dist/models/krutrim.d.ts +31 -1
  127. package/dist/models/krutrim.d.ts.map +1 -1
  128. package/dist/models/krutrim.js +55 -11
  129. package/dist/models/krutrim.js.map +1 -1
  130. package/dist/models/orchestrator.d.ts +24 -0
  131. package/dist/models/orchestrator.d.ts.map +1 -1
  132. package/dist/models/orchestrator.js +40 -6
  133. package/dist/models/orchestrator.js.map +1 -1
  134. package/package.json +8 -5
@@ -0,0 +1,108 @@
1
+ /**
2
+ * LspManager — manages language server lifecycle.
3
+ * Lazily starts servers on first use, shares one server per language.
4
+ */
5
+ import path from 'path';
6
+ import { getLanguageId, getServerIdForLanguage } from './language.js';
7
+ import { spawnLspServer } from './server.js';
8
+ import { createLspClient, prettyDiagnostic } from './client.js';
9
+ export class LspManager {
10
+ clients = new Map(); // serverId → client
11
+ starting = new Map(); // prevent double-start
12
+ enabled;
13
+ root;
14
+ constructor(options) {
15
+ this.root = options.root;
16
+ this.enabled = options.enabled ?? true;
17
+ }
18
+ /**
19
+ * Notify the LSP server about a file change (open/change).
20
+ * Starts the server lazily if needed.
21
+ * Waits for diagnostics to arrive (up to 3 seconds).
22
+ */
23
+ async touchFile(filePath) {
24
+ if (!this.enabled)
25
+ return;
26
+ const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(this.root, filePath);
27
+ const languageId = getLanguageId(absPath);
28
+ const serverId = getServerIdForLanguage(languageId);
29
+ if (!serverId)
30
+ return; // No LSP for this language
31
+ const client = await this.getOrStartClient(serverId);
32
+ if (!client)
33
+ return;
34
+ await client.notify.open(absPath);
35
+ await client.waitForDiagnostics(absPath);
36
+ }
37
+ /**
38
+ * Get merged diagnostics from all running clients.
39
+ * Returns an object mapping normalized file paths to diagnostic arrays.
40
+ */
41
+ getDiagnostics() {
42
+ const result = {};
43
+ for (const client of this.clients.values()) {
44
+ for (const [filePath, diags] of client.diagnostics) {
45
+ if (!result[filePath]) {
46
+ result[filePath] = [];
47
+ }
48
+ result[filePath].push(...diags);
49
+ }
50
+ }
51
+ return result;
52
+ }
53
+ /**
54
+ * Get formatted error diagnostics for a specific file.
55
+ * Returns empty string if no errors.
56
+ */
57
+ getErrorsForFile(filePath) {
58
+ const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(this.root, filePath);
59
+ const normalized = absPath.replace(/\\/g, '/');
60
+ const all = this.getDiagnostics();
61
+ const diags = all[normalized] ?? [];
62
+ const errors = diags.filter((d) => d.severity === 1 || d.severity === undefined);
63
+ if (errors.length === 0)
64
+ return '';
65
+ const MAX = 20;
66
+ const limited = errors.slice(0, MAX);
67
+ const suffix = errors.length > MAX ? `\n ... and ${errors.length - MAX} more` : '';
68
+ return limited.map((d) => prettyDiagnostic(d, absPath)).join('\n') + suffix;
69
+ }
70
+ /**
71
+ * Shut down all running language servers.
72
+ */
73
+ async shutdown() {
74
+ const shutdowns = Array.from(this.clients.values()).map((c) => c.shutdown().catch(() => { }));
75
+ await Promise.all(shutdowns);
76
+ this.clients.clear();
77
+ this.starting.clear();
78
+ }
79
+ // ─── Private ──────────────────────────────────────────────────────────────
80
+ async getOrStartClient(serverId) {
81
+ const existing = this.clients.get(serverId);
82
+ if (existing)
83
+ return existing;
84
+ // Prevent concurrent starts for the same server
85
+ let starting = this.starting.get(serverId);
86
+ if (!starting) {
87
+ starting = this.startClient(serverId);
88
+ this.starting.set(serverId, starting);
89
+ }
90
+ const client = await starting;
91
+ this.starting.delete(serverId);
92
+ return client;
93
+ }
94
+ async startClient(serverId) {
95
+ try {
96
+ const handle = spawnLspServer(serverId);
97
+ if (!handle)
98
+ return null; // Server not installed
99
+ const client = await createLspClient({ serverId, handle, root: this.root });
100
+ this.clients.set(serverId, client);
101
+ return client;
102
+ }
103
+ catch {
104
+ return null; // Failed to start — silently skip LSP for this language
105
+ }
106
+ }
107
+ }
108
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/code/lsp/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ChildProcessWithoutNullStreams } from 'child_process';
2
+ export interface LspServerHandle {
3
+ process: ChildProcessWithoutNullStreams;
4
+ initialization?: Record<string, unknown>;
5
+ }
6
+ /**
7
+ * Attempt to spawn a language server for the given server ID.
8
+ * Returns the handle if successful, undefined if the server is not installed.
9
+ */
10
+ export declare function spawnLspServer(serverId: string): LspServerHandle | undefined;
11
+ /**
12
+ * Check which language servers are available on this system.
13
+ */
14
+ export declare function getAvailableServers(): string[];
15
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/code/lsp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,8BAA8B,EAAE,MAAM,eAAe,CAAC;AAG3E,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,8BAA8B,CAAC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC1C;AA6CD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAyB5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAK9C"}
@@ -0,0 +1,78 @@
1
+ import { spawn } from 'child_process';
2
+ import { execSync } from 'child_process';
3
+ /**
4
+ * Find the path of an executable in PATH.
5
+ * Returns undefined if not found.
6
+ */
7
+ function which(cmd) {
8
+ try {
9
+ const result = execSync(`which ${cmd} 2>/dev/null`, { encoding: 'utf-8' }).trim();
10
+ return result || undefined;
11
+ }
12
+ catch {
13
+ return undefined;
14
+ }
15
+ }
16
+ /**
17
+ * Per-server configurations: how to detect and launch each language server.
18
+ */
19
+ const SERVER_CONFIGS = {
20
+ typescript: {
21
+ detect: () => which('typescript-language-server'),
22
+ args: () => ['--stdio'],
23
+ },
24
+ python: {
25
+ detect: () => which('pylsp') ?? which('pyright-langserver') ?? which('pyls'),
26
+ args: (binary) => binary.endsWith('pyright-langserver') ? ['--stdio'] : [],
27
+ },
28
+ go: {
29
+ detect: () => which('gopls'),
30
+ args: () => ['serve'],
31
+ },
32
+ rust: {
33
+ detect: () => which('rust-analyzer'),
34
+ args: () => [],
35
+ },
36
+ ruby: {
37
+ detect: () => which('solargraph'),
38
+ args: () => ['stdio'],
39
+ },
40
+ };
41
+ /**
42
+ * Attempt to spawn a language server for the given server ID.
43
+ * Returns the handle if successful, undefined if the server is not installed.
44
+ */
45
+ export function spawnLspServer(serverId) {
46
+ const config = SERVER_CONFIGS[serverId];
47
+ if (!config)
48
+ return undefined;
49
+ const binary = config.detect();
50
+ if (!binary)
51
+ return undefined;
52
+ const args = config.args(binary);
53
+ try {
54
+ const proc = spawn(binary, args, {
55
+ stdio: ['pipe', 'pipe', 'pipe'],
56
+ env: { ...process.env },
57
+ });
58
+ // Swallow stderr to avoid polluting Jiva's output
59
+ proc.stderr.resume();
60
+ return {
61
+ process: proc,
62
+ initialization: config.initialization,
63
+ };
64
+ }
65
+ catch {
66
+ return undefined;
67
+ }
68
+ }
69
+ /**
70
+ * Check which language servers are available on this system.
71
+ */
72
+ export function getAvailableServers() {
73
+ return Object.keys(SERVER_CONFIGS).filter((id) => {
74
+ const config = SERVER_CONFIGS[id];
75
+ return config.detect() !== undefined;
76
+ });
77
+ }
78
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/code/lsp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAuC,MAAM,eAAe,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAOzC;;;GAGG;AACH,SAAS,KAAK,CAAC,GAAW;IACxB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,GAAG,cAAc,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClF,OAAO,MAAM,IAAI,SAAS,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,cAAc,GAIf;IACH,UAAU,EAAE;QACV,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,4BAA4B,CAAC;QACjD,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC;KACxB;IACD,MAAM,EAAE;QACN,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC;QAC5E,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;KAC3E;IACD,EAAE,EAAE;QACF,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5B,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC;KACtB;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC;QACpC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE;KACf;IACD,IAAI,EAAE;QACJ,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;QACjC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC;KACtB;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;IAC/B,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAE9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;YAC/B,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QAEH,kDAAkD;QAClD,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAErB,OAAO;YACL,OAAO,EAAE,IAAsC;YAC/C,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC,MAAM,EAAE,KAAK,SAAS,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ICodeTool } from './index.js';
2
+ export declare const BashTool: ICodeTool;
3
+ //# sourceMappingURL=bash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.d.ts","sourceRoot":"","sources":["../../../src/code/tools/bash.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AAS7D,eAAO,MAAM,QAAQ,EAAE,SAwEtB,CAAC"}
@@ -0,0 +1,110 @@
1
+ import { exec } from 'child_process';
2
+ const DEFAULT_TIMEOUT = 30_000; // 30s
3
+ const MAX_TIMEOUT = 300_000; // 5 min
4
+ // Output limits — same as read_file to keep model context manageable
5
+ const MAX_OUTPUT_LINES = 2000;
6
+ const MAX_OUTPUT_BYTES = 50 * 1024; // 50KB
7
+ export const BashTool = {
8
+ name: 'bash',
9
+ description: `Execute a shell command in the workspace directory.
10
+
11
+ REQUIRED parameter: "command" (string) — the shell command to run.
12
+ Example: {"command": "git status"}
13
+ Example: {"command": "npm test", "timeout_ms": 60000}
14
+
15
+ Do NOT pass "path", "limit", "offset", or "query" to this tool — use read_file or grep for those.
16
+
17
+ Use for:
18
+ - Running build commands (npm run build, go build, cargo build)
19
+ - Running tests (npm test, pytest, go test ./...)
20
+ - Running linters (eslint, pylint, ruff)
21
+ - Git operations (git status, git diff --staged)
22
+ - Installing dependencies
23
+
24
+ Returns: stdout + stderr combined, plus exit code.
25
+ Commands timeout after ${DEFAULT_TIMEOUT / 1000}s by default (configurable up to ${MAX_TIMEOUT / 1000}s).
26
+ Output is truncated at ${MAX_OUTPUT_LINES} lines / ${MAX_OUTPUT_BYTES / 1024}KB.`,
27
+ parameters: {
28
+ type: 'object',
29
+ properties: {
30
+ command: {
31
+ type: 'string',
32
+ description: 'Shell command to execute (e.g. "git diff --staged", "npm test")',
33
+ },
34
+ timeout_ms: {
35
+ type: 'number',
36
+ description: `Timeout in milliseconds (default: ${DEFAULT_TIMEOUT}, max: ${MAX_TIMEOUT})`,
37
+ },
38
+ },
39
+ required: ['command'],
40
+ },
41
+ async execute(args, ctx) {
42
+ const command = args.command;
43
+ const timeout = Math.min(args.timeout_ms || DEFAULT_TIMEOUT, MAX_TIMEOUT);
44
+ return new Promise((resolve) => {
45
+ const proc = exec(command, {
46
+ cwd: ctx.workspaceDir,
47
+ timeout,
48
+ maxBuffer: 10 * 1024 * 1024, // 10MB raw buffer; we truncate before returning
49
+ env: { ...process.env },
50
+ }, (error, stdout, stderr) => {
51
+ const output = [];
52
+ if (stdout.trim())
53
+ output.push(stdout.trim());
54
+ if (stderr.trim())
55
+ output.push(`[stderr]\n${stderr.trim()}`);
56
+ if (error) {
57
+ if (error.killed) {
58
+ output.push(`\n[Command timed out after ${timeout / 1000}s]`);
59
+ }
60
+ else if (error.code !== undefined && error.code !== 0) {
61
+ output.push(`\n[Exit code: ${error.code}]`);
62
+ }
63
+ }
64
+ const raw = output.join('\n') || '(no output)';
65
+ resolve(truncateOutput(raw));
66
+ });
67
+ // Abort signal support
68
+ if (ctx.signal) {
69
+ ctx.signal.addEventListener('abort', () => {
70
+ try {
71
+ proc.kill();
72
+ }
73
+ catch { /* ignore */ }
74
+ }, { once: true });
75
+ }
76
+ });
77
+ },
78
+ };
79
+ /**
80
+ * Truncate command output to MAX_OUTPUT_LINES lines and MAX_OUTPUT_BYTES bytes.
81
+ * Mirrors the limits in read_file so the model context stays manageable.
82
+ * Truncation note is appended so the model knows output was cut.
83
+ */
84
+ function truncateOutput(text) {
85
+ // Byte limit first — apply to raw text
86
+ let result = text;
87
+ let bytesTruncated = false;
88
+ if (Buffer.byteLength(result, 'utf-8') > MAX_OUTPUT_BYTES) {
89
+ // Slice to byte limit, then back up to the last complete line
90
+ const buf = Buffer.from(result, 'utf-8').subarray(0, MAX_OUTPUT_BYTES);
91
+ result = buf.toString('utf-8');
92
+ // Trim to last newline to avoid split multibyte char
93
+ const lastNl = result.lastIndexOf('\n');
94
+ if (lastNl > 0)
95
+ result = result.substring(0, lastNl);
96
+ bytesTruncated = true;
97
+ }
98
+ // Line limit
99
+ const lines = result.split('\n');
100
+ if (lines.length > MAX_OUTPUT_LINES) {
101
+ const kept = lines.slice(0, MAX_OUTPUT_LINES);
102
+ const dropped = lines.length - MAX_OUTPUT_LINES;
103
+ result = kept.join('\n') + `\n\n[Output truncated: ${dropped} more line(s) not shown. Narrow the command or redirect output to a file.]`;
104
+ }
105
+ else if (bytesTruncated) {
106
+ result += `\n\n[Output truncated at ${MAX_OUTPUT_BYTES / 1024}KB. Redirect output to a file to capture everything.]`;
107
+ }
108
+ return result;
109
+ }
110
+ //# sourceMappingURL=bash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/code/tools/bash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Edit tool — multi-strategy text replacement with LSP diagnostics.
3
+ *
4
+ * The replacement strategies are ported from opencode (https://github.com/sst/opencode),
5
+ * which in turn sourced them from cline and gemini-cli.
6
+ */
7
+ import type { ICodeTool } from './index.js';
8
+ export declare const EditFileTool: ICodeTool;
9
+ /** Apply the first matching replacement strategy. */
10
+ export declare function replace(content: string, oldString: string, newString: string, replaceAll?: boolean): string;
11
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../../src/code/tools/edit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,YAAY,CAAC;AAI7D,eAAO,MAAM,YAAY,EAAE,SAwI1B,CAAC;AA2OF,qDAAqD;AACrD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,MAAM,CAiCzG"}