@sayknow-cli/coding-agent 0.6.4 → 0.6.6
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 +35 -1
- package/README.md +2 -2
- package/dist/types/config/keybindings.d.ts +6 -1
- package/dist/types/config/settings-schema.d.ts +7 -3
- package/dist/types/i18n/messages/en.d.ts +5 -14
- package/dist/types/modes/components/session-selector.d.ts +7 -3
- package/dist/types/modes/components/sessions-dashboard.d.ts +2 -1
- package/dist/types/modes/components/user-message-selector.d.ts +5 -2
- package/dist/types/modes/components/user-message.d.ts +3 -1
- package/dist/types/modes/components/welcome.d.ts +34 -14
- package/dist/types/modes/controllers/command-controller.d.ts +1 -1
- package/dist/types/modes/controllers/selector-controller.d.ts +5 -0
- package/dist/types/modes/interactive-mode.d.ts +14 -2
- package/dist/types/modes/theme/defaults/index.d.ts +342 -0
- package/dist/types/modes/theme/theme.d.ts +5 -1
- package/dist/types/modes/types.d.ts +3 -1
- package/dist/types/session/session-manager.d.ts +9 -0
- package/dist/types/session/session-stars.d.ts +15 -0
- package/dist/types/tools/debug.d.ts +2 -2
- package/dist/types/tui/output-block.d.ts +12 -1
- package/dist/types/tui/utils.d.ts +1 -3
- package/dist/types/utils/session-title-generation.d.ts +6 -0
- package/dist/types/utils/title-generator.d.ts +11 -2
- package/package.json +7 -7
- package/scripts/generate-sdk-operation-inventory.ts +8 -0
- package/src/cli/session-picker.ts +4 -0
- package/src/config/keybindings.ts +8 -1
- package/src/config/settings-schema.ts +4 -3
- package/src/i18n/messages/de.messages.ts +4 -1
- package/src/i18n/messages/de.settings.ts +2 -0
- package/src/i18n/messages/de.ts +3 -12
- package/src/i18n/messages/en.ts +5 -14
- package/src/i18n/messages/es.messages.ts +4 -1
- package/src/i18n/messages/es.settings.ts +2 -0
- package/src/i18n/messages/es.ts +3 -12
- package/src/i18n/messages/fr.messages.ts +4 -1
- package/src/i18n/messages/fr.settings.ts +2 -0
- package/src/i18n/messages/fr.ts +3 -12
- package/src/i18n/messages/ja.messages.ts +4 -1
- package/src/i18n/messages/ja.settings.ts +2 -0
- package/src/i18n/messages/ja.ts +3 -12
- package/src/i18n/messages/ko.messages.ts +4 -1
- package/src/i18n/messages/ko.settings.ts +2 -0
- package/src/i18n/messages/ko.ts +4 -13
- package/src/i18n/messages/zh.messages.ts +2 -1
- package/src/i18n/messages/zh.settings.ts +2 -0
- package/src/i18n/messages/zh.ts +3 -12
- package/src/internal-urls/docs-index.generated.ts +10 -10
- package/src/lsp/render.ts +0 -1
- package/src/modes/action-registry.ts +1 -0
- package/src/modes/components/session-selector.ts +71 -21
- package/src/modes/components/sessions-dashboard.ts +8 -5
- package/src/modes/components/settings-selector.ts +1 -0
- package/src/modes/components/status-line/presets.ts +5 -5
- package/src/modes/components/status-line/separators.ts +4 -0
- package/src/modes/components/tool-execution.ts +6 -19
- package/src/modes/components/tool-status-header.ts +103 -12
- package/src/modes/components/user-message-selector.ts +57 -15
- package/src/modes/components/user-message.ts +25 -15
- package/src/modes/components/welcome.ts +298 -576
- package/src/modes/controllers/command-controller.ts +56 -7
- package/src/modes/controllers/input-controller.ts +17 -0
- package/src/modes/controllers/selector-controller.ts +91 -10
- package/src/modes/interactive-mode.ts +85 -38
- package/src/modes/theme/defaults/glow-octopus.json +114 -0
- package/src/modes/theme/defaults/index.ts +6 -0
- package/src/modes/theme/defaults/ink-octopus.json +114 -0
- package/src/modes/theme/defaults/violet-octopus.json +114 -0
- package/src/modes/theme/theme.ts +18 -2
- package/src/modes/types.ts +3 -1
- package/src/prompts/system/title-system.md +1 -1
- package/src/sdk/protocol/operation-inventory.generated.json +40 -0
- package/src/session/agent-session.ts +12 -0
- package/src/session/internal/managed-session-scope.ts +10 -0
- package/src/session/session-manager.ts +26 -1
- package/src/session/session-stars.ts +104 -0
- package/src/slash-commands/builtin-registry.ts +104 -4
- package/src/tools/debug.ts +0 -1
- package/src/tools/fetch.ts +0 -1
- package/src/tui/output-block.ts +29 -61
- package/src/tui/utils.ts +1 -8
- package/src/utils/session-title-generation.ts +29 -0
- package/src/utils/title-generator.ts +46 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,41 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
-
## [0.6.
|
|
5
|
+
## [0.6.6] - 2026-09-28
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- `ctrl+q` (`app.session.continue`) continues the most recent saved session in one keystroke, from the launch card or mid-session; it never resumes the live session into itself and refuses while a turn is running. The launch card marks that session with `›` and names the key next to `alt+r` for the full list. It is a Control chord on purpose: many macOS terminals turn Option into composed text, so Option shortcuts such as `alt+r` only work where the terminal sends Option as Meta.
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- The launch screen is a compact card instead of the two-column ledger. The Sayknow pet — the same octopus sprite as the composer pet, drawn in half blocks so it needs no image protocol — sits beside four lines — version, tagline, model with reasoning level, and project path with branch and change counts — followed by one line after an update with the new version and its first note (pointing at `/changelog`), the three most recent sessions (with the key that opens the full list), and a single row of keys. Commits, preset, role models, MCP/skill/rule/LSP status, workflows, and the full keymap are no longer on it; they are one key or command away. The card stays within 76 columns on wide terminals and, when rows run short, drops the keys row first, then the release line, then the sessions. The pet is the one you keep beside the composer (`pet.mode`), or, with the pet off, blue on `blue-octopus` and red elsewhere. The intro has the pet sway its tentacles and lets color spread for about half a second; every fact is readable from the first frame, and `startup.skipLogoAnimation` still turns it off.
|
|
14
|
+
|
|
15
|
+
## [0.6.5] - 2026-09-26
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- Three more bundled dark octopus themes, selectable from Settings or `/theme`: `ink-octopus` (warm graphite, paper text, one amber accent), `glow-octopus` (teal-black with bioluminescent green and a violet secondary), and `violet-octopus` (plum-dark with lavender and an apricot secondary).
|
|
20
|
+
- `alt+r` opens the resume picker (`app.session.resume` had no default key, so the picker was reachable only through `/resume` or the command palette). The launch screen's session heading names the key.
|
|
21
|
+
- Starred sessions. `/star` and `/unstar` mark the current session, and Ctrl+S stars or unstars the selected session in the resume picker (`alt+r`). Starred sessions (`★`) are listed first in the picker and the `/sessions` dashboard. Stars live in `~/.skc/agent/session-stars.json`, not in transcripts, and never change `--continue`, ID-prefix resolution, deletion, or retention. Adapted from upstream #5202 and #5545 (upstream stores stars as transcript header patches; this fork keeps them in a separate index so the transcript format and its bounded listing scan stay unchanged).
|
|
22
|
+
- `/fork` is back as a TUI command: pick an earlier prompt and continue from it in a new session. The original transcript is kept, and the selected prompt returns as an editable draft instead of being sent. It refuses to open for an unsaved session or while a response, compaction, or foreground command is running; a second Enter while the fork is in flight is ignored; a fork that fails before the new session exists leaves you in the old one, while one that fails after still moves you to the new session and says what failed. The prompt list fits the terminal height. Adapted from upstream #5515.
|
|
23
|
+
- `/rename` with no argument regenerates the session title from the conversation (the first message plus the latest five) instead of printing usage. A result that lands after a newer prompt or an explicit rename is discarded. `/rename <title>` is unchanged. Ported from upstream #5617.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- The default dark theme is now `ink-octopus` (octopus ink: warm graphite, paper text, one amber accent) instead of `blue-octopus`, which was color-for-color identical to upstream's `blue-crab`. The light default stays `blue-octopus`, and an explicit `theme.dark` setting still wins.
|
|
28
|
+
- The launch screen is now a borderless workspace ledger instead of a boxed wordmark. The left column shows what the session is about to run with: workspace path, branch with staged/unstaged/untracked counts, the last three commits, model and provider, reasoning level, active preset, the model bound to each role agent (executor, planner, critic, architect), and tooling (MCP connected/total, skill count, loaded instruction files, LSP status). Git counts, commits, and instruction files are probed after first paint and fill in as they settle. The right column keeps What's New, recent sessions, workflows, and keys. Below 100 columns the two columns stack. The launch screen stays short at every viewport height: three recent sessions (listed first, and first after the ledger when stacked) and three release notes; the full list is one `alt+r` away. Every fact is on screen from the first frame; the sub-second intro only lets color spread top to bottom and never blocks input. `startup.skipLogoAnimation` still disables it.
|
|
29
|
+
- The transcript and composer drop their filled cards for rails. A user prompt sits on the terminal background behind an accent `▌` rail instead of a labelled bubble; replayed prompts get a dim rail and a `replay` tag. Tool output hangs off a single `│` rail under its header (`├` marks a section such as Output) instead of a closed box on a tinted fill; the rail color alone carries running, success, and error. The composer is the same `▌` rail on every input row, colored by session accent, thinking level, or shell/python mode, instead of a rounded box with a `>` prompt; shell mode shows `shell` on the rail.
|
|
30
|
+
- The status line sits on the bare terminal with ` · ` between segments. The new `dot` separator is the default for `statusLine.separator` and every built-in preset that used `slash`; `slash` and the powerline styles stay selectable, and powerline still paints its arrows from `statusLineBg`.
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
|
|
34
|
+
- A turn stopped by the repetition guard is no longer auto-retried. It carries no transport facts, so the session classified it as `unknown` and admitted a bounded retry that would re-trip the same loop and re-bill the full context. Ported from upstream #5627.
|
|
35
|
+
- The status-line usage segment shows only the active model's provider. It used to mix every cached usage report, so a Grok session could show leftover Claude 5h/7d windows, and with several Codex OAuth accounts the report order decided which account was shown. Codex now uses only the report that uniquely matches the OAuth account this session uses, and Grok's monthly credits are no longer drawn as a 7d window. Ported from upstream #5871 and the two status-line fixes before it.
|
|
36
|
+
|
|
37
|
+
### Performance
|
|
38
|
+
|
|
39
|
+
- `/resume` no longer reads and hashes both transcripts for every (legacy session, v2 session) pair while deciding which legacy sessions are already migrated. A migration receipt names exactly one source and one destination, so a receipt for a different pair is now rejected on those fields before any file I/O. Unrelated transcripts are read once by the listing instead of once more per receipt probe; upstream measured `/resume` in a 589-session directory dropping from 10.4–12.3s to 6.2–7.2s. Ported from upstream #5856 (the `/model` half of that change targets code this fork does not have).
|
|
6
40
|
|
|
7
41
|
## [0.6.2] - 2026-09-24
|
|
8
42
|
|
package/README.md
CHANGED
|
@@ -108,6 +108,6 @@ The agent supports three mutually-exclusive memory backends, selected via the `m
|
|
|
108
108
|
|
|
109
109
|
Switching backends mid-session is honoured on the next system-prompt rebuild and the next `/memory` slash command. Existing users with `memories.enabled = true|false` are migrated to `memory.backend = "local"|"off"` exactly once on first launch.
|
|
110
110
|
|
|
111
|
-
##
|
|
111
|
+
## Octopus TUI themes
|
|
112
112
|
|
|
113
|
-
The interactive TUI defaults to the bundled `
|
|
113
|
+
The interactive TUI defaults to the bundled `ink-octopus` cephalopod theme on dark terminals and `blue-octopus` on light terminals, with `red-octopus` as a warm, high-contrast alternate and `glow-octopus` and `violet-octopus` as further dark palettes. Three additional bundled migration themes — `claude-code`, `codex`, and `opencode` — mirror the look of those tools for easy eye-migration and are selectable from Settings or `/theme`. Explicit user theme settings still win; set `theme.dark: red-octopus` and `theme.light: blue-octopus` in `~/.skc/agent/config.yml` to pin them.
|
|
@@ -30,6 +30,7 @@ interface AppKeybindings {
|
|
|
30
30
|
"app.session.tree": true;
|
|
31
31
|
"app.session.fork": true;
|
|
32
32
|
"app.session.resume": true;
|
|
33
|
+
"app.session.continue": true;
|
|
33
34
|
"app.session.observe": true;
|
|
34
35
|
"app.session.dashboard": true;
|
|
35
36
|
"app.jobs.open": true;
|
|
@@ -164,9 +165,13 @@ export declare const KEYBINDINGS: {
|
|
|
164
165
|
readonly description: "Branch from message";
|
|
165
166
|
};
|
|
166
167
|
readonly "app.session.resume": {
|
|
167
|
-
readonly defaultKeys:
|
|
168
|
+
readonly defaultKeys: "alt+r";
|
|
168
169
|
readonly description: "Resume session";
|
|
169
170
|
};
|
|
171
|
+
readonly "app.session.continue": {
|
|
172
|
+
readonly defaultKeys: "ctrl+q";
|
|
173
|
+
readonly description: "Continue the most recent session";
|
|
174
|
+
};
|
|
170
175
|
readonly "app.session.observe": {
|
|
171
176
|
readonly defaultKeys: "ctrl+s";
|
|
172
177
|
readonly description: "Observe subagent sessions";
|
|
@@ -444,7 +444,7 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
444
444
|
};
|
|
445
445
|
readonly "theme.dark": {
|
|
446
446
|
readonly type: "string";
|
|
447
|
-
readonly default: "
|
|
447
|
+
readonly default: "ink-octopus";
|
|
448
448
|
readonly ui: {
|
|
449
449
|
readonly tab: "appearance";
|
|
450
450
|
readonly label: "Dark Theme";
|
|
@@ -601,13 +601,17 @@ export declare const SETTINGS_SCHEMA: {
|
|
|
601
601
|
};
|
|
602
602
|
readonly "statusLine.separator": {
|
|
603
603
|
readonly type: "enum";
|
|
604
|
-
readonly values: readonly ["powerline", "powerline-thin", "slash", "pipe", "block", "none", "ascii"];
|
|
605
|
-
readonly default: "
|
|
604
|
+
readonly values: readonly ["dot", "powerline", "powerline-thin", "slash", "pipe", "block", "none", "ascii"];
|
|
605
|
+
readonly default: "dot";
|
|
606
606
|
readonly ui: {
|
|
607
607
|
readonly tab: "appearance";
|
|
608
608
|
readonly label: "Status Line Separator";
|
|
609
609
|
readonly description: "Style of separators between segments";
|
|
610
610
|
readonly options: readonly [{
|
|
611
|
+
readonly value: "dot";
|
|
612
|
+
readonly label: "Dot";
|
|
613
|
+
readonly description: "Middle dots on the bare terminal (SKC default)";
|
|
614
|
+
}, {
|
|
611
615
|
readonly value: "powerline";
|
|
612
616
|
readonly label: "Powerline";
|
|
613
617
|
readonly description: "Solid arrows (Nerd Font)";
|
|
@@ -8,23 +8,14 @@ export declare const en: {
|
|
|
8
8
|
readonly "lang.fr": "Français";
|
|
9
9
|
readonly "lang.de": "Deutsch";
|
|
10
10
|
readonly "welcome.tagline": "Coding should feel like thinking.";
|
|
11
|
-
readonly "welcome.workflows": "Workflows";
|
|
12
|
-
readonly "welcome.wf.deepInterview": "scope · interview → spec";
|
|
13
|
-
readonly "welcome.wf.ralplan": "consensus plan";
|
|
14
|
-
readonly "welcome.wf.ultragoal": "autonomous build";
|
|
15
|
-
readonly "welcome.wf.team": "parallel agents";
|
|
16
|
-
readonly "welcome.flowKeys": "Flow keys";
|
|
17
11
|
readonly "welcome.commands": "commands";
|
|
18
|
-
readonly "welcome.actions": "actions";
|
|
19
|
-
readonly "welcome.shell": "shell";
|
|
20
|
-
readonly "welcome.python": "python";
|
|
21
12
|
readonly "welcome.keymap": "keymap";
|
|
22
13
|
readonly "welcome.model": "model";
|
|
23
|
-
readonly "welcome.
|
|
24
|
-
readonly "welcome.
|
|
25
|
-
readonly "welcome.
|
|
26
|
-
readonly "welcome.
|
|
27
|
-
readonly "welcome.
|
|
14
|
+
readonly "welcome.sessionTrail": "Recent sessions";
|
|
15
|
+
readonly "welcome.noSessions": "No saved sessions";
|
|
16
|
+
readonly "welcome.allSessions": "{key} all sessions";
|
|
17
|
+
readonly "welcome.continue": "{key} continue";
|
|
18
|
+
readonly "welcome.sessions": "sessions";
|
|
28
19
|
readonly "welcome.chooseModel": "choose a model";
|
|
29
20
|
readonly "welcome.modelHint": "ctrl+l to pick · / for commands";
|
|
30
21
|
readonly "settings.tab.appearance": "Appearance";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Component, Container } from "@sayknow-cli/tui";
|
|
2
|
-
import type
|
|
2
|
+
import { type ResumeSessionIdentity, type ResumeTailInspection, type SessionInfo } from "../../session/session-manager";
|
|
3
3
|
export interface SelectedSession {
|
|
4
4
|
kind: "selected";
|
|
5
5
|
path: string;
|
|
@@ -19,14 +19,17 @@ declare class SessionList implements Component {
|
|
|
19
19
|
onCancel?: () => void;
|
|
20
20
|
onExit: () => void;
|
|
21
21
|
onDeleteRequest?: (session: SessionInfo) => void;
|
|
22
|
+
onToggleStarRequest?: (session: SessionInfo) => void;
|
|
22
23
|
constructor(allSessions: SessionInfo[], showCwd?: boolean);
|
|
23
24
|
setInputFrozen(frozen: boolean): void;
|
|
24
25
|
removeSession(sessionPath: string): void;
|
|
26
|
+
/** Apply a persisted star change and keep the cursor on the same session as it moves. */
|
|
27
|
+
setSessionStarred(sessionPath: string, starred: boolean): void;
|
|
25
28
|
invalidate(): void;
|
|
26
29
|
render(width: number): string[];
|
|
27
30
|
handleInput(keyData: string): void;
|
|
28
31
|
}
|
|
29
|
-
/** A one-shot resume consent selector. It never opens
|
|
32
|
+
/** A one-shot resume consent selector with host-owned deletion and star persistence. It never opens sessions. */
|
|
30
33
|
export declare class SessionSelectorComponent extends Container {
|
|
31
34
|
#private;
|
|
32
35
|
private readonly onSelect;
|
|
@@ -35,7 +38,8 @@ export declare class SessionSelectorComponent extends Container {
|
|
|
35
38
|
private readonly onDelete?;
|
|
36
39
|
private readonly inspector?;
|
|
37
40
|
private readonly onSelection?;
|
|
38
|
-
|
|
41
|
+
private readonly onSetStarred?;
|
|
42
|
+
constructor(sessions: SessionInfo[], onSelect: (sessionPath: string) => void, onCancel: () => void, onExit: () => void, onDelete?: ((session: SessionInfo) => Promise<boolean>) | undefined, inspector?: SessionInspector | undefined, onSelection?: ((selection: SessionSelectionResult) => void) | undefined, onSetStarred?: ((session: SessionInfo, starred: boolean) => Promise<void>) | undefined);
|
|
39
43
|
setOnRequestRender(callback: () => void): void;
|
|
40
44
|
handleInput(keyData: string): void;
|
|
41
45
|
getSessionList(): SessionList;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Container } from "@sayknow-cli/tui";
|
|
2
|
-
import type
|
|
2
|
+
import { type SessionInfo } from "../../session/session-manager";
|
|
3
3
|
export type SessionLiveness = "active" | "stale" | "unknown";
|
|
4
4
|
export interface DashboardSession {
|
|
5
5
|
id: string;
|
|
6
6
|
cwd: string;
|
|
7
7
|
title: string;
|
|
8
|
+
starred: boolean;
|
|
8
9
|
modified: Date;
|
|
9
10
|
messageCount: number;
|
|
10
11
|
messageCountIsEstimate?: boolean;
|
|
@@ -13,16 +13,19 @@ declare class UserMessageList implements Component {
|
|
|
13
13
|
onSelect?: (entryId: string) => void;
|
|
14
14
|
onCancel?: () => void;
|
|
15
15
|
constructor(messages: UserMessageItem[]);
|
|
16
|
+
setAvailableRows(rows: number): void;
|
|
16
17
|
invalidate(): void;
|
|
17
18
|
render(width: number): string[];
|
|
18
19
|
handleInput(keyData: string): void;
|
|
19
20
|
}
|
|
20
21
|
/**
|
|
21
|
-
* Component that renders a
|
|
22
|
+
* Component that renders a prompt selector for creating a new session
|
|
22
23
|
*/
|
|
23
24
|
export declare class UserMessageSelectorComponent extends Container {
|
|
24
25
|
#private;
|
|
25
|
-
|
|
26
|
+
private readonly getViewportRows;
|
|
27
|
+
constructor(messages: UserMessageItem[], onSelect: (entryId: string) => void, onCancel: () => void, getViewportRows: () => number);
|
|
28
|
+
render(width: number): string[];
|
|
26
29
|
getMessageList(): UserMessageList;
|
|
27
30
|
}
|
|
28
31
|
export {};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Container } from "@sayknow-cli/tui";
|
|
2
2
|
/**
|
|
3
|
-
* Component that renders a user message
|
|
3
|
+
* Component that renders a user message: the prompt sits on the transcript
|
|
4
|
+
* background behind an accent rail instead of inside a filled bubble, so the
|
|
5
|
+
* user's turns read as margin notes rather than cards.
|
|
4
6
|
*/
|
|
5
7
|
export declare class UserMessageComponent extends Container {
|
|
6
8
|
#private;
|
|
@@ -1,13 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ThinkingLevel } from "@sayknow-cli/agent-core";
|
|
2
|
+
import { type Component, type PetSkinId } from "@sayknow-cli/tui";
|
|
2
3
|
import { type KeyDisplayContext } from "../../config/keybindings";
|
|
3
4
|
export interface RecentSession {
|
|
4
5
|
name: string;
|
|
5
6
|
timeAgo: string;
|
|
6
7
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Workspace facts on the launch card. Every field is optional: the card renders
|
|
10
|
+
* what is known and fills in git state once the asynchronous probe settles.
|
|
11
|
+
*/
|
|
12
|
+
export interface WelcomeSnapshot {
|
|
13
|
+
/** Display path of the project directory (already home-shortened). */
|
|
14
|
+
cwd?: string;
|
|
15
|
+
/** Current branch, `"detached"`, or `null` outside a git repository. */
|
|
16
|
+
branch?: string | null;
|
|
17
|
+
gitChanges?: {
|
|
18
|
+
staged: number;
|
|
19
|
+
unstaged: number;
|
|
20
|
+
untracked: number;
|
|
21
|
+
} | null;
|
|
22
|
+
thinkingLevel?: ThinkingLevel | string;
|
|
11
23
|
}
|
|
12
24
|
export type WelcomeLogoMode = "unicode" | "square" | "ascii";
|
|
13
25
|
export interface WelcomeComponentOptions {
|
|
@@ -15,15 +27,24 @@ export interface WelcomeComponentOptions {
|
|
|
15
27
|
getReservedBottomRows?: (termWidth: number) => number;
|
|
16
28
|
changelogMarkdown?: string;
|
|
17
29
|
rightGutterWidth?: number;
|
|
30
|
+
/** Show only the version on the release line, without its first note. */
|
|
18
31
|
collapseChangelog?: boolean;
|
|
19
32
|
buildLabel?: string;
|
|
20
33
|
keyDisplayContext?: KeyDisplayContext;
|
|
21
34
|
skipLogoAnimation?: boolean;
|
|
35
|
+
snapshot?: WelcomeSnapshot;
|
|
36
|
+
/** Key bound to the resume picker (`app.session.resume`); the card names it. */
|
|
37
|
+
resumeKey?: string;
|
|
38
|
+
/** Key bound to `app.session.continue`, which resumes the first session on the card. */
|
|
39
|
+
continueKey?: string;
|
|
40
|
+
/** Which Sayknow pet stands on the card (default red). */
|
|
41
|
+
petSkin?: PetSkinId;
|
|
22
42
|
}
|
|
23
43
|
/**
|
|
24
|
-
* Sayknow-CLI launch
|
|
25
|
-
*
|
|
26
|
-
*
|
|
44
|
+
* Sayknow-CLI launch card: the octopus mark beside who and where you are
|
|
45
|
+
* (version, model and reasoning, project and branch), then the three most recent
|
|
46
|
+
* sessions and a single row of keys. Everything else — the full session list,
|
|
47
|
+
* workflows, the keymap, release notes — is one key away, not on the card.
|
|
27
48
|
*/
|
|
28
49
|
export declare class WelcomeComponent implements Component {
|
|
29
50
|
#private;
|
|
@@ -31,21 +52,20 @@ export declare class WelcomeComponent implements Component {
|
|
|
31
52
|
private modelName;
|
|
32
53
|
private providerName;
|
|
33
54
|
private recentSessions;
|
|
34
|
-
private lspServers;
|
|
35
55
|
private readonly logoMode;
|
|
36
56
|
private readonly options;
|
|
37
|
-
constructor(version: string, modelName: string, providerName: string, recentSessions?: RecentSession[],
|
|
57
|
+
constructor(version: string, modelName: string, providerName: string, recentSessions?: RecentSession[], logoMode?: WelcomeLogoMode, options?: WelcomeComponentOptions);
|
|
38
58
|
invalidate(): void;
|
|
39
59
|
/**
|
|
40
|
-
* Play
|
|
41
|
-
*
|
|
42
|
-
* subsequent calls reset and replay.
|
|
60
|
+
* Play the short launch intro. Content is fully readable from the first frame;
|
|
61
|
+
* only color and the tentacles move. Safe to call again — it restarts.
|
|
43
62
|
*/
|
|
44
63
|
playIntro(requestRender: () => void): void;
|
|
45
64
|
dispose(): void;
|
|
46
65
|
setModel(modelName: string, providerName: string): void;
|
|
47
66
|
setRecentSessions(sessions: RecentSession[]): void;
|
|
48
|
-
|
|
67
|
+
/** Merge newly probed workspace facts into the card. */
|
|
68
|
+
setSnapshot(patch: WelcomeSnapshot): void;
|
|
49
69
|
render(termWidth: number): string[];
|
|
50
70
|
}
|
|
51
71
|
/** Resolve the intro cadence without making tests mutate global process state. */
|
|
@@ -29,7 +29,7 @@ export declare class CommandController {
|
|
|
29
29
|
handleDropCommand(): Promise<boolean>;
|
|
30
30
|
handleForkCommand(): Promise<void>;
|
|
31
31
|
handleMoveCommand(targetPath: string): Promise<void>;
|
|
32
|
-
handleRenameCommand(title
|
|
32
|
+
handleRenameCommand(title?: string): Promise<void>;
|
|
33
33
|
handleBashCommand(command: string, excludeFromContext?: boolean): Promise<void>;
|
|
34
34
|
handlePythonCommand(code: string, excludeFromContext?: boolean): Promise<void>;
|
|
35
35
|
handleCompactCommand(customInstructions?: string): Promise<CompactionOutcome>;
|
|
@@ -116,6 +116,11 @@ export declare class SelectorController {
|
|
|
116
116
|
temporaryOnly?: boolean;
|
|
117
117
|
}): void;
|
|
118
118
|
showPluginSelector(mode?: "install" | "uninstall"): Promise<void>;
|
|
119
|
+
/**
|
|
120
|
+
* Pick an earlier prompt and continue from it in a new session. The original
|
|
121
|
+
* transcript is kept; the selected prompt comes back as an editable draft,
|
|
122
|
+
* never auto-submitted.
|
|
123
|
+
*/
|
|
119
124
|
showUserMessageSelector(): void;
|
|
120
125
|
showTreeSelector(): void;
|
|
121
126
|
showSessionSelector(): Promise<void>;
|
|
@@ -22,7 +22,7 @@ import type { EvalExecutionComponent } from "./components/eval-execution";
|
|
|
22
22
|
import type { HookEditorComponent } from "./components/hook-editor";
|
|
23
23
|
import type { HookInputComponent } from "./components/hook-input";
|
|
24
24
|
import type { HookSelectorComponent } from "./components/hook-selector";
|
|
25
|
-
import { type PetMode, SayknowPetWidget } from "./components/sayknow-pet-widget";
|
|
25
|
+
import { type PetMode, type PetSkinId, SayknowPetWidget } from "./components/sayknow-pet-widget";
|
|
26
26
|
import type { ToolExecutionHandle } from "./components/tool-execution";
|
|
27
27
|
import { StatusLineComponent } from "./components/tool-status-header";
|
|
28
28
|
import { type WelcomeLogoMode } from "./components/welcome";
|
|
@@ -41,6 +41,17 @@ export declare function getComposerPlaceholder(keybindings: Pick<KeybindingsMana
|
|
|
41
41
|
readonly busyPromptMode: "steer" | "queue";
|
|
42
42
|
}): string;
|
|
43
43
|
export declare function getWelcomeTranscriptReservedRows(chatContainer: Container, width: number): number;
|
|
44
|
+
/**
|
|
45
|
+
* The pet on the launch card: the one the user keeps beside the composer, or —
|
|
46
|
+
* with the pet off — the skin that matches the theme (blue for blue-octopus).
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveWelcomePetSkin(petMode: PetMode, themeName: string | undefined): PetSkinId;
|
|
49
|
+
/**
|
|
50
|
+
* The composer is an open rail, not a box: every input row starts with the same
|
|
51
|
+
* rail glyph a submitted prompt keeps in the transcript, colored by the editor's
|
|
52
|
+
* border color (session accent, thinking level, shell/python mode).
|
|
53
|
+
*/
|
|
54
|
+
export declare function configureDefaultComposerChrome(editor: CustomEditor): void;
|
|
44
55
|
export type WelcomeBannerSettingMode = "auto" | "unicode" | "square" | "ascii";
|
|
45
56
|
export declare function resolveWelcomeLogoMode(mode: WelcomeBannerSettingMode, env?: Record<string, string | undefined>, platform?: NodeJS.Platform): WelcomeLogoMode;
|
|
46
57
|
/** Options for creating an InteractiveMode instance (for future API use) */
|
|
@@ -228,7 +239,7 @@ export declare class InteractiveMode implements InteractiveModeContext {
|
|
|
228
239
|
handleDropCommand(): Promise<boolean>;
|
|
229
240
|
handleForkCommand(): Promise<void>;
|
|
230
241
|
handleMoveCommand(targetPath: string): Promise<void>;
|
|
231
|
-
handleRenameCommand(title
|
|
242
|
+
handleRenameCommand(title?: string): Promise<void>;
|
|
232
243
|
handleMemoryCommand(text: string): Promise<void>;
|
|
233
244
|
handleSTTToggle(): Promise<void>;
|
|
234
245
|
showDebugSelector(): void;
|
|
@@ -270,6 +281,7 @@ export declare class InteractiveMode implements InteractiveModeContext {
|
|
|
270
281
|
showUserMessageSelector(): void;
|
|
271
282
|
showTreeSelector(): void;
|
|
272
283
|
showSessionSelector(): void;
|
|
284
|
+
continueRecentSession(): Promise<void>;
|
|
273
285
|
handleResumeSession(sessionPath: string, options?: {
|
|
274
286
|
requireIdle?: boolean;
|
|
275
287
|
}): Promise<boolean>;
|