@pentoshi/clai 2.0.15 → 2.0.17

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 (66) hide show
  1. package/dist/agent/runner.d.ts +4 -0
  2. package/dist/agent/runner.js +362 -395
  3. package/dist/agent/runner.js.map +1 -1
  4. package/dist/commands/providers.js +10 -11
  5. package/dist/commands/providers.js.map +1 -1
  6. package/dist/commands/search-providers.js +10 -11
  7. package/dist/commands/search-providers.js.map +1 -1
  8. package/dist/commands/update.js +1 -1
  9. package/dist/llm/agentrouter.js +10 -2
  10. package/dist/llm/agentrouter.js.map +1 -1
  11. package/dist/llm/capabilities.js +2 -2
  12. package/dist/llm/capabilities.js.map +1 -1
  13. package/dist/llm/gemini.js +15 -1
  14. package/dist/llm/gemini.js.map +1 -1
  15. package/dist/llm/groq.d.ts +1 -0
  16. package/dist/llm/groq.js +45 -1
  17. package/dist/llm/groq.js.map +1 -1
  18. package/dist/llm/http.js +8 -2
  19. package/dist/llm/http.js.map +1 -1
  20. package/dist/llm/provider.js +10 -9
  21. package/dist/llm/provider.js.map +1 -1
  22. package/dist/llm/router.js +8 -2
  23. package/dist/llm/router.js.map +1 -1
  24. package/dist/modes/ask.js +5 -3
  25. package/dist/modes/ask.js.map +1 -1
  26. package/dist/prompts/index.d.ts +2 -2
  27. package/dist/prompts/index.js +6 -3
  28. package/dist/prompts/index.js.map +1 -1
  29. package/dist/repl.js +4 -4
  30. package/dist/repl.js.map +1 -1
  31. package/dist/safety/classifier.js +10 -50
  32. package/dist/safety/classifier.js.map +1 -1
  33. package/dist/store/keys.js +50 -18
  34. package/dist/store/keys.js.map +1 -1
  35. package/dist/tools/http.d.ts +1 -0
  36. package/dist/tools/http.js +109 -9
  37. package/dist/tools/http.js.map +1 -1
  38. package/dist/tools/jobs.d.ts +4 -0
  39. package/dist/tools/jobs.js +29 -1
  40. package/dist/tools/jobs.js.map +1 -1
  41. package/dist/tools/registry.js +5 -8
  42. package/dist/tools/registry.js.map +1 -1
  43. package/dist/tools/web/fetch-core.js +6 -9
  44. package/dist/tools/web/fetch-core.js.map +1 -1
  45. package/dist/tools/web/fetch.js +26 -0
  46. package/dist/tools/web/fetch.js.map +1 -1
  47. package/dist/tools/web/readable.d.ts +7 -3
  48. package/dist/tools/web/readable.js +235 -11
  49. package/dist/tools/web/readable.js.map +1 -1
  50. package/dist/tools/web/types.d.ts +7 -8
  51. package/dist/tools/web/types.js +3 -3
  52. package/dist/tools/web/types.js.map +1 -1
  53. package/dist/tui/App.js +74 -6
  54. package/dist/tui/App.js.map +1 -1
  55. package/dist/tui/components/SecretInputPanel.d.ts +1 -0
  56. package/dist/tui/components/SecretInputPanel.js +15 -2
  57. package/dist/tui/components/SecretInputPanel.js.map +1 -1
  58. package/dist/tui/format-keys.js +16 -15
  59. package/dist/tui/format-keys.js.map +1 -1
  60. package/dist/tui/hooks/useAgentRunner.js +1 -1
  61. package/dist/tui/hooks/useAgentRunner.js.map +1 -1
  62. package/dist/tui/render-lines.js +179 -29
  63. package/dist/tui/render-lines.js.map +1 -1
  64. package/dist/ui/thinking.js +14 -2
  65. package/dist/ui/thinking.js.map +1 -1
  66. 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":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAInC,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG;IACzB,QAAQ;IACR,OAAO;IACP,UAAU;IACV,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,OAAO;CACR,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7D,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7B,2CAA2C;IAC3C,CAAC,CAAC,kBAAkB,CAAC,CAAC,MAAM,EAAE,CAAC;IAE/B,mEAAmE;IACnE,qEAAqE;IACrE,qEAAqE;IACrE,iBAAiB;IACjB,CAAC,CAAC,GAAG,CAAC;SACH,QAAQ,EAAE;SACV,MAAM,CAAC;QACN,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;IACjC,CAAC,CAAC;SACD,MAAM,EAAE,CAAC;IAEZ,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IAC5B,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACtC,OAAO,IAAI;SACR,OAAO,CAAC,+DAA+D,EAAE,GAAG,CAAC;SAC7E,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,gBAAgB,GAAwC,IAAI,GAAG,CAAC;IACpE,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACpB,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,MAAM,EAAE,MAAM,CAAC;CACjB,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;IACjC,CAAC;IAED,qEAAqE;IACrE,qEAAqE;IACrE,mEAAmE;IACnE,oCAAoC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAErC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,IAAY,CAAC;IACjB,IAAI,WAAmB,CAAC;IACxB,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,iEAAiE;QACjE,IAAI,GAAG,IAAI,CAAC;QACZ,WAAW,GAAG,EAAE,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,8DAA8D;QAC9D,oDAAoD;QACpD,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IAED,uEAAuE;IACvE,2DAA2D;IAC3D,MAAM,MAAM,GAAe,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;IAExD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,SAAS;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEnC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,QAAQ,GACZ,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxE,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAEzC,QAAQ,SAAS,EAAE,CAAC;YAClB,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;oBAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC;gBACpD,MAAM;YACR,CAAC;YACD,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;oBAAE,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;gBAClD,MAAM;YACR,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,GAAG,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;gBACrC,IAAI,GAAG,KAAK,SAAS;oBAAE,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;gBAC5C,MAAM;YACR,CAAC;YACD,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,MAAM,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;gBACjC,IAAI,CAAC,KAAK,SAAS;oBAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBACvC,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACvB,MAAM;YACR,CAAC;YACD,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;gBAChE,IAAI,SAAS,KAAK,SAAS;oBAAE,MAAM,CAAC,QAAQ,GAAG,SAAS,CAAC;gBACzD,MAAM;YACR,CAAC;YACD;gBACE,2DAA2D;gBAC3D,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,OAAO,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,kEAAkE;IAClE,kEAAkE;IAClE,6BAA6B;IAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/C,OAAO,CAAC,CAAC;AACX,CAAC"}
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 → " +
@@ -277,7 +313,8 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
277
313
  });
