@pentoshi/clai 2.0.14 → 2.0.16

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 (63) hide show
  1. package/dist/agent/context-manager.js +40 -3
  2. package/dist/agent/context-manager.js.map +1 -1
  3. package/dist/agent/runner.d.ts +4 -0
  4. package/dist/agent/runner.js +362 -395
  5. package/dist/agent/runner.js.map +1 -1
  6. package/dist/commands/providers.js +10 -11
  7. package/dist/commands/providers.js.map +1 -1
  8. package/dist/commands/search-providers.js +10 -11
  9. package/dist/commands/search-providers.js.map +1 -1
  10. package/dist/commands/update.js +1 -1
  11. package/dist/llm/groq.d.ts +1 -0
  12. package/dist/llm/groq.js +45 -1
  13. package/dist/llm/groq.js.map +1 -1
  14. package/dist/llm/http.js +9 -2
  15. package/dist/llm/http.js.map +1 -1
  16. package/dist/llm/provider.js +4 -7
  17. package/dist/llm/provider.js.map +1 -1
  18. package/dist/llm/router.js +8 -2
  19. package/dist/llm/router.js.map +1 -1
  20. package/dist/modes/ask.js +5 -3
  21. package/dist/modes/ask.js.map +1 -1
  22. package/dist/prompts/index.d.ts +2 -2
  23. package/dist/prompts/index.js +6 -3
  24. package/dist/prompts/index.js.map +1 -1
  25. package/dist/safety/classifier.js +10 -50
  26. package/dist/safety/classifier.js.map +1 -1
  27. package/dist/store/keys.js +50 -18
  28. package/dist/store/keys.js.map +1 -1
  29. package/dist/tools/http.d.ts +1 -0
  30. package/dist/tools/http.js +109 -9
  31. package/dist/tools/http.js.map +1 -1
  32. package/dist/tools/jobs.d.ts +4 -0
  33. package/dist/tools/jobs.js +29 -1
  34. package/dist/tools/jobs.js.map +1 -1
  35. package/dist/tools/registry.js +5 -8
  36. package/dist/tools/registry.js.map +1 -1
  37. package/dist/tools/web/fetch-core.js +6 -9
  38. package/dist/tools/web/fetch-core.js.map +1 -1
  39. package/dist/tools/web/fetch.js +26 -0
  40. package/dist/tools/web/fetch.js.map +1 -1
  41. package/dist/tools/web/readable.d.ts +7 -3
  42. package/dist/tools/web/readable.js +235 -11
  43. package/dist/tools/web/readable.js.map +1 -1
  44. package/dist/tools/web/types.d.ts +7 -8
  45. package/dist/tools/web/types.js +3 -3
  46. package/dist/tools/web/types.js.map +1 -1
  47. package/dist/tui/App.js +114 -27
  48. package/dist/tui/App.js.map +1 -1
  49. package/dist/tui/components/SecretInputPanel.d.ts +1 -0
  50. package/dist/tui/components/SecretInputPanel.js +15 -2
  51. package/dist/tui/components/SecretInputPanel.js.map +1 -1
  52. package/dist/tui/format-keys.js +16 -15
  53. package/dist/tui/format-keys.js.map +1 -1
  54. package/dist/tui/hooks/useAgentRunner.d.ts +1 -2
  55. package/dist/tui/hooks/useAgentRunner.js +5 -2
  56. package/dist/tui/hooks/useAgentRunner.js.map +1 -1
  57. package/dist/tui/render-lines.js +187 -30
  58. package/dist/tui/render-lines.js.map +1 -1
  59. package/dist/tui/state.js +10 -19
  60. package/dist/tui/state.js.map +1 -1
  61. package/dist/ui/thinking.js +14 -2
  62. package/dist/ui/thinking.js.map +1 -1
  63. package/package.json +1 -1
