eucode-cli 0.1.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 (157) hide show
  1. package/dist/agentFinish.d.ts +10 -0
  2. package/dist/agentFinish.d.ts.map +1 -0
  3. package/dist/agentFinish.js +9 -0
  4. package/dist/agentFinish.js.map +1 -0
  5. package/dist/agentHost.d.ts +29 -0
  6. package/dist/agentHost.d.ts.map +1 -0
  7. package/dist/agentHost.js +94 -0
  8. package/dist/agentHost.js.map +1 -0
  9. package/dist/backgroundJobs.d.ts +12 -0
  10. package/dist/backgroundJobs.d.ts.map +1 -0
  11. package/dist/backgroundJobs.js +66 -0
  12. package/dist/backgroundJobs.js.map +1 -0
  13. package/dist/capabilities.d.ts +9 -0
  14. package/dist/capabilities.d.ts.map +1 -0
  15. package/dist/capabilities.js +46 -0
  16. package/dist/capabilities.js.map +1 -0
  17. package/dist/cliErrors.d.ts +3 -0
  18. package/dist/cliErrors.d.ts.map +1 -0
  19. package/dist/cliErrors.js +16 -0
  20. package/dist/cliErrors.js.map +1 -0
  21. package/dist/cloud.d.ts +17 -0
  22. package/dist/cloud.d.ts.map +1 -0
  23. package/dist/cloud.js +78 -0
  24. package/dist/cloud.js.map +1 -0
  25. package/dist/codeReview.d.ts +8 -0
  26. package/dist/codeReview.d.ts.map +1 -0
  27. package/dist/codeReview.js +64 -0
  28. package/dist/codeReview.js.map +1 -0
  29. package/dist/commands/agent.d.ts +7 -0
  30. package/dist/commands/agent.d.ts.map +1 -0
  31. package/dist/commands/agent.js +86 -0
  32. package/dist/commands/agent.js.map +1 -0
  33. package/dist/commands/capabilities.d.ts +2 -0
  34. package/dist/commands/capabilities.d.ts.map +1 -0
  35. package/dist/commands/capabilities.js +22 -0
  36. package/dist/commands/capabilities.js.map +1 -0
  37. package/dist/commands/chat.d.ts +7 -0
  38. package/dist/commands/chat.d.ts.map +1 -0
  39. package/dist/commands/chat.js +426 -0
  40. package/dist/commands/chat.js.map +1 -0
  41. package/dist/commands/db.d.ts +6 -0
  42. package/dist/commands/db.d.ts.map +1 -0
  43. package/dist/commands/db.js +17 -0
  44. package/dist/commands/db.js.map +1 -0
  45. package/dist/commands/docker.d.ts +5 -0
  46. package/dist/commands/docker.d.ts.map +1 -0
  47. package/dist/commands/docker.js +35 -0
  48. package/dist/commands/docker.js.map +1 -0
  49. package/dist/commands/init.d.ts +3 -0
  50. package/dist/commands/init.d.ts.map +1 -0
  51. package/dist/commands/init.js +34 -0
  52. package/dist/commands/init.js.map +1 -0
  53. package/dist/commands/login.d.ts +5 -0
  54. package/dist/commands/login.d.ts.map +1 -0
  55. package/dist/commands/login.js +32 -0
  56. package/dist/commands/login.js.map +1 -0
  57. package/dist/commands/mcp.d.ts +3 -0
  58. package/dist/commands/mcp.d.ts.map +1 -0
  59. package/dist/commands/mcp.js +65 -0
  60. package/dist/commands/mcp.js.map +1 -0
  61. package/dist/commands/models.d.ts +2 -0
  62. package/dist/commands/models.d.ts.map +1 -0
  63. package/dist/commands/models.js +30 -0
  64. package/dist/commands/models.js.map +1 -0
  65. package/dist/commands/new.d.ts +5 -0
  66. package/dist/commands/new.d.ts.map +1 -0
  67. package/dist/commands/new.js +31 -0
  68. package/dist/commands/new.js.map +1 -0
  69. package/dist/commands/plan.d.ts +6 -0
  70. package/dist/commands/plan.d.ts.map +1 -0
  71. package/dist/commands/plan.js +82 -0
  72. package/dist/commands/plan.js.map +1 -0
  73. package/dist/commands/pr.d.ts +6 -0
  74. package/dist/commands/pr.d.ts.map +1 -0
  75. package/dist/commands/pr.js +29 -0
  76. package/dist/commands/pr.js.map +1 -0
  77. package/dist/commands/test.d.ts +5 -0
  78. package/dist/commands/test.d.ts.map +1 -0
  79. package/dist/commands/test.js +49 -0
  80. package/dist/commands/test.js.map +1 -0
  81. package/dist/config.d.ts +18 -0
  82. package/dist/config.d.ts.map +1 -0
  83. package/dist/config.js +75 -0
  84. package/dist/config.js.map +1 -0
  85. package/dist/createProject.d.ts +5 -0
  86. package/dist/createProject.d.ts.map +1 -0
  87. package/dist/createProject.js +53 -0
  88. package/dist/createProject.js.map +1 -0
  89. package/dist/delegateAgent.d.ts +6 -0
  90. package/dist/delegateAgent.d.ts.map +1 -0
  91. package/dist/delegateAgent.js +34 -0
  92. package/dist/delegateAgent.js.map +1 -0
  93. package/dist/fileContext.d.ts +4 -0
  94. package/dist/fileContext.d.ts.map +1 -0
  95. package/dist/fileContext.js +98 -0
  96. package/dist/fileContext.js.map +1 -0
  97. package/dist/index.d.ts +3 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +207 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/intensity.d.ts +13 -0
  102. package/dist/intensity.d.ts.map +1 -0
  103. package/dist/intensity.js +33 -0
  104. package/dist/intensity.js.map +1 -0
  105. package/dist/mcpConfig.d.ts +3 -0
  106. package/dist/mcpConfig.d.ts.map +1 -0
  107. package/dist/mcpConfig.js +29 -0
  108. package/dist/mcpConfig.js.map +1 -0
  109. package/dist/memory.d.ts +3 -0
  110. package/dist/memory.d.ts.map +1 -0
  111. package/dist/memory.js +16 -0
  112. package/dist/memory.js.map +1 -0
  113. package/dist/modelCatalog.d.ts +9 -0
  114. package/dist/modelCatalog.d.ts.map +1 -0
  115. package/dist/modelCatalog.js +45 -0
  116. package/dist/modelCatalog.js.map +1 -0
  117. package/dist/nodeToolHost.d.ts +4 -0
  118. package/dist/nodeToolHost.d.ts.map +1 -0
  119. package/dist/nodeToolHost.js +320 -0
  120. package/dist/nodeToolHost.js.map +1 -0
  121. package/dist/projectRules.d.ts +2 -0
  122. package/dist/projectRules.d.ts.map +1 -0
  123. package/dist/projectRules.js +57 -0
  124. package/dist/projectRules.js.map +1 -0
  125. package/dist/replOutput.d.ts +21 -0
  126. package/dist/replOutput.d.ts.map +1 -0
  127. package/dist/replOutput.js +84 -0
  128. package/dist/replOutput.js.map +1 -0
  129. package/dist/sqliteQuery.d.ts +3 -0
  130. package/dist/sqliteQuery.d.ts.map +1 -0
  131. package/dist/sqliteQuery.js +40 -0
  132. package/dist/sqliteQuery.js.map +1 -0
  133. package/dist/synthesizeAgentReply.d.ts +32 -0
  134. package/dist/synthesizeAgentReply.d.ts.map +1 -0
  135. package/dist/synthesizeAgentReply.js +173 -0
  136. package/dist/synthesizeAgentReply.js.map +1 -0
  137. package/dist/synthesizeAgentReply.test.d.ts +2 -0
  138. package/dist/synthesizeAgentReply.test.d.ts.map +1 -0
  139. package/dist/synthesizeAgentReply.test.js +35 -0
  140. package/dist/synthesizeAgentReply.test.js.map +1 -0
  141. package/dist/terminalOutput.d.ts +4 -0
  142. package/dist/terminalOutput.d.ts.map +1 -0
  143. package/dist/terminalOutput.js +34 -0
  144. package/dist/terminalOutput.js.map +1 -0
  145. package/dist/ui.d.ts +17 -0
  146. package/dist/ui.d.ts.map +1 -0
  147. package/dist/ui.js +121 -0
  148. package/dist/ui.js.map +1 -0
  149. package/dist/webFetch.d.ts +2 -0
  150. package/dist/webFetch.d.ts.map +1 -0
  151. package/dist/webFetch.js +29 -0
  152. package/dist/webFetch.js.map +1 -0
  153. package/dist/workspace.d.ts +2 -0
  154. package/dist/workspace.d.ts.map +1 -0
  155. package/dist/workspace.js +30 -0
  156. package/dist/workspace.js.map +1 -0
  157. package/package.json +49 -0