278
314
  return;
279
315
  }
280
- if (!getProvider(next).validateKey(key)) {
316
+ const trimmedKey = key.trim();
317
+ if (!getProvider(next).validateKey(trimmedKey)) {
281
318
  dispatch({
282
319
  type: "notice",
283
320
  level: "warn",
@@ -285,7 +322,7 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
285
322
  });
286
323
  return;
287
324
  }
288
- await setProviderSecret(next, key);
325
+ await setProviderSecret(next, trimmedKey);
289
326
  }
290
327
  const nextModel = getProviderModel(next);
291
328
  setDefaultProvider(next);
@@ -636,7 +673,11 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
636
673
  const memoMsg = result.messages.find((m) => m.role === "system" &&
637
674
  (m.content.startsWith("Session memory") ||
638
675
  m.content.startsWith("Earlier turns"))) ?? result.messages.find((m, i) => i > 0 && m.role === "system");
639
- 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";
640
681
  dispatch({ type: "compacted", summary, keepRecent: 2 });
641
682
  info(`compacted ${result.before} → ${result.after} messages · ~${result.beforeTokens.toLocaleString()} → ~${result.afterTokens.toLocaleString()} tokens${result.summarized ? "" : " · local fallback"}`);
642
683
  }
@@ -1320,9 +1361,14 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
1320
1361
  const usableRows = Math.max(8, rows - 1);
1321
1362
  const headerH = 0;
1322
1363
  const statusH = state.pendingConfirm ? 6 : secretRequest ? 7 : 0;
1323
- const composerH = 3;
1324
1364
  const chromeH = !secretRequest && !state.pendingConfirm ? 1 : 0;
1325
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;
1326
1372
  const maxMenuRows = Math.max(3, usableRows - headerH - statusH - composerH - chromeH - gapH - 3);
1327
1373
  const menuH = slashMenuOpen
1328
1374
  ? Math.min(suggestions.length, maxMenuRows)
@@ -1402,7 +1448,7 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
1402
1448
  useInput((ch, key) => {
1403
1449
  if (modalActive)
1404
1450
  return; // overlay/modal owns input
1405
- const cleanedChunk = stripMouseReports(ch);
1451
+ const cleanedChunk = stripMouseReports(ch).replace(/\r\n/g, "\n").replace(/\r/g, "\n");
1406
1452
  if (isMouseReport(ch) && cleanedChunk.length === 0)
1407
1453
  return;
1408
1454
  // Global shortcuts
@@ -1644,6 +1690,28 @@ export function App({ version, initialMode, provider: initialProvider, initialMo
1644
1690
  ? "yellow"
1645
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
1646
1692
  ? "type to queue a message…"
1647
- : "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 && !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] }));
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] }));
1648
1716
  }
1649
1717
  //# sourceMappingURL=App.js.map