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.
- package/dist/agentFinish.d.ts +10 -0
- package/dist/agentFinish.d.ts.map +1 -0
- package/dist/agentFinish.js +9 -0
- package/dist/agentFinish.js.map +1 -0
- package/dist/agentHost.d.ts +29 -0
- package/dist/agentHost.d.ts.map +1 -0
- package/dist/agentHost.js +94 -0
- package/dist/agentHost.js.map +1 -0
- package/dist/backgroundJobs.d.ts +12 -0
- package/dist/backgroundJobs.d.ts.map +1 -0
- package/dist/backgroundJobs.js +66 -0
- package/dist/backgroundJobs.js.map +1 -0
- package/dist/capabilities.d.ts +9 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +46 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/cliErrors.d.ts +3 -0
- package/dist/cliErrors.d.ts.map +1 -0
- package/dist/cliErrors.js +16 -0
- package/dist/cliErrors.js.map +1 -0
- package/dist/cloud.d.ts +17 -0
- package/dist/cloud.d.ts.map +1 -0
- package/dist/cloud.js +78 -0
- package/dist/cloud.js.map +1 -0
- package/dist/codeReview.d.ts +8 -0
- package/dist/codeReview.d.ts.map +1 -0
- package/dist/codeReview.js +64 -0
- package/dist/codeReview.js.map +1 -0
- package/dist/commands/agent.d.ts +7 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +86 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/capabilities.d.ts +2 -0
- package/dist/commands/capabilities.d.ts.map +1 -0
- package/dist/commands/capabilities.js +22 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/chat.d.ts +7 -0
- package/dist/commands/chat.d.ts.map +1 -0
- package/dist/commands/chat.js +426 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/db.d.ts +6 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +17 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/docker.d.ts +5 -0
- package/dist/commands/docker.d.ts.map +1 -0
- package/dist/commands/docker.js +35 -0
- package/dist/commands/docker.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +34 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +5 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +32 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/mcp.d.ts +3 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +65 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/models.d.ts +2 -0
- package/dist/commands/models.d.ts.map +1 -0
- package/dist/commands/models.js +30 -0
- package/dist/commands/models.js.map +1 -0
- package/dist/commands/new.d.ts +5 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +31 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/plan.d.ts +6 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +82 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/pr.d.ts +6 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +29 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/test.d.ts +5 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +49 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/config.d.ts +18 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +75 -0
- package/dist/config.js.map +1 -0
- package/dist/createProject.d.ts +5 -0
- package/dist/createProject.d.ts.map +1 -0
- package/dist/createProject.js +53 -0
- package/dist/createProject.js.map +1 -0
- package/dist/delegateAgent.d.ts +6 -0
- package/dist/delegateAgent.d.ts.map +1 -0
- package/dist/delegateAgent.js +34 -0
- package/dist/delegateAgent.js.map +1 -0
- package/dist/fileContext.d.ts +4 -0
- package/dist/fileContext.d.ts.map +1 -0
- package/dist/fileContext.js +98 -0
- package/dist/fileContext.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +207 -0
- package/dist/index.js.map +1 -0
- package/dist/intensity.d.ts +13 -0
- package/dist/intensity.d.ts.map +1 -0
- package/dist/intensity.js +33 -0
- package/dist/intensity.js.map +1 -0
- package/dist/mcpConfig.d.ts +3 -0
- package/dist/mcpConfig.d.ts.map +1 -0
- package/dist/mcpConfig.js +29 -0
- package/dist/mcpConfig.js.map +1 -0
- package/dist/memory.d.ts +3 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +16 -0
- package/dist/memory.js.map +1 -0
- package/dist/modelCatalog.d.ts +9 -0
- package/dist/modelCatalog.d.ts.map +1 -0
- package/dist/modelCatalog.js +45 -0
- package/dist/modelCatalog.js.map +1 -0
- package/dist/nodeToolHost.d.ts +4 -0
- package/dist/nodeToolHost.d.ts.map +1 -0
- package/dist/nodeToolHost.js +320 -0
- package/dist/nodeToolHost.js.map +1 -0
- package/dist/projectRules.d.ts +2 -0
- package/dist/projectRules.d.ts.map +1 -0
- package/dist/projectRules.js +57 -0
- package/dist/projectRules.js.map +1 -0
- package/dist/replOutput.d.ts +21 -0
- package/dist/replOutput.d.ts.map +1 -0
- package/dist/replOutput.js +84 -0
- package/dist/replOutput.js.map +1 -0
- package/dist/sqliteQuery.d.ts +3 -0
- package/dist/sqliteQuery.d.ts.map +1 -0
- package/dist/sqliteQuery.js +40 -0
- package/dist/sqliteQuery.js.map +1 -0
- package/dist/synthesizeAgentReply.d.ts +32 -0
- package/dist/synthesizeAgentReply.d.ts.map +1 -0
- package/dist/synthesizeAgentReply.js +173 -0
- package/dist/synthesizeAgentReply.js.map +1 -0
- package/dist/synthesizeAgentReply.test.d.ts +2 -0
- package/dist/synthesizeAgentReply.test.d.ts.map +1 -0
- package/dist/synthesizeAgentReply.test.js +35 -0
- package/dist/synthesizeAgentReply.test.js.map +1 -0
- package/dist/terminalOutput.d.ts +4 -0
- package/dist/terminalOutput.d.ts.map +1 -0
- package/dist/terminalOutput.js +34 -0
- package/dist/terminalOutput.js.map +1 -0
- package/dist/ui.d.ts +17 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +121 -0
- package/dist/ui.js.map +1 -0
- package/dist/webFetch.d.ts +2 -0
- package/dist/webFetch.d.ts.map +1 -0
- package/dist/webFetch.js +29 -0
- package/dist/webFetch.js.map +1 -0
- package/dist/workspace.d.ts +2 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +30 -0
- package/dist/workspace.js.map +1 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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
|