@pentoshi/clai 3.5.1 → 3.6.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/README.md +1 -1
- package/dist/agent/context-manager.js +8 -2
- package/dist/agent/context-manager.js.map +1 -1
- package/dist/agent/loop-guard.d.ts +2 -0
- package/dist/agent/loop-guard.js +39 -2
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/plan-tool.d.ts +22 -0
- package/dist/agent/plan-tool.js +357 -44
- package/dist/agent/plan-tool.js.map +1 -1
- package/dist/agent/project-root.d.ts +33 -0
- package/dist/agent/project-root.js +158 -0
- package/dist/agent/project-root.js.map +1 -0
- package/dist/agent/runner.js +1119 -240
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/task-evidence.d.ts +103 -0
- package/dist/agent/task-evidence.js +413 -0
- package/dist/agent/task-evidence.js.map +1 -0
- package/dist/agent/tool-call-parser.d.ts +16 -0
- package/dist/agent/tool-call-parser.js +86 -28
- package/dist/agent/tool-call-parser.js.map +1 -1
- package/dist/agent/tool-history.d.ts +27 -0
- package/dist/agent/tool-history.js +150 -0
- package/dist/agent/tool-history.js.map +1 -0
- package/dist/agent/workspace-orient.d.ts +64 -0
- package/dist/agent/workspace-orient.js +418 -0
- package/dist/agent/workspace-orient.js.map +1 -0
- package/dist/app/controllers/session-controller.js +4 -0
- package/dist/app/controllers/session-controller.js.map +1 -1
- package/dist/commands/doctor.js +3 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/update.js +1 -1
- package/dist/llm/adapters/anthropic-tools.d.ts +99 -0
- package/dist/llm/adapters/anthropic-tools.js +225 -0
- package/dist/llm/adapters/anthropic-tools.js.map +1 -0
- package/dist/llm/adapters/gemini-tools.d.ts +54 -0
- package/dist/llm/adapters/gemini-tools.js +139 -0
- package/dist/llm/adapters/gemini-tools.js.map +1 -0
- package/dist/llm/adapters/ollama-tools.d.ts +22 -0
- package/dist/llm/adapters/ollama-tools.js +62 -0
- package/dist/llm/adapters/ollama-tools.js.map +1 -0
- package/dist/llm/adapters/openai-tools.d.ts +39 -0
- package/dist/llm/adapters/openai-tools.js +71 -0
- package/dist/llm/adapters/openai-tools.js.map +1 -0
- package/dist/llm/agentrouter.js +23 -4
- package/dist/llm/agentrouter.js.map +1 -1
- package/dist/llm/anthropic.js +93 -92
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/aws-mantle.js +93 -56
- package/dist/llm/aws-mantle.js.map +1 -1
- package/dist/llm/bynara.js +23 -4
- package/dist/llm/bynara.js.map +1 -1
- package/dist/llm/capabilities.d.ts +7 -0
- package/dist/llm/capabilities.js +74 -0
- package/dist/llm/capabilities.js.map +1 -1
- package/dist/llm/gemini.js +63 -48
- package/dist/llm/gemini.js.map +1 -1
- package/dist/llm/groq.js +23 -4
- package/dist/llm/groq.js.map +1 -1
- package/dist/llm/http.d.ts +22 -17
- package/dist/llm/http.js +99 -26
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/kimchi.js +23 -4
- package/dist/llm/kimchi.js.map +1 -1
- package/dist/llm/nvidia.js +23 -4
- package/dist/llm/nvidia.js.map +1 -1
- package/dist/llm/ollama.js +49 -31
- package/dist/llm/ollama.js.map +1 -1
- package/dist/llm/openai.js +23 -4
- package/dist/llm/openai.js.map +1 -1
- package/dist/llm/openrouter.js +23 -4
- package/dist/llm/openrouter.js.map +1 -1
- package/dist/llm/qwen-cloud.js +23 -4
- package/dist/llm/qwen-cloud.js.map +1 -1
- package/dist/llm/router.js +48 -6
- package/dist/llm/router.js.map +1 -1
- package/dist/llm/tool-protocol.d.ts +73 -0
- package/dist/llm/tool-protocol.js +282 -0
- package/dist/llm/tool-protocol.js.map +1 -0
- package/dist/modes/ask.js +74 -20
- package/dist/modes/ask.js.map +1 -1
- package/dist/prompts/index.d.ts +13 -5
- package/dist/prompts/index.js +116 -18
- package/dist/prompts/index.js.map +1 -1
- package/dist/repl.js +7 -0
- package/dist/repl.js.map +1 -1
- package/dist/store/config.d.ts +7 -0
- package/dist/store/config.js +1 -0
- package/dist/store/config.js.map +1 -1
- package/dist/store/plan.d.ts +2 -0
- package/dist/store/plan.js.map +1 -1
- package/dist/tools/capabilities.d.ts +2 -0
- package/dist/tools/capabilities.js +101 -6
- package/dist/tools/capabilities.js.map +1 -1
- package/dist/tools/command-intent.d.ts +1 -0
- package/dist/tools/command-intent.js +31 -0
- package/dist/tools/command-intent.js.map +1 -1
- package/dist/tools/definitions.d.ts +20 -0
- package/dist/tools/definitions.js +509 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/fs.js +12 -3
- package/dist/tools/fs.js.map +1 -1
- package/dist/tools/net-ping-sweep.js +69 -16
- package/dist/tools/net-ping-sweep.js.map +1 -1
- package/dist/tools/nmap-runner.d.ts +8 -7
- package/dist/tools/nmap-runner.js +126 -65
- package/dist/tools/nmap-runner.js.map +1 -1
- package/dist/tools/registry.js +45 -7
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/validate.d.ts +11 -0
- package/dist/tools/validate.js +53 -0
- package/dist/tools/validate.js.map +1 -1
- package/dist/tools/web/search.js +48 -4
- package/dist/tools/web/search.js.map +1 -1
- package/dist/tui-v2/components/transcript/tool-card.js +1 -1
- package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
- package/dist/tui-v2/rendering/tool-presenter.d.ts +6 -1
- package/dist/tui-v2/rendering/tool-presenter.js +66 -2
- package/dist/tui-v2/rendering/tool-presenter.js.map +1 -1
- package/dist/types.d.ts +58 -0
- package/dist/ui/ansi-box.d.ts +2 -0
- package/dist/ui/ansi-box.js +8 -1
- package/dist/ui/ansi-box.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { isAbsolute, join, resolve } from "node:path";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { safeCwd } from "../os/cwd.js";
|
|
5
|
+
import { isBareParentDirectory, isExistingProjectDir, resolveScaffoldTargetPath, } from "./workspace-orient.js";
|
|
6
|
+
/**
|
|
7
|
+
* Sticky project root for the active plan/session turn.
|
|
8
|
+
* Relative fs paths and bare shell cwd resolve here so the agent never
|
|
9
|
+
* rewrites the agent package while working in a user project elsewhere.
|
|
10
|
+
*/
|
|
11
|
+
let activeProjectRoot;
|
|
12
|
+
export function setActiveProjectRoot(root) {
|
|
13
|
+
if (!root?.trim()) {
|
|
14
|
+
activeProjectRoot = undefined;
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const resolved = resolve(root.trim());
|
|
18
|
+
// Never pin sticky root to a bare parent (Desktop/home) — that makes
|
|
19
|
+
// relative "src/…" land on Desktop/src instead of the real project.
|
|
20
|
+
if (isBareParentDirectory(resolved)) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
activeProjectRoot = resolved;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Pin root only when the path exists (or force=true after a successful scaffold).
|
|
27
|
+
* Prevents inventing Desktop/todo-app before the folder is real.
|
|
28
|
+
*/
|
|
29
|
+
export function setActiveProjectRootIfValid(root, opts) {
|
|
30
|
+
if (!root?.trim())
|
|
31
|
+
return false;
|
|
32
|
+
const resolved = resolve(root.trim());
|
|
33
|
+
if (isBareParentDirectory(resolved))
|
|
34
|
+
return false;
|
|
35
|
+
if (!opts?.force && !existsSync(resolved))
|
|
36
|
+
return false;
|
|
37
|
+
activeProjectRoot = resolved;
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
export function getActiveProjectRoot() {
|
|
41
|
+
return activeProjectRoot;
|
|
42
|
+
}
|
|
43
|
+
export function clearActiveProjectRoot() {
|
|
44
|
+
activeProjectRoot = undefined;
|
|
45
|
+
}
|
|
46
|
+
/** Absolute POSIX/mac paths under the user tree that look like project dirs. */
|
|
47
|
+
const ABS_PROJECT_RE = /(?:^|[\s"'`=])(\/(?:Users|home)\/[^\s"'`:]+?(?:\/(?:Desktop|Documents|Projects|dev|code|src|work|repos?)\/[^\s"'`:]+|\/[^\s"'`:]*todo[^\s"'`/]*))(?=[\s"'`]|$)/gi;
|
|
48
|
+
/**
|
|
49
|
+
* Pull the best project directory from plan text / user prompt.
|
|
50
|
+
* Prefers existing paths; never returns bare Desktop alone when a deeper path exists.
|
|
51
|
+
*/
|
|
52
|
+
export function extractProjectRootFromText(...parts) {
|
|
53
|
+
const blob = parts.filter(Boolean).join("\n");
|
|
54
|
+
if (!blob.trim())
|
|
55
|
+
return undefined;
|
|
56
|
+
const candidates = [];
|
|
57
|
+
let m;
|
|
58
|
+
const re = new RegExp(ABS_PROJECT_RE.source, ABS_PROJECT_RE.flags);
|
|
59
|
+
while ((m = re.exec(blob)) !== null) {
|
|
60
|
+
const p = m[1].replace(/\/+$/, "");
|
|
61
|
+
candidates.push(p);
|
|
62
|
+
}
|
|
63
|
+
// Relative "…/Desktop/todo-app" without leading path — join home
|
|
64
|
+
const relDesk = blob.match(/(?:^|[\s"'`])(?:~\/Desktop|Desktop)\/([A-Za-z0-9._-]+)/);
|
|
65
|
+
if (relDesk?.[1]) {
|
|
66
|
+
candidates.push(join(homedir(), "Desktop", relDesk[1]));
|
|
67
|
+
}
|
|
68
|
+
if (candidates.length === 0)
|
|
69
|
+
return undefined;
|
|
70
|
+
// Prefer deepest path (project folder over Desktop alone)
|
|
71
|
+
candidates.sort((a, b) => b.length - a.length);
|
|
72
|
+
// Prefer candidates that already exist on disk
|
|
73
|
+
const existing = candidates.filter((c) => existsSync(resolve(c)));
|
|
74
|
+
const pool = existing.length > 0 ? existing : candidates;
|
|
75
|
+
for (const c of pool) {
|
|
76
|
+
const resolved = resolve(c);
|
|
77
|
+
if (isBareParentDirectory(resolved) && pool.some((x) => x.length > c.length)) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (isBareParentDirectory(resolved))
|
|
81
|
+
continue;
|
|
82
|
+
return resolved;
|
|
83
|
+
}
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
export function extractProjectRootFromPlan(plan) {
|
|
87
|
+
if (!plan)
|
|
88
|
+
return undefined;
|
|
89
|
+
return extractProjectRootFromText(plan.goal, plan.detail, ...plan.tasks.map((t) => t.title));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* After a successful one-shot scaffolder, derive the project directory.
|
|
93
|
+
* Stack-agnostic: npm create, cargo new, rails new, poetry new, etc.
|
|
94
|
+
*/
|
|
95
|
+
export function extractProjectRootFromScaffold(command, shellCwd) {
|
|
96
|
+
return resolveScaffoldTargetPath(command, shellCwd);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Resolve a tool path: absolute stays absolute; relative uses active project
|
|
100
|
+
* root when set, else process cwd.
|
|
101
|
+
*/
|
|
102
|
+
export function resolveToolPath(path) {
|
|
103
|
+
const trimmed = path.trim();
|
|
104
|
+
if (!trimmed)
|
|
105
|
+
return resolve(safeCwd(), ".");
|
|
106
|
+
let expanded = trimmed;
|
|
107
|
+
if (expanded === "~")
|
|
108
|
+
expanded = homedir();
|
|
109
|
+
else if (expanded.startsWith("~/") || expanded.startsWith("~\\")) {
|
|
110
|
+
expanded = join(homedir(), expanded.slice(2));
|
|
111
|
+
}
|
|
112
|
+
if (isAbsolute(expanded)) {
|
|
113
|
+
return resolve(expanded);
|
|
114
|
+
}
|
|
115
|
+
const root = getActiveProjectRoot();
|
|
116
|
+
if (root) {
|
|
117
|
+
return resolve(root, expanded);
|
|
118
|
+
}
|
|
119
|
+
return resolve(safeCwd(), expanded);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* If the model wrote into the agent package while a project root is set
|
|
123
|
+
* elsewhere, remap onto the project (keeps relative subpath).
|
|
124
|
+
* Generic: any relative path or common source roots (src, lib, app, …).
|
|
125
|
+
*/
|
|
126
|
+
export function remapAgentCwdWrite(resolved, original) {
|
|
127
|
+
const root = getActiveProjectRoot();
|
|
128
|
+
if (!root)
|
|
129
|
+
return resolved;
|
|
130
|
+
const agent = safeCwd();
|
|
131
|
+
if (root === agent)
|
|
132
|
+
return resolved;
|
|
133
|
+
// Already under project
|
|
134
|
+
if (resolved === root ||
|
|
135
|
+
resolved.startsWith(root + "/") ||
|
|
136
|
+
resolved.startsWith(root + "\\")) {
|
|
137
|
+
return resolved;
|
|
138
|
+
}
|
|
139
|
+
// Relative original wrongly resolved into agent cwd
|
|
140
|
+
if (!isAbsolute(original.trim()) &&
|
|
141
|
+
(resolved.startsWith(agent + "/") || resolved.startsWith(agent + "\\"))) {
|
|
142
|
+
const rel = resolved.slice(agent.length).replace(/^[/\\]/, "");
|
|
143
|
+
return resolve(root, rel);
|
|
144
|
+
}
|
|
145
|
+
// Absolute path under agent that looks like app source
|
|
146
|
+
if ((resolved.startsWith(agent + "/") || resolved.startsWith(agent + "\\")) &&
|
|
147
|
+
existsSync(root) &&
|
|
148
|
+
isExistingProjectDir(root)) {
|
|
149
|
+
const rel = resolved.slice(agent.length).replace(/^[/\\]+/, "");
|
|
150
|
+
// Common project-relative source trees (language-agnostic)
|
|
151
|
+
if (/^(src|lib|app|apps|packages|cmd|internal|pkg|tests?|spec|public|static|assets|components|pages|routes|handlers|models|views)[/\\]/i.test(rel) ||
|
|
152
|
+
/\.(jsx?|tsx?|vue|svelte|py|go|rs|java|kt|rb|php|swift|cs)$/i.test(rel)) {
|
|
153
|
+
return resolve(root, rel);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return resolved;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=project-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-root.js","sourceRoot":"","sources":["../../src/agent/project-root.ts"],"names":[],"mappings":"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"}
|