@@ -47,28 +47,46 @@ const STRIPPED_SELECTORS = [
47
47
  * 5. Collapses every run of ASCII/Unicode whitespace (including newlines,
48
48
  * tabs, NBSPs) into a single space and trims the result so the agent
49
49
  * receives compact prose.
50
+ * 6. Appends a deduplicated "Links" section so the agent can find the
51
+ * correct URL for any link on the page without guessing.
50
52
  *
51
- * Empty input, whitespace-only input, and input that contains only
52
- * stripped elements all yield the empty string.
53
+ * @param html - Raw HTML string to convert.
54
+ * @param baseUrl - The final page URL (used to resolve relative hrefs).
55
+ * When provided, all href values are resolved to absolute
56
+ * URLs. When omitted, relative hrefs are included as-is.
53
57
  */
54
- export function toReadableText(html) {
58
+ export function toReadableText(html, baseUrl) {
55
59
  if (typeof html !== "string" || html.length === 0)
56
60
  return "";
57
61
  const $ = cheerio.load(html);
58
- // 1. Remove non-content elements outright.
59
62
  $(STRIPPED_SELECTORS).remove();
60
- // 2. Remove every comment node still attached to the tree. cheerio
61
- // represents comments with `type === "comment"`; we walk the full
62
- // contents of `*` so nested comments inside any remaining element
63
- // are caught.
64
- $("*")
63
+ $("[aria-hidden='true'], [hidden], template, svg, canvas").remove();
64
+ $('*')
65
65
  .contents()
66
66
  .filter(function () {
67
67
  return this.type === "comment";
68
68
  })
69
69
  .remove();
70
- const raw = $.root().text();
71
- return collapseWhitespace(raw);
70
+ const title = collapseWhitespace($("title").first().text());
71
+ const description = collapseWhitespace($("meta[name='description']").attr("content") ?? "");
72
+ const root = bestContentRoot($);
73
+ const lines = renderChildren($, root, baseUrl);
74
+ const out = [];
75
+ if (title)
76
+ out.push(`# ${title}`);
77
+ if (description && description !== title)
78
+ out.push(`Summary: ${description}`);
79
+ out.push(...lines);
80
+ // Collect all links on the page and append a deduplicated Links section.
81
+ // This is the canonical source of URLs — the agent must use these rather
82
+ // than constructing or guessing paths.
83
+ const linkSection = collectLinks($, baseUrl);
84
+ if (linkSection.length > 0) {
85
+ out.push("");
86
+ out.push("## Links");
87
+ out.push(...linkSection);
88
+ }
89
+ return normalizeReadableLines(out);
72
90
  }
73
91
  /**
74
92
  * Collapse every contiguous run of whitespace characters into a single
@@ -86,6 +104,212 @@ function collapseWhitespace(text) {
86
104
  .replace(/[\s\u00a0\u2000-\u200a\u200b\u200c\u200d\u2028\u2029\ufeff]+/g, " ")
87
105
  .trim();
88
106
  }
107
+ /**
108
+ * Resolve an href (possibly relative) against a base URL string.
109
+ * Returns the absolute URL string, or the original href if resolution fails.
110
+ */
111
+ function resolveHref(href, baseUrl) {
112
+ if (!baseUrl)
113
+ return href;
114
+ try {
115
+ return new URL(href, baseUrl).href;
116
+ }
117
+ catch {
118
+ return href;
119
+ }
120
+ }
121
+ /**
122
+ * Collect all unique, non-anchor-only `<a href>` links from the page and
123
+ * return them as `[text](url)` markdown lines for the Links section.
124
+ * Deduplicates by URL. Fragment-only (#section) links are skipped.
125
+ * Limits to 80 links to avoid flooding the model context.
126
+ */
127
+ function collectLinks($, baseUrl) {
128
+ const seen = new Set();
129
+ const links = [];
130
+ $("a[href]").each((_, el) => {
131
+ const rawHref = collapseWhitespace($(el).attr("href") ?? "");
132
+ if (!rawHref || rawHref.startsWith("#"))
133
+ return;
134
+ const resolved = resolveHref(rawHref, baseUrl);
135
+ // Skip javascript: and mailto: etc.
136
+ if (/^(javascript|mailto|tel):/i.test(resolved))
137
+ return;
138
+ if (seen.has(resolved))
139
+ return;
140
+ seen.add(resolved);
141
+ const text = collapseWhitespace($(el).text()) || resolved;
142
+ links.push(`- [${text}](${resolved})`);
143
+ if (links.length >= 80)
144
+ return false; // cheerio each — returning false stops iteration
145
+ });
146
+ return links;
147
+ }
148
+ function bestContentRoot($) {
149
+ const candidates = [
150
+ "main",
151
+ "article",
152
+ "[role='main']",
153
+ "#content",
154
+ "#main",
155
+ ".content",
156
+ ".main",
157
+ "body",
158
+ ];
159
+ let best = $("body").first();
160
+ let bestScore = collapseWhitespace(best.text()).length;
161
+ for (const selector of candidates) {
162
+ $(selector).each((_, el) => {
163
+ const node = $(el);
164
+ const score = collapseWhitespace(node.text()).length;
165
+ if (score > bestScore || (score > 200 && selector !== "body")) {
166
+ best = node;
167
+ bestScore = score;
168
+ }
169
+ });
170
+ if (selector !== "body" && bestScore > 200 && best.is(selector))
171
+ break;
172
+ }
173
+ return best.length ? best : $.root();
174
+ }
175
+ function renderChildren($, node, baseUrl) {
176
+ const lines = [];
177
+ node.contents().each((_, child) => {
178
+ lines.push(...renderNode($, child, baseUrl));
179
+ });
180
+ return lines;
181
+ }
182
+ function renderNode($, node, baseUrl) {
183
+ const wrapped = $(node);
184
+ const raw = wrapped.get(0);
185
+ if (!raw)
186
+ return [];
187
+ if (raw.type === "text") {
188
+ const text = collapseWhitespace(wrapped.text());
189
+ return text ? [text] : [];
190
+ }
191
+ if (raw.type !== "tag")
192
+ return [];
193
+ const tag = (raw.tagName ?? raw.name ?? "").toLowerCase();
194
+ if (!tag || STRIPPED_SELECTORS.split(", ").includes(tag))
195
+ return [];
196
+ if (/^h[1-6]$/.test(tag)) {
197
+ const level = Math.min(Number(tag[1]), 6);
198
+ const text = inlineText($, wrapped, baseUrl);
199
+ return text ? [`${"#".repeat(level)} ${text}`] : [];
200
+ }
201
+ if (tag === "p" || tag === "blockquote") {
202
+ const text = inlineText($, wrapped, baseUrl);
203
+ if (!text)
204
+ return [];
205
+ return [tag === "blockquote" ? `> ${text}` : text];
206
+ }
207
+ if (tag === "br")
208
+ return [""];
209
+ if (tag === "pre") {
210
+ const text = wrapped.text().replace(/\n{3,}/g, "\n\n").trim();
211
+ return text ? ["```", text, "```"] : [];
212
+ }
213
+ if (tag === "code") {
214
+ const text = collapseWhitespace(wrapped.text());
215
+ return text ? [`\`${text}\``] : [];
216
+ }
217
+ if (tag === "ul" || tag === "ol") {
218
+ const ordered = tag === "ol";
219
+ const items = [];
220
+ wrapped.children("li").each((index, li) => {
221
+ const text = inlineText($, $(li), baseUrl);
222
+ if (text)
223
+ items.push(`${ordered ? `${index + 1}.` : "-"} ${text}`);
224
+ });
225
+ return items;
226
+ }
227
+ if (tag === "table")
228
+ return renderTable($, wrapped, baseUrl);
229
+ if (tag === "img") {
230
+ const alt = collapseWhitespace(wrapped.attr("alt") ?? "");
231
+ const src = collapseWhitespace(wrapped.attr("src") ?? "");
232
+ if (!alt && !src)
233
+ return [];
234
+ return [`Image: ${alt || src}${alt && src ? ` (${src})` : ""}`];
235
+ }
236
+ if (tag === "form")
237
+ return renderForm($, wrapped);
238
+ if (tag === "a") {
239
+ const text = inlineText($, wrapped, baseUrl);
240
+ return text ? [text] : [];
241
+ }
242
+ return renderChildren($, wrapped, baseUrl);
243
+ }
244
+ function inlineText($, node, baseUrl) {
245
+ const clone = node.clone();
246
+ clone.find("script, style, noscript, svg, canvas").remove();
247
+ clone.find("a[href]").each((_, el) => {
248
+ const link = $(el);
249
+ const text = collapseWhitespace(link.text());
250
+ const rawHref = collapseWhitespace(link.attr("href") ?? "");
251
+ if (rawHref && !rawHref.startsWith("#")) {
252
+ const href = resolveHref(rawHref, baseUrl);
253
+ if (text)
254
+ link.text(`${text} (${href})`);
255
+ }
256
+ });
257
+ clone.find("img").each((_, el) => {
258
+ const img = $(el);
259
+ const alt = collapseWhitespace(img.attr("alt") ?? "");
260
+ img.replaceWith(alt ? ` Image: ${alt} ` : " ");
261
+ });
262
+ return collapseWhitespace(clone.text());
263
+ }
264
+ function renderTable($, table, baseUrl) {
265
+ const rows = [];
266
+ table.find("tr").each((_, tr) => {
267
+ const cells = [];
268
+ $(tr).children("th,td").each((__, cell) => {
269
+ cells.push(inlineText($, $(cell), baseUrl));
270
+ });
271
+ if (cells.some(Boolean))
272
+ rows.push(cells);
273
+ });
274
+ if (rows.length === 0)
275
+ return [];
276
+ const width = Math.max(...rows.map((row) => row.length));
277
+ const normalized = rows.map((row) => Array.from({ length: width }, (_, i) => row[i] ?? ""));
278
+ const header = normalized[0];
279
+ return [
280
+ `| ${header.join(" | ")} |`,
281
+ `| ${header.map(() => "---").join(" | ")} |`,
282
+ ...normalized.slice(1).map((row) => `| ${row.join(" | ")} |`),
283
+ ];
284
+ }
285
+ function renderForm($, form) {
286
+ const fields = [];
287
+ form.find("input, textarea, select, button").each((_, el) => {
288
+ const field = $(el);
289
+ const tag = field.get(0).tagName?.toLowerCase() ?? "field";
290
+ const label = collapseWhitespace(field.attr("aria-label") ??
291
+ field.attr("placeholder") ??
292
+ field.attr("name") ??
293
+ field.text() ??
294
+ "");
295
+ fields.push(`${tag}${label ? `: ${label}` : ""}`);
296
+ });
297
+ return fields.length ? [`Form fields: ${fields.join("; ")}`] : [];
298
+ }
299
+ function normalizeReadableLines(lines) {
300
+ const out = [];
301
+ for (const line of lines) {
302
+ const text = collapseWhitespace(line);
303
+ if (!text) {
304
+ if (out.length > 0 && out[out.length - 1] !== "")
305
+ out.push("");
306
+ continue;
307
+ }
308
+ if (out[out.length - 1] !== text)
309
+ out.push(text);
310
+ }
311
+ return out.join("\n").replace(/\n{3,}/g, "\n\n").trim();
312
+ }
89
313
  // ---------------------------------------------------------------------------
90
314
  // Set-Cookie parser
91
315
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"readable.js","sourceRoot":"","sources":["../../../src/tools/web/readable.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"readable.js","sourceRoot":"","sources":["../../../src/tools/web/readable.ts"],"names":[],"mappings":"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"}
@@ -106,11 +106,10 @@ export declare const RESPONSE_MODES: readonly ResponseMode[];
106
106
  *
107
107
  * Defaults applied when an optional argument is omitted:
108
108
  * - `maxBytes` → {@link DEFAULT_MAX_BYTES} (Requirement 2.2)
109
- * - `includeHeaders` → `true` (Requirement 2.15)
110
- * - `includeTls` → `true` for `https://`, `false` for `http://`
111
- * (Requirement 2.16)
112
- * - `includeTiming` → `true` (Requirement 2.17)
113
- * - `includeRedirectChain` → `true` (Requirement 2.18)
109
+ * - `includeHeaders` → `false`
110
+ * - `includeTls` → `false`
111
+ * - `includeTiming` → `false`
112
+ * - `includeRedirectChain` → `false`
114
113
  * - `responseMode` → `"readable"` (Requirement 2.19)
115
114
  * - `redactSensitive` → `true` (Requirement 2.20)
116
115
  */
@@ -131,11 +130,11 @@ export declare const MIN_MAX_BYTES = 1024;
131
130
  /** Inclusive maximum allowed for `WebFetchArgs.maxBytes`. */
132
131
  export declare const MAX_MAX_BYTES = 1048576;
133
132
  /** Default value applied when `WebFetchArgs.includeHeaders` is omitted. */
134
- export declare const DEFAULT_INCLUDE_HEADERS = true;
133
+ export declare const DEFAULT_INCLUDE_HEADERS = false;
135
134
  /** Default value applied when `WebFetchArgs.includeTiming` is omitted. */
136
- export declare const DEFAULT_INCLUDE_TIMING = true;
135
+ export declare const DEFAULT_INCLUDE_TIMING = false;
137
136
  /** Default value applied when `WebFetchArgs.includeRedirectChain` is omitted. */
138
- export declare const DEFAULT_INCLUDE_REDIRECT_CHAIN = true;
137
+ export declare const DEFAULT_INCLUDE_REDIRECT_CHAIN = false;
139
138
  /** Default value applied when `WebFetchArgs.responseMode` is omitted. */
140
139
  export declare const DEFAULT_RESPONSE_MODE: ResponseMode;
141
140
  /** Default value applied when `WebFetchArgs.redactSensitive` is omitted. */
@@ -41,11 +41,11 @@ export const MIN_MAX_BYTES = 1024;
41
41
  /** Inclusive maximum allowed for `WebFetchArgs.maxBytes`. */
42
42
  export const MAX_MAX_BYTES = 1_048_576;
43
43
  /** Default value applied when `WebFetchArgs.includeHeaders` is omitted. */
44
- export const DEFAULT_INCLUDE_HEADERS = true;
44
+ export const DEFAULT_INCLUDE_HEADERS = false;
45
45
  /** Default value applied when `WebFetchArgs.includeTiming` is omitted. */
46
- export const DEFAULT_INCLUDE_TIMING = true;
46
+ export const DEFAULT_INCLUDE_TIMING = false;
47
47
  /** Default value applied when `WebFetchArgs.includeRedirectChain` is omitted. */
48
- export const DEFAULT_INCLUDE_REDIRECT_CHAIN = true;
48
+ export const DEFAULT_INCLUDE_REDIRECT_CHAIN = false;
49
49
  /** Default value applied when `WebFetchArgs.responseMode` is omitted. */
50
50
  export const DEFAULT_RESPONSE_MODE = "readable";
51
51
  /** Default value applied when `WebFetchArgs.redactSensitive` is omitted. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/web/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,oEAAoE;AACpE,MAAM,CAAC,MAAM,iBAAiB,GAAgC;IAC5D,OAAO;IACP,QAAQ;IACR,YAAY;CACJ,CAAC;AAeX,wEAAwE;AACxE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAgBpC,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AA6DvC,sDAAsD;AACtD,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD,UAAU;IACV,KAAK;CACG,CAAC;AA0BX,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAElC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAE3C,iFAAiF;AACjF,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAEnD,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAiB,UAAU,CAAC;AAE9D,4EAA4E;AAC5E,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,sEAAsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAElD,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAEjD,gEAAgE;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAElD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/web/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAcH,oEAAoE;AACpE,MAAM,CAAC,MAAM,iBAAiB,GAAgC;IAC5D,OAAO;IACP,QAAQ;IACR,YAAY;CACJ,CAAC;AAeX,wEAAwE;AACxE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,gEAAgE;AAChE,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAElC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAgBpC,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,iEAAiE;AACjE,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAEpC,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AA6DvC,sDAAsD;AACtD,MAAM,CAAC,MAAM,cAAc,GAA4B;IACrD,UAAU;IACV,KAAK;CACG,CAAC;AAyBX,qEAAqE;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC;AAElC,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC,2EAA2E;AAC3E,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAC;AAE7C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C,iFAAiF;AACjF,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,CAAC;AAEpD,yEAAyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAiB,UAAU,CAAC;AAE9D,4EAA4E;AAC5E,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAEnC,sEAAsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC,0EAA0E;AAC1E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAE5C,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAElD,uEAAuE;AACvE,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAEjD,gEAAgE;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,2EAA2E;AAC3E,MAAM,CAAC,MAAM,6BAA6B,GAAG,IAAI,CAAC;AAElD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC"}
package/dist/tui/App.js CHANGED
@@ -41,6 +41,42 @@ import { addScopeTargets, clearScope, loadScope, saveScope, } from "../store/sco
41
41
  import { formatKeyStatus } from "./format-keys.js";
42
42
  import { shouldStoreInPromptHistory } from "./input-history.js";
43
43
  import { DISABLE_MOUSE_REPORTING, ENABLE_MOUSE_REPORTING, isMouseReport, mouseWheelDirection, stripMouseReports, } from "./mouse.js";
44
+ function wrapPlainString(text, width) {
45
+ if (text.length === 0) {
46
+ return [{ lineText: "", startIdx: 0, endIdx: 0 }];
47
+ }
48
+ const lines = [];
49
+ const paragraphs = text.split("\n");
50
+ let currentOffset = 0;
51
+ for (let p = 0; p < paragraphs.length; p++) {
52
+ const para = paragraphs[p];
53
+ if (para.length === 0) {
54
+ lines.push({ lineText: "", startIdx: currentOffset, endIdx: currentOffset });
55
+ }
56
+ else {
57
+ let idx = 0;
58
+ while (idx < para.length) {
59
+ let chunk = para.slice(idx, idx + width);
60
+ let wrapLen = chunk.length;
61
+ if (idx + width < para.length) {
62
+ const lastSpace = chunk.lastIndexOf(" ");
63
+ if (lastSpace > 0) {
64
+ wrapLen = lastSpace + 1;
65
+ chunk = para.slice(idx, idx + wrapLen);
66
+ }
67
+ }
68
+ lines.push({
69
+ lineText: chunk,
70
+ startIdx: currentOffset + idx,
71
+ endIdx: currentOffset + idx + wrapLen,
72
+ });
73
+ idx += wrapLen;
74
+ }
75
+ }
76
+ currentOffset += para.length + 1;
77
+ }
78
+ return lines;
79
+ }
44
80
  const IMPLEMENT_PROMPT = "I approve the plan. Execute it now in STRICT ORDER. Task 1 (explore) is ALREADY COMPLETE from the planning phase — " +
45
81
  "do NOT re-list or re-read the directory. Start with the FIRST pending task that still needs implementation work. " +
46
82
  "For each task: call task.update {taskId, state:'in_progress'} → do the real work → VERIFY it succeeded → " +
@@ -77,6 +113,14 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
77
113
  const autosaveTimer = useRef(undefined);
78
114
  const latestItems = useRef(state.items);
79
115
  latestItems.current = state.items;
116
+ const compactAbortRef = useRef(undefined);
117
+ const cancelCompaction = useCallback(() => {
118
+ if (compactAbortRef.current) {
119
+ compactAbortRef.current.abort();
120
+ compactAbortRef.current = undefined;
121
+ }
122
+ setCompacting(false);
123
+ }, []);
80
124
  useEffect(() => {
81
125
  if (!process.stdout.isTTY)
82
126
  return;
@@ -269,7 +313,8 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
269
313
  });
270
314
  return;
271
315
  }
272
- if (!getProvider(next).validateKey(key)) {
316
+ const trimmedKey = key.trim();
317
+ if (!getProvider(next).validateKey(trimmedKey)) {
273
318
  dispatch({
274
319
  type: "notice",
275
320
  level: "warn",
@@ -277,7 +322,7 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
277
322
  });
278
323
  return;
279
324
  }
280
- await setProviderSecret(next, key);
325
+ await setProviderSecret(next, trimmedKey);
281
326
  }
282
327
  const nextModel = getProviderModel(next);
283
328
  setDefaultProvider(next);
@@ -409,11 +454,13 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
409
454
  info("mode → agent");
410
455
  return true;
411
456
  case "/clear":
457
+ cancelCompaction();
412
458
  runner.reset();
413
459
  dispatch({ type: "reset" });
414
460
  info("context cleared");
415
461
  return true;
416
462
  case "/new":
463
+ cancelCompaction();
417
464
  void (async () => {
418
465
  const messages = runner.getMessages();
419
466
  if (!noHistory && !getConfig().privateMode && messages.length > 0)
@@ -424,6 +471,7 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
424
471
  })();
425
472
  return true;
426
473
  case "/clean":
474
+ cancelCompaction();
427
475
  runner.reset();
428
476
  dispatch({ type: "reset" });
429
477
  info("fresh session started");
@@ -603,16 +651,21 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
603
651
  return true;
604
652
  }
605
653
  case "/compact": {
606
- if (runner.isRunning() || compacting) {
654
+ if (runner.isRunning()) {
607
655
  warn("wait for the current operation to finish");
608
656
  return true;
609
657
  }
658
+ cancelCompaction();
659
+ const ac = new AbortController();
660
+ compactAbortRef.current = ac;
610
661
  setCompacting(true);
611
662
  info("compacting conversation…");
612
663
  const fullSession = serializeTranscriptForCompaction(state.items);
613
664
  void runner
614
- .compact(fullSession, 2)
665
+ .compact(fullSession, 2, ac.signal)
615
666
  .then((result) => {
667
+ if (ac.signal.aborted)
668
+ return;
616
669
  if (result.after === result.before) {
617
670
  info("nothing to compact yet — more messages are required");
618
671
  }
@@ -620,13 +673,29 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
620
673
  const memoMsg = result.messages.find((m) => m.role === "system" &&
621
674
  (m.content.startsWith("Session memory") ||
622
675
  m.content.startsWith("Earlier turns"))) ?? result.messages.find((m, i) => i > 0 && m.role === "system");
623
- const summary = memoMsg ? memoMsg.content : "Compacted context";
676
+ const summary = !result.summarized && fullSession.trim()
677
+ ? `Earlier turns in this session, summarized to fit the context budget. Full local transcript shown for review; the model received a compact fallback memory.\n\n${fullSession}`
678
+ : memoMsg
679
+ ? memoMsg.content
680
+ : "Compacted context";
624
681
  dispatch({ type: "compacted", summary, keepRecent: 2 });
625
682
  info(`compacted ${result.before} → ${result.after} messages · ~${result.beforeTokens.toLocaleString()} → ~${result.afterTokens.toLocaleString()} tokens${result.summarized ? "" : " · local fallback"}`);
626
683
  }
627
684
  })
628
- .catch((error) => warn(`compaction failed: ${error instanceof Error ? error.message : String(error)}`))
629
- .finally(() => setCompacting(false));
685
+ .catch((error) => {
686
+ if (ac.signal.aborted || (error instanceof Error && error.name === "AbortError")) {
687
+ info("compaction cancelled");
688
+ }
689
+ else {
690
+ warn(`compaction failed: ${error instanceof Error ? error.message : String(error)}`);
691
+ }
692
+ })
693
+ .finally(() => {
694
+ if (compactAbortRef.current === ac) {
695
+ compactAbortRef.current = undefined;
696
+ setCompacting(false);
697
+ }
698
+ });
630
699
  return true;
631
700
  }
632
701
  case "/save":
@@ -680,6 +749,7 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
680
749
  warn("session not found");
681
750
  return;
682
751
  }
752
+ cancelCompaction();
683
753
  runner.setMessages(session.messages);
684
754
  setOverlay({ kind: "none" });
685
755
  dispatch({
@@ -1290,21 +1360,15 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
1290
1360
  // screen flash on every keypress/spinner frame.
1291
1361
  const usableRows = Math.max(8, rows - 1);
1292
1362
  const headerH = 0;
1293
- const statusH = state.pendingConfirm
1294
- ? 6
1295
- : secretRequest
1296
- ? 7
1297
- : state.status.running || compacting
1298
- ? 1
1299
- : 0;
1300
- const composerH = 3;
1301
- const chromeH = !secretRequest &&
1302
- !state.pendingConfirm &&
1303
- !state.status.running &&
1304
- !compacting
1305
- ? 1
1306
- : 0;
1363
+ const statusH = state.pendingConfirm ? 6 : secretRequest ? 7 : 0;
1364
+ const chromeH = !secretRequest && !state.pendingConfirm ? 1 : 0;
1307
1365
  const gapH = 1;
1366
+ const inputWidth = Math.max(10, cols - 6);
1367
+ const wrappedInputLines = wrapPlainString(input, inputWidth);
1368
+ const maxAvailableForComposer = Math.max(3, usableRows - headerH - statusH - chromeH - gapH - 8);
1369
+ const maxComposerTextRows = Math.max(1, maxAvailableForComposer - 2);
1370
+ const composerTextH = Math.min(wrappedInputLines.length, maxComposerTextRows);
1371
+ const composerH = composerTextH + 2;
1308
1372
  const maxMenuRows = Math.max(3, usableRows - headerH - statusH - composerH - chromeH - gapH - 3);
1309
1373
  const menuH = slashMenuOpen
1310
1374
  ? Math.min(suggestions.length, maxMenuRows)
@@ -1384,7 +1448,7 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
1384
1448
  useInput((ch, key) => {
1385
1449
  if (modalActive)
1386
1450
  return; // overlay/modal owns input
1387
- const cleanedChunk = stripMouseReports(ch);
1451
+ const cleanedChunk = stripMouseReports(ch).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
1388
1452
  if (isMouseReport(ch) && cleanedChunk.length === 0)
1389
1453
  return;
1390
1454
  // Global shortcuts
@@ -1461,6 +1525,10 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
1461
1525
  return;
1462
1526
  }
1463
1527
  if (key.escape) {
1528
+ if (compacting) {
1529
+ cancelCompaction();
1530
+ return;
1531
+ }
1464
1532
  if (state.outputExpanded)
1465
1533
  dispatch({ type: "toggle-output" });
1466
1534
  else if (runner.isRunning())
@@ -1616,15 +1684,34 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
1616
1684
  : file.isDir
1617
1685
  ? "#67E8F9"
1618
1686
  : "#F8FAFC", bold: i === selected, children: [i === selected ? "❯ " : " ", file.isDir ? "▸ " : "· ", file.value] }), _jsx(Text, { dimColor: true, children: file.isDir ? " directory" : " attach file" })] }, file.value)))
1619
- : null, secretRequest ? (_jsx(SecretInputPanel, { title: secretRequest.title, prompt: secretRequest.prompt, onSubmit: (value) => answerSecret(value), onCancel: () => answerSecret(undefined) })) : state.pendingConfirm ? (_jsx(ConfirmModal, { confirm: state.pendingConfirm, onAnswer: answerConfirm })) : state.status.running || compacting ? (_jsx(Box, { children: compacting ? (_jsxs(Text, { children: [_jsxs(Text, { color: "magenta", children: [spinner, " "] }), _jsx(Text, { color: "yellow", children: "compacting conversation\u2026" })] })) : (_jsxs(Text, { children: [_jsxs(Text, { color: "magenta", children: [spinner, " "] }), _jsx(Text, { color: "yellow", children: state.status.activity || "working" }), state.status.step > 0 ? (_jsx(Text, { dimColor: true, children: ` · step ${state.status.step}` })) : null, _jsx(Text, { dimColor: true, children: ` · ${elapsed}s · esc to cancel` }), state.queued.length > 0 ? (_jsx(Text, { dimColor: true, children: ` · ${state.queued.length} queued` })) : null] })) })) : null, _jsxs(Box, { borderStyle: "round", borderColor: state.pendingConfirm || secretRequest
1687
+ : null, secretRequest ? (_jsx(SecretInputPanel, { title: secretRequest.title, prompt: secretRequest.prompt, onSubmit: (value) => answerSecret(value), onCancel: () => answerSecret(undefined) })) : state.pendingConfirm ? (_jsx(ConfirmModal, { confirm: state.pendingConfirm, onAnswer: answerConfirm })) : null, _jsxs(Box, { borderStyle: "round", borderColor: state.pendingConfirm || secretRequest
1620
1688
  ? "yellow"
1621
1689
  : state.status.running
1622
1690
  ? "yellow"
1623
1691
  : "cyan", paddingX: 1, children: [_jsx(Text, { color: state.status.running ? "yellow" : "cyan", bold: true, children: state.pendingConfirm || secretRequest ? "! " : "❯ " }), secretRequest ? (_jsx(Text, { bold: true, children: "Input locked \u00B7 complete the secure input above" })) : state.pendingConfirm ? (_jsx(Text, { bold: true, children: "Input locked \u00B7 answer the confirmation above with Y or N" })) : input.length === 0 ? (_jsx(Text, { dimColor: true, children: state.status.running
1624
1692
  ? "type to queue a message…"
1625
- : "ask anything · / for commands · @file to attach · esc to cancel" })) : (_jsxs(Text, { wrap: "truncate-start", children: [_jsx(Text, { color: "#F8FAFC", children: before }), _jsx(Text, { backgroundColor: "#22D3EE", color: "#020617", bold: true, children: at }), _jsx(Text, { color: "#F8FAFC", children: after })] }))] }), !secretRequest &&
1626
- !state.pendingConfirm &&
1627
- !state.status.running &&
1628
- !compacting ? (_jsxs(Box, { paddingX: 1, justifyContent: "center", children: [_jsxs(Text, { backgroundColor: "#166534", color: "#FFFFFF", bold: true, children: [" ", "READY", " "] }), state.queued.length > 0 ? (_jsx(Text, { backgroundColor: "#854D0E", color: "#FFFFFF", bold: true, children: ` ${state.queued.length} QUEUED ` })) : null, _jsx(Text, { children: " " }), _jsxs(Text, { backgroundColor: "#334155", color: "#F8FAFC", children: [" ", "/ COMMANDS", " "] }), _jsx(Text, { children: " " }), _jsxs(Text, { backgroundColor: "#334155", color: "#F8FAFC", children: [" ", "CTRL+T THINKING", " "] }), _jsx(Text, { children: " " }), _jsxs(Text, { backgroundColor: "#334155", color: "#F8FAFC", children: [" ", "CTRL+O OUTPUT", " "] }), _jsx(Text, { children: " " }), _jsx(Text, { backgroundColor: mouseMode ? "#155E75" : "#334155", color: "#F8FAFC", children: ` MOUSE ${mouseMode ? "ON" : "OFF"} ` }), offset > 0 ? (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { backgroundColor: "#854D0E", color: "#FFFFFF", bold: true, children: ` ▲ ${offset} ` })] })) : null] })) : null] }));
1693
+ : "ask anything · / for commands · @file to attach · esc to cancel" })) : ((() => {
1694
+ let cursorLineIdx = 0;
1695
+ for (let i = 0; i < wrappedInputLines.length; i++) {
1696
+ const line = wrappedInputLines[i];
1697
+ if (cursor >= line.startIdx && cursor <= line.endIdx) {
1698
+ cursorLineIdx = i;
1699
+ if (cursor === line.startIdx) {
1700
+ break;
1701
+ }
1702
+ }
1703
+ }
1704
+ let startLine = Math.max(0, cursorLineIdx - Math.floor(composerTextH / 2));
1705
+ let endLine = Math.min(wrappedInputLines.length - 1, startLine + composerTextH - 1);
1706
+ startLine = Math.max(0, endLine - composerTextH + 1);
1707
+ const startCharIdx = wrappedInputLines[startLine].startIdx;
1708
+ const endCharIdx = wrappedInputLines[endLine].endIdx;
1709
+ const slicedInput = input.slice(startCharIdx, endCharIdx);
1710
+ const slicedCursor = cursor - startCharIdx;
1711
+ const beforeSliced = slicedInput.slice(0, slicedCursor);
1712
+ const atSliced = slicedInput.slice(slicedCursor, slicedCursor + 1) || " ";
1713
+ const afterSliced = slicedInput.slice(slicedCursor + 1);
1714
+ return (_jsxs(Text, { wrap: "wrap", children: [_jsx(Text, { color: "#F8FAFC", children: beforeSliced }), _jsx(Text, { backgroundColor: "#22D3EE", color: "#020617", bold: true, children: atSliced }), _jsx(Text, { color: "#F8FAFC", children: afterSliced })] }));
1715
+ })())] }), !secretRequest && !state.pendingConfirm ? (_jsxs(Box, { paddingX: 1, justifyContent: "center", children: [state.status.running || compacting ? (_jsxs(_Fragment, { children: [_jsxs(Text, { backgroundColor: "#B45309", color: "#FFFFFF", bold: true, children: [" ", compacting ? "COMPACTING" : "RUNNING", " "] }), _jsx(Text, { children: " " }), _jsxs(Text, { color: "magenta", children: [spinner, " "] }), _jsxs(Text, { color: "yellow", children: [compacting ? "compacting conversation" : (state.status.activity || "working"), state.status.step > 0 ? ` (step ${state.status.step})` : "", ` · ${elapsed}s`] }), _jsx(Text, { children: " " }), _jsxs(Text, { backgroundColor: "#334155", color: "#F8FAFC", children: [" ", "ESC CANCEL", " "] }), state.queued.length > 0 ? (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { backgroundColor: "#854D0E", color: "#FFFFFF", bold: true, children: ` ${state.queued.length} QUEUED ` })] })) : null] })) : (_jsxs(_Fragment, { children: [_jsxs(Text, { backgroundColor: "#166534", color: "#FFFFFF", bold: true, children: [" ", "READY", " "] }), state.queued.length > 0 ? (_jsx(Text, { backgroundColor: "#854D0E", color: "#FFFFFF", bold: true, children: ` ${state.queued.length} QUEUED ` })) : null, _jsx(Text, { children: " " }), _jsxs(Text, { backgroundColor: "#334155", color: "#F8FAFC", children: [" ", "/ COMMANDS", " "] }), _jsx(Text, { children: " " }), _jsxs(Text, { backgroundColor: "#334155", color: "#F8FAFC", children: [" ", "CTRL+T THINKING", " "] }), _jsx(Text, { children: " " }), _jsxs(Text, { backgroundColor: "#334155", color: "#F8FAFC", children: [" ", "CTRL+O OUTPUT", " "] }), _jsx(Text, { children: " " }), _jsx(Text, { backgroundColor: mouseMode ? "#155E75" : "#334155", color: "#F8FAFC", children: ` MOUSE ${mouseMode ? "ON" : "OFF"} ` })] })), maxOffset > offset ? (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { backgroundColor: "#854D0E", color: "#FFFFFF", bold: true, children: ` ▲ ${maxOffset - offset} ` })] })) : null, offset > 0 ? (_jsxs(_Fragment, { children: [_jsx(Text, { children: " " }), _jsx(Text, { backgroundColor: "#854D0E", color: "#FFFFFF", bold: true, children: ` ▼ ${offset} ` })] })) : null] })) : null] }));
1629
1716
  }
1630
1717
  //# sourceMappingURL=App.js.map