@pentoshi/clai 0.12.0 → 1.0.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/bin/clai.mjs +25 -0
- package/dist/agent/loop-guard.js +10 -2
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/runner.d.ts +38 -1
- package/dist/agent/runner.js +516 -36
- package/dist/agent/runner.js.map +1 -1
- package/dist/commands/update.js +1 -1
- package/dist/commands/update.js.map +1 -1
- package/dist/llm/anthropic.js +31 -12
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/capabilities.d.ts +13 -0
- package/dist/llm/capabilities.js +107 -24
- package/dist/llm/capabilities.js.map +1 -1
- package/dist/llm/gemini.js +17 -4
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/http.d.ts +12 -1
- package/dist/llm/http.js +50 -25
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/ollama.js +16 -8
- package/dist/llm/ollama.js.map +1 -1
- package/dist/modes/agent.d.ts +2 -1
- package/dist/modes/agent.js.map +1 -1
- package/dist/modes/ask.d.ts +2 -1
- package/dist/modes/ask.js +5 -1
- package/dist/modes/ask.js.map +1 -1
- package/dist/os/cwd.d.ts +30 -0
- package/dist/os/cwd.js +76 -0
- package/dist/os/cwd.js.map +1 -0
- package/dist/os/detect.js +2 -1
- package/dist/os/detect.js.map +1 -1
- package/dist/prompts/index.d.ts +1 -1
- package/dist/prompts/index.js +95 -22
- package/dist/prompts/index.js.map +1 -1
- package/dist/repl.d.ts +10 -0
- package/dist/repl.js +258 -28
- package/dist/repl.js.map +1 -1
- package/dist/safety/classifier.js +147 -26
- package/dist/safety/classifier.js.map +1 -1
- package/dist/safety/patterns.d.ts +26 -0
- package/dist/safety/patterns.js +167 -0
- package/dist/safety/patterns.js.map +1 -1
- package/dist/store/config.js +2 -1
- package/dist/store/config.js.map +1 -1
- package/dist/store/history.js +19 -5
- package/dist/store/history.js.map +1 -1
- package/dist/store/plan.d.ts +43 -0
- package/dist/store/plan.js +201 -0
- package/dist/store/plan.js.map +1 -0
- package/dist/store/project.js +3 -2
- package/dist/store/project.js.map +1 -1
- package/dist/tools/capabilities.js +6 -1
- package/dist/tools/capabilities.js.map +1 -1
- package/dist/tools/fs.d.ts +15 -0
- package/dist/tools/fs.js +69 -3
- package/dist/tools/fs.js.map +1 -1
- package/dist/tools/image.d.ts +13 -0
- package/dist/tools/image.js +81 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/jobs.js +2 -1
- package/dist/tools/jobs.js.map +1 -1
- package/dist/tools/pdf.d.ts +18 -0
- package/dist/tools/pdf.js +200 -0
- package/dist/tools/pdf.js.map +1 -0
- package/dist/tools/registry.js +87 -7
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/shell.js +3 -2
- package/dist/tools/shell.js.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/ui/keys.d.ts +1 -0
- package/dist/ui/keys.js +4 -0
- package/dist/ui/keys.js.map +1 -1
- package/dist/ui/mentions.d.ts +32 -1
- package/dist/ui/mentions.js +304 -27
- package/dist/ui/mentions.js.map +1 -1
- package/dist/ui/plan-pane.d.ts +19 -0
- package/dist/ui/plan-pane.js +101 -0
- package/dist/ui/plan-pane.js.map +1 -0
- package/package.json +6 -5
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile, rm } from "node:fs/promises";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { homedir, tmpdir } from "node:os";
|
|
5
|
+
import { getConfig } from "./config.js";
|
|
6
|
+
/**
|
|
7
|
+
* Session-scoped plan + task persistence.
|
|
8
|
+
*
|
|
9
|
+
* A plan is a comprehensive, human-readable description of HOW the agent
|
|
10
|
+
* intends to accomplish a multi-step goal (coding OR pentesting), paired
|
|
11
|
+
* with an ordered checklist of tasks. The agent has the plan in context for
|
|
12
|
+
* the whole session, marks tasks done as it completes them, and the user can
|
|
13
|
+
* view it in a pager (Ctrl+P) or approve execution with /implement.
|
|
14
|
+
*
|
|
15
|
+
* Storage mirrors history.ts: SQLite when better-sqlite3 is available,
|
|
16
|
+
* otherwise an always-present JSONL log. Plans are keyed by a session id so
|
|
17
|
+
* each REPL session keeps its own plan, and resuming a session reloads it.
|
|
18
|
+
*/
|
|
19
|
+
const planDir = join(homedir(), ".clai");
|
|
20
|
+
const jsonlFile = process.env.CLAI_PLAN_FILE ??
|
|
21
|
+
(process.env.VITEST_WORKER_ID
|
|
22
|
+
? join(tmpdir(), `clai-plans-${process.env.VITEST_WORKER_ID}.jsonl`)
|
|
23
|
+
: join(planDir, "plans.jsonl"));
|
|
24
|
+
const dbFile = join(planDir, "history.db");
|
|
25
|
+
const sqliteModuleName = "better-sqlite3";
|
|
26
|
+
let cachedDb;
|
|
27
|
+
let sqliteUnavailable = false;
|
|
28
|
+
async function loadDatabase() {
|
|
29
|
+
// Tests and JSONL-fallback installs skip SQLite entirely.
|
|
30
|
+
if (process.env.CLAI_PLAN_FILE || process.env.VITEST_WORKER_ID)
|
|
31
|
+
return undefined;
|
|
32
|
+
if (cachedDb)
|
|
33
|
+
return cachedDb;
|
|
34
|
+
if (sqliteUnavailable)
|
|
35
|
+
return undefined;
|
|
36
|
+
try {
|
|
37
|
+
await mkdir(planDir, { recursive: true });
|
|
38
|
+
const imported = (await import(sqliteModuleName));
|
|
39
|
+
const Ctor = imported.default ?? imported;
|
|
40
|
+
cachedDb = new Ctor(dbFile);
|
|
41
|
+
cachedDb.exec(`
|
|
42
|
+
CREATE TABLE IF NOT EXISTS plans (
|
|
43
|
+
session_id TEXT PRIMARY KEY,
|
|
44
|
+
goal TEXT NOT NULL,
|
|
45
|
+
detail TEXT NOT NULL,
|
|
46
|
+
tasks_json TEXT NOT NULL,
|
|
47
|
+
status TEXT NOT NULL,
|
|
48
|
+
kind TEXT NOT NULL,
|
|
49
|
+
created_at TEXT NOT NULL,
|
|
50
|
+
updated_at TEXT NOT NULL
|
|
51
|
+
);
|
|
52
|
+
`);
|
|
53
|
+
return cachedDb;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
sqliteUnavailable = true;
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function newTaskId(index) {
|
|
61
|
+
return `t${index + 1}`;
|
|
62
|
+
}
|
|
63
|
+
export function tasksFromTitles(titles) {
|
|
64
|
+
return titles
|
|
65
|
+
.map((title) => title.trim())
|
|
66
|
+
.filter(Boolean)
|
|
67
|
+
.map((title, index) => ({ id: newTaskId(index), title, state: "pending" }));
|
|
68
|
+
}
|
|
69
|
+
export function createPlan(input) {
|
|
70
|
+
const now = new Date().toISOString();
|
|
71
|
+
return {
|
|
72
|
+
sessionId: input.sessionId,
|
|
73
|
+
goal: input.goal.trim() || "Untitled plan",
|
|
74
|
+
detail: input.detail.trim(),
|
|
75
|
+
tasks: tasksFromTitles(input.taskTitles),
|
|
76
|
+
status: "draft",
|
|
77
|
+
kind: input.kind?.trim() || "general",
|
|
78
|
+
createdAt: now,
|
|
79
|
+
updatedAt: now,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export async function savePlan(plan) {
|
|
83
|
+
plan.updatedAt = new Date().toISOString();
|
|
84
|
+
if (getConfig().privateMode)
|
|
85
|
+
return; // never persist in private mode
|
|
86
|
+
const db = await loadDatabase();
|
|
87
|
+
if (db) {
|
|
88
|
+
db.prepare(`INSERT INTO plans (session_id, goal, detail, tasks_json, status, kind, created_at, updated_at)
|
|
89
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
90
|
+
ON CONFLICT(session_id) DO UPDATE SET
|
|
91
|
+
goal=excluded.goal, detail=excluded.detail, tasks_json=excluded.tasks_json,
|
|
92
|
+
status=excluded.status, kind=excluded.kind, updated_at=excluded.updated_at`).run(plan.sessionId, plan.goal, plan.detail, JSON.stringify(plan.tasks), plan.status, plan.kind, plan.createdAt, plan.updatedAt);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
await appendJsonl(plan);
|
|
96
|
+
}
|
|
97
|
+
async function appendJsonl(plan) {
|
|
98
|
+
await mkdir(planDir, { recursive: true });
|
|
99
|
+
// JSONL fallback keeps the latest record per session; we compact on write
|
|
100
|
+
// so the file does not grow unbounded for a long-lived session.
|
|
101
|
+
const existing = await readAllJsonl();
|
|
102
|
+
const map = new Map(existing.map((p) => [p.sessionId, p]));
|
|
103
|
+
map.set(plan.sessionId, plan);
|
|
104
|
+
const body = [...map.values()].map((p) => JSON.stringify(p)).join("\n");
|
|
105
|
+
await writeFile(jsonlFile, body ? `${body}\n` : "", { mode: 0o600 });
|
|
106
|
+
}
|
|
107
|
+
async function readAllJsonl() {
|
|
108
|
+
if (!existsSync(jsonlFile))
|
|
109
|
+
return [];
|
|
110
|
+
try {
|
|
111
|
+
const raw = await readFile(jsonlFile, "utf8");
|
|
112
|
+
return raw
|
|
113
|
+
.split("\n")
|
|
114
|
+
.filter(Boolean)
|
|
115
|
+
.map((line) => JSON.parse(line));
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return [];
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
export async function loadPlan(sessionId) {
|
|
122
|
+
const db = await loadDatabase();
|
|
123
|
+
if (db) {
|
|
124
|
+
const row = db
|
|
125
|
+
.prepare("SELECT session_id, goal, detail, tasks_json, status, kind, created_at, updated_at FROM plans WHERE session_id = ?")
|
|
126
|
+
.get(sessionId);
|
|
127
|
+
if (!row)
|
|
128
|
+
return undefined;
|
|
129
|
+
return {
|
|
130
|
+
sessionId: row.session_id,
|
|
131
|
+
goal: row.goal,
|
|
132
|
+
detail: row.detail,
|
|
133
|
+
tasks: JSON.parse(row.tasks_json),
|
|
134
|
+
status: row.status,
|
|
135
|
+
kind: row.kind,
|
|
136
|
+
createdAt: row.created_at,
|
|
137
|
+
updatedAt: row.updated_at,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return (await readAllJsonl()).find((p) => p.sessionId === sessionId);
|
|
141
|
+
}
|
|
142
|
+
export async function deletePlan(sessionId) {
|
|
143
|
+
const db = await loadDatabase();
|
|
144
|
+
if (db) {
|
|
145
|
+
db.prepare("DELETE FROM plans WHERE session_id = ?").run(sessionId);
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const existing = await readAllJsonl();
|
|
149
|
+
const remaining = existing.filter((p) => p.sessionId !== sessionId);
|
|
150
|
+
if (remaining.length === existing.length)
|
|
151
|
+
return;
|
|
152
|
+
await mkdir(planDir, { recursive: true });
|
|
153
|
+
const body = remaining.map((p) => JSON.stringify(p)).join("\n");
|
|
154
|
+
await writeFile(jsonlFile, body ? `${body}\n` : "", { mode: 0o600 });
|
|
155
|
+
}
|
|
156
|
+
export async function clearAllPlans() {
|
|
157
|
+
const db = await loadDatabase();
|
|
158
|
+
if (db) {
|
|
159
|
+
try {
|
|
160
|
+
db.exec("DELETE FROM plans;");
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
/* ignore */
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
if (existsSync(jsonlFile)) {
|
|
167
|
+
try {
|
|
168
|
+
await rm(jsonlFile, { force: true });
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
/* ignore */
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// ── Task mutations ────────────────────────────────────────────────────────
|
|
176
|
+
export function markTask(plan, taskId, state, note) {
|
|
177
|
+
const task = plan.tasks.find((t) => t.id === taskId);
|
|
178
|
+
if (!task)
|
|
179
|
+
return false;
|
|
180
|
+
task.state = state;
|
|
181
|
+
if (note !== undefined)
|
|
182
|
+
task.note = note;
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
/** Mark the first not-yet-finished task as the given state. */
|
|
186
|
+
export function markNextTask(plan, state) {
|
|
187
|
+
const task = plan.tasks.find((t) => t.state === "pending" || t.state === "in_progress");
|
|
188
|
+
if (!task)
|
|
189
|
+
return undefined;
|
|
190
|
+
task.state = state;
|
|
191
|
+
return task;
|
|
192
|
+
}
|
|
193
|
+
export function planProgress(plan) {
|
|
194
|
+
const done = plan.tasks.filter((t) => t.state === "done").length;
|
|
195
|
+
return { done, total: plan.tasks.length };
|
|
196
|
+
}
|
|
197
|
+
export function isPlanComplete(plan) {
|
|
198
|
+
return (plan.tasks.length > 0 &&
|
|
199
|
+
plan.tasks.every((t) => t.state === "done" || t.state === "skipped" || t.state === "failed"));
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/store/plan.ts"],"names":[],"mappings":"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"}
|
package/dist/store/project.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
+
import { safeCwd } from "../os/cwd.js";
|
|
4
5
|
const MAX_PROJECT_CONTEXT_BYTES = 16 * 1024;
|
|
5
6
|
export async function loadProjectContext() {
|
|
6
|
-
const contextFile = join(
|
|
7
|
+
const contextFile = join(safeCwd(), ".clai", "context.md");
|
|
7
8
|
if (!existsSync(contextFile))
|
|
8
9
|
return undefined;
|
|
9
10
|
const raw = await readFile(contextFile, "utf8");
|
|
@@ -35,7 +36,7 @@ export async function loadProjectContext() {
|
|
|
35
36
|
.join("\n");
|
|
36
37
|
}
|
|
37
38
|
export function getProjectContextPath() {
|
|
38
|
-
return join(
|
|
39
|
+
return join(safeCwd(), ".clai", "context.md");
|
|
39
40
|
}
|
|
40
41
|
export const MAX_PROJECT_CONTEXT = MAX_PROJECT_CONTEXT_BYTES;
|
|
41
42
|
//# sourceMappingURL=project.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/store/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/store/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,2EAA2E;IAC3E,2EAA2E;IAC3E,IAAI,IAAI,GAAG,OAAO,CAAC;IACnB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,IAAI,CAAC,MAAM,GAAG,yBAAyB,EAAE,CAAC;QAC5C,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAChD,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,wEAAwE;IACxE,4EAA4E;IAC5E,gBAAgB;IAChB,MAAM,IAAI,GAAG,SAAS;QACpB,CAAC,CAAC,uCAAuC,yBAAyB,CAAC,cAAc,EAAE,aAAa,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG;QAClI,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,oCAAoC;QACpC,uHAAuH;QACvH,IAAI;QACJ,IAAI,CAAC,IAAI,EAAE;QACX,oBAAoB;KACrB;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,yBAAyB,CAAC"}
|
|
@@ -19,6 +19,7 @@ const VERSION_COMMANDS = {
|
|
|
19
19
|
git: ["git", "--version"],
|
|
20
20
|
docker: ["docker", "--version"],
|
|
21
21
|
kubectl: ["kubectl", "version", "--client", "--short"],
|
|
22
|
+
tesseract: ["tesseract", "--version"],
|
|
22
23
|
};
|
|
23
24
|
const INSTALL_HINTS = {
|
|
24
25
|
nmap: "pkg.install nmap",
|
|
@@ -33,6 +34,7 @@ const INSTALL_HINTS = {
|
|
|
33
34
|
subfinder: "go install github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest",
|
|
34
35
|
httpx: "go install github.com/projectdiscovery/httpx/cmd/httpx@latest",
|
|
35
36
|
nuclei: "go install github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest",
|
|
37
|
+
tesseract: "pkg.install tesseract",
|
|
36
38
|
};
|
|
37
39
|
function findCommand(name) {
|
|
38
40
|
try {
|
|
@@ -98,7 +100,10 @@ export async function toolCheckHandler(args) {
|
|
|
98
100
|
names = toolsRaw.filter((t) => typeof t === "string");
|
|
99
101
|
}
|
|
100
102
|
else if (typeof toolsRaw === "string") {
|
|
101
|
-
names = toolsRaw
|
|
103
|
+
names = toolsRaw
|
|
104
|
+
.split(",")
|
|
105
|
+
.map((t) => t.trim())
|
|
106
|
+
.filter(Boolean);
|
|
102
107
|
}
|
|
103
108
|
else {
|
|
104
109
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/tools/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAWnC,MAAM,gBAAgB,GAA6B;IACjD,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;IAC3B,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC;IACpB,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;IAC3B,OAAO,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC;IACjC,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,IAAI,EAAE,CAAC,MAAM,EAAE,WAAW,CAAC;IAC3B,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC;IACrB,GAAG,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IAClB,KAAK,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;IAC7B,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC;IACjC,KAAK,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;IAC5B,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,KAAK,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC;IACtB,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC;IACvB,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC;IACvB,GAAG,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;IACzB,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/tools/capabilities.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/fs.d.ts
CHANGED
|
@@ -3,6 +3,21 @@ export declare function fsRead(path: string, options?: {
|
|
|
3
3
|
maxBytes?: number | undefined;
|
|
4
4
|
}): Promise<ToolResult>;
|
|
5
5
|
export declare function fsWrite(path: string, content: string): Promise<ToolResult>;
|
|
6
|
+
export interface FileWrite {
|
|
7
|
+
path: string;
|
|
8
|
+
content: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Write several files in a single tool call. This is the workhorse for
|
|
12
|
+
* scaffolding a project: a React app, an Express server, etc. all need a
|
|
13
|
+
* handful of files, and forcing one fs.write per file burns through the
|
|
14
|
+
* agent's step budget (the most common reason a scaffold never finished).
|
|
15
|
+
*
|
|
16
|
+
* Each entry is validated and written independently — a bad path does not
|
|
17
|
+
* abort the whole batch. Parent directories are created automatically, just
|
|
18
|
+
* like fs.write.
|
|
19
|
+
*/
|
|
20
|
+
export declare function fsWriteMany(files: FileWrite[]): Promise<ToolResult>;
|
|
6
21
|
export declare function fsList(path: string, options?: {
|
|
7
22
|
maxEntries?: number | undefined;
|
|
8
23
|
}): Promise<ToolResult>;
|
package/dist/tools/fs.js
CHANGED
|
@@ -4,6 +4,7 @@ import { homedir, tmpdir } from "node:os";
|
|
|
4
4
|
import { execa } from "execa";
|
|
5
5
|
import { getConfig } from "../store/config.js";
|
|
6
6
|
import { isSecretPath } from "../safety/patterns.js";
|
|
7
|
+
import { safeCwd } from "../os/cwd.js";
|
|
7
8
|
const DEFAULT_READ_MAX_BYTES = 256 * 1024;
|
|
8
9
|
const DEFAULT_LIST_MAX_ENTRIES = 500;
|
|
9
10
|
function expandHome(path) {
|
|
@@ -41,7 +42,7 @@ function ensureNotSecret(resolved) {
|
|
|
41
42
|
function pathInsideSandbox(resolvedPath, mode) {
|
|
42
43
|
const roots = [
|
|
43
44
|
...getConfig().sandboxRoots.map((root) => resolve(expandHome(root))),
|
|
44
|
-
|
|
45
|
+
safeCwd(),
|
|
45
46
|
];
|
|
46
47
|
if (mode === "read") {
|
|
47
48
|
// For reads we also accept the user's home (so dotfiles are inspectable
|
|
@@ -92,7 +93,7 @@ export async function fsRead(path, options = {}) {
|
|
|
92
93
|
const buffer = Buffer.alloc(cap);
|
|
93
94
|
const { bytesRead } = await handle.read(buffer, 0, cap, 0);
|
|
94
95
|
const truncated = stat.size > maxBytes;
|
|
95
|
-
const text = buffer.
|
|
96
|
+
const text = buffer.subarray(0, bytesRead).toString("utf8");
|
|
96
97
|
const suffix = truncated
|
|
97
98
|
? `\n... (truncated at ${maxBytes.toLocaleString()} bytes of ${stat.size.toLocaleString()})`
|
|
98
99
|
: "";
|
|
@@ -116,6 +117,71 @@ export async function fsWrite(path, content) {
|
|
|
116
117
|
await writeFile(resolved, content, "utf8");
|
|
117
118
|
return { ok: true, output: `Wrote ${resolved}` };
|
|
118
119
|
}
|
|
120
|
+
const WRITE_MANY_MAX_FILES = 50;
|
|
121
|
+
/**
|
|
122
|
+
* Write several files in a single tool call. This is the workhorse for
|
|
123
|
+
* scaffolding a project: a React app, an Express server, etc. all need a
|
|
124
|
+
* handful of files, and forcing one fs.write per file burns through the
|
|
125
|
+
* agent's step budget (the most common reason a scaffold never finished).
|
|
126
|
+
*
|
|
127
|
+
* Each entry is validated and written independently — a bad path does not
|
|
128
|
+
* abort the whole batch. Parent directories are created automatically, just
|
|
129
|
+
* like fs.write.
|
|
130
|
+
*/
|
|
131
|
+
export async function fsWriteMany(files) {
|
|
132
|
+
if (!Array.isArray(files) || files.length === 0) {
|
|
133
|
+
return {
|
|
134
|
+
ok: false,
|
|
135
|
+
output: 'fs.writeMany requires a non-empty "files" array of { path, content } objects.',
|
|
136
|
+
exitCode: 1,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
if (files.length > WRITE_MANY_MAX_FILES) {
|
|
140
|
+
return {
|
|
141
|
+
ok: false,
|
|
142
|
+
output: `fs.writeMany accepts at most ${WRITE_MANY_MAX_FILES} files per call (got ${files.length}). Split the scaffold into smaller batches.`,
|
|
143
|
+
exitCode: 1,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const written = [];
|
|
147
|
+
const failures = [];
|
|
148
|
+
for (const file of files) {
|
|
149
|
+
if (!file ||
|
|
150
|
+
typeof file !== "object" ||
|
|
151
|
+
typeof file.path !== "string" ||
|
|
152
|
+
file.path.length === 0 ||
|
|
153
|
+
typeof file.content !== "string") {
|
|
154
|
+
failures.push(`invalid entry — each file needs a non-empty string "path" and a string "content": ${JSON.stringify(file)}`);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
try {
|
|
158
|
+
const resolved = ensureWriteAllowed(file.path);
|
|
159
|
+
await mkdir(dirname(resolved), { recursive: true });
|
|
160
|
+
await writeFile(resolved, file.content, "utf8");
|
|
161
|
+
written.push(resolved);
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
165
|
+
failures.push(`${file.path}: ${msg}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const lines = [];
|
|
169
|
+
if (written.length > 0) {
|
|
170
|
+
lines.push(`Wrote ${written.length} file(s):`);
|
|
171
|
+
for (const p of written)
|
|
172
|
+
lines.push(` ${p}`);
|
|
173
|
+
}
|
|
174
|
+
if (failures.length > 0) {
|
|
175
|
+
lines.push(`Failed ${failures.length} file(s):`);
|
|
176
|
+
for (const f of failures)
|
|
177
|
+
lines.push(` ${f}`);
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
ok: failures.length === 0,
|
|
181
|
+
output: lines.join("\n"),
|
|
182
|
+
exitCode: failures.length === 0 ? 0 : 1,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
119
185
|
export async function fsList(path, options = {}) {
|
|
120
186
|
const resolved = resolvePath(path);
|
|
121
187
|
ensureReadAllowed(resolved, path);
|
|
@@ -133,7 +199,7 @@ export async function fsList(path, options = {}) {
|
|
|
133
199
|
truncated,
|
|
134
200
|
};
|
|
135
201
|
}
|
|
136
|
-
export async function fsSearch(pattern, path =
|
|
202
|
+
export async function fsSearch(pattern, path = safeCwd()) {
|
|
137
203
|
const resolved = resolvePath(path);
|
|
138
204
|
ensureReadAllowed(resolved, path);
|
|
139
205
|
const maxLines = 50;
|
package/dist/tools/fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/tools/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAE9B,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/tools/fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ToolResult } from "../types.js";
|
|
2
|
+
export interface ImageToolRunOptions {
|
|
3
|
+
signal?: AbortSignal | undefined;
|
|
4
|
+
onOutput?: ((chunk: string, stream: "stdout" | "stderr") => void) | undefined;
|
|
5
|
+
}
|
|
6
|
+
/** Fast, safe OCR wrapper for image text extraction.
|
|
7
|
+
*
|
|
8
|
+
* This intentionally uses argv (not shell parsing) so paths with spaces or
|
|
9
|
+
* macOS narrow no-break-space screenshot names cannot corrupt the tesseract
|
|
10
|
+
* argument order. It is a fallback for non-vision models only; vision models
|
|
11
|
+
* should inspect images directly for colors/layout/style.
|
|
12
|
+
*/
|
|
13
|
+
export declare function imageOcr(args: Record<string, unknown>, options?: ImageToolRunOptions): Promise<ToolResult>;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { stat } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import { spawnArgv } from "./shell.js";
|
|
5
|
+
function expandHome(path) {
|
|
6
|
+
if (path === "~")
|
|
7
|
+
return homedir();
|
|
8
|
+
if (path.startsWith("~/") || path.startsWith("~\\")) {
|
|
9
|
+
return resolve(homedir(), path.slice(2));
|
|
10
|
+
}
|
|
11
|
+
return path;
|
|
12
|
+
}
|
|
13
|
+
function optionalString(args, key) {
|
|
14
|
+
const value = args[key];
|
|
15
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
16
|
+
}
|
|
17
|
+
function optionalNumber(args, key) {
|
|
18
|
+
const value = args[key];
|
|
19
|
+
return typeof value === "number" ? value : undefined;
|
|
20
|
+
}
|
|
21
|
+
/** Fast, safe OCR wrapper for image text extraction.
|
|
22
|
+
*
|
|
23
|
+
* This intentionally uses argv (not shell parsing) so paths with spaces or
|
|
24
|
+
* macOS narrow no-break-space screenshot names cannot corrupt the tesseract
|
|
25
|
+
* argument order. It is a fallback for non-vision models only; vision models
|
|
26
|
+
* should inspect images directly for colors/layout/style.
|
|
27
|
+
*/
|
|
28
|
+
export async function imageOcr(args, options = {}) {
|
|
29
|
+
const rawPath = optionalString(args, "path");
|
|
30
|
+
if (!rawPath) {
|
|
31
|
+
return {
|
|
32
|
+
ok: false,
|
|
33
|
+
output: 'image.ocr expects { "path": "/path/to/image.png" }',
|
|
34
|
+
exitCode: 1,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const lang = optionalString(args, "lang") ?? "eng";
|
|
38
|
+
if (!/^[A-Za-z0-9_+-]+$/.test(lang)) {
|
|
39
|
+
return {
|
|
40
|
+
ok: false,
|
|
41
|
+
output: "image.ocr: lang may contain only letters, digits, _, +, or -",
|
|
42
|
+
exitCode: 1,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const psmRaw = optionalNumber(args, "psm") ?? 6;
|
|
46
|
+
const psm = Math.floor(psmRaw);
|
|
47
|
+
if (!Number.isFinite(psmRaw) || psm < 0 || psm > 13) {
|
|
48
|
+
return {
|
|
49
|
+
ok: false,
|
|
50
|
+
output: "image.ocr: psm must be an integer from 0 to 13",
|
|
51
|
+
exitCode: 1,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
const path = resolve(expandHome(rawPath));
|
|
55
|
+
try {
|
|
56
|
+
const info = await stat(path);
|
|
57
|
+
if (!info.isFile()) {
|
|
58
|
+
return {
|
|
59
|
+
ok: false,
|
|
60
|
+
output: `image.ocr: not a regular file: ${path}`,
|
|
61
|
+
exitCode: 1,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return {
|
|
67
|
+
ok: false,
|
|
68
|
+
output: `image.ocr: cannot read ${path}: ${error instanceof Error ? error.message : String(error)}`,
|
|
69
|
+
exitCode: 1,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return spawnArgv({
|
|
73
|
+
command: "tesseract",
|
|
74
|
+
argv: [path, "stdout", "-l", lang, "--psm", String(psm)],
|
|
75
|
+
timeoutMs: 60_000,
|
|
76
|
+
signal: options.signal,
|
|
77
|
+
onOutput: options.onOutput,
|
|
78
|
+
maxModelBytes: 32_000,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/tools/image.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/jobs.js
CHANGED
|
@@ -4,13 +4,14 @@ import { readFile, mkdir } from "node:fs/promises";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { homedir } from "node:os";
|
|
6
6
|
import { randomUUID } from "node:crypto";
|
|
7
|
+
import { safeCwd } from "../os/cwd.js";
|
|
7
8
|
export class JobManager {
|
|
8
9
|
jobs = new Map();
|
|
9
10
|
processes = new Map();
|
|
10
11
|
streams = new Map();
|
|
11
12
|
async startJob(command, options) {
|
|
12
13
|
const id = randomUUID().slice(0, 8);
|
|
13
|
-
const cwd = options?.cwd ??
|
|
14
|
+
const cwd = options?.cwd ?? safeCwd();
|
|
14
15
|
const dir = join(homedir(), ".clai", "jobs");
|
|
15
16
|
await mkdir(dir, { recursive: true });
|
|
16
17
|
const artifactPath = join(dir, `${new Date().toISOString().replace(/[:.]/g, "-")}-${id}.txt`);
|
package/dist/tools/jobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAoB,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/tools/jobs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ToolResult } from "../types.js";
|
|
2
|
+
export interface PdfToolRunOptions {
|
|
3
|
+
signal?: AbortSignal | undefined;
|
|
4
|
+
onOutput?: ((chunk: string, stream: "stdout" | "stderr") => void) | undefined;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Read a PDF as text.
|
|
8
|
+
*
|
|
9
|
+
* Strategy (mirrors what a human would do):
|
|
10
|
+
* 1. Run `pdftotext -layout <pdf> -` — fast and exact for born-digital PDFs.
|
|
11
|
+
* 2. If that yields little/no real text the PDF is scanned (image-only), so
|
|
12
|
+
* render every page to a PNG with `pdftoppm` and OCR each one with
|
|
13
|
+
* `tesseract`, concatenating the results page by page.
|
|
14
|
+
*
|
|
15
|
+
* Auto-executes (read-only). Returns a helpful error naming the missing
|
|
16
|
+
* binary so the agent can pkg.install it and retry.
|
|
17
|
+
*/
|
|
18
|
+
export declare function pdfRead(args: Record<string, unknown>, options?: PdfToolRunOptions): Promise<ToolResult>;
|