@@ -0,0 +1,45 @@
1
+ import { findSelectableModel, getModelById, getSelectableModelGroups, normalizeUserPlan, } from "@eucode/shared";
2
+ import { fetchModels } from "./cloud.js";
3
+ import { loadCliConfigFile, resolveApiToken, resolveApiUrl, } from "./config.js";
4
+ export async function loadSelectableModelGroups() {
5
+ const file = await loadCliConfigFile();
6
+ const apiUrl = resolveApiUrl(file);
7
+ const token = resolveApiToken(file);
8
+ const { models, plan, hint } = await fetchModels(apiUrl, token);
9
+ const cloudModels = models;
10
+ const normalizedPlan = normalizeUserPlan(plan ?? "free");
11
+ const groups = getSelectableModelGroups({
12
+ mode: "cloud-subscription",
13
+ plan: normalizedPlan,
14
+ cloudModels,
15
+ hideOllama: true,
16
+ });
17
+ return { groups, plan: normalizedPlan, hint };
18
+ }
19
+ export function modelDisplayName(modelId, groups) {
20
+ if (groups) {
21
+ const found = findSelectableModel(modelId, groups);
22
+ if (found)
23
+ return found.displayName;
24
+ }
25
+ return getModelById(modelId)?.displayName ?? modelId;
26
+ }
27
+ export function resolveModelFromInput(input, groups) {
28
+ const trimmed = input.trim();
29
+ if (!trimmed)
30
+ return undefined;
31
+ const byId = findSelectableModel(trimmed, groups);
32
+ if (byId)
33
+ return byId.id;
34
+ const lower = trimmed.toLowerCase();
35
+ for (const group of groups) {
36
+ for (const m of group.models) {
37
+ if (m.id.toLowerCase() === lower ||
38
+ m.displayName.toLowerCase() === lower) {
39
+ return m.id;
40
+ }
41
+ }
42
+ }
43
+ return trimmed;
44
+ }
45
+ //# sourceMappingURL=modelCatalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modelCatalog.js","sourceRoot":"","sources":["../src/modelCatalog.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,MAAM,CAAC,KAAK,UAAU,yBAAyB;IAK7C,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAChE,MAAM,WAAW,GAAG,MAAuB,CAAC;IAC5C,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACtC,IAAI,EAAE,oBAAoB;QAC1B,IAAI,EAAE,cAAc;QACpB,WAAW;QACX,UAAU,EAAE,IAAI;KACjB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,MAA+B;IAE/B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACnD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,WAAW,CAAC;IACtC,CAAC;IACD,OAAO,YAAY,CAAC,OAAO,CAAC,EAAE,WAAW,IAAI,OAAO,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAa,EACb,MAA8B;IAE9B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAClD,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,IACE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK;gBAC5B,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,KAAK,KAAK,EACrC,CAAC;gBACD,OAAO,CAAC,CAAC,EAAE,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ToolExecutor } from "@eucode/agent";
2
+ import type { EucodeConfig } from "@eucode/shared";
3
+ export declare function createNodeToolHost(cwd: string, config: EucodeConfig): ToolExecutor;
4
+ //# sourceMappingURL=nodeToolHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeToolHost.d.ts","sourceRoot":"","sources":["../src/nodeToolHost.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA+CnD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,YAAY,GACnB,YAAY,CA+Od"}
@@ -0,0 +1,320 @@
1
+ import { spawn } from "node:child_process";
2
+ import { readdir, readFile, writeFile, mkdir, unlink, rename } from "node:fs/promises";
3
+ import { join, relative, resolve } from "node:path";
4
+ import { applyDiffToFile, buildGitShellCommand, checkShellCommand, formatGitHint, validateFileToolPath, } from "@eucode/agent";
5
+ import { executeCreateProjectTool } from "./createProject.js";
6
+ import { querySqliteFile } from "./sqliteQuery.js";
7
+ import { sanitizeTerminalCommand, truncateTerminalOutput, } from "./terminalOutput.js";
8
+ import { fetchUrlAsText } from "./webFetch.js";
9
+ function safePath(root, rel) {
10
+ const abs = resolve(root, rel.replace(/^\.\//, ""));
11
+ const relPath = relative(root, abs);
12
+ if (relPath.startsWith("..") || relPath.includes(".."))
13
+ return null;
14
+ return abs;
15
+ }
16
+ function terminalAllowed(config) {
17
+ if (process.env.EUCODE_ALLOW_TERMINAL === "0")
18
+ return false;
19
+ return config.agent.allowTerminal;
20
+ }
21
+ async function runShellCommand(command, cwd, hooks) {
22
+ return new Promise((resolvePromise) => {
23
+ let combined = "";
24
+ const child = spawn(command, { shell: true, cwd, env: process.env });
25
+ child.stdout.on("data", (chunk) => {
26
+ const text = chunk.toString();
27
+ combined += text;
28
+ hooks?.onOutput?.(text);
29
+ });
30
+ child.stderr.on("data", (chunk) => {
31
+ const text = chunk.toString();
32
+ combined += text;
33
+ hooks?.onOutput?.(text);
34
+ });
35
+ child.on("error", (err) => resolvePromise(`Errore: ${err.message}`));
36
+ child.on("close", (code) => {
37
+ const raw = `exit ${code ?? 0}\n${combined}`.trim();
38
+ resolvePromise(truncateTerminalOutput(raw));
39
+ });
40
+ });
41
+ }
42
+ export function createNodeToolHost(cwd, config) {
43
+ return {
44
+ async execute(name, args, hooks) {
45
+ switch (name) {
46
+ case "read":
47
+ case "read_file": {
48
+ const pathErr = validateFileToolPath(args.path);
49
+ if (pathErr)
50
+ return pathErr;
51
+ const p = safePath(cwd, String(args.path ?? ""));
52
+ if (!p)
53
+ return "Percorso non valido.";
54
+ try {
55
+ return await readFile(p, "utf8");
56
+ }
57
+ catch (e) {
58
+ return `Errore lettura: ${e instanceof Error ? e.message : String(e)}`;
59
+ }
60
+ }
61
+ case "glob":
62
+ case "list_files": {
63
+ const glob = String(args.glob ?? "");
64
+ const files = [];
65
+ async function walk(dir, prefix = "") {
66
+ const entries = await readdir(dir, { withFileTypes: true });
67
+ for (const ent of entries) {
68
+ if (ent.name.startsWith(".") || ent.name === "node_modules")
69
+ continue;
70
+ const rel = prefix ? `${prefix}/${ent.name}` : ent.name;
71
+ if (ent.isDirectory())
72
+ await walk(join(dir, ent.name), rel);
73
+ else if (!glob || rel.includes(glob))
74
+ files.push(rel);
75
+ }
76
+ }
77
+ try {
78
+ await walk(cwd);
79
+ return files.length ? files.slice(0, 500).join("\n") : "Nessun file.";
80
+ }
81
+ catch (e) {
82
+ return `Errore list_files: ${e instanceof Error ? e.message : String(e)}`;
83
+ }
84
+ }
85
+ case "write":
86
+ case "write_file": {
87
+ const pathErr = validateFileToolPath(args.path);
88
+ if (pathErr)
89
+ return pathErr;
90
+ const p = safePath(cwd, String(args.path ?? ""));
91
+ if (!p)
92
+ return "Percorso non valido.";
93
+ const content = String(args.content ?? "");
94
+ try {
95
+ await mkdir(resolve(p, ".."), { recursive: true });
96
+ await writeFile(p, content, "utf8");
97
+ return `Scritto ${relative(cwd, p)} (${content.length} byte)`;
98
+ }
99
+ catch (e) {
100
+ return `Errore scrittura: ${e instanceof Error ? e.message : String(e)}`;
101
+ }
102
+ }
103
+ case "delete_file": {
104
+ const pathErr = validateFileToolPath(args.path);
105
+ if (pathErr)
106
+ return pathErr;
107
+ const p = safePath(cwd, String(args.path ?? ""));
108
+ if (!p)
109
+ return "Percorso non valido.";
110
+ try {
111
+ await unlink(p);
112
+ return `Cancellato ${relative(cwd, p)}`;
113
+ }
114
+ catch (e) {
115
+ return `Errore cancellazione: ${e instanceof Error ? e.message : String(e)}`;
116
+ }
117
+ }
118
+ case "rename_file": {
119
+ const oldErr = validateFileToolPath(args.oldPath);
120
+ if (oldErr)
121
+ return oldErr;
122
+ const newErr = validateFileToolPath(args.newPath);
123
+ if (newErr)
124
+ return newErr;
125
+ const oldP = safePath(cwd, String(args.oldPath ?? ""));
126
+ const newP = safePath(cwd, String(args.newPath ?? ""));
127
+ if (!oldP || !newP)
128
+ return "Percorso non valido.";
129
+ try {
130
+ await mkdir(resolve(newP, ".."), { recursive: true });
131
+ await rename(oldP, newP);
132
+ return `Rinominato ${relative(cwd, oldP)} → ${relative(cwd, newP)}`;
133
+ }
134
+ catch (e) {
135
+ return `Errore rinomina: ${e instanceof Error ? e.message : String(e)}`;
136
+ }
137
+ }
138
+ case "get_diagnostics": {
139
+ const pathErr = validateFileToolPath(args.path);
140
+ if (pathErr)
141
+ return pathErr;
142
+ const relPath = String(args.path ?? "");
143
+ if (!/\.(ts|tsx|js|jsx)$/i.test(relPath)) {
144
+ return "Diagnostics disponibili solo per file TypeScript/JavaScript.";
145
+ }
146
+ try {
147
+ const output = await runShellCommand(`npx tsc --noEmit --pretty false ${JSON.stringify(relPath)}`, cwd);
148
+ if (output.startsWith("exit 0"))
149
+ return "Nessun errore.";
150
+ const lines = output.split("\n").slice(1).filter(Boolean);
151
+ if (lines.length === 0)
152
+ return "Nessun errore.";
153
+ return lines.slice(0, 20).join("\n");
154
+ }
155
+ catch (e) {
156
+ return `Errore diagnostics: ${e instanceof Error ? e.message : String(e)}`;
157
+ }
158
+ }
159
+ case "edit":
160
+ case "search_replace": {
161
+ const pathErr = validateFileToolPath(args.path);
162
+ if (pathErr)
163
+ return pathErr;
164
+ const p = safePath(cwd, String(args.path ?? ""));
165
+ if (!p)
166
+ return "Percorso non valido.";
167
+ const oldText = String(args.oldText ?? "");
168
+ const newText = String(args.newText ?? "");
169
+ try {
170
+ const full = await readFile(p, "utf8");
171
+ const count = full.split(oldText).length - 1;
172
+ if (count === 0)
173
+ return "oldText non trovato.";
174
+ if (count > 1)
175
+ return `oldText trovato ${count} volte — sii più specifico.`;
176
+ await writeFile(p, full.replace(oldText, newText), "utf8");
177
+ return `Aggiornato ${relative(cwd, p)}`;
178
+ }
179
+ catch (e) {
180
+ return `Errore search_replace: ${e instanceof Error ? e.message : String(e)}`;
181
+ }
182
+ }
183
+ case "apply_diff": {
184
+ const pathErr = validateFileToolPath(args.path);
185
+ if (pathErr)
186
+ return pathErr;
187
+ const p = safePath(cwd, String(args.path ?? ""));
188
+ if (!p)
189
+ return "Percorso non valido.";
190
+ const diff = String(args.diff ?? "");
191
+ if (!diff)
192
+ return "Diff mancante.";
193
+ try {
194
+ const full = await readFile(p, "utf8");
195
+ const result = applyDiffToFile(full, diff);
196
+ if (!result.ok)
197
+ return `Errore apply_diff: ${result.error}`;
198
+ await writeFile(p, result.result, "utf8");
199
+ return `Patch applicato a ${relative(cwd, p)}`;
200
+ }
201
+ catch (e) {
202
+ return `Errore apply_diff: ${e instanceof Error ? e.message : String(e)}`;
203
+ }
204
+ }
205
+ case "grep": {
206
+ const pattern = String(args.pattern ?? "");
207
+ const max = Number(args.maxResults ?? 20);
208
+ try {
209
+ const rgOutput = await runShellCommand(`rg --line-number --max-count=${max} -- ${JSON.stringify(pattern)}`, cwd);
210
+ if (rgOutput.startsWith("exit 0") || rgOutput.startsWith("exit 1")) {
211
+ const lines = rgOutput.split("\n").slice(1).filter(Boolean);
212
+ if (lines.length === 0)
213
+ return "Nessun match.";
214
+ return lines.slice(0, max).join("\n");
215
+ }
216
+ }
217
+ catch {
218
+ // rg not available, fallback to naive
219
+ }
220
+ const hits = [];
221
+ async function scan(dir, prefix = "") {
222
+ if (hits.length >= max)
223
+ return;
224
+ const entries = await readdir(dir, { withFileTypes: true });
225
+ for (const ent of entries) {
226
+ if (hits.length >= max)
227
+ return;
228
+ if (ent.name.startsWith(".") || ent.name === "node_modules")
229
+ continue;
230
+ const rel = prefix ? `${prefix}/${ent.name}` : ent.name;
231
+ const abs = join(dir, ent.name);
232
+ if (ent.isDirectory())
233
+ await scan(abs, rel);
234
+ else {
235
+ try {
236
+ const text = await readFile(abs, "utf8");
237
+ if (text.includes(pattern))
238
+ hits.push(`${rel}: match`);
239
+ }
240
+ catch {
241
+ /* skip binary */
242
+ }
243
+ }
244
+ }
245
+ }
246
+ await scan(cwd);
247
+ return hits.length ? hits.join("\n") : "Nessun match.";
248
+ }
249
+ case "create_project":
250
+ return executeCreateProjectTool(cwd, args);
251
+ case "git": {
252
+ if (!terminalAllowed(config)) {
253
+ return "Git/terminale disabilitato. Imposta EUCODE_ALLOW_TERMINAL=1 o abilita agent.allowTerminal.";
254
+ }
255
+ const built = buildGitShellCommand(args);
256
+ if (built.error)
257
+ return built.error;
258
+ if (!built.command)
259
+ return "Comando git vuoto.";
260
+ const safety = checkShellCommand(built.command);
261
+ if (!safety.allowed)
262
+ return safety.reason;
263
+ const action = String(args.action ?? "");
264
+ const output = await runShellCommand(built.command, cwd, hooks);
265
+ if (/not a git repository/i.test(output)) {
266
+ return `${output}${formatGitHint("init")}`;
267
+ }
268
+ if (action === "push" &&
269
+ (/authentication failed|could not read from remote|Permission denied|403|401/i.test(output) ||
270
+ /set-upstream|no upstream/i.test(output))) {
271
+ return `${output}${formatGitHint("push")}`;
272
+ }
273
+ return output;
274
+ }
275
+ case "bash":
276
+ case "run_terminal": {
277
+ if (!terminalAllowed(config)) {
278
+ return "Terminale disabilitato. Imposta EUCODE_ALLOW_TERMINAL=1 per abilitarlo.";
279
+ }
280
+ const rawCommand = String(args.command ?? "");
281
+ if (!rawCommand.trim())
282
+ return "Comando vuoto.";
283
+ const command = sanitizeTerminalCommand(rawCommand, cwd);
284
+ const safety = checkShellCommand(command);
285
+ if (!safety.allowed)
286
+ return safety.reason;
287
+ return runShellCommand(command, cwd, hooks);
288
+ }
289
+ case "webfetch":
290
+ case "web_fetch": {
291
+ const url = String(args.url ?? "").trim();
292
+ if (!url)
293
+ return "URL mancante.";
294
+ try {
295
+ const maxChars = Number(args.maxChars ?? 12_000);
296
+ return await fetchUrlAsText(url, maxChars);
297
+ }
298
+ catch (e) {
299
+ return `web_fetch: ${e instanceof Error ? e.message : String(e)}`;
300
+ }
301
+ }
302
+ case "query_sqlite": {
303
+ const pathErr = validateFileToolPath(args.path);
304
+ if (pathErr)
305
+ return pathErr;
306
+ const p = safePath(cwd, String(args.path ?? ""));
307
+ if (!p)
308
+ return "Percorso database non valido.";
309
+ if (!/\.(db|sqlite|sqlite3)$/i.test(p)) {
310
+ return "Solo file .db / .sqlite / .sqlite3.";
311
+ }
312
+ return querySqliteFile(p, String(args.sql ?? ""));
313
+ }
314
+ default:
315
+ return `Tool non supportato in CLI: ${name}`;
316
+ }
317
+ },
318
+ };
319
+ }
320
+ //# sourceMappingURL=nodeToolHost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeToolHost.js","sourceRoot":"","sources":["../src/nodeToolHost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACvF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,GAErB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAW;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACpC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACpE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,MAAoB;IAC3C,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC5D,OAAO,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAAe,EACf,GAAW,EACX,KAA8C;IAE9C,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,EAAE;QACpC,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9B,QAAQ,IAAI,IAAI,CAAC;YACjB,KAAK,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9B,QAAQ,IAAI,IAAI,CAAC;YACjB,KAAK,EAAE,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,WAAW,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,GAAG,GAAG,QAAQ,IAAI,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YACpD,cAAc,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAW,EACX,MAAoB;IAEpB,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK;YAC7B,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,MAAM,CAAC;gBACZ,KAAK,WAAW,CAAC,CAAC,CAAC;oBACjB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChD,IAAI,OAAO;wBAAE,OAAO,OAAO,CAAC;oBAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;oBACjD,IAAI,CAAC,CAAC;wBAAE,OAAO,sBAAsB,CAAC;oBACtC,IAAI,CAAC;wBACH,OAAO,MAAM,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBACnC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,mBAAmB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzE,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,CAAC;gBACZ,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;oBACrC,MAAM,KAAK,GAAa,EAAE,CAAC;oBAC3B,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,MAAM,GAAG,EAAE;wBAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC5D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;4BAC1B,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc;gCAAE,SAAS;4BACtE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;4BACxD,IAAI,GAAG,CAAC,WAAW,EAAE;gCAAE,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;iCACvD,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gCAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACxD,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;wBAChB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;oBACxE,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,sBAAsB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5E,CAAC;gBACH,CAAC;gBACD,KAAK,OAAO,CAAC;gBACb,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChD,IAAI,OAAO;wBAAE,OAAO,OAAO,CAAC;oBAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;oBACjD,IAAI,CAAC,CAAC;wBAAE,OAAO,sBAAsB,CAAC;oBACtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBAC3C,IAAI,CAAC;wBACH,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;wBACnD,MAAM,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;wBACpC,OAAO,WAAW,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,MAAM,QAAQ,CAAC;oBAChE,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,qBAAqB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3E,CAAC;gBACH,CAAC;gBACD,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChD,IAAI,OAAO;wBAAE,OAAO,OAAO,CAAC;oBAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;oBACjD,IAAI,CAAC,CAAC;wBAAE,OAAO,sBAAsB,CAAC;oBACtC,IAAI,CAAC;wBACH,MAAM,MAAM,CAAC,CAAC,CAAC,CAAC;wBAChB,OAAO,cAAc,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC1C,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,yBAAyB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/E,CAAC;gBACH,CAAC;gBACD,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAClD,IAAI,MAAM;wBAAE,OAAO,MAAM,CAAC;oBAC1B,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAClD,IAAI,MAAM;wBAAE,OAAO,MAAM,CAAC;oBAC1B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;oBACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;oBACvD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI;wBAAE,OAAO,sBAAsB,CAAC;oBAClD,IAAI,CAAC;wBACH,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;wBACtD,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;wBACzB,OAAO,cAAc,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;oBACtE,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,oBAAoB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC1E,CAAC;gBACH,CAAC;gBACD,KAAK,iBAAiB,CAAC,CAAC,CAAC;oBACvB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChD,IAAI,OAAO;wBAAE,OAAO,OAAO,CAAC;oBAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;oBACxC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBACzC,OAAO,8DAA8D,CAAC;oBACxE,CAAC;oBACD,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,mCAAmC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAC5D,GAAG,CACJ,CAAC;wBACF,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;4BAAE,OAAO,gBAAgB,CAAC;wBACzD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;wBAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;4BAAE,OAAO,gBAAgB,CAAC;wBAChD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACvC,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,uBAAuB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7E,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,CAAC;gBACZ,KAAK,gBAAgB,CAAC,CAAC,CAAC;oBACtB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChD,IAAI,OAAO;wBAAE,OAAO,OAAO,CAAC;oBAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;oBACjD,IAAI,CAAC,CAAC;wBAAE,OAAO,sBAAsB,CAAC;oBACtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBAC3C,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;wBACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;wBAC7C,IAAI,KAAK,KAAK,CAAC;4BAAE,OAAO,sBAAsB,CAAC;wBAC/C,IAAI,KAAK,GAAG,CAAC;4BAAE,OAAO,mBAAmB,KAAK,6BAA6B,CAAC;wBAC5E,MAAM,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;wBAC3D,OAAO,cAAc,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;oBAC1C,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,0BAA0B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChF,CAAC;gBACH,CAAC;gBACD,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChD,IAAI,OAAO;wBAAE,OAAO,OAAO,CAAC;oBAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;oBACjD,IAAI,CAAC,CAAC;wBAAE,OAAO,sBAAsB,CAAC;oBACtC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;oBACrC,IAAI,CAAC,IAAI;wBAAE,OAAO,gBAAgB,CAAC;oBACnC,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;wBACvC,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;wBAC3C,IAAI,CAAC,MAAM,CAAC,EAAE;4BAAE,OAAO,sBAAsB,MAAM,CAAC,KAAK,EAAE,CAAC;wBAC5D,MAAM,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,MAAO,EAAE,MAAM,CAAC,CAAC;wBAC3C,OAAO,qBAAqB,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;oBACjD,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,sBAAsB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC5E,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;oBAC1C,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CACpC,gCAAgC,GAAG,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EACnE,GAAG,CACJ,CAAC;wBACF,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;4BACnE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BAC5D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gCAAE,OAAO,eAAe,CAAC;4BAC/C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACxC,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC;wBACP,sCAAsC;oBACxC,CAAC;oBACD,MAAM,IAAI,GAAa,EAAE,CAAC;oBAC1B,KAAK,UAAU,IAAI,CAAC,GAAW,EAAE,MAAM,GAAG,EAAE;wBAC1C,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;4BAAE,OAAO;wBAC/B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;wBAC5D,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;4BAC1B,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;gCAAE,OAAO;4BAC/B,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc;gCAAE,SAAS;4BACtE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;4BACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;4BAChC,IAAI,GAAG,CAAC,WAAW,EAAE;gCAAE,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;iCACvC,CAAC;gCACJ,IAAI,CAAC;oCACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;oCACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;wCAAE,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;gCACzD,CAAC;gCAAC,MAAM,CAAC;oCACP,iBAAiB;gCACnB,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;oBACD,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;oBAChB,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;gBACzD,CAAC;gBACD,KAAK,gBAAgB;oBACnB,OAAO,wBAAwB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC7C,KAAK,KAAK,CAAC,CAAC,CAAC;oBACX,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC7B,OAAO,4FAA4F,CAAC;oBACtG,CAAC;oBACD,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;oBACzC,IAAI,KAAK,CAAC,KAAK;wBAAE,OAAO,KAAK,CAAC,KAAK,CAAC;oBACpC,IAAI,CAAC,KAAK,CAAC,OAAO;wBAAE,OAAO,oBAAoB,CAAC;oBAChD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAChD,IAAI,CAAC,MAAM,CAAC,OAAO;wBAAE,OAAO,MAAM,CAAC,MAAM,CAAC;oBAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;oBACzC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;oBAChE,IAAI,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;wBACzC,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7C,CAAC;oBACD,IACE,MAAM,KAAK,MAAM;wBACjB,CAAC,6EAA6E,CAAC,IAAI,CACjF,MAAM,CACP;4BACC,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAC3C,CAAC;wBACD,OAAO,GAAG,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC7C,CAAC;oBACD,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,KAAK,MAAM,CAAC;gBACZ,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC7B,OAAO,yEAAyE,CAAC;oBACnF,CAAC;oBACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;oBAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;wBAAE,OAAO,gBAAgB,CAAC;oBAChD,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;oBACzD,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;oBAC1C,IAAI,CAAC,MAAM,CAAC,OAAO;wBAAE,OAAO,MAAM,CAAC,MAAM,CAAC;oBAC1C,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;gBAC9C,CAAC;gBACD,KAAK,UAAU,CAAC;gBAChB,KAAK,WAAW,CAAC,CAAC,CAAC;oBACjB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC1C,IAAI,CAAC,GAAG;wBAAE,OAAO,eAAe,CAAC;oBACjC,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC;wBACjD,OAAO,MAAM,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBAC7C,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,OAAO,cAAc,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;oBACpE,CAAC;gBACH,CAAC;gBACD,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChD,IAAI,OAAO;wBAAE,OAAO,OAAO,CAAC;oBAC5B,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;oBACjD,IAAI,CAAC,CAAC;wBAAE,OAAO,+BAA+B,CAAC;oBAC/C,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;wBACvC,OAAO,qCAAqC,CAAC;oBAC/C,CAAC;oBACD,OAAO,eAAe,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;gBACpD,CAAC;gBACD;oBACE,OAAO,+BAA+B,IAAI,EAAE,CAAC;YACjD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function loadCliProjectRules(cwd: string): Promise<string>;
2
+ //# sourceMappingURL=projectRules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectRules.d.ts","sourceRoot":"","sources":["../src/projectRules.ts"],"names":[],"mappings":"AAyCA,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CActE"}
@@ -0,0 +1,57 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { loadProjectRules, loadGlobalRules } from "@eucode/context";
5
+ function createRulesFileReader(cwd) {
6
+ return {
7
+ async readFile(rel) {
8
+ try {
9
+ return await readFile(join(cwd, rel), "utf8");
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ },
15
+ getActiveFile() {
16
+ return null;
17
+ },
18
+ async listFiles() {
19
+ return [];
20
+ },
21
+ };
22
+ }
23
+ function createHomeFileReader() {
24
+ return {
25
+ async readFile(rel) {
26
+ try {
27
+ return await readFile(rel, "utf8");
28
+ }
29
+ catch {
30
+ return null;
31
+ }
32
+ },
33
+ getActiveFile() {
34
+ return null;
35
+ },
36
+ async listFiles() {
37
+ return [];
38
+ },
39
+ };
40
+ }
41
+ export async function loadCliProjectRules(cwd) {
42
+ const home = homedir();
43
+ const [projectRules, globalRules, memory] = await Promise.all([
44
+ loadProjectRules(createRulesFileReader(cwd)),
45
+ loadGlobalRules(createHomeFileReader(), home),
46
+ readFile(join(cwd, ".eucode", "memory.md"), "utf8").catch(() => ""),
47
+ ]);
48
+ const blocks = [];
49
+ if (projectRules.trim())
50
+ blocks.push(projectRules.trim());
51
+ if (globalRules.trim())
52
+ blocks.push(globalRules.trim());
53
+ if (memory.trim())
54
+ blocks.push(`## Project memory (.eucode/memory.md)\n\n${memory.trim()}`);
55
+ return blocks.join("\n\n");
56
+ }
57
+ //# sourceMappingURL=projectRules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectRules.js","sourceRoot":"","sources":["../src/projectRules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAmB,MAAM,iBAAiB,CAAC;AAErF,SAAS,qBAAqB,CAAC,GAAW;IACxC,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,GAAW;YACxB,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,aAAa;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,SAAS;YACb,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,GAAW;YACxB,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,aAAa;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,SAAS;YACb,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,GAAW;IACnD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC5D,gBAAgB,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC5C,eAAe,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAY,CAAC;KAC9E,CAAC,CAAC;IAEH,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,YAAY,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,WAAW,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,IAAI,MAAM,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,4CAA4C,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAE5F,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { Ora } from "ora";
2
+ import type { ChatMessage } from "@eucode/shared";
3
+ import type { LlmProvider } from "@eucode/llm";
4
+ export interface ReplFinishOptions {
5
+ runResult?: string;
6
+ userPrompt: string;
7
+ history: ChatMessage[];
8
+ provider?: LlmProvider;
9
+ }
10
+ /** Keeps assistant text on stdout and tool spinners on stderr. */
11
+ export declare function createReplAgentCallbacks(spinner: Ora): {
12
+ wroteText: () => boolean;
13
+ callbacks: {
14
+ onText: (text: string) => void;
15
+ onToolStart: (name: string, args: Record<string, unknown>) => void;
16
+ onToolOutput: (name: string, chunk: string) => void;
17
+ onToolEnd: (name: string, result: string) => void;
18
+ };
19
+ finish: (options: ReplFinishOptions) => Promise<void>;
20
+ };
21
+ //# sourceMappingURL=replOutput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replOutput.d.ts","sourceRoot":"","sources":["../src/replOutput.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAU/C,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,WAAW,CAAC;CACxB;AAED,kEAAkE;AAClE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,GAAG;;;uBAOhC,MAAM;4BASD,MAAM,QAAQ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;6BAkBpC,MAAM,SAAS,MAAM;0BAIxB,MAAM,UAAU,MAAM;;sBAMlB,iBAAiB;EA0C5C"}
@@ -0,0 +1,84 @@
1
+ import { assistantTextLooksLikeGitSummary, promptWantsGitSummary, resolveAgentAssistantSummary, synthesizeAgentReply, collectToolResults, } from "./synthesizeAgentReply.js";
2
+ import { c } from "./ui.js";
3
+ /** Keeps assistant text on stdout and tool spinners on stderr. */
4
+ export function createReplAgentCallbacks(spinner) {
5
+ let wroteText = false;
6
+ let streamedText = "";
7
+ return {
8
+ wroteText: () => wroteText,
9
+ callbacks: {
10
+ onText: (text) => {
11
+ streamedText += text;
12
+ if (!wroteText) {
13
+ spinner.stop();
14
+ process.stdout.write(c.assistant(""));
15
+ wroteText = true;
16
+ }
17
+ process.stdout.write(text);
18
+ },
19
+ onToolStart: (name, args) => {
20
+ if (wroteText) {
21
+ process.stdout.write("\n");
22
+ wroteText = false;
23
+ }
24
+ const preview = name === "write" || name === "write_file" || name === "read" || name === "read_file" || name === "edit" || name === "search_replace"
25
+ ? String(args.path ?? "")
26
+ : name === "bash" || name === "run_terminal"
27
+ ? String(args.command ?? "")
28
+ : name === "git"
29
+ ? String(args.action ?? "")
30
+ : "";
31
+ spinner.text = preview
32
+ ? `${name} ${preview.slice(0, 60)}`
33
+ : `${name}…`;
34
+ if (!spinner.isSpinning)
35
+ spinner.start();
36
+ },
37
+ onToolOutput: (name, chunk) => {
38
+ spinner.stop();
39
+ process.stderr.write(c.dim(` [${name}] ${chunk}`));
40
+ },
41
+ onToolEnd: (name, result) => {
42
+ spinner.stop();
43
+ const firstLine = result.split("\n")[0]?.slice(0, 100) ?? "";
44
+ process.stderr.write(c.dim(` ✓ ${name}: ${firstLine}\n`));
45
+ },
46
+ },
47
+ finish: async (options) => {
48
+ spinner.stop();
49
+ const hasStreamed = Boolean(streamedText.trim());
50
+ const summary = await resolveAgentAssistantSummary({
51
+ finalText: options.runResult ?? "",
52
+ wroteText: hasStreamed,
53
+ history: options.history,
54
+ userPrompt: options.userPrompt,
55
+ provider: options.provider,
56
+ });
57
+ let text = streamedText.trim() ||
58
+ summary?.trim() ||
59
+ options.runResult?.trim() ||
60
+ "";
61
+ const toolSummary = synthesizeAgentReply(collectToolResults(options.history), options.userPrompt);
62
+ if (toolSummary?.trim() &&
63
+ promptWantsGitSummary(options.userPrompt) &&
64
+ !assistantTextLooksLikeGitSummary(text)) {
65
+ text = toolSummary.trim();
66
+ }
67
+ if (text) {
68
+ if (!hasStreamed) {
69
+ process.stdout.write(c.assistant(text));
70
+ }
71
+ else if (text !== streamedText.trim()) {
72
+ process.stdout.write("\n");
73
+ process.stdout.write(c.assistant(text));
74
+ }
75
+ process.stdout.write("\n");
76
+ }
77
+ else {
78
+ process.stdout.write(c.assistant("(nessuna risposta)\n"));
79
+ }
80
+ process.stdout.write("\n");
81
+ },
82
+ };
83
+ }
84
+ //# sourceMappingURL=replOutput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replOutput.js","sourceRoot":"","sources":["../src/replOutput.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function validateReadonlySql(sql: string): string | null;
2
+ export declare function querySqliteFile(dbPath: string, sql: string, maxRows?: number): string;
3
+ //# sourceMappingURL=sqliteQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqliteQuery.d.ts","sourceRoot":"","sources":["../src/sqliteQuery.ts"],"names":[],"mappings":"AAMA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa9D;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,SAAM,GACZ,MAAM,CA2BR"}
@@ -0,0 +1,40 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { accessSync } from "node:fs";
3
+ const BLOCKED_SQL = /\b(?:INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|REPLACE|ATTACH|DETACH|PRAGMA\s+(?!table_info|database_list))\b/i;
4
+ export function validateReadonlySql(sql) {
5
+ const trimmed = sql.trim();
6
+ if (!trimmed)
7
+ return "Query SQL vuota.";
8
+ if (!/^\s*SELECT\b/i.test(trimmed) && !/^\s*WITH\b/i.test(trimmed)) {
9
+ return "Solo query SELECT (o WITH … SELECT) sono consentite.";
10
+ }
11
+ if (BLOCKED_SQL.test(trimmed)) {
12
+ return "Query non consentita — solo SELECT in sola lettura.";
13
+ }
14
+ if (trimmed.includes(";") && trimmed.indexOf(";") < trimmed.length - 1) {
15
+ return "Una sola query per chiamata.";
16
+ }
17
+ return null;
18
+ }
19
+ export function querySqliteFile(dbPath, sql, maxRows = 100) {
20
+ const err = validateReadonlySql(sql);
21
+ if (err)
22
+ return err;
23
+ try {
24
+ accessSync(dbPath);
25
+ }
26
+ catch {
27
+ return `Database non trovato: ${dbPath}`;
28
+ }
29
+ const limited = `${sql.trim().replace(/;$/, "")} LIMIT ${maxRows};`;
30
+ const result = spawnSync("sqlite3", ["-readonly", "-header", "-column", dbPath, limited], { encoding: "utf8", maxBuffer: 512_000 });
31
+ if (result.error?.message.includes("ENOENT")) {
32
+ return ("sqlite3 CLI non trovato nel PATH. Installa SQLite oppure usa run_terminal: " +
33
+ `sqlite3 -readonly ${dbPath} \"SELECT …\"`);
34
+ }
35
+ if (result.status !== 0) {
36
+ return `Errore sqlite3: ${(result.stderr || result.stdout || "unknown").trim()}`;
37
+ }
38
+ return (result.stdout || "(nessuna riga)").trim();
39
+ }
40
+ //# sourceMappingURL=sqliteQuery.js.map