@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.
Files changed (123) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/context-manager.js +8 -2
  3. package/dist/agent/context-manager.js.map +1 -1
  4. package/dist/agent/loop-guard.d.ts +2 -0
  5. package/dist/agent/loop-guard.js +39 -2
  6. package/dist/agent/loop-guard.js.map +1 -1
  7. package/dist/agent/plan-tool.d.ts +22 -0
  8. package/dist/agent/plan-tool.js +357 -44
  9. package/dist/agent/plan-tool.js.map +1 -1
  10. package/dist/agent/project-root.d.ts +33 -0
  11. package/dist/agent/project-root.js +158 -0
  12. package/dist/agent/project-root.js.map +1 -0
  13. package/dist/agent/runner.js +1119 -240
  14. package/dist/agent/runner.js.map +1 -1
  15. package/dist/agent/task-evidence.d.ts +103 -0
  16. package/dist/agent/task-evidence.js +413 -0
  17. package/dist/agent/task-evidence.js.map +1 -0
  18. package/dist/agent/tool-call-parser.d.ts +16 -0
  19. package/dist/agent/tool-call-parser.js +86 -28
  20. package/dist/agent/tool-call-parser.js.map +1 -1
  21. package/dist/agent/tool-history.d.ts +27 -0
  22. package/dist/agent/tool-history.js +150 -0
  23. package/dist/agent/tool-history.js.map +1 -0
  24. package/dist/agent/workspace-orient.d.ts +64 -0
  25. package/dist/agent/workspace-orient.js +418 -0
  26. package/dist/agent/workspace-orient.js.map +1 -0
  27. package/dist/app/controllers/session-controller.js +4 -0
  28. package/dist/app/controllers/session-controller.js.map +1 -1
  29. package/dist/commands/doctor.js +3 -0
  30. package/dist/commands/doctor.js.map +1 -1
  31. package/dist/commands/update.js +1 -1
  32. package/dist/llm/adapters/anthropic-tools.d.ts +99 -0
  33. package/dist/llm/adapters/anthropic-tools.js +225 -0
  34. package/dist/llm/adapters/anthropic-tools.js.map +1 -0
  35. package/dist/llm/adapters/gemini-tools.d.ts +54 -0
  36. package/dist/llm/adapters/gemini-tools.js +139 -0
  37. package/dist/llm/adapters/gemini-tools.js.map +1 -0
  38. package/dist/llm/adapters/ollama-tools.d.ts +22 -0
  39. package/dist/llm/adapters/ollama-tools.js +62 -0
  40. package/dist/llm/adapters/ollama-tools.js.map +1 -0
  41. package/dist/llm/adapters/openai-tools.d.ts +39 -0
  42. package/dist/llm/adapters/openai-tools.js +71 -0
  43. package/dist/llm/adapters/openai-tools.js.map +1 -0
  44. package/dist/llm/agentrouter.js +23 -4
  45. package/dist/llm/agentrouter.js.map +1 -1
  46. package/dist/llm/anthropic.js +93 -92
  47. package/dist/llm/anthropic.js.map +1 -1
  48. package/dist/llm/aws-mantle.js +93 -56
  49. package/dist/llm/aws-mantle.js.map +1 -1
  50. package/dist/llm/bynara.js +23 -4
  51. package/dist/llm/bynara.js.map +1 -1
  52. package/dist/llm/capabilities.d.ts +7 -0
  53. package/dist/llm/capabilities.js +74 -0
  54. package/dist/llm/capabilities.js.map +1 -1
  55. package/dist/llm/gemini.js +63 -48
  56. package/dist/llm/gemini.js.map +1 -1
  57. package/dist/llm/groq.js +23 -4
  58. package/dist/llm/groq.js.map +1 -1
  59. package/dist/llm/http.d.ts +22 -17
  60. package/dist/llm/http.js +99 -26
  61. package/dist/llm/http.js.map +1 -1
  62. package/dist/llm/kimchi.js +23 -4
  63. package/dist/llm/kimchi.js.map +1 -1
  64. package/dist/llm/nvidia.js +23 -4
  65. package/dist/llm/nvidia.js.map +1 -1
  66. package/dist/llm/ollama.js +49 -31
  67. package/dist/llm/ollama.js.map +1 -1
  68. package/dist/llm/openai.js +23 -4
  69. package/dist/llm/openai.js.map +1 -1
  70. package/dist/llm/openrouter.js +23 -4
  71. package/dist/llm/openrouter.js.map +1 -1
  72. package/dist/llm/qwen-cloud.js +23 -4
  73. package/dist/llm/qwen-cloud.js.map +1 -1
  74. package/dist/llm/router.js +48 -6
  75. package/dist/llm/router.js.map +1 -1
  76. package/dist/llm/tool-protocol.d.ts +73 -0
  77. package/dist/llm/tool-protocol.js +282 -0
  78. package/dist/llm/tool-protocol.js.map +1 -0
  79. package/dist/modes/ask.js +74 -20
  80. package/dist/modes/ask.js.map +1 -1
  81. package/dist/prompts/index.d.ts +13 -5
  82. package/dist/prompts/index.js +116 -18
  83. package/dist/prompts/index.js.map +1 -1
  84. package/dist/repl.js +7 -0
  85. package/dist/repl.js.map +1 -1
  86. package/dist/store/config.d.ts +7 -0
  87. package/dist/store/config.js +1 -0
  88. package/dist/store/config.js.map +1 -1
  89. package/dist/store/plan.d.ts +2 -0
  90. package/dist/store/plan.js.map +1 -1
  91. package/dist/tools/capabilities.d.ts +2 -0
  92. package/dist/tools/capabilities.js +101 -6
  93. package/dist/tools/capabilities.js.map +1 -1
  94. package/dist/tools/command-intent.d.ts +1 -0
  95. package/dist/tools/command-intent.js +31 -0
  96. package/dist/tools/command-intent.js.map +1 -1
  97. package/dist/tools/definitions.d.ts +20 -0
  98. package/dist/tools/definitions.js +509 -0
  99. package/dist/tools/definitions.js.map +1 -0
  100. package/dist/tools/fs.js +12 -3
  101. package/dist/tools/fs.js.map +1 -1
  102. package/dist/tools/net-ping-sweep.js +69 -16
  103. package/dist/tools/net-ping-sweep.js.map +1 -1
  104. package/dist/tools/nmap-runner.d.ts +8 -7
  105. package/dist/tools/nmap-runner.js +126 -65
  106. package/dist/tools/nmap-runner.js.map +1 -1
  107. package/dist/tools/registry.js +45 -7
  108. package/dist/tools/registry.js.map +1 -1
  109. package/dist/tools/validate.d.ts +11 -0
  110. package/dist/tools/validate.js +53 -0
  111. package/dist/tools/validate.js.map +1 -1
  112. package/dist/tools/web/search.js +48 -4
  113. package/dist/tools/web/search.js.map +1 -1
  114. package/dist/tui-v2/components/transcript/tool-card.js +1 -1
  115. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  116. package/dist/tui-v2/rendering/tool-presenter.d.ts +6 -1
  117. package/dist/tui-v2/rendering/tool-presenter.js +66 -2
  118. package/dist/tui-v2/rendering/tool-presenter.js.map +1 -1
  119. package/dist/types.d.ts +58 -0
  120. package/dist/ui/ansi-box.d.ts +2 -0
  121. package/dist/ui/ansi-box.js +8 -1
  122. package/dist/ui/ansi-box.js.map +1 -1
  123. 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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"}