@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.
|
|
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.
|
|
58
|
-
"@sayknow-cli/agent-core": "0.6.
|
|
59
|
-
"@sayknow-cli/ai": "0.6.
|
|
60
|
-
"@sayknow-cli/natives": "0.6.
|
|
61
|
-
"@sayknow-cli/tui": "0.6.
|
|
62
|
-
"@sayknow-cli/utils": "0.6.
|
|
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,
|
|
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
|
|
352
|
-
rows.push(
|
|
354
|
+
const line = text[row] ?? "";
|
|
355
|
+
rows.push(line ? `${art}${padding(MARK_GAP)}${line}` : art);
|
|
353
356
|
}
|
|
354
|
-
} else rows.push(...
|
|
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
|
|
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: "
|
|
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;
|
package/src/tools/locate.ts
CHANGED
|
@@ -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;
|