@sayknow-cli/coding-agent 0.6.7 → 0.6.8

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/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.6.8] - 2026-09-29
6
+
7
+ ### Fixed
8
+
9
+ - Picking a recent session on the launch card with the arrow keys needed the key held down in terminals that use the kitty keyboard protocol (Ghostty, kitty, WezTerm): the release event that follows every press was treated as "another key" and cancelled the pick. Release events are now ignored, so one tap of `↓`/`↑` moves one row and `Enter` opens the highlighted session.
10
+
11
+ ### Changed
12
+
13
+ - The launch card shows the pet's own sprite (the same octopus as the composer pet) at three quarters size, 12 columns × 5 rows, instead of a separately drawn small octopus. The model line moves up beside the pet so no blank row opens under the tagline.
14
+
5
15
  ## [0.6.7] - 2026-09-28
6
16
 
7
17
  ### Added
@@ -18,6 +18,12 @@ export declare class LocateTool implements AgentTool<typeof locateSchema, Locate
18
18
  readonly name = "locate";
19
19
  readonly label = "Locate";
20
20
  readonly summary = "Find code by describing what it does (Jev relevance judgement)";
21
+ /**
22
+ * Essential when offered: its value is being picked instead of a grep, which a
23
+ * discoverable tool hidden behind search_tool_bm25 would rarely be. createIf already
24
+ * keeps it out unless a TypeSafe key is stored.
25
+ */
26
+ readonly loadMode = "essential";
21
27
  readonly description: string;
22
28
  readonly parameters: z.ZodObject<{
23
29
  query: z.ZodString;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@sayknow-cli/coding-agent",
4
- "version": "0.6.7",
4
+ "version": "0.6.8",
5
5
  "description": "Sayknow-CLI CLI with read, bash, edit, write tools and session management",
6
6
  "homepage": "https://sayknow-cli.com",
7
7
  "author": "jaybeyond",
@@ -54,12 +54,12 @@
54
54
  "@agentclientprotocol/sdk": "1.3.0",
55
55
  "@babel/parser": "^7.29.3",
56
56
  "@mozilla/readability": "^0.6.0",
57
- "@sayknow-cli/stats": "0.6.7",
58
- "@sayknow-cli/agent-core": "0.6.7",
59
- "@sayknow-cli/ai": "0.6.7",
60
- "@sayknow-cli/natives": "0.6.7",
61
- "@sayknow-cli/tui": "0.6.7",
62
- "@sayknow-cli/utils": "0.6.7",
57
+ "@sayknow-cli/stats": "0.6.8",
58
+ "@sayknow-cli/agent-core": "0.6.8",
59
+ "@sayknow-cli/ai": "0.6.8",
60
+ "@sayknow-cli/natives": "0.6.8",
61
+ "@sayknow-cli/tui": "0.6.8",
62
+ "@sayknow-cli/utils": "0.6.8",
63
63
  "@puppeteer/browsers": "^2.13.0",
64
64
  "@types/turndown": "5.0.6",
65
65
  "@xterm/headless": "^6.0.0",
@@ -343,17 +343,18 @@ export class WelcomeComponent implements Component {
343
343
  );
344
344
  const info = [...head, withWordmark ? versionLine : theme.fg("muted", t("welcome.tagline"))];
345
345
 
346
+ // Model and place sit under the wordmark, in the same column — starting beside the
347
+ // pet's last rows when the pet is taller than the wordmark, so no blank row opens.
348
+ const text = [...info, ...this.#statusLines(infoWidth)];
346
349
  const rows: string[] = [];
347
350
  if (withMark) {
348
- const count = Math.max(mark.length, info.length);
351
+ const count = Math.max(mark.length, text.length);
349
352
  for (let row = 0; row < count; row++) {
350
353
  const art = mark[row] ?? padding(markWidth);
351
- const text = info[row] ?? "";
352
- rows.push(text ? `${art}${padding(MARK_GAP)}${text}` : art);
354
+ const line = text[row] ?? "";
355
+ rows.push(line ? `${art}${padding(MARK_GAP)}${line}` : art);
353
356
  }
354
- } else rows.push(...info);
355
- // Model and place sit under the wordmark, in the same column.
356
- for (const line of this.#statusLines(infoWidth)) rows.push(`${padding(indent)}${line}`);
357
+ } else rows.push(...text);
357
358
  return rows;
358
359
  }
359
360
 
@@ -362,7 +363,7 @@ export class WelcomeComponent implements Component {
362
363
  return `v${this.version} · ${buildLabel}`;
363
364
  }
364
365
 
365
- /** The Sayknow pet at half size, in half blocks; the pose follows the intro. */
366
+ /** The Sayknow pet (its own sprite at three quarters size), in half blocks; the pose follows the intro. */
366
367
  #markRows(): string[] {
367
368
  const step = this.#animStart == null ? -1 : Math.floor((performance.now() - this.#animStart) / WAVE_STEP_MS);
368
369
  if (this.logoMode === "ascii") {
@@ -371,7 +372,7 @@ export class WelcomeComponent implements Component {
371
372
  return rows.map(row => theme.fg("accent", row));
372
373
  }
373
374
  const pose = step >= 0 && step < INTRO_POSES.length ? INTRO_POSES[step]! : "base";
374
- return renderPetHalfBlocks(pose, this.options.petSkin ?? "red", theme.getColorMode(), { scale: "half" });
375
+ return renderPetHalfBlocks(pose, this.options.petSkin ?? "red", theme.getColorMode(), { scale: "compact" });
375
376
  }
376
377
 
377
378
  /** One-line title for layouts without room for the wordmark. */
@@ -8,6 +8,7 @@ import {
8
8
  Container,
9
9
  clearRenderCache,
10
10
  getRenderCacheRetainedBytes,
11
+ isKeyRelease,
11
12
  Loader,
12
13
  matchesKey,
13
14
  onImageProtocolChanged,
@@ -2267,6 +2268,10 @@ export class InteractiveMode implements InteractiveModeContext {
2267
2268
  #handleWelcomeKey(welcome: WelcomeComponent, data: string): { consume: true } | undefined {
2268
2269
  if (this.#welcomeComponent !== welcome || !welcome.interactive) return undefined;
2269
2270
  if (this.ui.getFocusedComponent() !== this.editor) return undefined;
2271
+ // Terminals with the kitty keyboard protocol (Ghostty, kitty, WezTerm) send a release
2272
+ // event after every press. It is not a keystroke: treating it as "another key" cancelled
2273
+ // the pick a ↓ had just made, so a single tap never moved the highlight.
2274
+ if (isKeyRelease(data)) return undefined;
2270
2275
  const picking = welcome.selectedIndex !== undefined;
2271
2276
  if (!picking) {
2272
2277
  if (!matchesKey(data, "down")) return undefined;
@@ -83,6 +83,12 @@ export class LocateTool implements AgentTool<typeof locateSchema, LocateToolDeta
83
83
  readonly name = "locate";
84
84
  readonly label = "Locate";
85
85
  readonly summary = "Find code by describing what it does (Jev relevance judgement)";
86
+ /**
87
+ * Essential when offered: its value is being picked instead of a grep, which a
88
+ * discoverable tool hidden behind search_tool_bm25 would rarely be. createIf already
89
+ * keeps it out unless a TypeSafe key is stored.
90
+ */
91
+ readonly loadMode = "essential";
86
92
  readonly description: string;
87
93
  readonly parameters = locateSchema;
88
94
  readonly strict = true;