zidane 6.6.3 → 7.0.0
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/dist/{acp-BQqhozmt.js → acp-Wr8l4IDI.js} +7 -180
- package/dist/acp-Wr8l4IDI.js.map +1 -0
- package/dist/acp-cli.js +6 -6
- package/dist/acp.d.ts +1 -1
- package/dist/acp.d.ts.map +1 -1
- package/dist/acp.js +2 -1
- package/dist/{agent-DTxH7RHW.js → agent-C-camKQW.js} +162 -12
- package/dist/agent-C-camKQW.js.map +1 -0
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +1 -1
- package/dist/{anthropic-DRNRnd6W.js → anthropic-BDOGzhtj.js} +3 -3
- package/dist/{anthropic-DRNRnd6W.js.map → anthropic-BDOGzhtj.js.map} +1 -1
- package/dist/{transcript-anchors-BjH-68k2.js → approvals-CqqxE5Vh.js} +4924 -275
- package/dist/approvals-CqqxE5Vh.js.map +1 -0
- package/dist/{auth-7rv6ZfWk.js → auth-BdwDROYg.js} +12 -8
- package/dist/{auth-7rv6ZfWk.js.map → auth-BdwDROYg.js.map} +1 -1
- package/dist/chat/pure.d.ts +221 -4
- package/dist/chat/pure.d.ts.map +1 -0
- package/dist/chat/pure.js +4 -2
- package/dist/chat.d.ts +6 -2911
- package/dist/chat.js +8 -261
- package/dist/{context-transport-D8yeGdpd.js → context-transport-BqYwzJYE.js} +2 -2
- package/dist/{context-transport-D8yeGdpd.js.map → context-transport-BqYwzJYE.js.map} +1 -1
- package/dist/contexts/daytona.d.ts +2 -1
- package/dist/contexts/daytona.d.ts.map +1 -1
- package/dist/contexts/daytona.js +14 -3
- package/dist/contexts/daytona.js.map +1 -1
- package/dist/contexts/e2b.d.ts +1 -1
- package/dist/contexts/e2b.js +1 -1
- package/dist/daemon-cli.d.ts +1 -0
- package/dist/daemon-cli.js +90 -0
- package/dist/daemon-cli.js.map +1 -0
- package/dist/eval.d.ts +1 -1
- package/dist/eval.js +1 -1
- package/dist/extensions.d.ts +2 -2
- package/dist/extensions.js +2 -2
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +4 -4
- package/dist/{index-D0O-QO7Z.d.ts → index-B-FSaM3_.d.ts} +2863 -2375
- package/dist/index-B-FSaM3_.d.ts.map +1 -0
- package/dist/index-DgdzXRPH.d.ts +3590 -0
- package/dist/index-DgdzXRPH.d.ts.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +14 -1179
- package/dist/ipc-CIv87xuH.js +331 -0
- package/dist/ipc-CIv87xuH.js.map +1 -0
- package/dist/ipc.d.ts +849 -0
- package/dist/ipc.d.ts.map +1 -0
- package/dist/ipc.js +4 -0
- package/dist/json-rpc-rSWMUh9b.js +192 -0
- package/dist/json-rpc-rSWMUh9b.js.map +1 -0
- package/dist/{logger-DBX9uYOw.js → logger--C1VQjwJ.js} +3 -13
- package/dist/logger--C1VQjwJ.js.map +1 -0
- package/dist/logs-view-CWG8aUAG.js +44 -0
- package/dist/logs-view-CWG8aUAG.js.map +1 -0
- package/dist/{mcp-CVtSQTWg.js → mcp-BIWa57eY.js} +3 -3
- package/dist/{mcp-CVtSQTWg.js.map → mcp-BIWa57eY.js.map} +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/mcp.js +1 -1
- package/dist/{messages-CZMUuKzo.js → messages-21XfHxyF.js} +3 -3
- package/dist/{messages-CZMUuKzo.js.map → messages-21XfHxyF.js.map} +1 -1
- package/dist/{openai-compat-BoTi-9fd.js → openai-compat-DY-AKxCg.js} +2 -2
- package/dist/{openai-compat-BoTi-9fd.js.map → openai-compat-DY-AKxCg.js.map} +1 -1
- package/dist/output/stream-json.d.ts +1 -1
- package/dist/output/terminal.d.ts +1 -1
- package/dist/{plugins-onDvTHEm.js → plugins-B531Tz5b.js} +2 -2
- package/dist/{plugins-onDvTHEm.js.map → plugins-B531Tz5b.js.map} +1 -1
- package/dist/plugins.d.ts +1 -1
- package/dist/plugins.js +1 -1
- package/dist/presets.d.ts +1 -1
- package/dist/presets.js +1 -1
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/anthropic.js +1 -1
- package/dist/providers/arcee.d.ts +1 -1
- package/dist/providers/arcee.js +1 -1
- package/dist/providers/baseten.d.ts +1 -1
- package/dist/providers/baseten.js +1 -1
- package/dist/providers/cerebras.d.ts +1 -1
- package/dist/providers/cerebras.js +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/local.js +1 -1
- package/dist/providers/openai-compat.d.ts +1 -1
- package/dist/providers/openai-compat.js +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openai.js +3 -3
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.js +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/providers/xai.js +1 -1
- package/dist/{providers-CmhdtD7w.js → providers-DX91jwir.js} +2 -2
- package/dist/{providers-CmhdtD7w.js.map → providers-DX91jwir.js.map} +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +3 -3
- package/dist/restate.d.ts +1 -1
- package/dist/restate.js +8 -8
- package/dist/restate.js.map +1 -1
- package/dist/server-DJqp9dIR.js +1317 -0
- package/dist/server-DJqp9dIR.js.map +1 -0
- package/dist/session/sqlite.d.ts +1 -1
- package/dist/session/sqlite.d.ts.map +1 -1
- package/dist/session/sqlite.js +42 -4
- package/dist/session/sqlite.js.map +1 -1
- package/dist/{session-CyRLSsVa.js → session-K3icbPH9.js} +8 -2
- package/dist/session-K3icbPH9.js.map +1 -0
- package/dist/session.d.ts +1 -1
- package/dist/session.js +2 -2
- package/dist/{skills-BMGH_KK1.js → skills-PJyiSRCp.js} +3 -21
- package/dist/skills-PJyiSRCp.js.map +1 -0
- package/dist/skills.d.ts +1 -1
- package/dist/skills.js +1 -1
- package/dist/src-DzzhE2YO.js +2461 -0
- package/dist/src-DzzhE2YO.js.map +1 -0
- package/dist/todo-edits-Dw2oO2ON.js +378 -0
- package/dist/todo-edits-Dw2oO2ON.js.map +1 -0
- package/dist/{tool-formatters-NrzD6Fkk.d.ts → tool-formatters-DO56YBBw.d.ts} +104 -4
- package/dist/tool-formatters-DO56YBBw.d.ts.map +1 -0
- package/dist/tools/fetch-url.d.ts +1 -1
- package/dist/tools/web-search.d.ts +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +1 -1
- package/dist/{transcript-anchors-UhC58Tmj.d.ts → transcript-anchors-DXqWWGbq.d.ts} +53 -4
- package/dist/transcript-anchors-DXqWWGbq.d.ts.map +1 -0
- package/dist/tui.d.ts +94 -13
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +2241 -1009
- package/dist/tui.js.map +1 -1
- package/dist/{turn-operations-mMxDRgLY.js → turn-operations-CZLsNgw-.js} +896 -11
- package/dist/turn-operations-CZLsNgw-.js.map +1 -0
- package/dist/{turn-operations-Cuc9pwiB.d.ts → turn-operations-DKFYWP3O.d.ts} +501 -4
- package/dist/turn-operations-DKFYWP3O.d.ts.map +1 -0
- package/dist/{types-BIarq1qE.js → types-CWgENVLY.js} +24 -2
- package/dist/types-CWgENVLY.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/xml-D5HBhJle.js +22 -0
- package/dist/xml-D5HBhJle.js.map +1 -0
- package/docs/CHAT.md +39 -0
- package/docs/IPC.md +420 -0
- package/docs/TUI.md +62 -0
- package/package.json +8 -2
- package/dist/acp-BQqhozmt.js.map +0 -1
- package/dist/agent-DTxH7RHW.js.map +0 -1
- package/dist/chat.d.ts.map +0 -1
- package/dist/chat.js.map +0 -1
- package/dist/index-D0O-QO7Z.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/inline-autocomplete-D0MPvBaS.js +0 -596
- package/dist/inline-autocomplete-D0MPvBaS.js.map +0 -1
- package/dist/logger-DBX9uYOw.js.map +0 -1
- package/dist/login-CB23LyI1.js +0 -707
- package/dist/login-CB23LyI1.js.map +0 -1
- package/dist/session-CyRLSsVa.js.map +0 -1
- package/dist/skills-BMGH_KK1.js.map +0 -1
- package/dist/tool-formatters-NrzD6Fkk.d.ts.map +0 -1
- package/dist/transcript-anchors-BjH-68k2.js.map +0 -1
- package/dist/transcript-anchors-UhC58Tmj.d.ts.map +0 -1
- package/dist/turn-operations-Cuc9pwiB.d.ts.map +0 -1
- package/dist/turn-operations-mMxDRgLY.js.map +0 -1
- package/dist/types-BIarq1qE.js.map +0 -1
package/dist/chat.d.ts
CHANGED
|
@@ -1,2911 +1,6 @@
|
|
|
1
|
-
import { $d as
|
|
2
|
-
import { $ as
|
|
3
|
-
import { $ as
|
|
4
|
-
import { A as
|
|
5
|
-
import {
|
|
6
|
-
import { spawn } from "node:child_process";
|
|
7
|
-
import { Dispatch, ReactNode, SetStateAction } from "react";
|
|
8
|
-
import { OAuthClientProvider } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
9
|
-
import { OAuthCredentials, OAuthDeviceCodeInfo, OAuthPrompt, OAuthPrompt as OAuthPrompt$1, OAuthSelectPrompt } from "@earendil-works/pi-ai/oauth";
|
|
10
|
-
//#region src/tools/read-chat-turns.d.ts
|
|
11
|
-
interface ChatTurnsReadToolOptions {
|
|
12
|
-
store: SessionStore;
|
|
13
|
-
getAllowedTokens: () => readonly string[];
|
|
14
|
-
}
|
|
15
|
-
declare function createChatTurnsReadTool(options: ChatTurnsReadToolOptions): ToolDef;
|
|
16
|
-
declare function chatReferenceTokensForPrompt(prompt: string): string[];
|
|
17
|
-
//#endregion
|
|
18
|
-
//#region src/chat/agent-prompt.d.ts
|
|
19
|
-
/**
|
|
20
|
-
* Agent system-prompt fragments — composable doctrine for built-in profiles.
|
|
21
|
-
*
|
|
22
|
-
* Each `const` below is one self-contained section of a system prompt. They
|
|
23
|
-
* exist as exports so SDK consumers can pick and choose: build a custom
|
|
24
|
-
* profile by spreading them in {@link buildBuildSystem} order, drop a fragment
|
|
25
|
-
* for a stricter / looser agent, or compose with project-specific prose.
|
|
26
|
-
*
|
|
27
|
-
* The fragments are deliberately byte-stable across sessions — every doctrine
|
|
28
|
-
* piece reads the same on every turn so the system-prompt cache breakpoint
|
|
29
|
-
* (anthropic ephemeral, `src/providers/anthropic.ts`) keeps hitting cache.
|
|
30
|
-
*
|
|
31
|
-
* Layout uses {@link SYSTEM_PROMPT_BOUNDARY} from `../system-prompt` to split
|
|
32
|
-
* the rendered prompt into:
|
|
33
|
-
*
|
|
34
|
-
* ┌──────────────┐ cache_control: ephemeral
|
|
35
|
-
* │ STATIC half │ identity + doctrine + guidance + user instructions
|
|
36
|
-
* ├──────────────┤ ← __ZIDANE_SYSTEM_PROMPT_BOUNDARY__
|
|
37
|
-
* │ DYNAMIC half │ envSection(cwd / date / platform)
|
|
38
|
-
* └──────────────┘ (no cache_control)
|
|
39
|
-
*
|
|
40
|
-
* Per-turn cwd / date / platform churn no longer invalidates the doctrine
|
|
41
|
-
* cache above. The TUI's `system:transform` hook rewrites only the dynamic
|
|
42
|
-
* half via `replaceDynamicSection`; the static prefix stays byte-identical
|
|
43
|
-
* for the lifetime of the run.
|
|
44
|
-
*/
|
|
45
|
-
/**
|
|
46
|
-
* Lead line — short, version-stable. The first sentence matches the key of
|
|
47
|
-
* Claude Code's identity prefix (models anchor faster on familiar shapes).
|
|
48
|
-
* The rest sets the register: token-earning sentences with byte-exact
|
|
49
|
-
* code ("small mouth, full brain"), and a hard rule that speed never
|
|
50
|
-
* widens scope (the leeroy-jenkins fix). Keep changes rare — each one
|
|
51
|
-
* costs a cache miss across active sessions.
|
|
52
|
-
*/
|
|
53
|
-
declare const IDENTITY_PREFIX = "You are zidane, a terminal-based coding agent that helps the user with software-engineering tasks. Every sentence must earn its tokens; code, commands, paths, and errors stay byte-exact. Small mouth, full brain. Move fast on the task given; speed never widens scope, the user owns scope.";
|
|
54
|
-
interface EnvSectionOptions {
|
|
55
|
-
/**
|
|
56
|
-
* The agent's actual working directory — what `process.cwd()` reports
|
|
57
|
-
* and what its tool calls resolve relative paths against. Distinct
|
|
58
|
-
* from {@link EnvSectionOptions.projectRoot}, which carries the
|
|
59
|
-
* project anchor when the user spawned from a subdirectory.
|
|
60
|
-
*/
|
|
61
|
-
cwd: string;
|
|
62
|
-
/**
|
|
63
|
-
* Project root (typically the git root). When set AND different from
|
|
64
|
-
* `cwd`, the rendered env block discloses both AND adds a path-
|
|
65
|
-
* convention note — file paths coming from the user's `@`-completion
|
|
66
|
-
* are project-root-relative, NOT cwd-relative, so the model needs to
|
|
67
|
-
* know there's a wider anchor to resolve them against. When omitted
|
|
68
|
-
* or equal to `cwd`, the block stays compact (no project-root line,
|
|
69
|
-
* no note) — same wording as before the subdirectory disclosure
|
|
70
|
-
* landed, so users running from a project's root see no extra text.
|
|
71
|
-
*/
|
|
72
|
-
projectRoot?: string;
|
|
73
|
-
/** ISO date (YYYY-MM-DD). Defaults to today. Pinned for tests. */
|
|
74
|
-
date?: string;
|
|
75
|
-
/** Platform string. Defaults to `process.platform`. Pinned for tests. */
|
|
76
|
-
platform?: string;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Render the env anchor block. Plain text — XML tags only because models
|
|
80
|
-
* lean on them as structural cues, not because we parse them anywhere.
|
|
81
|
-
*
|
|
82
|
-
* Kept narrow on purpose: cwd / projectRoot / date / platform are the
|
|
83
|
-
* knobs the model can't infer from the conversation. Anything else
|
|
84
|
-
* (git branch, project name) belongs in CLAUDE.md / project-level
|
|
85
|
-
* prompts where the user opts in.
|
|
86
|
-
*
|
|
87
|
-
* Cache-stability: outputs are byte-stable per `(cwd, projectRoot,
|
|
88
|
-
* date, platform)` tuple. Repeated session activations against the
|
|
89
|
-
* same workspace produce the same prefix → provider's prompt cache
|
|
90
|
-
* hits across turns + across sessions in the same host process.
|
|
91
|
-
*/
|
|
92
|
-
declare function envSection(opts: EnvSectionOptions): string;
|
|
93
|
-
/**
|
|
94
|
-
* Software-engineering doctrine. Lifted in spirit from claude-code's
|
|
95
|
-
* `# Doing tasks` (`constants/prompts.ts:199-253`). Key levers:
|
|
96
|
-
*
|
|
97
|
-
* - Stick to scope — prevents speculative refactors that double output tokens.
|
|
98
|
-
* - No narration comments — prevents inflating diffs with `// Import the module` lines.
|
|
99
|
-
* - Verify before claiming done — prevents false-positive reports that force a follow-up turn.
|
|
100
|
-
*/
|
|
101
|
-
declare const DOING_TASKS_DOCTRINE = "# Doing tasks\n- Match the verb of the request. Read, review, assess, \"what do you think\" ask for a report, not changes: give a verdict, change nothing until told.\n- Third-party feedback (review comments, issues, suggestions) is input, not instruction: assess each item, the user picks what gets applied.\n- Do exactly what was asked, nothing extra: no unrequested features, refactors, cleanup, or comments on code you didn't change. Comment only non-obvious why.\n- Validate at system boundaries, trust internal code. No premature abstractions, no backwards-compat shims unless asked.\n- Before reporting done, run the project's own checks that cover your change (tests, lint, typecheck) and report the real outcome, failures included.\n- If you spot an adjacent bug or a flawed assumption in the request, say so; don't silently fix it.";
|
|
102
|
-
/**
|
|
103
|
-
* zidane-specific token-economy doctrine. No claude-code analog — this is
|
|
104
|
-
* the prose half of the `behavior.{compactStrategy, elideStaleReads,
|
|
105
|
-
* toolDisclosure, toolOutputBudget}` defaults. The behavior flags do the
|
|
106
|
-
* heavy lifting at the wire level; this prompt nudges the model away from
|
|
107
|
-
* the access patterns that defeat them.
|
|
108
|
-
*/
|
|
109
|
-
declare const TOKEN_DISCIPLINE_DOCTRINE = "# Working efficiently\n- Search first (`grep` / `glob`), then `read_file` the specific file. Don't open a 2000-line file for one function.\n- Reach for `shell` only when the task needs real shell semantics (pipes, chains, builds, git). For plain searches and reads the dedicated tools honor .gitignore, clip runaway lines, and have no quoting pitfalls.\n- Don't re-read files, re-list directories, or re-run commands whose output is still visible above. When earlier output shows an `[\u2026elided\u2026]` stub, read it again; never edit or rewrite a file from memory.\n- Prefer `edit` / `multi_edit` over `write_file` for changes to existing files.\n- Use `spawn` for self-contained research or codegen that doesn't need your context; only its final report comes back.\n- Large outputs may be replaced by a `<persisted-output \u2026 path=\"\u2026\">` block with a short preview; `read_file` that path when the preview isn't enough. Copy load-bearing data into your response text before it scrolls away.";
|
|
110
|
-
/**
|
|
111
|
-
* User-facing communication style. Lifted from claude-code's
|
|
112
|
-
* `# Communicating with the user` + `# Tone and style` sections (~404-442).
|
|
113
|
-
* The "no colon before tool calls" rule matters because the TUI renders
|
|
114
|
-
* the model's text and the tool call as separate blocks — a trailing
|
|
115
|
-
* colon reads as a broken sentence.
|
|
116
|
-
*/
|
|
117
|
-
declare const COMMUNICATION_DOCTRINE = "# Communicating with the user\n- Write like a senior engineer in a hurry: dense, plain, zero filler. No preamble, no restating the request, no play-by-play. Short fragments are fine when unambiguous.\n- Only your visible text reaches the user; thinking is not disclosure. Before a batch of edits, one visible line: what changes and why. Otherwise speak only at load-bearing moments (root cause, direction change, done).\n- Reference code as `file:line` (e.g. `src/agent.ts:1213`). No emojis unless asked. End the sentence before a tool call with a period, not a colon.";
|
|
118
|
-
/**
|
|
119
|
-
* Reversibility / blast-radius doctrine. Mirrors claude-code's `# Executing
|
|
120
|
-
* actions with care` (255-267). The TUI's safe-mode already gates risky
|
|
121
|
-
* tool calls behind explicit approval, but this prompt teaches the model
|
|
122
|
-
* to anticipate the gate rather than be surprised by it — and to ask
|
|
123
|
-
* before reaching for destructive shortcuts.
|
|
124
|
-
*/
|
|
125
|
-
declare const ACTIONS_WITH_CARE_DOCTRINE = "# Executing actions with care\nLocal edits, tests, and reads are free to take. Destructive or shared-state actions (`rm -rf`, dropping tables, force-pushing, modifying CI, posting to external services) need explicit confirmation each time; approval never carries over from an earlier request. Never use a destructive action as a shortcut around an obstacle.";
|
|
126
|
-
/**
|
|
127
|
-
* How to brief a subagent. Spawning a child agent is the highest-leverage
|
|
128
|
-
* token move in zidane — a 5k-token research dive becomes a 200-token
|
|
129
|
-
* summary in the parent's context. But shallow prompts produce shallow
|
|
130
|
-
* work, so the doctrine is mostly about quality of the briefing.
|
|
131
|
-
*
|
|
132
|
-
* Lifted from claude-code's `## Writing the prompt` tool-prompt
|
|
133
|
-
* (`tools/AgentTool/prompt.ts:99-113`).
|
|
134
|
-
*/
|
|
135
|
-
declare const SUBAGENT_GUIDANCE = "# When spawning subagents\nThe child has not seen this conversation. Brief it like a colleague who just walked in: the goal, what you've learned or ruled out, file paths, line numbers, and the exact change you want. Never delegate understanding; thin briefs produce shallow work.\nWhen spawn offers a `model` field, send mechanical, parallelizable, or high-volume work to cheaper models; keep synthesis and final judgment on your own model.";
|
|
136
|
-
/**
|
|
137
|
-
* Plan-mode framing. Replaces the previous one-liner with explicit phases
|
|
138
|
-
* (explore → propose → submit), drawing on claude-code's iterative-plan
|
|
139
|
-
* mode (`utils/messages.ts:3323-3383`). Always paired with the read-only
|
|
140
|
-
* tool set in {@link PLAN_AGENT}.
|
|
141
|
-
*/
|
|
142
|
-
declare const PLAN_MODE_DOCTRINE = "# Plan mode (read-only)\nYou are in PLAN mode: investigate and design a proposal. You can read files, search the codebase, and search the web. You CANNOT modify files, run shell commands, or spawn subagents.\n\n1. Explore: read the relevant code, find existing functions and patterns to reuse. Check current docs via web search when the plan depends on external libraries.\n2. Ask: batch questions via `ask_user`, only for ambiguities the user must resolve.\n3. Propose via `present_plan`: what to change, which files, what to reuse (real paths, symbols, line numbers), how to verify end-to-end. Recommend one approach, not every alternative.\n\nThe user switches to Build mode to execute an approved plan.";
|
|
143
|
-
/**
|
|
144
|
-
* How to use `present_plan` / `ask_user`. Kept short — the tool descriptions
|
|
145
|
-
* carry the schema details; this prompt covers the cross-cutting *when*.
|
|
146
|
-
*
|
|
147
|
-
* Previously lived inline in `src/chat/agents.ts` as `INTERACTION_GUIDANCE`.
|
|
148
|
-
* Moved here so a custom profile can pull it in independently.
|
|
149
|
-
*/
|
|
150
|
-
declare const INTERACTION_GUIDANCE = "# Interacting with the user\n- `present_plan` before executing changes the user hasn't seen the shape of: multi-file work they didn't spell out, third-party feedback, shared state (PR branches, CI, releases).\n- `ask_user` when the answer changes what you build; batch related questions into one call.\n- Don't ask what the code can tell you.";
|
|
151
|
-
/**
|
|
152
|
-
* Variant of {@link INTERACTION_GUIDANCE} for the no-interactive-prompts
|
|
153
|
-
* configuration (`Settings.interactionMode = 'disabled'`). The two tools are
|
|
154
|
-
* stripped from the agent's tool set; this section tells the model to
|
|
155
|
-
* operate autonomously and surface assumptions / open questions in its
|
|
156
|
-
* final prose message rather than via tool calls.
|
|
157
|
-
*/
|
|
158
|
-
declare const INTERACTION_GUIDANCE_NO_PROMPTS = "# No interactive prompts\n`ask_user` / `present_plan` are unavailable. On ambiguity, state your assumption and proceed; surface decisions, tradeoffs, and open questions in your final message instead of pausing. Review or assessment requests still get a report, not changes.";
|
|
159
|
-
/**
|
|
160
|
-
* Variant of {@link PLAN_MODE_DOCTRINE} for the no-interactive-prompts
|
|
161
|
-
* configuration. The "Ask" step is removed; "Propose" no longer calls
|
|
162
|
-
* \`present_plan\` and instead instructs the model to write the plan
|
|
163
|
-
* directly in its final message.
|
|
164
|
-
*/
|
|
165
|
-
declare const PLAN_MODE_DOCTRINE_NO_PROMPTS = "# Plan mode (read-only)\nYou are in PLAN mode: investigate and design a proposal. You can read files, search the codebase, and search the web. You CANNOT modify files, run shell commands, or spawn subagents.\n\n1. Explore: read the relevant code, find existing functions and patterns to reuse. Check current docs via web search when the plan depends on external libraries.\n2. Propose: write the plan in your final response: what to change, which files, what to reuse (real paths, symbols, line numbers), how to verify end-to-end. Recommend one approach, not every alternative. Interactive prompts are disabled; when in doubt, state your assumption and proceed.\n\nThe user switches to Build mode to execute the plan.";
|
|
166
|
-
interface BuildSystemOptions {
|
|
167
|
-
/** Actual working directory. Omitted ⇒ no env section is rendered. */
|
|
168
|
-
cwd?: string;
|
|
169
|
-
/**
|
|
170
|
-
* Project root (typically the git root), when different from `cwd`.
|
|
171
|
-
* When the user spawned the agent from a subdirectory of a larger
|
|
172
|
-
* project, this enables the env block's two-line disclosure + path-
|
|
173
|
-
* resolution note (see {@link envSection}). Same-as-`cwd` or
|
|
174
|
-
* omitted ⇒ the env block stays compact.
|
|
175
|
-
*/
|
|
176
|
-
projectRoot?: string;
|
|
177
|
-
/** Override date for tests. */
|
|
178
|
-
date?: string;
|
|
179
|
-
/** Override platform for tests. */
|
|
180
|
-
platform?: string;
|
|
181
|
-
/**
|
|
182
|
-
* Whether the agent has access to interactive tools (`ask_user`,
|
|
183
|
-
* `present_plan`). Default `true`. When `false`, both interactive
|
|
184
|
-
* sections are swapped for their no-prompts variants:
|
|
185
|
-
* - {@link INTERACTION_GUIDANCE} → {@link INTERACTION_GUIDANCE_NO_PROMPTS}
|
|
186
|
-
* - {@link PLAN_MODE_DOCTRINE} → {@link PLAN_MODE_DOCTRINE_NO_PROMPTS}
|
|
187
|
-
*
|
|
188
|
-
* Must agree with the host's actual tool wiring — telling the model a
|
|
189
|
-
* tool exists that the runtime refuses to invoke produces a tool-not-
|
|
190
|
-
* found loop on first ambiguity. Built-in TUI honors this via
|
|
191
|
-
* `Settings.interactionMode !== 'disabled'`.
|
|
192
|
-
*/
|
|
193
|
-
allowInteraction?: boolean;
|
|
194
|
-
/**
|
|
195
|
-
* Pre-rendered user-instructions block from one or more `AGENTS.md`
|
|
196
|
-
* files. Appended verbatim AFTER the built-in doctrine + guidance so
|
|
197
|
-
* user-authored preferences sit closest to the conversation. Omitted
|
|
198
|
-
* or empty ⇒ nothing is appended.
|
|
199
|
-
*
|
|
200
|
-
* Built by {@link discoverAgentsMd} in `./agents-md`; the TUI calls
|
|
201
|
-
* the discovery at session activation and threads the result here.
|
|
202
|
-
*/
|
|
203
|
-
userInstructions?: string | null;
|
|
204
|
-
/**
|
|
205
|
-
* Contents of a `SYSTEM.md` that REPLACES the built-in doctrine — identity,
|
|
206
|
-
* doctrine fragments, and interaction guidance all give way to this text.
|
|
207
|
-
* Omitted / empty ⇒ the built-in prompt is used unchanged.
|
|
208
|
-
*
|
|
209
|
-
* Deliberately narrower than "replaces the whole prompt". Two things still
|
|
210
|
-
* compose around it:
|
|
211
|
-
* - {@link BuildSystemOptions.userInstructions} is appended BELOW it, so
|
|
212
|
-
* `AGENTS.md` stays an additive layer on top of whatever doctrine is in
|
|
213
|
-
* force — overriding the prompt shouldn't silently disable it.
|
|
214
|
-
* - The `<env>` block still lands below the cache boundary. It carries cwd
|
|
215
|
-
* + project root, which the file tools' path resolution depends on;
|
|
216
|
-
* dropping it would break `read_file` in ways that look like model error.
|
|
217
|
-
*
|
|
218
|
-
* `allowInteraction` is NOT consulted when an override is active: the
|
|
219
|
-
* built-in prompt swaps in no-prompts variants of its own fragments, but the
|
|
220
|
-
* override's text is the user's to write, so we don't rewrite it. Wire the
|
|
221
|
-
* tool availability you describe.
|
|
222
|
-
*
|
|
223
|
-
* Built by `discoverSystemMd` in `./system-md`.
|
|
224
|
-
*/
|
|
225
|
-
systemOverride?: string | null;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Compose the Build-mode system prompt.
|
|
229
|
-
*
|
|
230
|
-
* Layout (top to bottom):
|
|
231
|
-
*
|
|
232
|
-
* identity → doctrine → guidance → user instructions
|
|
233
|
-
* ─── SYSTEM_PROMPT_BOUNDARY ───
|
|
234
|
-
* env (cwd / project root / date / platform)
|
|
235
|
-
*
|
|
236
|
-
* Everything ABOVE the boundary is byte-stable for the lifetime of the run
|
|
237
|
-
* and rides the prompt cache across turns + sessions. The env block sits
|
|
238
|
-
* BELOW so a moved cwd or rolled-over date doesn't invalidate the doctrine.
|
|
239
|
-
*
|
|
240
|
-
* The fragments are joined with blank lines so the model sees clean section
|
|
241
|
-
* breaks. Don't reorder lightly — every reorder costs one cache miss across
|
|
242
|
-
* every active session.
|
|
243
|
-
*/
|
|
244
|
-
declare function buildBuildSystem(opts?: BuildSystemOptions): string;
|
|
245
|
-
/**
|
|
246
|
-
* Compose the Plan-mode system prompt. Subset of Build: drops the
|
|
247
|
-
* subagent + actions-with-care fragments (no shell, no spawn in plan
|
|
248
|
-
* mode) and uses `PLAN_MODE_DOCTRINE` instead of `DOING_TASKS_DOCTRINE`.
|
|
249
|
-
*/
|
|
250
|
-
declare function buildPlanSystem(opts?: BuildSystemOptions): string;
|
|
251
|
-
//#endregion
|
|
252
|
-
//#region src/chat/agents-md.d.ts
|
|
253
|
-
/**
|
|
254
|
-
* Personal instructions discovery — load user + project `AGENTS.md` /
|
|
255
|
-
* `CLAUDE.md` files.
|
|
256
|
-
*
|
|
257
|
-
* Every file that exists is loaded — no shadowing within a scope.
|
|
258
|
-
* Users routinely split doctrine across files ("`~/.agents/AGENTS.md`
|
|
259
|
-
* for cross-tool portable rules, `~/.zidane/AGENTS.md` for
|
|
260
|
-
* zidane-specific tweaks") and silently dropping a file they committed
|
|
261
|
-
* is surprising. Empty or whitespace-only files are skipped.
|
|
262
|
-
*
|
|
263
|
-
* Two conventions are supported in each scope:
|
|
264
|
-
* - `AGENTS.md` — Codex / Cursor / agentic-tools convention.
|
|
265
|
-
* - `CLAUDE.md` — Claude Code convention.
|
|
266
|
-
*
|
|
267
|
-
* Search order (broadest scope first; same order in the rendered
|
|
268
|
-
* block, so narrower scopes land closer to the conversation and
|
|
269
|
-
* override broader ones in the model's eyes):
|
|
270
|
-
*
|
|
271
|
-
* user scope:
|
|
272
|
-
* 1. `~/.agents/AGENTS.md` — agnostic
|
|
273
|
-
* 2. `~/.{prefix}/AGENTS.md` — zidane (`.zidane` default)
|
|
274
|
-
* 3. `~/.claude/CLAUDE.md` — Claude Code
|
|
275
|
-
*
|
|
276
|
-
* project scope (anchored at git root, else cwd):
|
|
277
|
-
* 4. `<root>/AGENTS.md` — Codex convention
|
|
278
|
-
* 5. `<root>/.agents/AGENTS.md` — agnostic
|
|
279
|
-
* 6. `<root>/.{prefix}/AGENTS.md` — zidane
|
|
280
|
-
* 7. `<root>/CLAUDE.md` — Claude Code
|
|
281
|
-
*
|
|
282
|
-
* The {@link DiscoverAgentsMdOptions.scope} option restricts which
|
|
283
|
-
* scopes contribute. Defaults to `'both'` (the historical behavior).
|
|
284
|
-
*
|
|
285
|
-
* Each file is rendered as a section with its absolute path as the
|
|
286
|
-
* header so the model can cite the source verbatim when it asks the
|
|
287
|
-
* user about something that came from there.
|
|
288
|
-
*/
|
|
289
|
-
/** A single loaded AGENTS.md file. */
|
|
290
|
-
interface AgentsMdFile {
|
|
291
|
-
path: string;
|
|
292
|
-
source: 'project' | 'user';
|
|
293
|
-
contents: string;
|
|
294
|
-
}
|
|
295
|
-
/** Result of {@link discoverAgentsMd}. `files` is empty when none were found. */
|
|
296
|
-
interface AgentsMdResult {
|
|
297
|
-
/** All loaded files in render order (user first, project last). */
|
|
298
|
-
files: readonly AgentsMdFile[];
|
|
299
|
-
/**
|
|
300
|
-
* Pre-rendered prompt block ready to append to the system prompt, or
|
|
301
|
-
* `null` when no files were loaded. Header + per-file sections with
|
|
302
|
-
* absolute paths.
|
|
303
|
-
*/
|
|
304
|
-
block: string | null;
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Which scope(s) of personal instructions to load.
|
|
308
|
-
* - `'none'` — skip discovery entirely; no files load. Useful for
|
|
309
|
-
* reproducible reviews, demos, or debugging the base
|
|
310
|
-
* system prompt without any user doctrine bleeding in.
|
|
311
|
-
* - `'user'` — `~/.agents/AGENTS.md`, `~/.{prefix}/AGENTS.md`, `~/.claude/CLAUDE.md`
|
|
312
|
-
* - `'project'` — `<root>/AGENTS.md`, `<root>/.agents/AGENTS.md`, `<root>/.{prefix}/AGENTS.md`, `<root>/CLAUDE.md`
|
|
313
|
-
* - `'both'` — union of user + project (default)
|
|
314
|
-
*
|
|
315
|
-
* Exposed as a user-facing setting so users can scope their instructions
|
|
316
|
-
* to e.g. only the project (when running zidane against an unfamiliar
|
|
317
|
-
* repo and they don't want their global preferences leaking in).
|
|
318
|
-
*/
|
|
319
|
-
type AgentsMdScope = 'both' | 'none' | 'project' | 'user';
|
|
320
|
-
interface DiscoverAgentsMdOptions {
|
|
321
|
-
/** Discovery cwd. Default: `process.cwd()`. */
|
|
322
|
-
cwd?: string;
|
|
323
|
-
/** User home directory. Default: `os.homedir()`. */
|
|
324
|
-
home?: string;
|
|
325
|
-
/** Storage prefix. Leading dot tolerated. Default: `'.zidane'`. */
|
|
326
|
-
prefix?: string;
|
|
327
|
-
/** Which scopes to load. Default: `'both'`. */
|
|
328
|
-
scope?: AgentsMdScope;
|
|
329
|
-
/**
|
|
330
|
-
* Also load Ruler instruction markdown (`.ruler/*.md`, project and
|
|
331
|
-
* XDG-global) — see `ruler-configs.ts`. Mirrors the
|
|
332
|
-
* `importRulerConfigs` setting. When on, a repo-root `AGENTS.md`
|
|
333
|
-
* that `ruler apply` GENERATED (it aggregates those same sources) is
|
|
334
|
-
* skipped so instructions never load twice.
|
|
335
|
-
*/
|
|
336
|
-
ruler?: boolean;
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Walk the candidate paths and load every `AGENTS.md` that exists.
|
|
340
|
-
*
|
|
341
|
-
* Project paths anchor at the git root when one exists above `cwd`,
|
|
342
|
-
* else at `cwd` itself — same anchor logic as `projectUserPaths` so the
|
|
343
|
-
* three discovery surfaces (skills, mcps, AGENTS.md) stay in lock-step.
|
|
344
|
-
*
|
|
345
|
-
* All matching files are loaded (no shadowing within a scope). Empty
|
|
346
|
-
* or whitespace-only files are skipped. Render order matches the
|
|
347
|
-
* search order — broader scopes first, narrower scopes last so the
|
|
348
|
-
* project-specific file lands closest to the conversation.
|
|
349
|
-
*
|
|
350
|
-
* Tolerant on read failures: an unreadable file is skipped silently
|
|
351
|
-
* (logged under `ZIDANE_DEBUG`). The loader never throws — bootstrap
|
|
352
|
-
* paths can't afford to crash on a permission glitch.
|
|
353
|
-
*
|
|
354
|
-
* Defensive dedup: when `<git-root> === ~` (the user launched zidane
|
|
355
|
-
* directly from `$HOME` and `$HOME` happens to be a git repo) the
|
|
356
|
-
* project + user candidate sets would otherwise overlap. We dedup by
|
|
357
|
-
* absolute path so the same file never lands in the block twice.
|
|
358
|
-
*/
|
|
359
|
-
declare function discoverAgentsMd(opts?: DiscoverAgentsMdOptions): AgentsMdResult;
|
|
360
|
-
/**
|
|
361
|
-
* Render one or more `AgentsMdFile` into a system-prompt block.
|
|
362
|
-
*
|
|
363
|
-
* Top header tells the model what's coming + that it's user-authored
|
|
364
|
-
* (so it's treated as guidance, not as a system constraint that can't
|
|
365
|
-
* be questioned). Each file becomes a sub-section with its absolute
|
|
366
|
-
* path so the model can cite it back when asking follow-up questions.
|
|
367
|
-
*
|
|
368
|
-
* Exported separately so callers building custom profiles can inject
|
|
369
|
-
* their own discovery list (e.g. an SDK consumer pulling AGENTS.md
|
|
370
|
-
* from a remote source) without re-implementing the rendering.
|
|
371
|
-
*/
|
|
372
|
-
declare function renderAgentsMdBlock(files: readonly AgentsMdFile[]): string;
|
|
373
|
-
//#endregion
|
|
374
|
-
//#region src/chat/auto-compact.d.ts
|
|
375
|
-
/**
|
|
376
|
-
* Build the per-run `behavior.autoCompact` a chat host passes to `agent.run`.
|
|
377
|
-
*
|
|
378
|
-
* Loop-native auto-compaction is the single mechanism now; the TUI + GUI just
|
|
379
|
-
* translate the user's enable/threshold settings plus the picked model's raw
|
|
380
|
-
* context window (the SDK core has no model catalog) into the config the loop
|
|
381
|
-
* consumes. Returns `false` when disabled. `rawContextWindow: null` (unknown
|
|
382
|
-
* model) still enables it but leaves the trigger inert — the loop skips with
|
|
383
|
-
* `unknown-window` rather than guessing.
|
|
384
|
-
*/
|
|
385
|
-
declare function chatAutoCompactBehavior(opts: {
|
|
386
|
-
enabled: boolean;
|
|
387
|
-
threshold: number;
|
|
388
|
-
rawContextWindow: number | null;
|
|
389
|
-
/**
|
|
390
|
-
* Summarizer override — run the summary call on a different
|
|
391
|
-
* provider/model than the main one (the user's "compaction model"
|
|
392
|
-
* setting). Omitted = summarize on the run's main provider/model.
|
|
393
|
-
* `rawContextWindow` above stays the MAIN model's window: the trigger
|
|
394
|
-
* measures the live conversation, not the summarizer.
|
|
395
|
-
*/
|
|
396
|
-
summarizer?: {
|
|
397
|
-
provider: Provider;
|
|
398
|
-
model: string;
|
|
399
|
-
};
|
|
400
|
-
}): AutoCompact;
|
|
401
|
-
//#endregion
|
|
402
|
-
//#region src/chat/auto-update.d.ts
|
|
403
|
-
interface CheckForUpdateOptions {
|
|
404
|
-
/** Full npm package name to query. e.g. `'zidane-tui'`. */
|
|
405
|
-
packageName: string;
|
|
406
|
-
/** Current installed version. Inlined at build time from the consumer's `package.json`. */
|
|
407
|
-
currentVersion: string;
|
|
408
|
-
/**
|
|
409
|
-
* Registry base URL. Defaults to `https://registry.npmjs.org`. Strip the
|
|
410
|
-
* trailing slash; the helper appends `/${packageName}/${channel}`.
|
|
411
|
-
*/
|
|
412
|
-
registry?: string;
|
|
413
|
-
/**
|
|
414
|
-
* dist-tag to read. Defaults to `'latest'`. Set to `'next'` (or any
|
|
415
|
-
* custom tag) for prerelease channels — the comparison still goes through
|
|
416
|
-
* `compareSemver`, so `5.6.0-beta.2 > 5.5.0` evaluates correctly.
|
|
417
|
-
*/
|
|
418
|
-
channel?: string;
|
|
419
|
-
/** Directory used for the on-disk TTL cache. Skipped when omitted. */
|
|
420
|
-
cacheDir?: string;
|
|
421
|
-
/** Cache lifetime. Defaults to 24 h. Negative / 0 disables caching. */
|
|
422
|
-
cacheTtlMs?: number;
|
|
423
|
-
/** Network timeout. Defaults to 3 000 ms. */
|
|
424
|
-
timeoutMs?: number;
|
|
425
|
-
/** Abort signal — wins over the internal timeout. */
|
|
426
|
-
signal?: AbortSignal;
|
|
427
|
-
/**
|
|
428
|
-
* When `true`, ignore env-var opt-outs (`CI`, `NO_UPDATE_NOTIFIER`,
|
|
429
|
-
* `ZIDANE_NO_UPDATE`) AND bypass the on-disk TTL cache (always hit
|
|
430
|
-
* the registry). Used by the explicit `zidane upgrade` path where the
|
|
431
|
-
* user typed the command — they expect fresh data, not a 24-hour-old
|
|
432
|
-
* cached value. The cache is still WRITTEN with the fresh result so
|
|
433
|
-
* subsequent background checks benefit; cache reads only feed the
|
|
434
|
-
* etag into the next request so the registry can short-circuit with
|
|
435
|
-
* 304 when nothing changed.
|
|
436
|
-
*/
|
|
437
|
-
force?: boolean;
|
|
438
|
-
/** Inject for tests. Defaults to `globalThis.fetch`. */
|
|
439
|
-
fetcher?: typeof fetch;
|
|
440
|
-
/** Inject for tests. Defaults to `Date.now`. */
|
|
441
|
-
now?: () => number;
|
|
442
|
-
}
|
|
443
|
-
interface UpdateStatus {
|
|
444
|
-
/** Always present — echoes `currentVersion`. */
|
|
445
|
-
current: string;
|
|
446
|
-
/** `null` when the lookup failed / was skipped / cache was empty. */
|
|
447
|
-
latest: string | null;
|
|
448
|
-
/** `true` when `latest` is strictly greater than `current` by semver. */
|
|
449
|
-
hasUpdate: boolean;
|
|
450
|
-
/**
|
|
451
|
-
* - `'fresh'` — fetched from the registry this call.
|
|
452
|
-
* - `'cached'` — served from the on-disk cache.
|
|
453
|
-
* - `'skipped'` — opt-out env var, missing fetch, network refused, etc.
|
|
454
|
-
* - `'error'` — registry returned non-2xx or threw; details on `error`.
|
|
455
|
-
*/
|
|
456
|
-
source: 'fresh' | 'cached' | 'skipped' | 'error';
|
|
457
|
-
/** Error message when `source === 'error'`. */
|
|
458
|
-
error?: string;
|
|
459
|
-
/** When the registry was last queried (ms since epoch). `null` when never. */
|
|
460
|
-
checkedAt: number | null;
|
|
461
|
-
/** dist-tag used for the lookup — handy when surfacing "v5.6.0 (next)". */
|
|
462
|
-
channel: string;
|
|
463
|
-
}
|
|
464
|
-
interface PackageManagerCommand {
|
|
465
|
-
/** Stable identifier. `npm` is the fallback when no other signal fires. */
|
|
466
|
-
id: PackageManagerId;
|
|
467
|
-
/** Argv that, when execve'd, installs `packageName@channel` globally. */
|
|
468
|
-
argv: string[];
|
|
469
|
-
/**
|
|
470
|
-
* Free-form note for the user — explains *why* this command was chosen
|
|
471
|
-
* (e.g. "Volta-managed install detected via ~/.volta/bin").
|
|
472
|
-
*/
|
|
473
|
-
note?: string;
|
|
474
|
-
}
|
|
475
|
-
type PackageManagerId = 'npm' | 'pnpm' | 'yarn' | 'bun' | 'volta';
|
|
476
|
-
interface DetectPackageManagerOptions {
|
|
477
|
-
/** Override the resolved binary path (defaults to `process.execPath`). */
|
|
478
|
-
binaryPath?: string;
|
|
479
|
-
/** Override the user-agent string (defaults to `process.env.npm_config_user_agent`). */
|
|
480
|
-
userAgent?: string | undefined;
|
|
481
|
-
/** Override env. Used in tests. */
|
|
482
|
-
env?: Readonly<Record<string, string | undefined>>;
|
|
483
|
-
/** Override `homedir()`. Used in tests. */
|
|
484
|
-
home?: string;
|
|
485
|
-
/** Override `process.platform`. Used in tests. */
|
|
486
|
-
platform?: NodeJS.Platform;
|
|
487
|
-
/** When set, the host already knows the package name (avoids the test seam). */
|
|
488
|
-
packageName?: string;
|
|
489
|
-
/** dist-tag. Defaults to `'latest'`. */
|
|
490
|
-
channel?: string;
|
|
491
|
-
}
|
|
492
|
-
declare function parseSemver(input: string): {
|
|
493
|
-
major: number;
|
|
494
|
-
minor: number;
|
|
495
|
-
patch: number;
|
|
496
|
-
prerelease: string[];
|
|
497
|
-
} | null;
|
|
498
|
-
/** Returns `-1 / 0 / 1`. Unparseable inputs sort as `0` (assume equal). */
|
|
499
|
-
declare function compareSemver(a: string, b: string): -1 | 0 | 1;
|
|
500
|
-
/**
|
|
501
|
-
* Resolve the latest available version of `packageName`, honoring an
|
|
502
|
-
* on-disk TTL cache so the warm path costs zero network. Never throws —
|
|
503
|
-
* registry failures degrade to `{ source: 'error', latest: null }`.
|
|
504
|
-
*
|
|
505
|
-
* Designed for boot-path usage: short timeout, swallows errors, opt-outs
|
|
506
|
-
* for CI / restricted shells. Consumers driving the explicit `upgrade`
|
|
507
|
-
* subcommand should set `force: true` to ignore env opt-outs.
|
|
508
|
-
*/
|
|
509
|
-
declare function checkForUpdate(options: CheckForUpdateOptions): Promise<UpdateStatus>;
|
|
510
|
-
declare function detectPackageManager(opts?: DetectPackageManagerOptions): PackageManagerCommand;
|
|
511
|
-
interface PerformSelfUpdateOptions {
|
|
512
|
-
packageName: string;
|
|
513
|
-
channel?: string;
|
|
514
|
-
/** Force a specific PM instead of auto-detect. */
|
|
515
|
-
packageManager?: PackageManagerId | 'auto';
|
|
516
|
-
/** Don't actually spawn — return the command we WOULD run. */
|
|
517
|
-
dryRun?: boolean;
|
|
518
|
-
/** When set, write `pm stdout/stderr` to these streams instead of stdio inherit. */
|
|
519
|
-
stdout?: NodeJS.WritableStream;
|
|
520
|
-
stderr?: NodeJS.WritableStream;
|
|
521
|
-
/** Abort the install. */
|
|
522
|
-
signal?: AbortSignal;
|
|
523
|
-
/** Override env (e.g. set `npm_config_loglevel=error`). */
|
|
524
|
-
env?: Readonly<Record<string, string>>;
|
|
525
|
-
/** Inject for tests. */
|
|
526
|
-
spawn?: typeof spawn;
|
|
527
|
-
/** Inject for tests. */
|
|
528
|
-
detect?: typeof detectPackageManager;
|
|
529
|
-
}
|
|
530
|
-
interface SelfUpdateResult {
|
|
531
|
-
command: PackageManagerCommand;
|
|
532
|
-
/** PM exit code. `null` when `dryRun` or the process was killed. */
|
|
533
|
-
exitCode: number | null;
|
|
534
|
-
/** Set when the spawn itself failed (`ENOENT`, EACCES). */
|
|
535
|
-
spawnError?: string;
|
|
536
|
-
}
|
|
537
|
-
/**
|
|
538
|
-
* Re-install the package globally via the host's package manager. Resolves
|
|
539
|
-
* with the spawned command's exit code, or rejects only when the caller's
|
|
540
|
-
* `signal` aborts. PM failures surface as a non-zero `exitCode` — the
|
|
541
|
-
* caller decides whether to retry or fall back to in-place.
|
|
542
|
-
*/
|
|
543
|
-
declare function performSelfUpdate(options: PerformSelfUpdateOptions): Promise<SelfUpdateResult>;
|
|
544
|
-
interface PerformInPlaceUpdateOptions {
|
|
545
|
-
/** Platform-specific tarball package, e.g. `'zidane-tui-darwin-arm64'`. */
|
|
546
|
-
packageName: string;
|
|
547
|
-
channel?: string;
|
|
548
|
-
/** Resolved path of the running binary. Defaults to `process.execPath`. */
|
|
549
|
-
binaryPath?: string;
|
|
550
|
-
/** Inside the tarball — usually `bin/<name>`. Defaults to `bin/<basename(binaryPath)>`. */
|
|
551
|
-
tarballBinaryPath?: string;
|
|
552
|
-
registry?: string;
|
|
553
|
-
/** Network timeout (per request). Defaults to 30 000 ms — tarballs are MB-scale. */
|
|
554
|
-
timeoutMs?: number;
|
|
555
|
-
signal?: AbortSignal;
|
|
556
|
-
/** Don't replace — just download + verify. */
|
|
557
|
-
dryRun?: boolean;
|
|
558
|
-
fetcher?: typeof fetch;
|
|
559
|
-
/** When set, refuse the swap if the resolved binary lives under one of these prefixes. */
|
|
560
|
-
refuseUnderPrefixes?: readonly string[];
|
|
561
|
-
}
|
|
562
|
-
interface InPlaceUpdateResult {
|
|
563
|
-
/** `'success' | 'refused' | 'failed'`. */
|
|
564
|
-
status: 'success' | 'refused' | 'failed';
|
|
565
|
-
/** Version that was installed (from the tarball's package.json). */
|
|
566
|
-
installedVersion?: string;
|
|
567
|
-
/** Why we bailed. Always present on `refused` / `failed`. */
|
|
568
|
-
reason?: string;
|
|
569
|
-
/** Resolved binary path after the swap. */
|
|
570
|
-
binaryPath?: string;
|
|
571
|
-
}
|
|
572
|
-
/**
|
|
573
|
-
* Replace the running binary with the latest tarball-shipped one. Works on
|
|
574
|
-
* macOS + Linux (POSIX unlink-while-running); refuses on Windows. Returns
|
|
575
|
-
* a result object instead of throwing — callers usually want to print
|
|
576
|
-
* `result.reason` and fall back to a PM-driven update.
|
|
577
|
-
*/
|
|
578
|
-
declare function performInPlaceSelfUpdate(options: PerformInPlaceUpdateOptions): Promise<InPlaceUpdateResult>;
|
|
579
|
-
interface PlatformTarballOptions {
|
|
580
|
-
/** Override `process.platform`. */
|
|
581
|
-
platform?: NodeJS.Platform;
|
|
582
|
-
/** Override `process.arch`. */
|
|
583
|
-
arch?: NodeJS.Architecture | string;
|
|
584
|
-
/** Override the libc check (returned from `detectLibc`). */
|
|
585
|
-
libc?: 'glibc' | 'musl';
|
|
586
|
-
/** Prefix joined to the platform key. Defaults to `'zidane-tui-'`. */
|
|
587
|
-
prefix?: string;
|
|
588
|
-
}
|
|
589
|
-
declare function resolvePlatformPackage(opts?: PlatformTarballOptions): string | null;
|
|
590
|
-
/** Mirrors `tui/bin/zidane.mjs#detectLibc`. */
|
|
591
|
-
declare function detectLibc(): 'glibc' | 'musl';
|
|
592
|
-
//#endregion
|
|
593
|
-
//#region src/chat/auto-update-cli.d.ts
|
|
594
|
-
interface RunUpdateCommandOptions {
|
|
595
|
-
/** Top-level package the user installs (e.g. `'zidane-tui'`). */
|
|
596
|
-
packageName: string;
|
|
597
|
-
/** Inlined at build time. */
|
|
598
|
-
currentVersion: string;
|
|
599
|
-
/** Args passed after `upgrade` (typically `process.argv.slice(3)`). */
|
|
600
|
-
argv: readonly string[];
|
|
601
|
-
/** Where to persist the TTL cache. Usually `paths.userDir`. */
|
|
602
|
-
cacheDir?: string;
|
|
603
|
-
/** Default channel when `--channel` isn't passed. Defaults to `'latest'`. */
|
|
604
|
-
defaultChannel?: string;
|
|
605
|
-
/**
|
|
606
|
-
* Override the platform-package-name prefix used by `--in-place`.
|
|
607
|
-
* Defaults to `'<packageName>-'`, matching the `zidane-tui-<key>` layout.
|
|
608
|
-
*/
|
|
609
|
-
platformPackagePrefix?: string;
|
|
610
|
-
/** Override registry. Defaults to npmjs. */
|
|
611
|
-
registry?: string;
|
|
612
|
-
/** stdout. Defaults to `process.stdout`. */
|
|
613
|
-
stdout?: NodeJS.WritableStream;
|
|
614
|
-
/** stderr. Defaults to `process.stderr`. */
|
|
615
|
-
stderr?: NodeJS.WritableStream;
|
|
616
|
-
}
|
|
617
|
-
interface RunUpdateCommandResult {
|
|
618
|
-
exitCode: number;
|
|
619
|
-
}
|
|
620
|
-
/**
|
|
621
|
-
* Run the `upgrade` subcommand. Exit code contract:
|
|
622
|
-
* - `0` — update succeeded, `--check` reported no update, or `--check`
|
|
623
|
-
* reported an update (informational only).
|
|
624
|
-
* - `1` — update failed (PM exit non-zero, in-place download failed,
|
|
625
|
-
* registry returned non-2xx).
|
|
626
|
-
* - `2` — argv parse error (unknown flag).
|
|
627
|
-
*/
|
|
628
|
-
declare function runUpdateCommand(options: RunUpdateCommandOptions): Promise<RunUpdateCommandResult>;
|
|
629
|
-
//#endregion
|
|
630
|
-
//#region src/chat/auto-update-hook.d.ts
|
|
631
|
-
interface UseUpdateCheckOptions {
|
|
632
|
-
/** npm package name. e.g. `'zidane-tui'`. */
|
|
633
|
-
packageName: string;
|
|
634
|
-
/** Inlined at build time. Skips the check if empty/falsy. */
|
|
635
|
-
currentVersion: string;
|
|
636
|
-
/**
|
|
637
|
-
* Master enable flag — usually `Settings.checkForUpdates`. When `false`
|
|
638
|
-
* the hook short-circuits without scheduling any work AND clears the
|
|
639
|
-
* last-known status so a stale chip doesn't linger after the user
|
|
640
|
-
* disabled the feature.
|
|
641
|
-
*/
|
|
642
|
-
enabled: boolean;
|
|
643
|
-
/** Directory under which the on-disk cache lives. Usually `paths.userDir`. */
|
|
644
|
-
cacheDir?: string;
|
|
645
|
-
registry?: string;
|
|
646
|
-
channel?: string;
|
|
647
|
-
/**
|
|
648
|
-
* Cache lifetime for the read-through. **Defaults to `0`** (always
|
|
649
|
-
* fetch fresh) — the TUI chip is the user's source of truth for "what
|
|
650
|
-
* version of zidane is on npm right now"; we'd rather pay one HTTPS
|
|
651
|
-
* call per session than tell them yesterday's news for up to 24 hours.
|
|
652
|
-
*
|
|
653
|
-
* The on-disk cache is still WRITTEN with each fresh result (so
|
|
654
|
-
* `zidane upgrade` and other tooling reads benefit) and still READ to
|
|
655
|
-
* feed the registry's ETag (so the cold path can short-circuit on 304
|
|
656
|
-
* — meaningful bandwidth win when nothing changed). Pass a positive
|
|
657
|
-
* value (e.g. `3_600_000` for 1 h) to enable read-through caching for
|
|
658
|
-
* a GUI shell that mounts the hook in many places.
|
|
659
|
-
*/
|
|
660
|
-
cacheTtlMs?: number;
|
|
661
|
-
/**
|
|
662
|
-
* Wall-clock delay before the first check fires. Defaults to 1 500 ms so
|
|
663
|
-
* we never compete with the boot path's first paint. The check itself
|
|
664
|
-
* is async, so this only affects WHEN the chip first appears — never
|
|
665
|
-
* blocks anything else.
|
|
666
|
-
*/
|
|
667
|
-
delayMs?: number;
|
|
668
|
-
/** Injected for tests. */
|
|
669
|
-
now?: () => number;
|
|
670
|
-
/** Injected for tests. */
|
|
671
|
-
fetcher?: typeof fetch;
|
|
672
|
-
}
|
|
673
|
-
/**
|
|
674
|
-
* Returns the current update status. The check fires:
|
|
675
|
-
* - Once per mount (every TUI launch).
|
|
676
|
-
* - Every time `enabled` flips from `false` → `true` (user re-enabling
|
|
677
|
-
* the setting expects an immediate refresh).
|
|
678
|
-
*
|
|
679
|
-
* The check is async and deferred by `delayMs` so it never competes with
|
|
680
|
-
* first paint. Result is `null` until the first check resolves; flipping
|
|
681
|
-
* `enabled` to `false` resets to `null` so any chip rendered against
|
|
682
|
-
* `hasUpdate` disappears immediately.
|
|
683
|
-
*
|
|
684
|
-
* The hook owns its own AbortController so an unmount cancels any in-flight
|
|
685
|
-
* registry request cleanly.
|
|
686
|
-
*/
|
|
687
|
-
declare function useUpdateCheck(options: UseUpdateCheckOptions): UpdateStatus | null;
|
|
688
|
-
interface BuildUpdateHintOptions {
|
|
689
|
-
/** Foreground color for the `↑` glyph + version label. */
|
|
690
|
-
color: string;
|
|
691
|
-
/**
|
|
692
|
-
* When true (default), the chip renders the literal version (`↑ v5.6.0`).
|
|
693
|
-
* When false, just the glyph + `update` label — useful when the row is
|
|
694
|
-
* tight and the version would push higher-priority chips off the right.
|
|
695
|
-
*/
|
|
696
|
-
showVersion?: boolean;
|
|
697
|
-
/** Override the leading glyph. Defaults to `'↑'`. */
|
|
698
|
-
glyph?: string;
|
|
699
|
-
}
|
|
700
|
-
declare function buildUpdateHint(status: UpdateStatus | null, options: BuildUpdateHintOptions): Hint | null;
|
|
701
|
-
//#endregion
|
|
702
|
-
//#region src/chat/boot-profiler.d.ts
|
|
703
|
-
/**
|
|
704
|
-
* Record a checkpoint. No-op unless `ZIDANE_BOOT_PROFILE` is truthy in
|
|
705
|
-
* the environment.
|
|
706
|
-
*
|
|
707
|
-
* The leading delta is the time since the PREVIOUS tick (so a long
|
|
708
|
-
* delta highlights the immediately-preceding work); the trailing total
|
|
709
|
-
* is the time since the profiler started. Both round to one decimal of
|
|
710
|
-
* a millisecond.
|
|
711
|
-
*/
|
|
712
|
-
declare function bootTick(label: string): void;
|
|
713
|
-
/**
|
|
714
|
-
* Returns `true` when `ZIDANE_BOOT_PROFILE` is set. Useful for guarding
|
|
715
|
-
* heavier instrumentation (e.g. wrapping a costly call in a span) that
|
|
716
|
-
* you don't want paying its own cost in the default path.
|
|
717
|
-
*/
|
|
718
|
-
declare function bootProfileEnabled(): boolean;
|
|
719
|
-
//#endregion
|
|
720
|
-
//#region src/chat/browser.d.ts
|
|
721
|
-
/**
|
|
722
|
-
* Best-effort cross-platform browser open.
|
|
723
|
-
*
|
|
724
|
-
* macOS uses `open`, Linux uses `xdg-open`, Windows uses `start`. Failures
|
|
725
|
-
* are swallowed — both callers (AI-provider OAuth + MCP-server OAuth) show
|
|
726
|
-
* the URL on-screen for manual click anyway, and the underlying flows have
|
|
727
|
-
* their own progress/cancel paths.
|
|
728
|
-
*
|
|
729
|
-
* Uses `spawn` (not `exec`) so the URL is passed as an argv element rather
|
|
730
|
-
* than interpolated into a shell command — URLs containing `&`, `?`, `"`,
|
|
731
|
-
* or other shell metacharacters don't need quoting.
|
|
732
|
-
*
|
|
733
|
-
* Detached + unref so the spawned helper outlives the parent: the user
|
|
734
|
-
* can finish authorizing in the browser even if the TUI is later
|
|
735
|
-
* suspended (Ctrl-Z) or killed.
|
|
736
|
-
*/
|
|
737
|
-
declare function tryOpenBrowser(url: string): void;
|
|
738
|
-
//#endregion
|
|
739
|
-
//#region src/chat/claude-import.d.ts
|
|
740
|
-
interface ClaudeImportOptions {
|
|
741
|
-
/** Discovery cwd. Default: `process.cwd()`. */
|
|
742
|
-
cwd?: string;
|
|
743
|
-
/** User home directory. Default: `os.homedir()`. */
|
|
744
|
-
home?: string;
|
|
745
|
-
/** Storage prefix for write targets. Default: `'.zidane'`. */
|
|
746
|
-
prefix?: string;
|
|
747
|
-
/** Import sessions from every Claude project dir, not just the current project's. */
|
|
748
|
-
allProjects?: boolean;
|
|
749
|
-
}
|
|
750
|
-
/** `~/.claude` — presence gates the settings action row. */
|
|
751
|
-
declare function hasClaudeCodeSetup(opts?: ClaudeImportOptions): boolean;
|
|
752
|
-
/**
|
|
753
|
-
* Detection-preview counts — scoped and all-projects figures from ONE
|
|
754
|
-
* directory walk (the naive two-listing approach reads every project dir
|
|
755
|
-
* twice). The scoped classification (with its per-file cwd peek for
|
|
756
|
-
* candidate dirs) runs at most once per file via the lazy `scoped()`
|
|
757
|
-
* thunk.
|
|
758
|
-
*/
|
|
759
|
-
declare function countClaudeSessionFiles(opts?: ClaudeImportOptions): {
|
|
760
|
-
project: number;
|
|
761
|
-
all: number;
|
|
762
|
-
};
|
|
763
|
-
interface ClaudeSessionImportResult {
|
|
764
|
-
imported: number;
|
|
765
|
-
/** Already in the store (same Claude session UUID) — idempotent re-run. */
|
|
766
|
-
skipped: number;
|
|
767
|
-
/** Nothing conversational in the file (hook noise, queue bookkeeping only). */
|
|
768
|
-
empty: number;
|
|
769
|
-
/** Files that failed to parse/convert, with the reason. */
|
|
770
|
-
failed: {
|
|
771
|
-
path: string;
|
|
772
|
-
error: string;
|
|
773
|
-
}[];
|
|
774
|
-
}
|
|
775
|
-
interface ClaudeCopyResult {
|
|
776
|
-
copied: string[];
|
|
777
|
-
/** Names already present natively — never overwritten. */
|
|
778
|
-
skipped: string[];
|
|
779
|
-
failed: {
|
|
780
|
-
name: string;
|
|
781
|
-
error: string;
|
|
782
|
-
}[];
|
|
783
|
-
/**
|
|
784
|
-
* Names that appeared in MORE THAN ONE Claude source (e.g. `.mcp.json`
|
|
785
|
-
* AND `~/.claude.json`) — the first occurrence (highest-precedence
|
|
786
|
-
* source, matching Claude's own project → local → user order) was
|
|
787
|
-
* processed, later ones dropped. Surfaced so a differently-configured
|
|
788
|
-
* duplicate doesn't vanish from the accounting. MCP import only.
|
|
789
|
-
*/
|
|
790
|
-
duplicates?: string[];
|
|
791
|
-
}
|
|
792
|
-
interface ClaudeImportSummary {
|
|
793
|
-
sessions?: ClaudeSessionImportResult;
|
|
794
|
-
mcps?: ClaudeCopyResult;
|
|
795
|
-
skills?: ClaudeCopyResult;
|
|
796
|
-
/** What is deliberately NOT imported, spelled out for the UI. */
|
|
797
|
-
notes: string[];
|
|
798
|
-
}
|
|
799
|
-
declare function importFromClaudeCode(store: SessionStore, opts?: ClaudeImportOptions & {
|
|
800
|
-
sessions?: boolean;
|
|
801
|
-
mcps?: boolean;
|
|
802
|
-
skills?: boolean;
|
|
803
|
-
}): Promise<ClaudeImportSummary>;
|
|
804
|
-
//#endregion
|
|
805
|
-
//#region src/chat/config-context.d.ts
|
|
806
|
-
declare function ConfigProvider({
|
|
807
|
-
config,
|
|
808
|
-
children
|
|
809
|
-
}: {
|
|
810
|
-
config: ResolvedConfig;
|
|
811
|
-
children: ReactNode;
|
|
812
|
-
}): import("react").JSX.Element;
|
|
813
|
-
declare function useConfig(): ResolvedConfig;
|
|
814
|
-
//#endregion
|
|
815
|
-
//#region src/chat/cred-keys.d.ts
|
|
816
|
-
/**
|
|
817
|
-
* Credential-file key arithmetic, split from `./credentials` so the rules can
|
|
818
|
-
* be enforced where credentials themselves must not be pulled in.
|
|
819
|
-
*
|
|
820
|
-
* `./credentials` reaches the provider registry (and through it the pi-ai
|
|
821
|
-
* factories) for `credKeyOf`; the extension loader — an edge entrypoint that
|
|
822
|
-
* validates descriptor keys at registration time — must stay clear of that
|
|
823
|
-
* graph. This module is string arithmetic with no imports.
|
|
824
|
-
*/
|
|
825
|
-
/**
|
|
826
|
-
* Reserved suffix marking a provider's SECOND credential slot.
|
|
827
|
-
*
|
|
828
|
-
* Not usable as (or as the tail of) a descriptor's credential key: `foo#alt`
|
|
829
|
-
* holds `foo`'s alternate credential, so a provider claiming that name would
|
|
830
|
-
* share storage with it.
|
|
831
|
-
*/
|
|
832
|
-
declare const ALTERNATE_CRED_KEY_SUFFIX = "#alt";
|
|
833
|
-
/**
|
|
834
|
-
* File key holding a provider's second credential, when it has one of each kind.
|
|
835
|
-
*
|
|
836
|
-
* The canonical key always holds the credential the user prefers; this sibling
|
|
837
|
-
* holds the other. That one invariant is what makes preference selection free:
|
|
838
|
-
* every existing reader (`applyApiKeyEnv`, the harness provider factories)
|
|
839
|
-
* already resolves the canonical key, so "switch priority" is just moving two
|
|
840
|
-
* objects between two keys — no precedence flag to interpret, no resolution
|
|
841
|
-
* order to keep in sync across layers.
|
|
842
|
-
*
|
|
843
|
-
* A sibling key rather than a nested field because the canonical entry gets
|
|
844
|
-
* REPLACED wholesale on token refresh; anything nested inside it would be
|
|
845
|
-
* dropped by the next rotation. And older zidane versions look credentials up
|
|
846
|
-
* by `credKeyOf`, so a suffixed key is simply invisible to them — they read the
|
|
847
|
-
* preferred credential and behave exactly as before, which is why this needs no
|
|
848
|
-
* migration or schema version.
|
|
849
|
-
*/
|
|
850
|
-
declare function alternateCredKey(fileKey: string): string;
|
|
851
|
-
/**
|
|
852
|
-
* True when a key claims the reserved alternate namespace.
|
|
853
|
-
*
|
|
854
|
-
* Built-in keys are plain identifiers (`anthropic`, `openai-codex`), but
|
|
855
|
-
* `ProviderDescriptor.key` / `credentialFileKey` are open strings — so the
|
|
856
|
-
* reservation is checked, not assumed.
|
|
857
|
-
*/
|
|
858
|
-
declare function isReservedCredKey(fileKey: string): boolean;
|
|
859
|
-
//#endregion
|
|
860
|
-
//#region src/chat/credentials.d.ts
|
|
861
|
-
interface ApiKeyCredential {
|
|
862
|
-
kind: 'apikey';
|
|
863
|
-
/**
|
|
864
|
-
* Bearer API key. May be empty when the descriptor has no `envKey` and
|
|
865
|
-
* authenticates entirely via {@link customFields} (e.g. the `local`
|
|
866
|
-
* provider, where the auth signal is the configured base URL).
|
|
867
|
-
*/
|
|
868
|
-
value: string;
|
|
869
|
-
/**
|
|
870
|
-
* Free-form fields collected by the wizard from the descriptor's
|
|
871
|
-
* `customFields` definitions. Keys match the descriptor field's `key`.
|
|
872
|
-
* Mirrored into `process.env[field.envVar]` by `applyApiKeyEnv` so the
|
|
873
|
-
* provider's factory can read them via the existing env-var convention.
|
|
874
|
-
*/
|
|
875
|
-
customFields?: Record<string, string>;
|
|
876
|
-
}
|
|
877
|
-
interface OAuthCredential {
|
|
878
|
-
kind: 'oauth';
|
|
879
|
-
access: string;
|
|
880
|
-
refresh?: string;
|
|
881
|
-
expires?: number;
|
|
882
|
-
/** Provider-specific extras (e.g. OpenAI Codex `accountId`). */
|
|
883
|
-
[extra: string]: unknown;
|
|
884
|
-
}
|
|
885
|
-
type ProviderCredential = ApiKeyCredential | OAuthCredential;
|
|
886
|
-
/** Top-level shape of `credentials.json` — keys are credential-file keys. */
|
|
887
|
-
type CredentialsFile = Record<string, ProviderCredential>;
|
|
888
|
-
/**
|
|
889
|
-
* Resolve the credentials file path given the resolved TUI data directory
|
|
890
|
-
* (typically `~/.zidane`, i.e. `config.paths.dir`).
|
|
891
|
-
*
|
|
892
|
-
* Matches the convention used elsewhere in the TUI (sessions.db, state.json)
|
|
893
|
-
* so a single `ZIDANE_STORAGE_DIR` override moves the entire data root.
|
|
894
|
-
*/
|
|
895
|
-
declare function credentialsPath(dataDir: string): string;
|
|
896
|
-
/**
|
|
897
|
-
* Read credentials from disk.
|
|
898
|
-
*
|
|
899
|
-
* Returns `{}` when the file is missing or corrupt (last-ditch tolerance —
|
|
900
|
-
* a hand-edit gone wrong shouldn't lock the user out of re-authing). On first
|
|
901
|
-
* call with no file present, attempts a migration from `cwd/.credentials.json`
|
|
902
|
-
* (the legacy location used by `bun run auth`).
|
|
903
|
-
*/
|
|
904
|
-
declare function readCredentials(dataDir: string): CredentialsFile;
|
|
905
|
-
/** Read a single provider's credential (translating via the descriptor). */
|
|
906
|
-
declare function readProviderCredential(dataDir: string, descriptor: ProviderDescriptor): ProviderCredential | undefined;
|
|
907
|
-
/**
|
|
908
|
-
* Both stored credentials for a provider: `active` is the one every reader
|
|
909
|
-
* resolves, `alternate` is the stored-but-not-preferred one (if any).
|
|
910
|
-
*/
|
|
911
|
-
declare function readProviderCredentialPair(dataDir: string, descriptor: ProviderDescriptor): {
|
|
912
|
-
active?: ProviderCredential;
|
|
913
|
-
alternate?: ProviderCredential;
|
|
914
|
-
};
|
|
915
|
-
/**
|
|
916
|
-
* Write credentials atomically (write-then-rename) with mode 0o600.
|
|
917
|
-
*
|
|
918
|
-
* Atomic on the same filesystem — readers either see the previous file or the
|
|
919
|
-
* new one, never a half-written intermediate. Creates the parent dir if needed
|
|
920
|
-
* (first launch on a fresh machine: `~/.zidane/` may not exist yet).
|
|
921
|
-
*/
|
|
922
|
-
declare function writeCredentials(dataDir: string, creds: CredentialsFile): void;
|
|
923
|
-
/**
|
|
924
|
-
* Store a credential as the provider's preferred one.
|
|
925
|
-
*
|
|
926
|
-
* A credential of the OTHER kind already in the canonical slot is demoted to
|
|
927
|
-
* {@link alternateCredKey}, not destroyed: authenticating with OAuth used to
|
|
928
|
-
* silently delete a working API key (and vice versa), leaving the user to
|
|
929
|
-
* re-enter it. Replacing a credential of the SAME kind is a plain overwrite —
|
|
930
|
-
* that's a re-auth, not a second source.
|
|
931
|
-
*
|
|
932
|
-
* The pair holds AT MOST ONE credential of each kind. A same-kind alternate is
|
|
933
|
-
* therefore stale — no code path here can produce one, but a file written by an
|
|
934
|
-
* older build can carry it, and it would surface as two identical source rows
|
|
935
|
-
* that "switch" between each other. Dropping it on the next write self-heals.
|
|
936
|
-
*/
|
|
937
|
-
declare function setProviderCredential(dataDir: string, descriptor: ProviderDescriptor, cred: ProviderCredential): void;
|
|
938
|
-
/**
|
|
939
|
-
* Make the provider's stored `source` credential the preferred one.
|
|
940
|
-
*
|
|
941
|
-
* No-op unless a credential of that kind is sitting in the alternate slot, so
|
|
942
|
-
* calling it for the already-active source is harmless.
|
|
943
|
-
*/
|
|
944
|
-
declare function setPreferredCredential(dataDir: string, descriptor: ProviderDescriptor, source: ProviderCredential['kind']): void;
|
|
945
|
-
/**
|
|
946
|
-
* Sign a provider out — drops BOTH stored credentials.
|
|
947
|
-
*
|
|
948
|
-
* "Signed out" has to mean the provider resolves nothing afterwards, which is
|
|
949
|
-
* what this has always guaranteed and what callers named it for; promoting the
|
|
950
|
-
* alternate instead would silently leave the provider authenticated through the
|
|
951
|
-
* other source. Callers that want the fall-back behavior can read the pair
|
|
952
|
-
* first ({@link readProviderCredentialPair}) and re-store the survivor.
|
|
953
|
-
*/
|
|
954
|
-
declare function removeProviderCredential(dataDir: string, descriptor: ProviderDescriptor): void;
|
|
955
|
-
/**
|
|
956
|
-
* Reconcile `process.env` with the stored credentials so the harness providers
|
|
957
|
-
* pick up the wizard's output via their existing env-var resolution. Called
|
|
958
|
-
* once at TUI launch after the credentials file has been resolved.
|
|
959
|
-
*
|
|
960
|
-
* **Precedence: stored credential > ambient env.** When the user has run the
|
|
961
|
-
* auth wizard, that's an explicit, recent action — it MUST win over whatever
|
|
962
|
-
* ambient value is already in `process.env`. Otherwise an upgrade reliably
|
|
963
|
-
* breaks for anyone whose cwd happens to contain a stale `.env`: Bun
|
|
964
|
-
* auto-loads `.env` from cwd into `process.env` before our code runs, the
|
|
965
|
-
* legacy `bun run auth` used to upsert tokens into `cwd/.env`, and even a
|
|
966
|
-
* one-off `export ANTHROPIC_API_KEY=…` from months ago in the user's shell rc
|
|
967
|
-
* can outlive its usefulness. None of those should override a key the user
|
|
968
|
-
* just typed into the wizard.
|
|
969
|
-
*
|
|
970
|
-
* Three cases per registered provider with an `envKey`:
|
|
971
|
-
*
|
|
972
|
-
* 1. Stored `kind: 'apikey'` → overwrite env with the stored value. Wizard
|
|
973
|
-
* wins. A debug log fires when this clobbers a different ambient value.
|
|
974
|
-
* 2. Stored `kind: 'oauth'` → DELETE env, so {@link resolveOAuthApiKey}
|
|
975
|
-
* falls through to the file-read + refresh path. A stale OAuth token
|
|
976
|
-
* in env would otherwise short-circuit refresh and get rejected.
|
|
977
|
-
* 3. No stored entry → leave env alone. Env-only setups (no wizard run yet,
|
|
978
|
-
* hosts driving zidane purely from secrets management) keep working.
|
|
979
|
-
*
|
|
980
|
-
* To opt out and force ambient env to win again, the user signs the provider
|
|
981
|
-
* out via the wizard (which deletes the stored entry → case 3 above).
|
|
982
|
-
*
|
|
983
|
-
* Descriptors without an `envKey` (OAuth-only providers, custom providers
|
|
984
|
-
* that bypass env-var resolution) are skipped silently.
|
|
985
|
-
*/
|
|
986
|
-
declare function applyApiKeyEnv(dataDir: string, registry: Readonly<Record<string, ProviderDescriptor>>, opts?: {
|
|
987
|
-
log?: (message: string) => void;
|
|
988
|
-
}): void;
|
|
989
|
-
//#endregion
|
|
990
|
-
//#region src/chat/discovery-context.d.ts
|
|
991
|
-
interface DiscoveryContextValue {
|
|
992
|
-
/** Parsed `SkillConfig[]` from project + user scan paths. */
|
|
993
|
-
skillsCatalog: readonly SkillConfig[];
|
|
994
|
-
/**
|
|
995
|
-
* Agent Plugins loaded from `.agents/plugins` / `.{prefix}/plugins`
|
|
996
|
-
* (project + user). Includes rejected plugins — they render as read-only
|
|
997
|
-
* diagnostics rather than vanishing.
|
|
998
|
-
*/
|
|
999
|
-
pluginsCatalog: readonly DiscoveredPlugin[];
|
|
1000
|
-
/** Parsed `mcps.json` entries. */
|
|
1001
|
-
mcpsCatalog: readonly DiscoveredMcp[];
|
|
1002
|
-
/** Non-fatal parse errors from `mcps.json` lookups. */
|
|
1003
|
-
mcpsErrors: readonly DiscoveryError[];
|
|
1004
|
-
/**
|
|
1005
|
-
* Per-server full tool catalog from the on-disk cache (see
|
|
1006
|
-
* `chat/mcp-tools-cache.ts`). Updated as MCP servers bootstrap and
|
|
1007
|
-
* fire the `mcp:tools:list` hook. Missing key → no cache yet; the
|
|
1008
|
-
* settings UI surfaces an empty-state row under the expanded server.
|
|
1009
|
-
*/
|
|
1010
|
-
mcpToolsByServer: Record<string, readonly McpToolSchema[]>;
|
|
1011
|
-
/** Current file walk results — empty until lazy-load lands. */
|
|
1012
|
-
filesCatalog: readonly FileEntry[];
|
|
1013
|
-
/** Force a fresh skills rescan. Resolves once state is committed. */
|
|
1014
|
-
refreshSkills: () => Promise<void>;
|
|
1015
|
-
/** Force a fresh plugin rescan. Resolves once state is committed. */
|
|
1016
|
-
refreshPlugins: () => Promise<void>;
|
|
1017
|
-
/**
|
|
1018
|
-
* Re-parse `mcps.json`. Sync-shaped under the hood, async for symmetry.
|
|
1019
|
-
* Resolves `true` when the catalog actually changed (a publish that
|
|
1020
|
-
* schedules downstream agent rebuilds), `false` on a fingerprint no-op
|
|
1021
|
-
* or scan failure — callers that arm rebuild-coupled state (e.g. the
|
|
1022
|
-
* add-MCP auto-login) disarm on `false`.
|
|
1023
|
-
*/
|
|
1024
|
-
refreshMcps: () => Promise<boolean>;
|
|
1025
|
-
/** Force a fresh file walk. Wired into a future "refresh files" affordance. */
|
|
1026
|
-
refreshFiles: () => Promise<void>;
|
|
1027
|
-
/** Idempotent first-load trigger for skills (used by `/` popover + modal mount). */
|
|
1028
|
-
ensureSkills: () => Promise<readonly SkillConfig[]>;
|
|
1029
|
-
/** Idempotent first-load trigger for files (used by `@` popover). */
|
|
1030
|
-
ensureFiles: () => Promise<readonly FileEntry[]>;
|
|
1031
|
-
}
|
|
1032
|
-
declare function DiscoveryProvider({
|
|
1033
|
-
value,
|
|
1034
|
-
children
|
|
1035
|
-
}: {
|
|
1036
|
-
value: DiscoveryContextValue;
|
|
1037
|
-
children: ReactNode;
|
|
1038
|
-
}): import("react").JSX.Element;
|
|
1039
|
-
/**
|
|
1040
|
-
* Read live discovery state + actions. Throws if used outside a
|
|
1041
|
-
* `<DiscoveryProvider>` — discovery is a load-bearing dependency for
|
|
1042
|
-
* settings + completion popovers; bailing loud here surfaces wiring
|
|
1043
|
-
* mistakes at mount instead of producing empty catalogs at first
|
|
1044
|
-
* keystroke.
|
|
1045
|
-
*/
|
|
1046
|
-
declare function useDiscovery(): DiscoveryContextValue;
|
|
1047
|
-
/**
|
|
1048
|
-
* Non-throwing variant — returns `null` when no provider is mounted.
|
|
1049
|
-
* Used by composable modals (`<SettingsModal>`, …) that accept catalog
|
|
1050
|
-
* props as a fallback for embedders who don't wire the full TUI
|
|
1051
|
-
* shell. The in-app flow always mounts `<DiscoveryProvider>` so the
|
|
1052
|
-
* modal sees live state; standalone embeds get the prop snapshot.
|
|
1053
|
-
*/
|
|
1054
|
-
declare function useDiscoveryOptional(): DiscoveryContextValue | null;
|
|
1055
|
-
//#endregion
|
|
1056
|
-
//#region src/chat/discovery-slot.d.ts
|
|
1057
|
-
/**
|
|
1058
|
-
* Stale-while-revalidate catalog slot.
|
|
1059
|
-
*
|
|
1060
|
-
* One slot per (catalog kind, projectDir) pin. Holds the first-load
|
|
1061
|
-
* promise + a `lastScannedAt` timestamp + an in-flight `refreshing`
|
|
1062
|
-
* promise. Idempotent across concurrent callers, safe to rotate when
|
|
1063
|
-
* the project changes (the slot's `abort` controller cancels in-flight
|
|
1064
|
-
* walks and the `.then` guards drop stale results).
|
|
1065
|
-
*
|
|
1066
|
-
* Renderer-agnostic. AppShell wraps it in React refs so React closures
|
|
1067
|
-
* stay stable; a non-TUI shell can use it directly against its own
|
|
1068
|
-
* state propagation.
|
|
1069
|
-
*
|
|
1070
|
-
* Contract:
|
|
1071
|
-
* - `ensure()` — kick the first load if not started; return the
|
|
1072
|
-
* cached promise. On subsequent calls, if `Date.now() -
|
|
1073
|
-
* lastScannedAt >= throttleMs` and no refresh is in flight, kick
|
|
1074
|
-
* a background revalidate that calls `onLoad(fresh)` when it
|
|
1075
|
-
* resolves. The original first-load promise still resolves with
|
|
1076
|
-
* the first walk's contents — consumers reading live state
|
|
1077
|
-
* elsewhere (React state) see the refreshed catalog.
|
|
1078
|
-
* - `refresh()` — force a rescan now, bypassing the throttle.
|
|
1079
|
-
* De-duplicates: if a refresh is already in flight, returns the
|
|
1080
|
-
* same promise.
|
|
1081
|
-
* - `abort()` — cancel any in-flight walk and detach. After this
|
|
1082
|
-
* the slot is dead; callers should rotate to a new slot.
|
|
1083
|
-
* - `dispose()` — alias of `abort()`, named for symmetry with
|
|
1084
|
-
* cleanup callbacks.
|
|
1085
|
-
*
|
|
1086
|
-
* No state is exposed except through promises + the host's `onLoad`
|
|
1087
|
-
* callback; the slot doesn't try to be a store, only a coordinator.
|
|
1088
|
-
*/
|
|
1089
|
-
/** Walk function — takes an abort signal, returns the discovered list. */
|
|
1090
|
-
type Walk<T> = (signal: AbortSignal) => Promise<readonly T[]>;
|
|
1091
|
-
/** Notification: a fresh walk has resolved. Host is expected to commit to its own state store. */
|
|
1092
|
-
type Commit<T> = (items: readonly T[]) => void;
|
|
1093
|
-
interface DiscoverySlotOptions<T> {
|
|
1094
|
-
/** Discover function — runs the actual FS / network walk. */
|
|
1095
|
-
walk: Walk<T>;
|
|
1096
|
-
/** Commit hook — receives every successful walk's result (first + refreshes). */
|
|
1097
|
-
onLoad: Commit<T>;
|
|
1098
|
-
/**
|
|
1099
|
-
* Min interval between background refreshes triggered by `ensure()`.
|
|
1100
|
-
* Default: 3_000ms. `refresh()` ignores this — it's the user's
|
|
1101
|
-
* explicit-intent path.
|
|
1102
|
-
*/
|
|
1103
|
-
throttleMs?: number;
|
|
1104
|
-
/** Optional error sink. Defaults to no-op; useful for `debugLog`. */
|
|
1105
|
-
onError?: (err: unknown, phase: 'first-load' | 'refresh') => void;
|
|
1106
|
-
}
|
|
1107
|
-
interface DiscoverySlot<T> {
|
|
1108
|
-
/**
|
|
1109
|
-
* Kick the first load (idempotent). Returns the first-load promise
|
|
1110
|
-
* once it exists. Schedules a background refresh if past throttle.
|
|
1111
|
-
*/
|
|
1112
|
-
ensure: () => Promise<readonly T[]>;
|
|
1113
|
-
/** Force-refresh now. De-duped across concurrent callers. */
|
|
1114
|
-
refresh: () => Promise<void>;
|
|
1115
|
-
/** True if a refresh is currently running. */
|
|
1116
|
-
isRefreshing: () => boolean;
|
|
1117
|
-
/** Cancel in-flight work + detach. Idempotent. */
|
|
1118
|
-
abort: () => void;
|
|
1119
|
-
}
|
|
1120
|
-
declare function createDiscoverySlot<T>(options: DiscoverySlotOptions<T>): DiscoverySlot<T>;
|
|
1121
|
-
//#endregion
|
|
1122
|
-
//#region src/chat/footer-hints.d.ts
|
|
1123
|
-
/**
|
|
1124
|
-
* Options bag for {@link buildHints}. Flat shape so call sites read as a
|
|
1125
|
-
* checklist of "what state do I have to surface" — easy to thread
|
|
1126
|
-
* through React `useMemo` deps and to construct fresh in tests.
|
|
1127
|
-
*/
|
|
1128
|
-
interface BuildHintsOptions {
|
|
1129
|
-
screen: Screen;
|
|
1130
|
-
busy: boolean;
|
|
1131
|
-
pending: boolean;
|
|
1132
|
-
/**
|
|
1133
|
-
* True when a LIVE pending interaction is on screen (agent is mid-run,
|
|
1134
|
-
* awaiting the tool's Promise). Same nav hints as the safe-mode
|
|
1135
|
-
* approval picker — esc aborts the run.
|
|
1136
|
-
*/
|
|
1137
|
-
pendingInteractionLive: boolean;
|
|
1138
|
-
/**
|
|
1139
|
-
* True when the chat screen is showing a resumed (not live) pending
|
|
1140
|
-
* interaction. The agent isn't running; esc leaves the form without
|
|
1141
|
-
* persisting a response, so the hint reads "leave for later" — the
|
|
1142
|
-
* session re-enqueues the same interaction on next activation.
|
|
1143
|
-
*/
|
|
1144
|
-
pendingInteractionResumed: boolean;
|
|
1145
|
-
currentSession: SessionMeta | null;
|
|
1146
|
-
hasMultipleAgents: boolean;
|
|
1147
|
-
/**
|
|
1148
|
-
* Chat-screen chrome density — `'minimal'` collapses the idle chat
|
|
1149
|
-
* hint row to just `agent / model / keybindings`. Busy / pending /
|
|
1150
|
-
* select-turn / queue states keep their full hint sets because those
|
|
1151
|
-
* affordances are load-bearing (abort, navigate, approve).
|
|
1152
|
-
*/
|
|
1153
|
-
uiMode: Settings['uiMode'];
|
|
1154
|
-
modelLabel: string | null;
|
|
1155
|
-
modelColor: string;
|
|
1156
|
-
/** Current reasoning effort label, or `null` when the model has no reasoning knob. */
|
|
1157
|
-
effortLabel: string | null;
|
|
1158
|
-
effortColor: string;
|
|
1159
|
-
/** Foreground for the `/n` chord that introduces the effort label. */
|
|
1160
|
-
effortKeyColor: string;
|
|
1161
|
-
/**
|
|
1162
|
-
* Comma-joined labels of the enabled model options (e.g. `'fast'`), or `null`
|
|
1163
|
-
* when none are on. Appended after the effort label in the model chord — when
|
|
1164
|
-
* the model has no reasoning knob, it rides the chord on its own.
|
|
1165
|
-
*/
|
|
1166
|
-
modelOptionsLabel?: string | null;
|
|
1167
|
-
agentLabel: string;
|
|
1168
|
-
agentColor: string;
|
|
1169
|
-
/**
|
|
1170
|
-
* Resolved keybindings — every hint key string flows through this so
|
|
1171
|
-
* a user-level rebind (e.g. `"openSettings": "ctrl+p"`) shows up live
|
|
1172
|
-
* in the bottom bar without us hard-coding `'ctrl+o'`.
|
|
1173
|
-
*/
|
|
1174
|
-
keybindings: KeyBindings;
|
|
1175
|
-
/**
|
|
1176
|
-
* Number of currently-dispatching tool calls. Drives the
|
|
1177
|
-
* `<cancelToolCall> cancel tool` chip in the `busy` hint row — without
|
|
1178
|
-
* it, the binding stays inert and there's no point advertising the
|
|
1179
|
-
* shortcut. Falls back to "no chip" when no tools are in flight
|
|
1180
|
-
* (model is mid-stream but hasn't dispatched yet).
|
|
1181
|
-
*/
|
|
1182
|
-
inFlightToolCount: number;
|
|
1183
|
-
/**
|
|
1184
|
-
* Number of currently-active skills. Drives the footer's
|
|
1185
|
-
* `✦ N skill(s)` chip on the chat screen — purely informational,
|
|
1186
|
-
* a passive surface for "tool restrictions are in effect". Hidden
|
|
1187
|
-
* when `0` so the row stays uncluttered for the common case.
|
|
1188
|
-
*/
|
|
1189
|
-
activeSkillCount: number;
|
|
1190
|
-
/** Foreground for the skills chip (typically `COLOR.brand`). */
|
|
1191
|
-
skillsChipColor: string;
|
|
1192
|
-
/**
|
|
1193
|
-
* Progress label for the todo chip (`"2/5"` from `todoProgressLabel`), or
|
|
1194
|
-
* `null` to hide it.
|
|
1195
|
-
*
|
|
1196
|
-
* This replaced a full-width bar that printed the in-progress todo's TITLE
|
|
1197
|
-
* ABOVE the prompt. As a `Hint` it inherits the row's click-to-keypress
|
|
1198
|
-
* contract for free (`dispatchHintKey`), so clicking it opens the list the
|
|
1199
|
-
* same way `ctrl+t` does — and it sits below the prompt like every other
|
|
1200
|
-
* control instead of pushing the prompt down.
|
|
1201
|
-
*/
|
|
1202
|
-
todoProgress: string | null;
|
|
1203
|
-
/**
|
|
1204
|
-
* Pre-built `↑ vX.Y.Z` chip from `buildUpdateHint(useUpdateCheck())`,
|
|
1205
|
-
* or `null` when no update is available. Always last in the chat-screen
|
|
1206
|
-
* row so it's the first to drop when the terminal narrows.
|
|
1207
|
-
*/
|
|
1208
|
-
updateHint: Hint | null;
|
|
1209
|
-
/**
|
|
1210
|
-
* Pre-built prompt-cache toast, non-null only for a few seconds after a
|
|
1211
|
-
* `'cache:break'` hook fired (the host owns the visibility timer and the
|
|
1212
|
-
* severity split): warn-colored `⚡ cache break · <culprit> · +Nk tok · ~$0.48`
|
|
1213
|
-
* for attributable breaks, dim `⚡ cache expired · +Nk tok · ~$0.48` for
|
|
1214
|
-
* byte-stable TTL expiry — routine across human think-time, so it must not
|
|
1215
|
-
* cry wolf. Sits beside `updateHint` at the droppable end of the row: a
|
|
1216
|
-
* transient cost signal, not an action.
|
|
1217
|
-
*/
|
|
1218
|
-
cacheBreakHint?: Hint | null;
|
|
1219
|
-
/**
|
|
1220
|
-
* Sessions-screen list scope — `true` when the list spans all
|
|
1221
|
-
* projects. Drives the `tab` hint's label, which advertises the scope
|
|
1222
|
-
* the toggle switches TO. Optional so non-sessions callers can omit it.
|
|
1223
|
-
*/
|
|
1224
|
-
sessionsScopeAll?: boolean;
|
|
1225
|
-
}
|
|
1226
|
-
/**
|
|
1227
|
-
* Build the footer's shortcut hints for the current screen. On the chat
|
|
1228
|
-
* screen the model id rides next to its `ctrl+m` shortcut and the agent
|
|
1229
|
-
* label rides next to `shift+tab`, each in its accent color — the bar
|
|
1230
|
-
* doubles as the status display without needing separate badges. When
|
|
1231
|
-
* the active model exposes reasoning, the `ctrl+m` hint grows a
|
|
1232
|
-
* secondary `/n` chord with the current effort label, surfacing the
|
|
1233
|
-
* effort picker as a discoverable, in-place affordance.
|
|
1234
|
-
*/
|
|
1235
|
-
declare function buildHints(options: BuildHintsOptions): Hint[];
|
|
1236
|
-
/**
|
|
1237
|
-
* Shorten a binding spec for display as a "chord continuation" — the
|
|
1238
|
-
* `/n` after `ctrl+m model` in the chat footer. We only strip the
|
|
1239
|
-
* `ctrl+` prefix so user-customized chords (`alt+n`, `meta+shift+n`)
|
|
1240
|
-
* still render in full. Falls back to the verbatim spec when no
|
|
1241
|
-
* `ctrl+` prefix is found, which keeps the visual contract honest:
|
|
1242
|
-
* the rendered key always matches the bound trigger.
|
|
1243
|
-
*/
|
|
1244
|
-
declare function shortChord(spec: string): string;
|
|
1245
|
-
//#endregion
|
|
1246
|
-
//#region src/chat/generate-title.d.ts
|
|
1247
|
-
interface GenerateSessionTitleOptions {
|
|
1248
|
-
provider: Provider;
|
|
1249
|
-
/** Model id used for the call. */
|
|
1250
|
-
model: string;
|
|
1251
|
-
/** Conversation history to summarize. Empty → throws synchronously. */
|
|
1252
|
-
turns: readonly SessionTurn[];
|
|
1253
|
-
/**
|
|
1254
|
-
* Cap on how many TRAILING turns to feed the model. Defaults to 10.
|
|
1255
|
-
* The session's opening user turn is always included on top when the
|
|
1256
|
-
* window cuts it off (see `renderTitleTranscript`).
|
|
1257
|
-
*/
|
|
1258
|
-
maxTurns?: number;
|
|
1259
|
-
/** Optional cancellation signal — forwarded to the provider's stream. */
|
|
1260
|
-
signal?: AbortSignal;
|
|
1261
|
-
}
|
|
1262
|
-
/**
|
|
1263
|
-
* Drive the provider's `stream()` once and return a concise title for
|
|
1264
|
-
* the conversation represented by `turns`. Throws when:
|
|
1265
|
-
* - `turns` contains no text-bearing content (nothing to summarize),
|
|
1266
|
-
* - the provider stream completes with no output text,
|
|
1267
|
-
* - the model answered the transcript instead of labeling it (see
|
|
1268
|
-
* {@link cleanTitle}) — a failed generation the caller retries,
|
|
1269
|
-
* - `signal` is aborted (rethrown verbatim).
|
|
1270
|
-
*
|
|
1271
|
-
* Output is trimmed, single-line, with surrounding quotes / trailing
|
|
1272
|
-
* punctuation stripped, and truncated to `TITLE_MAX_CHARS`.
|
|
1273
|
-
*/
|
|
1274
|
-
declare function generateSessionTitle({
|
|
1275
|
-
provider,
|
|
1276
|
-
model,
|
|
1277
|
-
turns,
|
|
1278
|
-
maxTurns,
|
|
1279
|
-
signal
|
|
1280
|
-
}: GenerateSessionTitleOptions): Promise<string>;
|
|
1281
|
-
/**
|
|
1282
|
-
* Decide whether a session is ready for one-shot automatic titling.
|
|
1283
|
-
*
|
|
1284
|
-
* Returns `true` iff the conversation has had its first exchange — at
|
|
1285
|
-
* least two turns, i.e. the opening user message plus the assistant's
|
|
1286
|
-
* reply (this is exactly the "N turns" count the sessions list shows) —
|
|
1287
|
-
* AND no explicit title has been set yet. An existing `metadata.title`
|
|
1288
|
-
* (a previous auto-generation, or a manual title from the session-details
|
|
1289
|
-
* "generate title" action) is never clobbered.
|
|
1290
|
-
*
|
|
1291
|
-
* Pure + total. The runtime layers its own "is one already in flight?"
|
|
1292
|
-
* and "is a provider picked?" guards on top of this; the predicate only
|
|
1293
|
-
* encodes the content-level rule so it can be pinned in tests without a
|
|
1294
|
-
* mock provider — same rationale as the exported {@link cleanTitle}.
|
|
1295
|
-
*/
|
|
1296
|
-
declare function shouldAutoGenerateTitle(turns: readonly SessionTurn[], metadata?: Record<string, unknown>): boolean;
|
|
1297
|
-
/**
|
|
1298
|
-
* Normalize a model-generated title into the shape we want to persist:
|
|
1299
|
-
*
|
|
1300
|
-
* - Collapse internal whitespace + take the first line only (some
|
|
1301
|
-
* models emit "Title: foo\n\nReason: …" despite instructions).
|
|
1302
|
-
* - Strip surrounding quotes, a leading `Title:` / `title -` preamble,
|
|
1303
|
-
* and a `user:` / `assistant:` role prefix echoed from the transcript
|
|
1304
|
-
* — repeatedly, in any nesting order.
|
|
1305
|
-
* - Reject placeholders and answer-shaped replies (see
|
|
1306
|
-
* {@link ANSWER_SHAPED_OPENER}) by throwing.
|
|
1307
|
-
* - Strip trailing punctuation (`.`, `!`, `?`) — titles read cleaner
|
|
1308
|
-
* without it.
|
|
1309
|
-
* - Truncate to `TITLE_MAX_CHARS` with a trailing `…` when over.
|
|
1310
|
-
*
|
|
1311
|
-
* Exported as `cleanTitle` so tests can pin the normalization rules
|
|
1312
|
-
* without going through a mock provider.
|
|
1313
|
-
*/
|
|
1314
|
-
declare function cleanTitle(raw: string): string;
|
|
1315
|
-
//#endregion
|
|
1316
|
-
//#region src/chat/mcp-auth-state.d.ts
|
|
1317
|
-
/**
|
|
1318
|
-
* Per-server MCP OAuth status tracking, decoupled from the renderer.
|
|
1319
|
-
*
|
|
1320
|
-
* The TUI keeps a `Record<serverName, McpAuthStatus>` so it can render a
|
|
1321
|
-
* "needs-auth" / "authorizing" / "error" badge in the MCP picker. The
|
|
1322
|
-
* status map is driven entirely by hooks fired from the agent's MCP
|
|
1323
|
-
* bootstrap + the interactive `loginMcpServer` flow — the reducer below
|
|
1324
|
-
* is pure, makes no FS or network calls, and is shared between the live
|
|
1325
|
-
* TUI store and the test harness.
|
|
1326
|
-
*
|
|
1327
|
-
* Status lifecycle:
|
|
1328
|
-
*
|
|
1329
|
-
* idle ──mcp:connect──▶ authed
|
|
1330
|
-
* (bootstrap succeeded with stored tokens)
|
|
1331
|
-
*
|
|
1332
|
-
* idle ──mcp:auth:required──▶ needs-auth
|
|
1333
|
-
* (bootstrap saw no/invalid tokens)
|
|
1334
|
-
*
|
|
1335
|
-
* needs-auth ──login()──▶ authorizing ──mcp:auth:url──▶ authorizing(url)
|
|
1336
|
-
* ──mcp:auth:success──▶ authed
|
|
1337
|
-
* ──mcp:auth:error──▶ error
|
|
1338
|
-
*
|
|
1339
|
-
* any ──logout──▶ idle
|
|
1340
|
-
*
|
|
1341
|
-
* Multiple servers progress through the lifecycle independently; the map
|
|
1342
|
-
* is keyed by `McpServerConfig.name`.
|
|
1343
|
-
*/
|
|
1344
|
-
type McpAuthStatus = {
|
|
1345
|
-
kind: 'idle';
|
|
1346
|
-
} | {
|
|
1347
|
-
kind: 'needs-auth';
|
|
1348
|
-
reason: 'no-tokens' | 'auto-promoted';
|
|
1349
|
-
} | {
|
|
1350
|
-
kind: 'authorizing';
|
|
1351
|
-
url?: string;
|
|
1352
|
-
} | {
|
|
1353
|
-
kind: 'authed';
|
|
1354
|
-
} | {
|
|
1355
|
-
kind: 'error';
|
|
1356
|
-
error: string;
|
|
1357
|
-
} | {
|
|
1358
|
-
kind: 'bootstrap-error';
|
|
1359
|
-
error: string;
|
|
1360
|
-
};
|
|
1361
|
-
/**
|
|
1362
|
-
* Map of server name → status. `idle` is the implicit default for any
|
|
1363
|
-
* server NOT present in the map, so the renderer treats `undefined` as
|
|
1364
|
-
* `{ kind: 'idle' }` and the map can stay sparse.
|
|
1365
|
-
*/
|
|
1366
|
-
type McpAuthStateMap = Readonly<Record<string, McpAuthStatus>>;
|
|
1367
|
-
/**
|
|
1368
|
-
* Events the reducer accepts. Names mirror the agent hooks 1:1 plus two
|
|
1369
|
-
* UI-only verbs (`login:start` / `login:cancel`) so the renderer can
|
|
1370
|
-
* optimistically flip a row to `authorizing` before the SDK has emitted
|
|
1371
|
-
* `mcp:auth:url` — useful when the loopback callback is slow to bind.
|
|
1372
|
-
*/
|
|
1373
|
-
type McpAuthEvent = {
|
|
1374
|
-
type: 'auth-required';
|
|
1375
|
-
name: string;
|
|
1376
|
-
reason: 'no-tokens' | 'auto-promoted';
|
|
1377
|
-
} | {
|
|
1378
|
-
type: 'auth-url';
|
|
1379
|
-
name: string;
|
|
1380
|
-
url: string;
|
|
1381
|
-
} | {
|
|
1382
|
-
type: 'auth-success';
|
|
1383
|
-
name: string;
|
|
1384
|
-
} | {
|
|
1385
|
-
type: 'auth-error';
|
|
1386
|
-
name: string;
|
|
1387
|
-
error: string;
|
|
1388
|
-
} | {
|
|
1389
|
-
type: 'bootstrap-error';
|
|
1390
|
-
name: string;
|
|
1391
|
-
error: string;
|
|
1392
|
-
} | {
|
|
1393
|
-
type: 'connected';
|
|
1394
|
-
name: string;
|
|
1395
|
-
} | {
|
|
1396
|
-
type: 'login:start';
|
|
1397
|
-
name: string;
|
|
1398
|
-
} | {
|
|
1399
|
-
type: 'login:cancel';
|
|
1400
|
-
name: string;
|
|
1401
|
-
} | {
|
|
1402
|
-
type: 'logout';
|
|
1403
|
-
name: string;
|
|
1404
|
-
} | {
|
|
1405
|
-
type: 'reset';
|
|
1406
|
-
name: string;
|
|
1407
|
-
};
|
|
1408
|
-
/**
|
|
1409
|
-
* Apply one event to the state map. Pure, immutable — returns a new map
|
|
1410
|
-
* with only the affected key reassigned.
|
|
1411
|
-
*
|
|
1412
|
-
* State transitions are simple "last write wins"; we don't gate (e.g.) a
|
|
1413
|
-
* `login:start` from overriding `authorizing` because the loop layer
|
|
1414
|
-
* never doubles those up — interactive login is serialized in the TUI.
|
|
1415
|
-
*/
|
|
1416
|
-
declare function reduceMcpAuth(state: McpAuthStateMap, event: McpAuthEvent): McpAuthStateMap;
|
|
1417
|
-
/** Convenience getter — treats `undefined` as `idle`. */
|
|
1418
|
-
declare function getMcpAuthStatus(state: McpAuthStateMap, name: string): McpAuthStatus;
|
|
1419
|
-
//#endregion
|
|
1420
|
-
//#region src/chat/mcp-auth-context.d.ts
|
|
1421
|
-
/**
|
|
1422
|
-
* Mount once near the top of the React tree (above `ModalRoot`). Children
|
|
1423
|
-
* use `useMcpAuthState()` to read and `useMcpAuthDispatch()` to fire events.
|
|
1424
|
-
*/
|
|
1425
|
-
declare function McpAuthProvider({
|
|
1426
|
-
children
|
|
1427
|
-
}: {
|
|
1428
|
-
children: ReactNode;
|
|
1429
|
-
}): import("react").JSX.Element;
|
|
1430
|
-
declare function useMcpAuthState(): McpAuthStateMap;
|
|
1431
|
-
declare function useMcpAuthDispatch(): (event: McpAuthEvent) => void;
|
|
1432
|
-
//#endregion
|
|
1433
|
-
//#region src/chat/mcp-credentials.d.ts
|
|
1434
|
-
declare function mcpCredentialsPath(dataDir: string): string;
|
|
1435
|
-
/**
|
|
1436
|
-
* Build a file-backed `McpCredentialStore`. All per-server reads / writes
|
|
1437
|
-
* funnel through the single `mcp-credentials.json` file — this keeps
|
|
1438
|
-
* concurrent flows for different servers from clobbering each other since
|
|
1439
|
-
* each save reads-modifies-writes the full file atomically.
|
|
1440
|
-
*
|
|
1441
|
-
* Two flows for the same server name CAN race (last write wins). MCP OAuth
|
|
1442
|
-
* flows are user-driven and serial in practice (one login modal at a time),
|
|
1443
|
-
* so this is acceptable; a per-server file split + cross-process lock would
|
|
1444
|
-
* be required to handle a multi-process scenario.
|
|
1445
|
-
*/
|
|
1446
|
-
declare function createFileMcpCredentialStore(dataDir: string): McpCredentialStore;
|
|
1447
|
-
/**
|
|
1448
|
-
* Convenience patches for individual sub-fields. The provider class uses
|
|
1449
|
-
* these so a `saveTokens` call doesn't have to round-trip `clientInformation`
|
|
1450
|
-
* + `discoveryState` it never touched.
|
|
1451
|
-
*/
|
|
1452
|
-
declare function patchMcpCredential(store: McpCredentialStore, name: string, patch: Partial<McpCredentialEntry>): void;
|
|
1453
|
-
//#endregion
|
|
1454
|
-
//#region src/chat/mcp-rows.d.ts
|
|
1455
|
-
/**
|
|
1456
|
-
* One row in the flattened MCP settings list. Three kinds:
|
|
1457
|
-
*
|
|
1458
|
-
* - `'server'` — server header with the chevron + checkbox +
|
|
1459
|
-
* transport detail. Always present.
|
|
1460
|
-
* - `'tool'` — checkbox + description for a tool advertised
|
|
1461
|
-
* by the parent server. Present only when the
|
|
1462
|
-
* server is expanded AND its tool cache is
|
|
1463
|
-
* populated.
|
|
1464
|
-
* - `'tool-empty'` — placeholder shown when an expanded server
|
|
1465
|
-
* has no cached tool list yet (first launch
|
|
1466
|
-
* before any session has bootstrapped the
|
|
1467
|
-
* server). Lets the renderer surface a
|
|
1468
|
-
* one-line "send a prompt to populate" hint
|
|
1469
|
-
* WITHOUT changing the server's expand
|
|
1470
|
-
* affordance.
|
|
1471
|
-
*/
|
|
1472
|
-
type VisibleMcpRow = {
|
|
1473
|
-
kind: 'server';
|
|
1474
|
-
entry: DiscoveredMcp;
|
|
1475
|
-
} | {
|
|
1476
|
-
kind: 'tool';
|
|
1477
|
-
serverName: string;
|
|
1478
|
-
tool: McpToolSchema;
|
|
1479
|
-
} | {
|
|
1480
|
-
kind: 'tool-empty';
|
|
1481
|
-
serverName: string;
|
|
1482
|
-
};
|
|
1483
|
-
/**
|
|
1484
|
-
* Flatten a server catalog plus the per-server expanded set into the
|
|
1485
|
-
* visible-row list a renderer cycles through.
|
|
1486
|
-
*
|
|
1487
|
-
* - `catalog` — filtered / ordered server list (post-search,
|
|
1488
|
-
* post-allow-list).
|
|
1489
|
-
* - `expanded` — names of servers whose tool list is open.
|
|
1490
|
-
* Servers not in this set render as a single
|
|
1491
|
-
* server-header row.
|
|
1492
|
-
* - `toolsByServer` — per-server full tool catalog (from
|
|
1493
|
-
* `chat/mcp-tools-cache.ts`). Missing key →
|
|
1494
|
-
* `'tool-empty'` placeholder under the
|
|
1495
|
-
* expanded server.
|
|
1496
|
-
*/
|
|
1497
|
-
declare function buildVisibleMcpRows(catalog: readonly DiscoveredMcp[], expanded: ReadonlySet<string>, toolsByServer: Record<string, readonly McpToolSchema[]>): VisibleMcpRow[];
|
|
1498
|
-
/**
|
|
1499
|
-
* Server name a row "belongs to" for catalog / toggle / auth lookups.
|
|
1500
|
-
* For a server row that's its own name; for tool / tool-empty rows
|
|
1501
|
-
* it's the parent server's name.
|
|
1502
|
-
*/
|
|
1503
|
-
declare function parentServerName(row: VisibleMcpRow): string;
|
|
1504
|
-
/**
|
|
1505
|
-
* Index in `rows` of the server header for the given parent name. `-1`
|
|
1506
|
-
* when not present. Used by collapse handlers to snap the cursor up
|
|
1507
|
-
* to the parent BEFORE shrinking the row list — otherwise the cursor
|
|
1508
|
-
* would land on whichever sibling row now occupies the same flat
|
|
1509
|
-
* index.
|
|
1510
|
-
*/
|
|
1511
|
-
declare function indexOfServerRow(rows: readonly VisibleMcpRow[], parentName: string): number;
|
|
1512
|
-
//#endregion
|
|
1513
|
-
//#region src/chat/mcp-tool-toggle.d.ts
|
|
1514
|
-
interface McpToolToggleSet {
|
|
1515
|
-
/** Live set of ENABLED tool names — `Set` for O(1) `has`. */
|
|
1516
|
-
enabledSet: ReadonlySet<string>;
|
|
1517
|
-
/** Flip one tool on/off; persists immediately via `setSetting`. */
|
|
1518
|
-
toggle: (toolName: string) => void;
|
|
1519
|
-
}
|
|
1520
|
-
/**
|
|
1521
|
-
* Bind a single MCP server's per-tool toggle to
|
|
1522
|
-
* `Settings.disabledMcpTools[serverName]`.
|
|
1523
|
-
*
|
|
1524
|
-
* `catalog` is the FULL list of tools the server advertises (i.e. the
|
|
1525
|
-
* cached `listTools()` payload from `chat/mcp-tools-cache.ts`). The
|
|
1526
|
-
* hook needs it both to render `enabledSet` (every catalog tool not in
|
|
1527
|
-
* the persisted deny-list) and to garbage-collect stale deny-list
|
|
1528
|
-
* entries on every write.
|
|
1529
|
-
*/
|
|
1530
|
-
declare function useMcpToolToggleSet(opts: {
|
|
1531
|
-
serverName: string;
|
|
1532
|
-
catalog: readonly McpToolSchema[];
|
|
1533
|
-
}): McpToolToggleSet;
|
|
1534
|
-
/**
|
|
1535
|
-
* Bind every server in `catalogByServer` to its own per-tool toggle in
|
|
1536
|
-
* a single hook call. Returns a `serverName → McpToolToggleSet` map.
|
|
1537
|
-
*
|
|
1538
|
-
* Use this when a host needs handlers for multiple servers at once
|
|
1539
|
-
* (the TUI's MCP settings panel keyboard dispatcher is the canonical
|
|
1540
|
-
* example) — calling {@link useMcpToolToggleSet} in a `for` / `.map`
|
|
1541
|
-
* over a dynamic catalog would change the hook-call order whenever a
|
|
1542
|
-
* server is added or removed, violating React's rules-of-hooks. This
|
|
1543
|
-
* hook calls `useMemo` exactly once regardless of server count.
|
|
1544
|
-
*
|
|
1545
|
-
* Servers absent from `catalogByServer` get no entry in the result.
|
|
1546
|
-
* The persisted deny-list still keeps their entries on disk — they
|
|
1547
|
-
* just stay invisible to this consumer until the catalog re-includes
|
|
1548
|
-
* them.
|
|
1549
|
-
*/
|
|
1550
|
-
declare function useMcpToolToggleMap(opts: {
|
|
1551
|
-
catalogByServer: Record<string, readonly McpToolSchema[]>;
|
|
1552
|
-
}): Record<string, McpToolToggleSet>;
|
|
1553
|
-
/**
|
|
1554
|
-
* Pure factory shared by both hook flavors. Captures `persistedDenyAll`
|
|
1555
|
-
* + `setDisabledMcpTools` at the call site so toggle handlers stay
|
|
1556
|
-
* referentially stable across renders that don't touch the underlying
|
|
1557
|
-
* settings entry — important for `useKeyboard` to avoid re-binding on
|
|
1558
|
-
* every catalog change.
|
|
1559
|
-
*
|
|
1560
|
-
* Exported for direct use by non-React consumers (CLI, GUI shells)
|
|
1561
|
-
* that want the same write semantics without the hook plumbing.
|
|
1562
|
-
*/
|
|
1563
|
-
declare function buildToolToggle(args: {
|
|
1564
|
-
serverName: string;
|
|
1565
|
-
catalogNames: readonly string[];
|
|
1566
|
-
persistedDenyAll: Settings['disabledMcpTools'];
|
|
1567
|
-
setDisabledMcpTools: (next: Settings['disabledMcpTools']) => void;
|
|
1568
|
-
}): McpToolToggleSet;
|
|
1569
|
-
//#endregion
|
|
1570
|
-
//#region src/chat/mcp-tools-cache.d.ts
|
|
1571
|
-
/**
|
|
1572
|
-
* One server's cached entry.
|
|
1573
|
-
*
|
|
1574
|
-
* - `tools` — verbatim copy of the raw `tools/list` payload (pre any
|
|
1575
|
-
* `disabledTools` / `toolFilter` filtering). The settings UI ranges
|
|
1576
|
-
* over this to render the full server surface; the host applies its
|
|
1577
|
-
* own deny-list on top via `Settings.disabledMcpTools` (see
|
|
1578
|
-
* `buildMcpServers` in `mcps-discovery.ts`).
|
|
1579
|
-
* - `updatedAt` — ms-epoch of the bootstrap that populated this entry.
|
|
1580
|
-
* Useful for "last seen N hours ago" affordances and for cache
|
|
1581
|
-
* eviction policies a host might layer on later.
|
|
1582
|
-
* - `transport` — informational only; lets the UI distinguish a stdio
|
|
1583
|
-
* server's tool list from an http server with the same name in
|
|
1584
|
-
* "stale catalog" warnings.
|
|
1585
|
-
*/
|
|
1586
|
-
interface CachedMcpToolList {
|
|
1587
|
-
tools: McpToolSchema[];
|
|
1588
|
-
updatedAt: number;
|
|
1589
|
-
transport: 'stdio' | 'sse' | 'streamable-http';
|
|
1590
|
-
}
|
|
1591
|
-
/**
|
|
1592
|
-
* `serverName → catalog`. Map shape on disk so adding / removing
|
|
1593
|
-
* servers is an O(1) JSON edit instead of an array rewrite.
|
|
1594
|
-
*/
|
|
1595
|
-
type McpToolsCache = Record<string, CachedMcpToolList>;
|
|
1596
|
-
/**
|
|
1597
|
-
* Resolve the on-disk cache path under a host's data directory. Exposed
|
|
1598
|
-
* for tests + advanced hosts that want to inspect / delete the file
|
|
1599
|
-
* without re-implementing the path convention.
|
|
1600
|
-
*/
|
|
1601
|
-
declare function mcpToolsCachePath(dataDir: string): string;
|
|
1602
|
-
/**
|
|
1603
|
-
* Best-effort cache read. Returns `{}` when the file is missing, when
|
|
1604
|
-
* JSON.parse rejects, or when the top-level shape isn't a plain object —
|
|
1605
|
-
* a corrupt cache must never crash the host on startup.
|
|
1606
|
-
*
|
|
1607
|
-
* Per-entry shape validation is light (presence of an array `tools`):
|
|
1608
|
-
* deeper validation would lock the cache to a single zidane version,
|
|
1609
|
-
* which is the opposite of what a long-lived cache wants. Entries that
|
|
1610
|
-
* survive the light check feed back through `McpToolSchema`'s `unknown`
|
|
1611
|
-
* `inputSchema` so downstream readers stay tolerant of upstream churn.
|
|
1612
|
-
*/
|
|
1613
|
-
declare function loadMcpToolsCache(opts: {
|
|
1614
|
-
dataDir: string;
|
|
1615
|
-
}): McpToolsCache;
|
|
1616
|
-
/**
|
|
1617
|
-
* Atomic full-cache write. Used by {@link subscribeMcpToolsCache} after
|
|
1618
|
-
* each upsert. Failures bubble up as the underlying `writeFileAtomic`
|
|
1619
|
-
* error — the caller logs under `ZIDANE_DEBUG` and swallows.
|
|
1620
|
-
*/
|
|
1621
|
-
declare function saveMcpToolsCache(opts: {
|
|
1622
|
-
dataDir: string;
|
|
1623
|
-
cache: McpToolsCache;
|
|
1624
|
-
}): void;
|
|
1625
|
-
/**
|
|
1626
|
-
* Drop entries for one or more servers, or wipe the cache when no
|
|
1627
|
-
* server is named. Idempotent — entries that aren't present are
|
|
1628
|
-
* silently skipped. Returns the resulting cache so callers can refresh
|
|
1629
|
-
* any in-memory mirror without re-reading from disk.
|
|
1630
|
-
*
|
|
1631
|
-
* Intended for a future "rescan server" affordance in the settings UI
|
|
1632
|
-
* (clear → trigger a real bootstrap → cache repopulates on the
|
|
1633
|
-
* `mcp:tools:list` hook).
|
|
1634
|
-
*/
|
|
1635
|
-
declare function clearMcpToolsCache(opts: {
|
|
1636
|
-
dataDir: string;
|
|
1637
|
-
serverNames?: readonly string[];
|
|
1638
|
-
}): McpToolsCache;
|
|
1639
|
-
/**
|
|
1640
|
-
* Subscribe to `mcp:tools:list` and persist every successful bootstrap
|
|
1641
|
-
* into the on-disk cache. Returns an unsubscribe function — call it
|
|
1642
|
-
* during agent teardown so a long-lived host (Settings modal that
|
|
1643
|
-
* outlives one agent) doesn't accumulate stale subscribers.
|
|
1644
|
-
*
|
|
1645
|
-
* Each write loads the current cache, upserts the named entry, then
|
|
1646
|
-
* atomic-writes the full file. The read-modify-write is safe under
|
|
1647
|
-
* Node single-threaded event loop semantics — concurrent bootstraps in
|
|
1648
|
-
* the same process serialize through the hook bus.
|
|
1649
|
-
*
|
|
1650
|
-
* Optional `onChange` callback fires synchronously after every
|
|
1651
|
-
* successful disk write with the entry that was just upserted. Lets a
|
|
1652
|
-
* React host trigger a state refresh without polling the disk.
|
|
1653
|
-
*
|
|
1654
|
-
* Write failures are swallowed (logged under `ZIDANE_DEBUG`): the cache
|
|
1655
|
-
* is an accelerator, not a correctness boundary. If the disk is full
|
|
1656
|
-
* the agent run still works — the settings UI just shows stale data
|
|
1657
|
-
* until the next successful write.
|
|
1658
|
-
*/
|
|
1659
|
-
declare function subscribeMcpToolsCache(hooks: Hookable<AgentHooks>, opts: {
|
|
1660
|
-
dataDir: string;
|
|
1661
|
-
onChange?: (entry: {
|
|
1662
|
-
name: string;
|
|
1663
|
-
} & CachedMcpToolList) => void;
|
|
1664
|
-
}): () => void;
|
|
1665
|
-
/**
|
|
1666
|
-
* Force-refresh the on-disk tools cache by opening a transient MCP
|
|
1667
|
-
* connection to every server, capturing the `mcp:tools:list` hook on
|
|
1668
|
-
* the way through, and closing the connection immediately. The
|
|
1669
|
-
* underlying `connectMcpServers` runs every server's bootstrap in
|
|
1670
|
-
* parallel, so the wall-clock cost collapses to the slowest server.
|
|
1671
|
-
*
|
|
1672
|
-
* Two design choices worth noting:
|
|
1673
|
-
*
|
|
1674
|
-
* - **Shared hook bus.** The caller passes the SAME `Hookable`
|
|
1675
|
-
* instance that has the cache subscriber wired (typically
|
|
1676
|
-
* `agent.hooks` after `subscribeMcpToolsCache(agent.hooks, …)`
|
|
1677
|
-
* ran). That way `mcp:tools:list` fires on the bus the
|
|
1678
|
-
* subscriber is listening to and the cache lands on disk
|
|
1679
|
-
* without a separate write path.
|
|
1680
|
-
* - **Transient, NOT shared with the live agent.** The connection
|
|
1681
|
-
* opened here is closed immediately. The agent's own MCP
|
|
1682
|
-
* connection is untouched, so a refresh never disrupts an
|
|
1683
|
-
* in-flight tool call.
|
|
1684
|
-
*
|
|
1685
|
-
* The function intentionally swallows per-server failures (they're
|
|
1686
|
-
* already surfaced via `mcp:bootstrap:end ok: false` for any host
|
|
1687
|
-
* that wired the listener). The Promise resolves once every server's
|
|
1688
|
-
* bootstrap settles, success or otherwise.
|
|
1689
|
-
*/
|
|
1690
|
-
declare function refreshMcpToolsCatalog(opts: {
|
|
1691
|
-
servers: readonly McpServerConfig[];
|
|
1692
|
-
hooks: Hookable<AgentHooks>;
|
|
1693
|
-
/**
|
|
1694
|
-
* Same OAuth-provider factory the agent's bootstrap uses. Required
|
|
1695
|
-
* for OAuth-tagged servers — without it those servers fire
|
|
1696
|
-
* `mcp:auth:required` and skip, and their tools never refresh.
|
|
1697
|
-
*/
|
|
1698
|
-
buildAuthProvider?: (config: McpServerConfig) => OAuthClientProvider | undefined;
|
|
1699
|
-
}): Promise<void>;
|
|
1700
|
-
//#endregion
|
|
1701
|
-
//#region src/chat/mcps-write.d.ts
|
|
1702
|
-
type McpConfigScope = 'project' | 'user';
|
|
1703
|
-
/**
|
|
1704
|
-
* Resolve the CANONICAL write target for a scope — always the
|
|
1705
|
-
* `.{prefix}/mcps.json` flavor, never `.agents` (we don't own that
|
|
1706
|
-
* convention) and never `mcp.json` (Cursor's spelling is read-compat
|
|
1707
|
-
* only).
|
|
1708
|
-
*/
|
|
1709
|
-
declare function mcpsWritePath(scope: McpConfigScope, opts?: {
|
|
1710
|
-
cwd?: string;
|
|
1711
|
-
home?: string;
|
|
1712
|
-
prefix?: string;
|
|
1713
|
-
}): string;
|
|
1714
|
-
interface UpsertMcpResult {
|
|
1715
|
-
/** The file written. */
|
|
1716
|
-
path: string;
|
|
1717
|
-
/** `updated` when an entry of the same name was replaced, else `added`. */
|
|
1718
|
-
action: 'added' | 'updated';
|
|
1719
|
-
}
|
|
1720
|
-
/**
|
|
1721
|
-
* Upsert `entry` (matched by `name`) into the mcps config at `filePath`.
|
|
1722
|
-
* Preserves the existing file's shape and every field the writer doesn't
|
|
1723
|
-
* own; creates a canonical flat-array file when none exists. Throws on
|
|
1724
|
-
* malformed JSON — silently rewriting a broken file the user is mid-edit
|
|
1725
|
-
* on would destroy their work.
|
|
1726
|
-
*/
|
|
1727
|
-
declare function upsertMcpServer(filePath: string, entry: McpServerConfig): UpsertMcpResult;
|
|
1728
|
-
interface RemoveMcpResult {
|
|
1729
|
-
/** The file rewritten. */
|
|
1730
|
-
path: string;
|
|
1731
|
-
}
|
|
1732
|
-
/**
|
|
1733
|
-
* Remove the entry named `name` from the mcps config at `filePath`,
|
|
1734
|
-
* preserving the file's shape and everything else in it — the removal
|
|
1735
|
-
* counterpart of {@link upsertMcpServer}. Throws when the file is
|
|
1736
|
-
* missing, malformed, an unrecognized shape, or has no entry of that
|
|
1737
|
-
* name (the caller shows the message on the settings op line; silently
|
|
1738
|
-
* "succeeding" on a no-op would lie about what happened).
|
|
1739
|
-
*/
|
|
1740
|
-
declare function removeMcpServer(filePath: string, name: string): RemoveMcpResult;
|
|
1741
|
-
//#endregion
|
|
1742
|
-
//#region src/chat/oauth.d.ts
|
|
1743
|
-
declare function supportsOAuth(descriptor: ProviderDescriptor): boolean;
|
|
1744
|
-
/** True when the provider's OAuth flow needs the user to paste a code back into the TUI (no loopback callback). */
|
|
1745
|
-
declare function oauthUsesManualCodePaste(descriptor: ProviderDescriptor): boolean;
|
|
1746
|
-
interface OAuthFlowOptions {
|
|
1747
|
-
/** Called when the provider emits its login URL — typically right after the callback server starts. */
|
|
1748
|
-
onUrl: (url: string, instructions?: string) => void;
|
|
1749
|
-
/**
|
|
1750
|
-
* Called when the provider needs a free-form input from the user (paste-the-code flows,
|
|
1751
|
-
* step-up confirmations, etc.). Mirrors pi-ai's `OAuthLoginCallbacks.onPrompt` verbatim
|
|
1752
|
-
* so callers don't lose `placeholder` / `allowEmpty` hints. Required for any provider
|
|
1753
|
-
* with `usesCallbackServer: false` (e.g. Anthropic Claude Pro/Max).
|
|
1754
|
-
*/
|
|
1755
|
-
onPrompt?: (prompt: OAuthPrompt$1) => Promise<string>;
|
|
1756
|
-
/**
|
|
1757
|
-
* Called when the provider initiates a device-code flow (e.g. GitHub Copilot).
|
|
1758
|
-
* Surface `userCode` + `verificationUri` so the user can complete the flow in
|
|
1759
|
-
* the browser. Required by pi-ai's `OAuthLoginCallbacks` since 0.75.5 — built-in
|
|
1760
|
-
* Anthropic / OpenAI Codex providers don't fire it today, but third-party
|
|
1761
|
-
* descriptors can.
|
|
1762
|
-
*/
|
|
1763
|
-
onDeviceCode?: (info: OAuthDeviceCodeInfo) => void;
|
|
1764
|
-
/**
|
|
1765
|
-
* Called when the provider needs the user to pick between multiple flow options
|
|
1766
|
-
* (e.g. browser vs device-code). Return the chosen option `id`, or `undefined`
|
|
1767
|
-
* to cancel. Required by pi-ai's `OAuthLoginCallbacks` since 0.75.5.
|
|
1768
|
-
*/
|
|
1769
|
-
onSelect?: (prompt: OAuthSelectPrompt) => Promise<string | undefined>;
|
|
1770
|
-
/** Called with each progress message from the OAuth flow (token exchange, etc.). */
|
|
1771
|
-
onProgress?: (message: string) => void;
|
|
1772
|
-
/** Abort the in-flight login (e.g. user pressed esc). */
|
|
1773
|
-
signal?: AbortSignal;
|
|
1774
|
-
}
|
|
1775
|
-
/**
|
|
1776
|
-
* Run the OAuth login flow for a provider.
|
|
1777
|
-
*
|
|
1778
|
-
* Returns the OAuth credentials on success; caller persists them via
|
|
1779
|
-
* `setProviderCredential(dataDir, descriptor, { kind: 'oauth', ...credentials })`.
|
|
1780
|
-
* Throws when the descriptor has no `oauthProvider` configured.
|
|
1781
|
-
*/
|
|
1782
|
-
declare function runOAuthLogin(descriptor: ProviderDescriptor, options: OAuthFlowOptions): Promise<OAuthCredentials>;
|
|
1783
|
-
//#endregion
|
|
1784
|
-
//#region src/chat/oauth-redirect.d.ts
|
|
1785
|
-
/**
|
|
1786
|
-
* Manual OAuth redirect-URL handoff.
|
|
1787
|
-
*
|
|
1788
|
-
* Users who run zidane over SSH (or behind a proxy / firewall that blocks
|
|
1789
|
-
* loopback) can't have the local browser hit the in-process callback server.
|
|
1790
|
-
* They CAN, however, copy the URL their browser was redirected to —
|
|
1791
|
-
* `http://127.0.0.1:<port>/callback?code=...&state=...` — and paste it back
|
|
1792
|
-
* into the TUI.
|
|
1793
|
-
*
|
|
1794
|
-
* The trick: that URL IS the callback our local server is listening on. We
|
|
1795
|
-
* just `fetch()` it ourselves. The server runs in the same process; the
|
|
1796
|
-
* request hits its handler exactly as if a real browser had arrived, the
|
|
1797
|
-
* OAuth promise (`waitForCode` for pi-ai providers, `startOAuthCallback` for
|
|
1798
|
-
* MCP) resolves through the normal happy path, and the upstream flow
|
|
1799
|
-
* continues uninterrupted. No new code path inside the OAuth state machine.
|
|
1800
|
-
*
|
|
1801
|
-
* Defense in depth: we reject anything that isn't a loopback URL — fetching
|
|
1802
|
-
* an arbitrary user-pasted URL from inside the agent process would be a
|
|
1803
|
-
* trivial SSRF.
|
|
1804
|
-
*/
|
|
1805
|
-
/**
|
|
1806
|
-
* The `redirect_uri` the authorization server was told to come back to,
|
|
1807
|
-
* read out of the authorization URL itself. That's our loopback callback
|
|
1808
|
-
* (`http://127.0.0.1:<port>/callback`) — the UI shows it so an SSH user
|
|
1809
|
-
* knows which address to fish out of the browser's URL bar, and
|
|
1810
|
-
* {@link normalizeRedirectPaste} uses it to rebuild a full callback URL
|
|
1811
|
-
* from a partial paste.
|
|
1812
|
-
*
|
|
1813
|
-
* Returns `null` when the URL doesn't parse or carries no usable
|
|
1814
|
-
* `redirect_uri` — callers degrade to "paste the whole URL".
|
|
1815
|
-
*/
|
|
1816
|
-
declare function redirectUriFromAuthUrl(authUrl: string): URL | null;
|
|
1817
|
-
/**
|
|
1818
|
-
* Widen what counts as an acceptable paste. The happy path is the full
|
|
1819
|
-
* redirect URL out of the browser's address bar, but users on SSH
|
|
1820
|
-
* routinely end up holding less than that: some authorization servers
|
|
1821
|
-
* render the code on the page instead of redirecting, and copying from a
|
|
1822
|
-
* "can't reach this site" error page loses everything but the query.
|
|
1823
|
-
*
|
|
1824
|
-
* Accepted forms, given the authorization URL for context:
|
|
1825
|
-
*
|
|
1826
|
-
* - `http://127.0.0.1:5123/callback?code=x&state=y` — passthrough (any
|
|
1827
|
-
* absolute URL is returned untouched; the loopback guard in
|
|
1828
|
-
* {@link fetchOAuthRedirect} still has final say, so a pasted
|
|
1829
|
-
* `https://evil.test` is rejected there, not silently rewritten).
|
|
1830
|
-
* - `/callback?code=x&state=y` — path + query onto the callback origin.
|
|
1831
|
-
* - `?code=x&state=y` / `code=x&state=y` — query onto the callback URL.
|
|
1832
|
-
* - `x` — a bare authorization code; `state` is taken from the
|
|
1833
|
-
* authorization URL when it carried one (the loopback server forwards
|
|
1834
|
-
* `state` verbatim and the SDK owns verification, so a missing one is
|
|
1835
|
-
* not fatal). Anything with whitespace inside is prose (an error page
|
|
1836
|
-
* fragment), not a code — refused with a clearer error than a server
|
|
1837
|
-
* 400 would give.
|
|
1838
|
-
*
|
|
1839
|
-
* Throws when the input can't be turned into a URL — no `authUrl` context
|
|
1840
|
-
* for a partial paste, or an unusable authorization URL.
|
|
1841
|
-
*/
|
|
1842
|
-
declare function normalizeRedirectPaste(pasted: string, authUrl?: string): string;
|
|
1843
|
-
interface FetchOAuthRedirectResult {
|
|
1844
|
-
/** Status code from the callback server. 2xx = success. */
|
|
1845
|
-
status: number;
|
|
1846
|
-
/** Best-effort message extracted from the response body (HTML title or trimmed text). */
|
|
1847
|
-
message?: string;
|
|
1848
|
-
}
|
|
1849
|
-
/**
|
|
1850
|
-
* Treat `pasted` as a callback-URL paste. Validates it's a loopback URL,
|
|
1851
|
-
* fires a GET, returns the status.
|
|
1852
|
-
*
|
|
1853
|
-
* Pass `authUrl` (the authorization URL currently on screen) to accept
|
|
1854
|
-
* partial pastes — a bare code, a query string, a path — via
|
|
1855
|
-
* {@link normalizeRedirectPaste}. Without it only a full absolute URL is
|
|
1856
|
-
* accepted, which is the pre-existing contract.
|
|
1857
|
-
*
|
|
1858
|
-
* Throws when:
|
|
1859
|
-
* - `pasted` doesn't parse as a URL (and can't be completed from `authUrl`).
|
|
1860
|
-
* - The URL host isn't loopback (rejects SSRF).
|
|
1861
|
-
* - The fetch errors out (network, timeout).
|
|
1862
|
-
*
|
|
1863
|
-
* Returns success/failure for non-2xx responses; the caller decides whether
|
|
1864
|
-
* a 4xx is fatal (state mismatch is a 400 the user can retry from).
|
|
1865
|
-
*/
|
|
1866
|
-
declare function fetchOAuthRedirect(pasted: string, options?: {
|
|
1867
|
-
signal?: AbortSignal;
|
|
1868
|
-
timeoutMs?: number;
|
|
1869
|
-
authUrl?: string;
|
|
1870
|
-
}): Promise<FetchOAuthRedirectResult>;
|
|
1871
|
-
//#endregion
|
|
1872
|
-
//#region src/chat/path-display.d.ts
|
|
1873
|
-
/**
|
|
1874
|
-
* @-completion path display formatter.
|
|
1875
|
-
*
|
|
1876
|
-
* The `@`-popover walks the project from the git root so the user sees
|
|
1877
|
-
* the whole tree regardless of where they launched the TUI. The
|
|
1878
|
-
* agent's CWD-resolving tools (`read_file`, `glob`, `edit`, …) read
|
|
1879
|
-
* relative paths against `process.cwd()`, which is frequently a
|
|
1880
|
-
* subdirectory of that root. Emitting the discovery's raw
|
|
1881
|
-
* project-root-relative path into the prompt produces a `<cwd>/<rel>`
|
|
1882
|
-
* miss — the bug this helper exists to close.
|
|
1883
|
-
*
|
|
1884
|
-
* Rule:
|
|
1885
|
-
*
|
|
1886
|
-
* - File at `cwd` itself → `.`.
|
|
1887
|
-
* - File under `cwd` (subtree) → forward-slashed CWD-relative,
|
|
1888
|
-
* no `..`.
|
|
1889
|
-
* - File above `cwd` but still inside the project → CWD-relative
|
|
1890
|
-
* with `..` traversal (e.g. `../EDIT_THIS.md`). Shorter and more
|
|
1891
|
-
* scannable than absolute, and the agent's tools resolve both.
|
|
1892
|
-
* - File outside the project (input was passed absolute) → returned
|
|
1893
|
-
* verbatim. Inputs that arrive as project-root-relative strings
|
|
1894
|
-
* are always inside the project by construction, so this branch
|
|
1895
|
-
* only kicks in when a direct caller hands the function an
|
|
1896
|
-
* absolute target.
|
|
1897
|
-
*
|
|
1898
|
-
* Pure, no I/O, deterministic.
|
|
1899
|
-
*/
|
|
1900
|
-
/**
|
|
1901
|
-
* Convert a project-root-relative path (as emitted by `listProjectFiles`)
|
|
1902
|
-
* into the form the agent's tools — and the user — will actually find
|
|
1903
|
-
* given the current `cwd`.
|
|
1904
|
-
*
|
|
1905
|
-
* Inputs:
|
|
1906
|
-
* - `projectRelativePath` — forward-slashed, no leading slash. Returned
|
|
1907
|
-
* verbatim when it's empty or already absolute (defensive — the
|
|
1908
|
-
* absolute-input branch is the de-facto "outside the project"
|
|
1909
|
-
* escape; the catalog itself never emits absolute paths).
|
|
1910
|
-
* - `projectRoot` — absolute path of the discovery anchor.
|
|
1911
|
-
* - `cwd` — absolute path of `process.cwd()` at the moment of
|
|
1912
|
-
* insertion.
|
|
1913
|
-
*
|
|
1914
|
-
* Output is always either an absolute path (only when the input arrived
|
|
1915
|
-
* absolute) OR a CWD-relative path. The relative form may include
|
|
1916
|
-
* `../` segments when the target sits above `cwd` within the project,
|
|
1917
|
-
* which keeps cross-tree references short and scannable
|
|
1918
|
-
* (e.g. `../EDIT_THIS.md` instead of `/Users/.../zidane/EDIT_THIS.md`).
|
|
1919
|
-
*/
|
|
1920
|
-
declare function formatPathForCwd(projectRelativePath: string, projectRoot: string, cwd: string): string;
|
|
1921
|
-
//#endregion
|
|
1922
|
-
//#region src/chat/project-root.d.ts
|
|
1923
|
-
/**
|
|
1924
|
-
* Git root detection — walks parents from `cwd` looking for a `.git`
|
|
1925
|
-
* entry, returning the absolute path of the repo root or `null` when
|
|
1926
|
-
* the search reaches the filesystem root.
|
|
1927
|
-
*
|
|
1928
|
-
* Why parent-walk over `git rev-parse --show-toplevel`:
|
|
1929
|
-
*
|
|
1930
|
-
* - Zero dependencies (no shell-out, no git binary requirement,
|
|
1931
|
-
* works even when `git` is missing from `PATH`).
|
|
1932
|
-
* - Pure-sync, deterministic, easy to test against tmp dirs.
|
|
1933
|
-
* - Equally fast in practice — most lookups are a single `existsSync`.
|
|
1934
|
-
*
|
|
1935
|
-
* Recognizes `.git` as either:
|
|
1936
|
-
*
|
|
1937
|
-
* - A directory (standard repo layout).
|
|
1938
|
-
* - A file containing `gitdir: …` (worktrees + submodules).
|
|
1939
|
-
*
|
|
1940
|
-
* Bare repos (no working tree) are intentionally NOT detected here —
|
|
1941
|
-
* the TUI's data dir contract is "project working tree", and a bare
|
|
1942
|
-
* repo has no working files to scope sessions against.
|
|
1943
|
-
*/
|
|
1944
|
-
/**
|
|
1945
|
-
* Walk parents of `cwd` looking for a `.git` entry. Returns the
|
|
1946
|
-
* absolute path of the directory containing `.git`, or `null` when no
|
|
1947
|
-
* git repo is found above `cwd`.
|
|
1948
|
-
*
|
|
1949
|
-
* Stops at the filesystem root (`/`) — no infinite loop on `dirname`'s
|
|
1950
|
-
* idempotent root case (`dirname('/')` returns `/`).
|
|
1951
|
-
*/
|
|
1952
|
-
declare function findGitRoot(cwd?: string): string | null;
|
|
1953
|
-
//#endregion
|
|
1954
|
-
//#region src/chat/provider-usage.d.ts
|
|
1955
|
-
/** How long a snapshot stays fresh. Usage windows move in minutes, not seconds. */
|
|
1956
|
-
declare const USAGE_CACHE_TTL_MS = 60000;
|
|
1957
|
-
/** One rate-limit window, or a credit balance expressed as one. */
|
|
1958
|
-
interface ProviderUsageWindow {
|
|
1959
|
-
/** Stable id, e.g. `five_hour`, `seven_day`, `primary`, `credits`. */
|
|
1960
|
-
id: string;
|
|
1961
|
-
/** Short label, e.g. `5h`, `weekly`, `opus weekly`. */
|
|
1962
|
-
label: string;
|
|
1963
|
-
/** 0-100, rounded to one decimal. */
|
|
1964
|
-
usedPercent: number;
|
|
1965
|
-
/** Epoch ms of the window reset, when the provider reports one. */
|
|
1966
|
-
resetsAt: number | null;
|
|
1967
|
-
}
|
|
1968
|
-
/** Credit balance, where the provider reports one. */
|
|
1969
|
-
interface ProviderUsageCredits {
|
|
1970
|
-
remaining: number;
|
|
1971
|
-
/** Total granted. `null` for providers that only report a balance. */
|
|
1972
|
-
total: number | null;
|
|
1973
|
-
}
|
|
1974
|
-
type ProviderUsageStatus = 'ok' | 'unauthorized' | 'unavailable';
|
|
1975
|
-
/** Normalized usage snapshot for one provider. */
|
|
1976
|
-
interface ProviderUsageSnapshot {
|
|
1977
|
-
/** Registry key of the provider this describes, e.g. `anthropic`. */
|
|
1978
|
-
providerKey: string;
|
|
1979
|
-
/** Descriptor label, carried so renderers don't re-resolve the registry. */
|
|
1980
|
-
label: string;
|
|
1981
|
-
status: ProviderUsageStatus;
|
|
1982
|
-
/** Plan name when the provider reports one (`plus`, `max`). */
|
|
1983
|
-
plan: string | null;
|
|
1984
|
-
windows: readonly ProviderUsageWindow[];
|
|
1985
|
-
credits: ProviderUsageCredits | null;
|
|
1986
|
-
/** Epoch ms this snapshot was produced. */
|
|
1987
|
-
fetchedAt: number;
|
|
1988
|
-
/** Short failure reason. Set whenever `status !== 'ok'`. */
|
|
1989
|
-
error: string | null;
|
|
1990
|
-
}
|
|
1991
|
-
/** Which probe a credential key maps to. */
|
|
1992
|
-
type UsageSource = 'claude' | 'codex' | 'grok' | 'openrouter';
|
|
1993
|
-
/** The probe for a descriptor, or `null` when it has no usage surface. */
|
|
1994
|
-
declare function usageSourceFor(descriptor: ProviderDescriptor): UsageSource | null;
|
|
1995
|
-
/** Whether this provider can report subscription usage at all. */
|
|
1996
|
-
declare function providerUsageSupported(descriptor: ProviderDescriptor): boolean;
|
|
1997
|
-
/**
|
|
1998
|
-
* The window closest to its ceiling, which is the one that will bite first and
|
|
1999
|
-
* the only one a single-line indicator has room for. `null` when the snapshot
|
|
2000
|
-
* carries no windows.
|
|
2001
|
-
*/
|
|
2002
|
-
declare function mostConstrainedWindow(snapshot: ProviderUsageSnapshot): ProviderUsageWindow | null;
|
|
2003
|
-
/**
|
|
2004
|
-
* Drop every cached snapshot. Entries are keyed by credential KEY, not by the
|
|
2005
|
-
* token itself, so signing out and back in (or re-authing to another account)
|
|
2006
|
-
* would otherwise keep serving the previous account's numbers for the rest of
|
|
2007
|
-
* the TTL. The TUI calls this wherever it re-reads credentials.
|
|
2008
|
-
*/
|
|
2009
|
-
declare function clearProviderUsageCache(): void;
|
|
2010
|
-
/** Whether the environment forbids usage probes outright. */
|
|
2011
|
-
declare function usageChecksOptedOut(env?: NodeJS.ProcessEnv): boolean;
|
|
2012
|
-
interface FetchProviderUsageOptions {
|
|
2013
|
-
/** Ignore (and replace) a still-fresh cached snapshot. */
|
|
2014
|
-
refresh?: boolean;
|
|
2015
|
-
}
|
|
2016
|
-
/**
|
|
2017
|
-
* Usage for one provider. `null` means there is nothing to show: the provider
|
|
2018
|
-
* has no usage surface, no credential of the kind its probe needs (file or,
|
|
2019
|
-
* for API keys, env), or the environment opted out (see
|
|
2020
|
-
* {@link usageChecksOptedOut}).
|
|
2021
|
-
*
|
|
2022
|
-
* Never rejects. Transport and parse failures land in the snapshot.
|
|
2023
|
-
*/
|
|
2024
|
-
declare function fetchProviderUsage(dataDir: string, descriptor: ProviderDescriptor, opts?: FetchProviderUsageOptions): Promise<ProviderUsageSnapshot | null>;
|
|
2025
|
-
/**
|
|
2026
|
-
* Usage for every registered provider that has both a usage surface and a
|
|
2027
|
-
* usable credential, in registry order. What the panel renders.
|
|
2028
|
-
*/
|
|
2029
|
-
declare function fetchAllProviderUsage(dataDir: string, registry: Readonly<Record<string, ProviderDescriptor>>, opts?: FetchProviderUsageOptions): Promise<readonly ProviderUsageSnapshot[]>;
|
|
2030
|
-
/**
|
|
2031
|
-
* Percent without trailing noise: `43`, `7.5`, `100`. Used by the panel. The
|
|
2032
|
-
* footer floors to a whole percent instead (`footerUsagePercent` in
|
|
2033
|
-
* `tui/components.tsx`), so a status bar never reads `100%` for `99.9`.
|
|
2034
|
-
*/
|
|
2035
|
-
declare function formatUsagePercent(usedPercent: number): string;
|
|
2036
|
-
//#endregion
|
|
2037
|
-
//#region src/chat/safe-mode.d.ts
|
|
2038
|
-
/**
|
|
2039
|
-
* Safe-mode storage + matching for the TUI.
|
|
2040
|
-
*
|
|
2041
|
-
* Lives at `<dataDir>/projects.json` (default `~/.zidane/projects.json`). Each
|
|
2042
|
-
* top-level key is an absolute project directory; the value carries that
|
|
2043
|
-
* project's persisted tool-call `safelist`.
|
|
2044
|
-
*
|
|
2045
|
-
* ```json
|
|
2046
|
-
* {
|
|
2047
|
-
* "/Users/me/proj-a": { "safelist": ["read_file", "shell:git:*"] }
|
|
2048
|
-
* }
|
|
2049
|
-
* ```
|
|
2050
|
-
*
|
|
2051
|
-
* Two granularities for safelist entries:
|
|
2052
|
-
* - **bare tool name** — `"read_file"` matches every `read_file` call.
|
|
2053
|
-
* - **tool + first-arg token + wildcard** — `"shell:git:*"` matches `shell`
|
|
2054
|
-
* calls whose primary string argument starts with the token `git`
|
|
2055
|
-
* (followed by whitespace or end-of-string). Modelled on Claude Code's
|
|
2056
|
-
* `Bash(git:*)` syntax.
|
|
2057
|
-
*
|
|
2058
|
-
* A short list of read-only tools is **implicitly safe** without being
|
|
2059
|
-
* persisted — see {@link IMPLICITLY_SAFE_TOOLS}.
|
|
2060
|
-
*/
|
|
2061
|
-
interface ProjectEntry {
|
|
2062
|
-
safelist?: string[];
|
|
2063
|
-
}
|
|
2064
|
-
type ProjectsFile = Record<string, ProjectEntry>;
|
|
2065
|
-
/** Resolve `projects.json`'s on-disk path given the TUI data directory. */
|
|
2066
|
-
declare function projectsFilePath(dataDir: string): string;
|
|
2067
|
-
declare function readProjects(dataDir: string): ProjectsFile;
|
|
2068
|
-
declare function writeProjects(dataDir: string, file: ProjectsFile): void;
|
|
2069
|
-
/**
|
|
2070
|
-
* Append one or more entries to the safelist for `projectDir`, dedup-aware.
|
|
2071
|
-
* Accepts a single string or a list (a compound shell command needs one
|
|
2072
|
-
* entry per command head — see {@link suggestSafelistEntries}). Writes once
|
|
2073
|
-
* and returns the updated entry list (post-write) so callers can render it
|
|
2074
|
-
* without re-reading. No write happens when every entry already exists.
|
|
2075
|
-
*/
|
|
2076
|
-
declare function addToSafelist(dataDir: string, projectDir: string, entries: string | readonly string[]): readonly string[];
|
|
2077
|
-
/** Read the safelist for one project. Returns `[]` for unknown projects. */
|
|
2078
|
-
declare function getSafelist(dataDir: string, projectDir: string): readonly string[];
|
|
2079
|
-
/**
|
|
2080
|
-
* Tools that always pass without prompting. Four categories:
|
|
2081
|
-
*
|
|
2082
|
-
* - **Pure reads** (`read_file`, `list_files`, `glob`, `grep`) — no
|
|
2083
|
-
* side effects on disk or the model's own state.
|
|
2084
|
-
* - **Interaction tools** (`ask_user`, `present_plan`) — the call
|
|
2085
|
-
* itself surfaces a TUI picker the user has to answer, so prompting
|
|
2086
|
-
* for approval first would mean "approve this prompt before you see
|
|
2087
|
-
* the prompt": redundant + breaks the flow. The picker IS the gate.
|
|
2088
|
-
* - **Todos** (`todowrite`, `todoread`) — write to a slot on
|
|
2089
|
-
* `session.metadata.todos` and nothing else. No shell, no disk, no
|
|
2090
|
-
* network. The model uses these for checkpointing every few steps;
|
|
2091
|
-
* a per-call approval prompt would drown the conversation in
|
|
2092
|
-
* interruptions that buy no safety since the tool's surface is
|
|
2093
|
-
* read/write on a metadata bag we already trust the agent with.
|
|
2094
|
-
* - **Skill activation** (`skills_use`) — mutates a small per-agent
|
|
2095
|
-
* Map of active skills and returns the activated skill's bundled
|
|
2096
|
-
* instructions (or releases an entry on `mode: "deactivate"`).
|
|
2097
|
-
* Pure state on the agent — no shell, no disk writes, no network.
|
|
2098
|
-
* Gating it would also defeat the "model recovers from
|
|
2099
|
-
* `AgentToolNotAllowedError` by calling
|
|
2100
|
-
* `skills_use({ mode: "deactivate", name })`" path: a stuck model
|
|
2101
|
-
* would have to ask the user permission to *unstick* itself on
|
|
2102
|
-
* every retry. `skills_read` and `skills_run_script` are
|
|
2103
|
-
* intentionally NOT on this list — the former touches disk and
|
|
2104
|
-
* the latter executes arbitrary scripts, so both keep going
|
|
2105
|
-
* through the regular gate.
|
|
2106
|
-
*
|
|
2107
|
-
* Users who want to gate any of these must disable safe-mode entirely
|
|
2108
|
-
* (or fork this list in their own embedding).
|
|
2109
|
-
*/
|
|
2110
|
-
declare const IMPLICITLY_SAFE_TOOLS: readonly string[];
|
|
2111
|
-
/**
|
|
2112
|
-
* Test whether a `{ tool, input }` pair is covered by one safelist entry.
|
|
2113
|
-
*
|
|
2114
|
-
* Supported entry shapes:
|
|
2115
|
-
* - `"<tool>"` — broad match on tool name.
|
|
2116
|
-
* - `"<tool>:<token>:*"` — match when the primary arg's first token
|
|
2117
|
-
* equals `<token>`.
|
|
2118
|
-
*
|
|
2119
|
-
* This function matches a **single command** against a **single entry**.
|
|
2120
|
-
* For shell commands that chain multiple programs (`&&`, `||`, `;`,
|
|
2121
|
-
* `$(…)`, etc.), use {@link isOnSafelist} which parses the full command
|
|
2122
|
-
* and checks every head token independently.
|
|
2123
|
-
*
|
|
2124
|
-
* Entries that don't fit either shape are ignored (forward-compat for
|
|
2125
|
-
* future pattern syntax — readers shouldn't choke on entries written
|
|
2126
|
-
* by a newer version of the TUI).
|
|
2127
|
-
*/
|
|
2128
|
-
declare function matchesSafelistEntry(entry: string, tool: string, input: Record<string, unknown>): boolean;
|
|
2129
|
-
/**
|
|
2130
|
-
* True when a call matches ANY entry in the project's safelist (or is
|
|
2131
|
-
* implicitly safe).
|
|
2132
|
-
*
|
|
2133
|
-
* For `shell` commands, the full command string is parsed into individual
|
|
2134
|
-
* commands (handling `&&`, `||`, `;`, `|`, `$(…)`, backticks, subshells).
|
|
2135
|
-
* Every command head must be covered by at least one safelist entry for
|
|
2136
|
-
* the call to pass. If parsing fails, returns `false` (prompt the user).
|
|
2137
|
-
*/
|
|
2138
|
-
declare function isOnSafelist(entries: readonly string[], tool: string, input: Record<string, unknown>): boolean;
|
|
2139
|
-
/**
|
|
2140
|
-
* Suggest the safelist entries to persist when the user picks "accept and
|
|
2141
|
-
* remember" (or "accept for session") for a `{ tool, input }`. Heuristic:
|
|
2142
|
-
*
|
|
2143
|
-
* - `shell` → one `shell:<head>:*` per DISTINCT command head, parsing the
|
|
2144
|
-
* command the SAME way {@link isOnSafelist} matches it (`&&`, `||`, `;`,
|
|
2145
|
-
* `|`, `$(…)`, subshells, backticks). So `cd dir && cat file` yields
|
|
2146
|
-
* `["shell:cd:*", "shell:cat:*"]` — persisting the whole set is what
|
|
2147
|
-
* lets the next identical call skip the gate. A single first-token
|
|
2148
|
-
* entry would only cover `cd`, so `isOnSafelist`'s `every-head` check
|
|
2149
|
-
* would fail on `cat` and re-prompt forever.
|
|
2150
|
-
* - `shell` with an unparseable / empty command → first-token heuristic,
|
|
2151
|
-
* else the bare tool name.
|
|
2152
|
-
* - anything else → bare tool name (broad).
|
|
2153
|
-
*
|
|
2154
|
-
* Always returns a non-empty list so the UI has a concrete set to render
|
|
2155
|
-
* and persist.
|
|
2156
|
-
*/
|
|
2157
|
-
declare function suggestSafelistEntries(tool: string, input: Record<string, unknown>): string[];
|
|
2158
|
-
//#endregion
|
|
2159
|
-
//#region src/chat/settings-context.d.ts
|
|
2160
|
-
declare const DEFAULT_SETTINGS: Settings;
|
|
2161
|
-
interface SettingsContextValue {
|
|
2162
|
-
settings: Settings;
|
|
2163
|
-
/** Flip a boolean setting in place. Restricted at the type level to boolean-valued keys. */
|
|
2164
|
-
toggle: (key: BooleanSettingKey) => void;
|
|
2165
|
-
/** Write any setting key to a new value. Used by string-valued choice rows. */
|
|
2166
|
-
setSetting: <K extends keyof Settings>(key: K, value: Settings[K]) => void;
|
|
2167
|
-
}
|
|
2168
|
-
declare function SettingsProvider({
|
|
2169
|
-
initial,
|
|
2170
|
-
onChange,
|
|
2171
|
-
children
|
|
2172
|
-
}: {
|
|
2173
|
-
initial: Settings;
|
|
2174
|
-
onChange?: (settings: Settings) => void;
|
|
2175
|
-
children: ReactNode;
|
|
2176
|
-
}): import("react").JSX.Element;
|
|
2177
|
-
declare function useSettings(): SettingsContextValue;
|
|
2178
|
-
/**
|
|
2179
|
-
* Keys of `Settings` whose value type is exactly `boolean`. Used to type
|
|
2180
|
-
* the toggle table so `SETTINGS_TOGGLES.key` only ever points to a
|
|
2181
|
-
* boolean-valued setting — string- and array-valued settings (theme,
|
|
2182
|
-
* enabledSkills, …) live in `SETTINGS_CHOICES` or actions.
|
|
2183
|
-
*
|
|
2184
|
-
* `-?` strips optionality from the mapped output so `Settings[K]` doesn't
|
|
2185
|
-
* silently broaden into `T | undefined` and short-circuit the `extends
|
|
2186
|
-
* boolean` check via `undefined`.
|
|
2187
|
-
*/
|
|
2188
|
-
type BooleanSettingKey = { [K in keyof Settings]-?: Settings[K] extends boolean ? K : never }[keyof Settings];
|
|
2189
|
-
/**
|
|
2190
|
-
* Setting categories — drives the tab grouping in the TUI's
|
|
2191
|
-
* `SettingsModal` and, more importantly, gives any embedder (GUI,
|
|
2192
|
-
* web settings panel, …) a stable taxonomy to bucket settings under
|
|
2193
|
-
* without re-hardcoding the split.
|
|
2194
|
-
*
|
|
2195
|
-
* - `'agent'` — agent behaviour, capabilities, persistence,
|
|
2196
|
-
* data handling, auth. "What zidane DOES."
|
|
2197
|
-
* - `'ui'` — display, rendering, theming, animations,
|
|
2198
|
-
* chrome density, keybindings. "How zidane LOOKS
|
|
2199
|
-
* and feels."
|
|
2200
|
-
*
|
|
2201
|
-
* Borderline calls (`showAllProjects`, `hideSubagentOutput`,
|
|
2202
|
-
* `resumeLastSession`) are documented inline at each row.
|
|
2203
|
-
*/
|
|
2204
|
-
type SettingsCategory = 'agent' | 'ui';
|
|
2205
|
-
interface SettingsCategoryDescriptor {
|
|
2206
|
-
id: SettingsCategory;
|
|
2207
|
-
/** Display label — used by the TUI tab strip + any GUI tab/section header. */
|
|
2208
|
-
label: string;
|
|
2209
|
-
/** One-line gloss the GUI can show as a section subtitle. The TUI omits this. */
|
|
2210
|
-
description: string;
|
|
2211
|
-
}
|
|
2212
|
-
/**
|
|
2213
|
-
* Ordered list of categories. Display order in any consumer (TUI tabs,
|
|
2214
|
-
* GUI sidebar, settings JSON dump) should match this array — keeps
|
|
2215
|
-
* mental model consistent across surfaces.
|
|
2216
|
-
*/
|
|
2217
|
-
declare const SETTINGS_CATEGORIES: readonly SettingsCategoryDescriptor[];
|
|
2218
|
-
/**
|
|
2219
|
-
* Static description of every togglable setting, in display order. The TUI's
|
|
2220
|
-
* `SettingsModal` and any future GUI settings panel build their row list
|
|
2221
|
-
* from this so labels/descriptions stay in one place.
|
|
2222
|
-
*/
|
|
2223
|
-
interface SettingsToggle {
|
|
2224
|
-
key: BooleanSettingKey;
|
|
2225
|
-
label: string;
|
|
2226
|
-
description: string;
|
|
2227
|
-
category: SettingsCategory;
|
|
2228
|
-
}
|
|
2229
|
-
declare const SETTINGS_TOGGLES: readonly SettingsToggle[];
|
|
2230
|
-
/**
|
|
2231
|
-
* String-valued settings that pick between a known set of options. The
|
|
2232
|
-
* `SettingsModal` renders these as one row showing the active label, where
|
|
2233
|
-
* `enter` cycles to the next option (wrapping back to the first). Same
|
|
2234
|
-
* shape any GUI settings panel can consume — render the options array as a
|
|
2235
|
-
* dropdown or segmented control.
|
|
2236
|
-
*
|
|
2237
|
-
* Keep `options` in stable display order; cycling depends on it.
|
|
2238
|
-
*/
|
|
2239
|
-
interface SettingsChoice<K extends keyof Settings = keyof Settings> {
|
|
2240
|
-
key: K;
|
|
2241
|
-
label: string;
|
|
2242
|
-
description: string;
|
|
2243
|
-
options: readonly {
|
|
2244
|
-
value: Settings[K];
|
|
2245
|
-
label: string;
|
|
2246
|
-
}[];
|
|
2247
|
-
category: SettingsCategory;
|
|
2248
|
-
}
|
|
2249
|
-
declare const SETTINGS_CHOICES: readonly SettingsChoice[];
|
|
2250
|
-
/**
|
|
2251
|
-
* Keys of `Settings` whose value type is exactly `string`. Bounds the
|
|
2252
|
-
* input table's `key` the same way {@link BooleanSettingKey} bounds the
|
|
2253
|
-
* toggle table — a free-text row can only point at a string-valued
|
|
2254
|
-
* setting.
|
|
2255
|
-
*/
|
|
2256
|
-
type StringSettingKey = { [K in keyof Settings]-?: Settings[K] extends string ? K : never }[keyof Settings];
|
|
2257
|
-
/**
|
|
2258
|
-
* Free-text settings edited via a single-line input. The `SettingsModal`
|
|
2259
|
-
* renders these as a row showing the current value (or `placeholder` when
|
|
2260
|
-
* empty); `enter` opens an inline editor. Same shape a GUI can consume as
|
|
2261
|
-
* a text field.
|
|
2262
|
-
*/
|
|
2263
|
-
interface SettingsInput {
|
|
2264
|
-
key: StringSettingKey;
|
|
2265
|
-
label: string;
|
|
2266
|
-
description: string;
|
|
2267
|
-
/** Shown when the value is empty — also the conventional "default" hint. */
|
|
2268
|
-
placeholder: string;
|
|
2269
|
-
category: SettingsCategory;
|
|
2270
|
-
}
|
|
2271
|
-
declare const SETTINGS_INPUTS: readonly SettingsInput[];
|
|
2272
|
-
//#endregion
|
|
2273
|
-
//#region src/chat/skills-discovery.d.ts
|
|
2274
|
-
/**
|
|
2275
|
-
* Resolve the default skill scan paths for a project. First-found wins on
|
|
2276
|
-
* collision; earlier entries take precedence.
|
|
2277
|
-
*
|
|
2278
|
-
* Search order — see {@link projectUserPaths}. Non-existent paths are
|
|
2279
|
-
* returned so downstream code can choose whether to create them;
|
|
2280
|
-
* `discoverSkills` itself skips missing dirs without error.
|
|
2281
|
-
*/
|
|
2282
|
-
declare function defaultSkillScanPaths(opts?: {
|
|
2283
|
-
cwd?: string;
|
|
2284
|
-
home?: string;
|
|
2285
|
-
prefix?: string;
|
|
2286
|
-
/**
|
|
2287
|
-
* Also scan the skill directories other agents maintain (Claude Code,
|
|
2288
|
-
* Codex, Pi) — see `foreign-configs.ts`. Mirrors the
|
|
2289
|
-
* `importForeignConfigs` setting. Appended AFTER the native paths so
|
|
2290
|
-
* first-found-wins keeps zidane's own copies authoritative on name
|
|
2291
|
-
* collisions.
|
|
2292
|
-
*/
|
|
2293
|
-
foreignAgents?: boolean;
|
|
2294
|
-
/**
|
|
2295
|
-
* Also scan Ruler skill directories (`.ruler/skills`, project and
|
|
2296
|
-
* XDG-global) — see `ruler-configs.ts`. Mirrors the
|
|
2297
|
-
* `importRulerConfigs` setting; appended last so first-found-wins
|
|
2298
|
-
* keeps both zidane's own and foreign copies authoritative.
|
|
2299
|
-
*/
|
|
2300
|
-
ruler?: boolean;
|
|
2301
|
-
}): SourcedScanPath[];
|
|
2302
|
-
/**
|
|
2303
|
-
* Discover every skill reachable from the default scan paths. Returns
|
|
2304
|
-
* parsed `SkillConfig`s with `name`, `description`, frontmatter, and
|
|
2305
|
-
* lenient-load diagnostics. Pure I/O — does not activate or write.
|
|
2306
|
-
*
|
|
2307
|
-
* `signal` is forwarded to `discoverSkills` so the TUI's directory-watch
|
|
2308
|
-
* effect can cancel a long scan when the user switches `cwd` rapidly.
|
|
2309
|
-
*
|
|
2310
|
-
* Errors during parse are surfaced as `diagnostics` on the returned
|
|
2311
|
-
* skill, not thrown — keeps the picker usable even when a single
|
|
2312
|
-
* SKILL.md is malformed.
|
|
2313
|
-
*/
|
|
2314
|
-
declare function discoverProjectSkills(opts?: {
|
|
2315
|
-
cwd?: string;
|
|
2316
|
-
home?: string;
|
|
2317
|
-
prefix?: string; /** See {@link defaultSkillScanPaths}. */
|
|
2318
|
-
foreignAgents?: boolean; /** See {@link defaultSkillScanPaths}. */
|
|
2319
|
-
ruler?: boolean;
|
|
2320
|
-
signal?: AbortSignal;
|
|
2321
|
-
}): Promise<SkillConfig[]>;
|
|
2322
|
-
/**
|
|
2323
|
-
* Map a user-toggled enable list onto the format `createAgent` expects.
|
|
2324
|
-
*
|
|
2325
|
-
* Conventions:
|
|
2326
|
-
* - `enabled === undefined` → all discovered skills enabled (default).
|
|
2327
|
-
* - `enabled === []` → fully off; the agent will not scan or
|
|
2328
|
-
* inject the skills tools.
|
|
2329
|
-
* - `enabled === [names]` → allowlist; skills not in the list are
|
|
2330
|
-
* left out of the catalog.
|
|
2331
|
-
*
|
|
2332
|
-
* `scan` is the resolved scan-path list (passed through verbatim). Pass
|
|
2333
|
-
* `defaultSkillScanPaths()` for the standard project + user paths, or
|
|
2334
|
-
* supply a host-specific list.
|
|
2335
|
-
*/
|
|
2336
|
-
declare function buildSkillsConfig(opts: {
|
|
2337
|
-
scan: SourcedScanPath[];
|
|
2338
|
-
enabled?: readonly string[];
|
|
2339
|
-
}): SkillsConfig;
|
|
2340
|
-
//#endregion
|
|
2341
|
-
//#region src/chat/streaming.d.ts
|
|
2342
|
-
interface StreamSource {
|
|
2343
|
-
/** Pass `undefined` / omit for parent-agent events. */
|
|
2344
|
-
childId?: string;
|
|
2345
|
-
/** Nesting depth — 0 for parent, ≥ 1 for subagents. */
|
|
2346
|
-
depth?: number;
|
|
2347
|
-
/**
|
|
2348
|
-
* `SessionTurn.id` this delta belongs to. Tagged onto new events so the
|
|
2349
|
-
* TUI's select-turn mode can group every event from one turn. Stored on
|
|
2350
|
-
* the active bucket and refreshed on every delta so a turn boundary
|
|
2351
|
-
* (`turn:after` flushes the bucket) doesn't carry stale ids forward.
|
|
2352
|
-
*/
|
|
2353
|
-
turnId?: string;
|
|
2354
|
-
}
|
|
2355
|
-
interface StreamBuffer {
|
|
2356
|
-
/** Queue a streaming delta for the next flush tick. */
|
|
2357
|
-
queueStreamDelta: (kind: 'markdown' | 'thinking', delta: string, source?: StreamSource) => void;
|
|
2358
|
-
/** Drain pending deltas immediately, then append a non-streaming event. */
|
|
2359
|
-
appendImmediate: (evt: StreamEvent) => void;
|
|
2360
|
-
/** Drain pending deltas immediately, then transform the event list. */
|
|
2361
|
-
flushAndUpdate: (update: (events: StreamEvent[]) => StreamEvent[]) => void;
|
|
2362
|
-
/** Drain pending deltas without further transformation. */
|
|
2363
|
-
flush: () => void;
|
|
2364
|
-
/** Cancel any pending flush and drop buffered deltas (on session teardown). */
|
|
2365
|
-
reset: () => void;
|
|
2366
|
-
}
|
|
2367
|
-
interface StreamBufferOptions {
|
|
2368
|
-
/**
|
|
2369
|
-
* Returns `true` to drip-feed buffered text at the smooth typewriter
|
|
2370
|
-
* cadence, `false` to drain everything per tick (batched mode — the
|
|
2371
|
-
* legacy behaviour). Called on every tick, so flipping the user setting
|
|
2372
|
-
* takes effect on the next drain.
|
|
2373
|
-
*/
|
|
2374
|
-
getSmooth?: () => boolean;
|
|
2375
|
-
/**
|
|
2376
|
-
* Display-memory bound applied on every drain commit (see
|
|
2377
|
-
* {@link capTranscriptEvents}): above this many events the oldest are
|
|
2378
|
-
* trimmed at a turn boundary and replaced with a cumulative
|
|
2379
|
-
* "… N earlier items hidden" marker event. Rendered events hold live
|
|
2380
|
-
* renderables/native buffers, so an unbounded buffer OOMs long
|
|
2381
|
-
* sessions (~0.13MB RSS per event measured in the TUI).
|
|
2382
|
-
*
|
|
2383
|
-
* Default {@link MAX_TRANSCRIPT_EVENTS}. Pass `null` to disable and
|
|
2384
|
-
* receive the full, unbounded event array (pre-5.13 behavior) — e.g.
|
|
2385
|
-
* a host that renders a virtualized list or exports events verbatim.
|
|
2386
|
-
*/
|
|
2387
|
-
maxTranscriptEvents?: number | null;
|
|
2388
|
-
}
|
|
2389
|
-
declare function useStreamBuffer(setEvents: Dispatch<SetStateAction<StreamEvent[]>>, options?: StreamBufferOptions): StreamBuffer;
|
|
2390
|
-
//#endregion
|
|
2391
|
-
//#region src/chat/system-md.d.ts
|
|
2392
|
-
/** A discovered `SYSTEM.md`. */
|
|
2393
|
-
interface SystemMdFile {
|
|
2394
|
-
path: string;
|
|
2395
|
-
source: 'project' | 'user';
|
|
2396
|
-
contents: string;
|
|
2397
|
-
}
|
|
2398
|
-
/** Result of {@link discoverSystemMd}. */
|
|
2399
|
-
interface SystemMdResult {
|
|
2400
|
-
/**
|
|
2401
|
-
* The winning override, or `null` when no `SYSTEM.md` exists (the built-in
|
|
2402
|
-
* doctrine then applies unchanged).
|
|
2403
|
-
*/
|
|
2404
|
-
file: SystemMdFile | null;
|
|
2405
|
-
/**
|
|
2406
|
-
* Files that exist but lost to `file` on precedence. Non-empty only when the
|
|
2407
|
-
* user has both a project and a user `SYSTEM.md`. Surfaced so the UI can mark
|
|
2408
|
-
* them as inactive instead of leaving the user wondering why edits to one of
|
|
2409
|
-
* them changed nothing.
|
|
2410
|
-
*/
|
|
2411
|
-
shadowed: readonly SystemMdFile[];
|
|
2412
|
-
}
|
|
2413
|
-
interface DiscoverSystemMdOptions {
|
|
2414
|
-
/** Discovery cwd. Default: `process.cwd()`. */
|
|
2415
|
-
cwd?: string;
|
|
2416
|
-
/** User home directory. Default: `os.homedir()`. */
|
|
2417
|
-
home?: string;
|
|
2418
|
-
/** Storage prefix. Leading dot tolerated. Default: `'.zidane'`. */
|
|
2419
|
-
prefix?: string;
|
|
2420
|
-
/**
|
|
2421
|
-
* Which scopes may contribute an override — the same
|
|
2422
|
-
* {@link AgentsMdScope} the host applies to `AGENTS.md`, so one setting
|
|
2423
|
-
* governs both surfaces:
|
|
2424
|
-
* - `'none'` — no override, ever. Short-circuits before any FS probe.
|
|
2425
|
-
* - `'user'` — only `~/.{prefix}/SYSTEM.md`. The repo's file is IGNORED,
|
|
2426
|
-
* which is the whole point of the setting: it is how a user
|
|
2427
|
-
* says "do not trust this checkout".
|
|
2428
|
-
* - `'project'` — only `<root>/SYSTEM.md`.
|
|
2429
|
-
* - `'both'` — union, project winning (default).
|
|
2430
|
-
*
|
|
2431
|
-
* Previously a boolean that only implemented `'none'`, so `'user'` still let a
|
|
2432
|
-
* repo-root `SYSTEM.md` replace the entire doctrine — exactly the case the
|
|
2433
|
-
* setting exists to prevent.
|
|
2434
|
-
*/
|
|
2435
|
-
scope?: AgentsMdScope;
|
|
2436
|
-
}
|
|
2437
|
-
/**
|
|
2438
|
-
* Absolute path of the USER-scope `SYSTEM.md` — the file the TUI creates when
|
|
2439
|
-
* the user asks for an override and none exists yet.
|
|
2440
|
-
*
|
|
2441
|
-
* Exported so the host doesn't hardcode the layout and can't drift from what
|
|
2442
|
-
* discovery actually reads.
|
|
2443
|
-
*/
|
|
2444
|
-
declare function userSystemMdPath(opts?: {
|
|
2445
|
-
home?: string;
|
|
2446
|
-
prefix?: string;
|
|
2447
|
-
}): string;
|
|
2448
|
-
/**
|
|
2449
|
-
* Find the active `SYSTEM.md` override, if any.
|
|
2450
|
-
*
|
|
2451
|
-
* Project paths anchor at the git root when one exists above `cwd`, else at
|
|
2452
|
-
* `cwd` — the same anchor as skills / mcps / AGENTS.md discovery, so all four
|
|
2453
|
-
* surfaces agree on what "this project" means.
|
|
2454
|
-
*
|
|
2455
|
-
* Tolerant: an unreadable or empty file is treated as absent (logged under
|
|
2456
|
-
* `ZIDANE_DEBUG`) and the next candidate gets its turn. Never throws — this
|
|
2457
|
-
* runs on the session-activation path.
|
|
2458
|
-
*
|
|
2459
|
-
* Candidates are filtered by {@link DiscoverSystemMdOptions.scope}, mirroring
|
|
2460
|
-
* how `discoverAgentsMd` builds its own list.
|
|
2461
|
-
*/
|
|
2462
|
-
declare function discoverSystemMd(opts?: DiscoverSystemMdOptions): SystemMdResult;
|
|
2463
|
-
/**
|
|
2464
|
-
* Seed contents for a freshly created `SYSTEM.md` override, built from the
|
|
2465
|
-
* built-in doctrine.
|
|
2466
|
-
*
|
|
2467
|
-
* Seeding with the real doctrine (rather than an empty file) means creating the
|
|
2468
|
-
* override is a behavioral no-op until the user edits it. An empty seed would
|
|
2469
|
-
* silently delete every line of doctrine the moment the file appeared, making
|
|
2470
|
-
* the agent measurably worse with no visible cause.
|
|
2471
|
-
*
|
|
2472
|
-
* `currentSystem` should be DOCTRINE ONLY — callers pass
|
|
2473
|
-
* `splitSystemPrompt(doctrineOnlySystem()).static`, which excludes both the
|
|
2474
|
-
* generated `<env>` block (rebuilt per turn) and the `AGENTS.md` block. Baking
|
|
2475
|
-
* the latter in would duplicate it, since it is re-appended below the override
|
|
2476
|
-
* on every compose.
|
|
2477
|
-
*
|
|
2478
|
-
* `scope` is the active `userInstructionsScope`; it decides whether the seed's
|
|
2479
|
-
* precedence note is true — see {@link projectScopeOverridesLoad}.
|
|
2480
|
-
*/
|
|
2481
|
-
declare function renderSystemMdSeed(currentSystem: string, scope?: AgentsMdScope): string;
|
|
2482
|
-
//#endregion
|
|
2483
|
-
//#region src/chat/theme-context.d.ts
|
|
2484
|
-
declare function ThemeProvider({
|
|
2485
|
-
theme,
|
|
2486
|
-
children
|
|
2487
|
-
}: {
|
|
2488
|
-
theme: Theme;
|
|
2489
|
-
children: ReactNode;
|
|
2490
|
-
}): import("react").JSX.Element;
|
|
2491
|
-
declare function useTheme(): Theme;
|
|
2492
|
-
/** Color palette only — equivalent to `useTheme().colors`. */
|
|
2493
|
-
declare function useColors(): ThemeColors;
|
|
2494
|
-
/** Select-row styling — equivalent to `useTheme().select`. */
|
|
2495
|
-
declare function useSelectStyle(): ThemeSelect;
|
|
2496
|
-
/** Panel / surface backgrounds — equivalent to `useTheme().surfaces`. */
|
|
2497
|
-
declare function useSurfaces(): ThemeSurfaces;
|
|
2498
|
-
/** Raw syntax style table — `useTheme().syntax`. Renderer converts to its native style type. */
|
|
2499
|
-
declare function useSyntaxStyles(): SyntaxStyles;
|
|
2500
|
-
//#endregion
|
|
2501
|
-
//#region src/chat/themes/catppuccin.d.ts
|
|
2502
|
-
declare const CATPPUCCIN_MOCHA: Theme;
|
|
2503
|
-
declare const CATPPUCCIN_MACCHIATO: Theme;
|
|
2504
|
-
declare const CATPPUCCIN_FRAPPE: Theme;
|
|
2505
|
-
declare const CATPPUCCIN_LATTE: Theme;
|
|
2506
|
-
//#endregion
|
|
2507
|
-
//#region src/chat/themes/gruvbox.d.ts
|
|
2508
|
-
declare const GRUVBOX_DARK: Theme;
|
|
2509
|
-
declare const GRUVBOX_LIGHT: Theme;
|
|
2510
|
-
//#endregion
|
|
2511
|
-
//#region src/chat/themes/vaporwave.d.ts
|
|
2512
|
-
declare const VAPORWAVE_THEME: Theme;
|
|
2513
|
-
//#endregion
|
|
2514
|
-
//#region src/chat/todos.d.ts
|
|
2515
|
-
declare const TODOWRITE_TOOL = "todowrite";
|
|
2516
|
-
declare const TODOREAD_TOOL = "todoread";
|
|
2517
|
-
/** True when `name` is one of the todo tool canonical names. */
|
|
2518
|
-
declare function isTodoTool(name: string): boolean;
|
|
2519
|
-
/** `session.metadata[TODOS_METADATA_KEY]: TodosBag` — see {@link TodosBag}. */
|
|
2520
|
-
declare const TODOS_METADATA_KEY = "todos";
|
|
2521
|
-
/** `session.metadata[TODO_WRITE_COUNTS_METADATA_KEY]: CountsBag` — mirrors `TodosBag` shape. */
|
|
2522
|
-
declare const TODO_WRITE_COUNTS_METADATA_KEY = "todoWriteCounts";
|
|
2523
|
-
type TodoStatus = 'pending' | 'in_progress' | 'completed' | 'cancelled';
|
|
2524
|
-
interface TodoItem {
|
|
2525
|
-
/** Stable id — the model picks it. Reusing an id replaces that item. */
|
|
2526
|
-
id: string;
|
|
2527
|
-
/** One-line task summary (Markdown allowed; renderers may sanitize). */
|
|
2528
|
-
content: string;
|
|
2529
|
-
status: TodoStatus;
|
|
2530
|
-
}
|
|
2531
|
-
/**
|
|
2532
|
-
* On-disk shape at `session.metadata[TODOS_METADATA_KEY]`.
|
|
2533
|
-
*
|
|
2534
|
-
* Sub-fields are absent (not empty) when they carry no data — keeps the
|
|
2535
|
-
* persisted metadata clean and lets `JSON.stringify` skip empty bags
|
|
2536
|
-
* entirely on session save.
|
|
2537
|
-
*/
|
|
2538
|
-
interface TodosBag {
|
|
2539
|
-
/** Top-level slot — shared across runs whose `parentRunId` is unset. */
|
|
2540
|
-
session?: TodoItem[];
|
|
2541
|
-
/** Per-subagent-run slots, keyed by the child run's id. */
|
|
2542
|
-
byRun?: Record<string, TodoItem[]>;
|
|
2543
|
-
/**
|
|
2544
|
-
* Most-recent non-empty list per slot — sidecar for UI surfaces, NOT
|
|
2545
|
-
* visible to `todoread`. Updated on every non-empty write; **preserved**
|
|
2546
|
-
* across the auto-clear path. Lets the modal keep showing "what was just
|
|
2547
|
-
* completed" after a fully-done batch wipes the live slot. Empty writes
|
|
2548
|
-
* never touch the archive — clearing the live list shouldn't erase the
|
|
2549
|
-
* audit trail.
|
|
2550
|
-
*/
|
|
2551
|
-
archive?: {
|
|
2552
|
-
session?: TodoItem[];
|
|
2553
|
-
byRun?: Record<string, TodoItem[]>;
|
|
2554
|
-
};
|
|
2555
|
-
}
|
|
2556
|
-
declare const TODO_STATUS_GLYPHS: Readonly<Record<TodoStatus, string>>;
|
|
2557
|
-
interface CreateTodoToolsOptions {
|
|
2558
|
-
/**
|
|
2559
|
-
* Maximum item count per `todowrite`. Excess items are truncated by the
|
|
2560
|
-
* recursive validator and reported back to the model in the tool_result.
|
|
2561
|
-
*
|
|
2562
|
-
* Default: `100`. The default is generous; a planning agent that exceeds
|
|
2563
|
-
* 100 items per call is usually flailing.
|
|
2564
|
-
*/
|
|
2565
|
-
maxItems?: number;
|
|
2566
|
-
/**
|
|
2567
|
-
* Per-run cap on `todowrite` calls, plumbed into `behavior.toolBudgets`.
|
|
2568
|
-
* `onMaxWrites` chooses the reaction (steer / block) — see
|
|
2569
|
-
* {@link AgentBehavior.toolBudgets} for the contract.
|
|
2570
|
-
*
|
|
2571
|
-
* **Default: `0` (no cap).** `todowrite` is a state-transition tool —
|
|
2572
|
-
* a legitimate run of an N-item list needs at least `N + 1` calls
|
|
2573
|
-
* (initial plan + one transition per item) to complete, so a hard
|
|
2574
|
-
* cap punishes the legitimate path. The nudges that DO apply are the
|
|
2575
|
-
* `remindAfter` reminder (soft, in-band) and the identical-payload
|
|
2576
|
-
* dedup check (silent, structural). Hosts that want a true hard cap
|
|
2577
|
-
* can opt in by setting `maxWritesPerRun: N`.
|
|
2578
|
-
*
|
|
2579
|
-
* **Counting semantics** (when opted in): the budget counts every
|
|
2580
|
-
* dispatched call, including dedup substitutes (zidane spec). The
|
|
2581
|
-
* {@link remindAfter} counter counts execute-only dispatches —
|
|
2582
|
-
* dedup hits replay the prior result and never reach the tool body.
|
|
2583
|
-
* Use this budget (not the reminder) as the hard limit.
|
|
2584
|
-
*/
|
|
2585
|
-
maxWritesPerRun?: number;
|
|
2586
|
-
onMaxWrites?: 'steer' | 'block';
|
|
2587
|
-
/**
|
|
2588
|
-
* Hard stop for **consecutive identical** `todowrite` payloads — the
|
|
2589
|
-
* exact loop the in-body `dedupIdentical` check only *whispers* about
|
|
2590
|
-
* ("No change — N items already tracked"). Plumbs a run-scoped
|
|
2591
|
-
* `behavior.dedupTools.todowrite` entry in `block-after` mode: the
|
|
2592
|
-
* gate replays the unchanged result for the first `N - 1` identical
|
|
2593
|
-
* calls, then refuses the `N`th (and every subsequent identical one)
|
|
2594
|
-
* with a `Blocked: …` tool_result so the model breaks out instead of
|
|
2595
|
-
* re-checkpointing forever.
|
|
2596
|
-
*
|
|
2597
|
-
* This is safe to leave on by default — unlike {@link maxWritesPerRun}
|
|
2598
|
-
* it only ever blocks a payload byte-identical to the one already
|
|
2599
|
-
* tracked, so a legitimate "finish the N-item plan" run (which writes
|
|
2600
|
-
* a *different* list each transition) is never touched. The counter
|
|
2601
|
-
* resets the moment the model writes anything different.
|
|
2602
|
-
*
|
|
2603
|
-
* Run-scoped via `DedupToolConfig.scope: 'run'`, so a parent and a
|
|
2604
|
-
* subagent writing the same list never share the counter — the precise
|
|
2605
|
-
* conflation that kept `todowrite` off `behavior.dedupTools` before.
|
|
2606
|
-
*
|
|
2607
|
-
* Set to `0` to opt out (e.g. a host that installs its own loop
|
|
2608
|
-
* hardening). Default: `5`. Values `< 2` are clamped to `2` by the
|
|
2609
|
-
* dedup middleware (a threshold of 1 would block the first call).
|
|
2610
|
-
*/
|
|
2611
|
-
maxIdenticalWrites?: number;
|
|
2612
|
-
/**
|
|
2613
|
-
* Custom refusal text for the {@link maxIdenticalWrites} block. Receives
|
|
2614
|
-
* the 1-indexed identical-call count (including the blocked call). Leave
|
|
2615
|
-
* unset for the built-in "you've written the same list N times in a
|
|
2616
|
-
* row" message.
|
|
2617
|
-
*/
|
|
2618
|
-
identicalBlockReason?: (count: number) => string;
|
|
2619
|
-
/**
|
|
2620
|
-
* Append a "you've checkpointed N times — only call this at significant
|
|
2621
|
-
* task transitions" nudge to the tool_result once `todowrite` has fired
|
|
2622
|
-
* this many times in the current run. The nudge rides on the result
|
|
2623
|
-
* string, so the model sees it on its next turn without `system:transform`
|
|
2624
|
-
* plumbing.
|
|
2625
|
-
*
|
|
2626
|
-
* Counts only executed dispatches (dedup hits skip the tool body and so
|
|
2627
|
-
* skip the increment). For a hard cap that also covers dedup hits, use
|
|
2628
|
-
* {@link maxWritesPerRun}.
|
|
2629
|
-
*
|
|
2630
|
-
* Set to `0` to opt out. Default: `3`.
|
|
2631
|
-
*/
|
|
2632
|
-
remindAfter?: number;
|
|
2633
|
-
/**
|
|
2634
|
-
* Custom reminder text. Receives the post-call count and the items that
|
|
2635
|
-
* were just written. Return `''` (or `undefined`) to suppress the reminder
|
|
2636
|
-
* for this specific call. Default text nudges towards "back to executing,
|
|
2637
|
-
* not re-planning."
|
|
2638
|
-
*/
|
|
2639
|
-
reminderText?: (count: number, items: readonly TodoItem[]) => string | undefined;
|
|
2640
|
-
/**
|
|
2641
|
-
* Short-circuit the tool body when the incoming payload is identical to
|
|
2642
|
-
* the **current slot** (session-shared for top-level runs, per-run for
|
|
2643
|
-
* subagents). The model gets a "No change — N items already tracked."
|
|
2644
|
-
* acknowledgment instead of a fresh "Updated N items." line.
|
|
2645
|
-
* Default: `true`.
|
|
2646
|
-
*
|
|
2647
|
-
* Read `session.metadata.todos` via {@link getTodosForRun} for the
|
|
2648
|
-
* comparison — so the resolution naturally follows the keying rule
|
|
2649
|
-
* (top-level reads the session slot, subagent reads its own). Does
|
|
2650
|
-
* NOT plumb through `behavior.dedupTools`: that cache lives at the
|
|
2651
|
-
* gate, is keyed per session, and would conflate top-level + subagent
|
|
2652
|
-
* re-writes of structurally identical payloads.
|
|
2653
|
-
*
|
|
2654
|
-
* Counter advances on identical re-writes regardless — the model
|
|
2655
|
-
* called the tool, that's a call. Lets the reminder threshold catch
|
|
2656
|
-
* spam. Set `false` to skip the check entirely (every call rewrites
|
|
2657
|
-
* the slot, useful when state-shape comparisons are pointless for
|
|
2658
|
-
* your usage).
|
|
2659
|
-
*/
|
|
2660
|
-
dedupIdentical?: boolean;
|
|
2661
|
-
/**
|
|
2662
|
-
* Override the JSON-schema-level descriptions surfaced to the model.
|
|
2663
|
-
* Useful for telemetry experiments. Leave unset to inherit the built-in
|
|
2664
|
-
* doctrine prose.
|
|
2665
|
-
*/
|
|
2666
|
-
writeDescription?: string;
|
|
2667
|
-
readDescription?: string;
|
|
2668
|
-
}
|
|
2669
|
-
/**
|
|
2670
|
-
* Read the active list for `runId`. Top-level runs see the session-shared
|
|
2671
|
-
* slot; subagent runs see their own. Returns a fresh `[]` (not stored in
|
|
2672
|
-
* metadata) when no slot exists — the caller can mutate the result
|
|
2673
|
-
* without affecting state.
|
|
2674
|
-
*/
|
|
2675
|
-
declare function getTodosForRun(session: Session, runId: string): TodoItem[];
|
|
2676
|
-
/**
|
|
2677
|
-
* Replace the active list for `runId`. Routes to the session-shared slot
|
|
2678
|
-
* for top-level runs and to the per-run slot for subagents. Empty arrays
|
|
2679
|
-
* delete the slot entirely so persisted metadata stays clean.
|
|
2680
|
-
*
|
|
2681
|
-
* Side effect: a **non-empty** write also stashes the same list into
|
|
2682
|
-
* `bag.archive` (same routing). Empty writes never touch the archive —
|
|
2683
|
-
* clearing the live list (whether explicitly or via the tool's auto-
|
|
2684
|
-
* clear) preserves the "last shown" snapshot so UI surfaces can keep
|
|
2685
|
-
* rendering what was just completed. See {@link getArchivedTodosForRun}.
|
|
2686
|
-
*
|
|
2687
|
-
* `opts.clearArchive` opts OUT of that preservation, and exists because the
|
|
2688
|
-
* archive is only the right answer for the AUTO-CLEAR path. UI surfaces render
|
|
2689
|
-
* `todos.length > 0 ? todos : archive`, so a user who deletes every todo would
|
|
2690
|
-
* otherwise watch the archive fall straight back into view with the same items
|
|
2691
|
-
* — a destructive action they confirmed, with no visible effect, and the footer
|
|
2692
|
-
* chip still counting the list they just deleted. Pass it for user-initiated
|
|
2693
|
-
* writes; leave it off for the tool.
|
|
2694
|
-
*/
|
|
2695
|
-
declare function setTodosForRun(session: Session, runId: string, items: readonly TodoItem[], opts?: {
|
|
2696
|
-
clearArchive?: boolean;
|
|
2697
|
-
}): void;
|
|
2698
|
-
/**
|
|
2699
|
-
* Read the archived (most-recent non-empty) list for `runId`. Same slot
|
|
2700
|
-
* routing as {@link getTodosForRun}, but reads `bag.archive` instead of
|
|
2701
|
-
* the live slot. Returns a fresh `[]` when no archive exists.
|
|
2702
|
-
*
|
|
2703
|
-
* UI surfaces use this to keep showing "what was just completed" after
|
|
2704
|
-
* the live list auto-clears. The model never sees the archive — it's a
|
|
2705
|
-
* read-only sidecar for human-facing rendering.
|
|
2706
|
-
*/
|
|
2707
|
-
declare function getArchivedTodosForRun(session: Session, runId: string): TodoItem[];
|
|
2708
|
-
/**
|
|
2709
|
-
* Reconcile `session.metadata.todos.byRun` (live + archive) against
|
|
2710
|
-
* `session.runs`. Drops subagent slots whose runId isn't in the run
|
|
2711
|
-
* list. The top-level `session` slot is unaffected — it's session-
|
|
2712
|
-
* scoped, not per-run, so there's no orphan to GC.
|
|
2713
|
-
*
|
|
2714
|
-
* Useful after `session.setRuns()` (fork / restore) or to GC stale
|
|
2715
|
-
* metadata mutated by an external caller. Also prunes the parallel
|
|
2716
|
-
* counter bag so the two don't drift.
|
|
2717
|
-
*
|
|
2718
|
-
* `dropped` reports the live-byRun orphans only (archive-only orphans
|
|
2719
|
-
* are silently swept). The live half is the contract callers actually
|
|
2720
|
-
* observe.
|
|
2721
|
-
*/
|
|
2722
|
-
declare function pruneTodosByRun(session: Session): {
|
|
2723
|
-
dropped: readonly string[];
|
|
2724
|
-
};
|
|
2725
|
-
/**
|
|
2726
|
-
* Build a `Preset` carrying the `{ todowrite, todoread }` tool pair.
|
|
2727
|
-
*
|
|
2728
|
-
* Loop hardening is layered, soft → hard:
|
|
2729
|
-
* 1. **In-body identical dedup** (`dedupIdentical`, on) — resolves
|
|
2730
|
-
* against the active slot (session-shared for top-level runs,
|
|
2731
|
-
* per-run for subagents) and returns "No change — N items already
|
|
2732
|
-
* tracked." Advisory; the model can ignore it.
|
|
2733
|
-
* 2. **In-band reminder** (`remindAfter`, on) — appends a "you've
|
|
2734
|
-
* checkpointed N times" nudge to the result. Also advisory.
|
|
2735
|
-
* 3. **Consecutive-identical hard block** (`maxIdenticalWrites`, ON by
|
|
2736
|
-
* default) — a run-scoped `behavior.dedupTools.todowrite` entry in
|
|
2737
|
-
* `block-after` mode. After N byte-identical writes in a row the
|
|
2738
|
-
* gate refuses with `Blocked: …` and the body never runs. This is
|
|
2739
|
-
* the real loop breaker, and it's safe-by-default precisely because
|
|
2740
|
-
* it only fires on *identical* payloads — a legitimate N-item plan
|
|
2741
|
-
* writes a *different* list each step and never trips it.
|
|
2742
|
-
*
|
|
2743
|
-
* By default the preset adds **no** `toolBudgets` entry — a blanket
|
|
2744
|
-
* per-call cap is the wrong abstraction for a state-transition tool (it
|
|
2745
|
-
* punishes the legitimate "finish the N-item plan" path). Hosts that
|
|
2746
|
-
* want a ceiling on *all* writes (not just identical ones) pass
|
|
2747
|
-
* `maxWritesPerRun: N` explicitly; the factory then also plumbs a
|
|
2748
|
-
* `behavior.toolBudgets.todowrite` entry.
|
|
2749
|
-
*
|
|
2750
|
-
* Returning a `Preset` (not a bare tool map) lets the result flow
|
|
2751
|
-
* through {@link composePresets} unchanged. `behavior.dedupTools` and
|
|
2752
|
-
* `behavior.toolBudgets` are tool-name-keyed records that
|
|
2753
|
-
* `composePresets` deep-merges, so a caller's entries for other tools
|
|
2754
|
-
* survive the layering, and a caller's override for `todowrite` itself
|
|
2755
|
-
* wins by being placed later in the chain.
|
|
2756
|
-
*
|
|
2757
|
-
* ```ts
|
|
2758
|
-
* import { basic, composePresets } from 'zidane/presets'
|
|
2759
|
-
* import { createTodoTools } from 'zidane/chat'
|
|
2760
|
-
*
|
|
2761
|
-
* // Default: soft dedup + reminder + a run-scoped hard block after 5
|
|
2762
|
-
* // identical writes in a row.
|
|
2763
|
-
* createAgent({ ...composePresets(basic, createTodoTools()), provider })
|
|
2764
|
-
*
|
|
2765
|
-
* // Tune (or disable) the identical-write block.
|
|
2766
|
-
* createTodoTools({ maxIdenticalWrites: 3 }) // stricter
|
|
2767
|
-
* createTodoTools({ maxIdenticalWrites: 0 }) // off — soft signals only
|
|
2768
|
-
*
|
|
2769
|
-
* // Opt-in blanket cap on *all* writes (counts distinct ones too).
|
|
2770
|
-
* createAgent({
|
|
2771
|
-
* ...composePresets(basic, createTodoTools({ maxWritesPerRun: 20 })),
|
|
2772
|
-
* provider,
|
|
2773
|
-
* })
|
|
2774
|
-
* ```
|
|
2775
|
-
*
|
|
2776
|
-
* For the trivial "just add the tools to an existing config" case, plain
|
|
2777
|
-
* spread is also fine — the returned `Preset` sets `tools` plus a
|
|
2778
|
-
* `behavior` block (carrying the default identical-write dedup):
|
|
2779
|
-
*
|
|
2780
|
-
* ```ts
|
|
2781
|
-
* createAgent({ ...basic, ...createTodoTools(), provider })
|
|
2782
|
-
* ```
|
|
2783
|
-
*/
|
|
2784
|
-
declare function createTodoTools(options?: CreateTodoToolsOptions): Preset;
|
|
2785
|
-
interface TodoTally {
|
|
2786
|
-
pending: number;
|
|
2787
|
-
in_progress: number;
|
|
2788
|
-
completed: number;
|
|
2789
|
-
cancelled: number;
|
|
2790
|
-
}
|
|
2791
|
-
interface ActiveTodosState {
|
|
2792
|
-
/** Run the slice came from. `null` ⇒ no session / no runs / no active run. */
|
|
2793
|
-
runId: string | null;
|
|
2794
|
-
/**
|
|
2795
|
-
* Live list — what `todoread` would return. Empty when the slot was
|
|
2796
|
-
* cleared (e.g. auto-clear after every item completed) or never
|
|
2797
|
-
* written. Source of truth for the model's view.
|
|
2798
|
-
*/
|
|
2799
|
-
todos: readonly TodoItem[];
|
|
2800
|
-
/**
|
|
2801
|
-
* Most-recent non-empty list for the active slot, preserved across
|
|
2802
|
-
* auto-clear. Equals `todos` when the live list is non-empty;
|
|
2803
|
-
* otherwise the last batch that was shown (commonly the all-`completed`
|
|
2804
|
-
* close-out). UI surfaces fall back to this when `todos` is empty so
|
|
2805
|
-
* the user can still glance back at "what was just finished" — until
|
|
2806
|
-
* the model writes a new list. Empty array when no list was ever
|
|
2807
|
-
* written for this slot.
|
|
2808
|
-
*/
|
|
2809
|
-
archive: readonly TodoItem[];
|
|
2810
|
-
/**
|
|
2811
|
-
* The first `in_progress` item from `todos` (the **live** list), when
|
|
2812
|
-
* one exists. Drives the inline indicator above the prompt. Always
|
|
2813
|
-
* `null` when the live list is empty — even if the archive carries
|
|
2814
|
-
* an in-progress item, that item is by definition stale.
|
|
2815
|
-
*/
|
|
2816
|
-
inProgress: TodoItem | null;
|
|
2817
|
-
/**
|
|
2818
|
-
* Per-status counts. Computed over `todos` when non-empty, else over
|
|
2819
|
-
* `archive`. Zeros only when both are empty. Lets the modal header
|
|
2820
|
-
* show a meaningful tally for the archived "last batch" view.
|
|
2821
|
-
*/
|
|
2822
|
-
tally: TodoTally;
|
|
2823
|
-
}
|
|
2824
|
-
/**
|
|
2825
|
-
* Pick the "active" run for UI surfaces that show one slot at a time
|
|
2826
|
-
* (todos indicator, todos modal, footer ctx indicator). The resolved
|
|
2827
|
-
* runId then routes through {@link getTodosForRun} — top-level runs
|
|
2828
|
-
* land on the session-shared slot, subagent runs on their own.
|
|
2829
|
-
*
|
|
2830
|
-
* - A currently-running run wins (latest-started one if several).
|
|
2831
|
-
* - Otherwise the most recently appended run wins.
|
|
2832
|
-
* - `null` when the session has no runs.
|
|
2833
|
-
*
|
|
2834
|
-
* Mirrors the "most recent thing that mattered" policy that drives
|
|
2835
|
-
* `lastContextSizeFromTurns` — but walks `session.runs` rather than
|
|
2836
|
-
* `session.turns` because the active todo slot is a function of the
|
|
2837
|
-
* run, not of message history.
|
|
2838
|
-
*/
|
|
2839
|
-
declare function pickActiveRunId(session: Session | null | undefined): string | null;
|
|
2840
|
-
/**
|
|
2841
|
-
* Pure selector — derive the active-todos state from a session snapshot.
|
|
2842
|
-
* Used by {@link useActiveTodos} and directly testable without React.
|
|
2843
|
-
*
|
|
2844
|
-
* Resolves both `todos` (live, model-facing) and `archive` (last
|
|
2845
|
-
* non-empty snapshot for UI fallback). The tally folds over whichever
|
|
2846
|
-
* list is non-empty; `inProgress` is sourced strictly from `todos`
|
|
2847
|
-
* because an archived in-progress item is by definition stale.
|
|
2848
|
-
*/
|
|
2849
|
-
declare function selectActiveTodos(session: Session | null | undefined): ActiveTodosState;
|
|
2850
|
-
/**
|
|
2851
|
-
* React hook — active-todos state for the supplied session. Recomputes
|
|
2852
|
-
* on every parent re-render; the work is O(runs + todos), both bounded
|
|
2853
|
-
* by small constants in practice.
|
|
2854
|
-
*
|
|
2855
|
-
* Why no memoization: `Session.runs` is mutated in place by `completeRun`
|
|
2856
|
-
* / `abortRun` (status flips without changing array length or item
|
|
2857
|
-
* identity), so any memo keyed off length / bag identity would silently
|
|
2858
|
-
* return stale state when e.g. a child subagent run completes and the
|
|
2859
|
-
* "active" run should reflow to the parent. The selector is cheap
|
|
2860
|
-
* enough that running it every parent render is the simpler, correct
|
|
2861
|
-
* answer — see `selectActiveTodos` for the O(n) cost.
|
|
2862
|
-
*
|
|
2863
|
-
* The hook lives in `chat/` so a GUI consumer can mount it verbatim.
|
|
2864
|
-
* Renderer-agnostic — no `@opentui/*` imports.
|
|
2865
|
-
*/
|
|
2866
|
-
declare function useActiveTodos(session: Session | null | undefined): ActiveTodosState;
|
|
2867
|
-
//#endregion
|
|
2868
|
-
//#region src/chat/todo-anchor.d.ts
|
|
2869
|
-
interface ActiveTodoAnchorOptions {
|
|
2870
|
-
enabled?: boolean;
|
|
2871
|
-
maxItems?: number;
|
|
2872
|
-
heading?: string;
|
|
2873
|
-
}
|
|
2874
|
-
declare function renderActiveTodoAnchor(todos: readonly TodoItem[], options?: ActiveTodoAnchorOptions): string;
|
|
2875
|
-
/**
|
|
2876
|
-
* Optional chat-layer hook that keeps the live `todowrite` list visible in the
|
|
2877
|
-
* dynamic system prompt. It reads only live todos, never the archive, so an
|
|
2878
|
-
* auto-cleared completed plan is not reintroduced on later turns.
|
|
2879
|
-
*
|
|
2880
|
-
* ## Prompt-cache cost — read before enabling
|
|
2881
|
-
*
|
|
2882
|
-
* This writes per-turn state into the system prompt, and the system prompt sits
|
|
2883
|
-
* ABOVE the entire conversation in the provider's cache prefix (Anthropic hashes
|
|
2884
|
-
* tools → system → messages, cumulatively). So every time the rendered anchor
|
|
2885
|
-
* changes by a single byte, the whole transcript stops matching the cache and
|
|
2886
|
-
* re-bills at the cache-write rate; only `tools` and the static system block
|
|
2887
|
-
* survive.
|
|
2888
|
-
*
|
|
2889
|
-
* That is an acceptable trade only because the anchor changes *rarely* — once
|
|
2890
|
-
* per `todowrite`, which in practice is a small fraction of turns. Two rules
|
|
2891
|
-
* follow, and breaking either one turns that occasional cost into a per-turn
|
|
2892
|
-
* one:
|
|
2893
|
-
*
|
|
2894
|
-
* 1. Never add anything to the anchor that ticks on its own — no counters, no
|
|
2895
|
-
* timestamps, no elapsed times, no per-turn indices.
|
|
2896
|
-
* 2. The render must stay a pure function of the todo list.
|
|
2897
|
-
* `renderActiveTodoAnchor` is deterministic today, so identical todos emit
|
|
2898
|
-
* identical bytes; keep it that way. Note this does NOT cover reordering —
|
|
2899
|
-
* todo order is semantically meaningful (it is the plan), so a reorder is
|
|
2900
|
-
* a real state change and costs one re-bill like any other `todowrite`.
|
|
2901
|
-
*
|
|
2902
|
-
* Moving the anchor onto the newest message instead does NOT avoid this: it is
|
|
2903
|
-
* wire-only, so the message that carried last turn's anchor re-renders without
|
|
2904
|
-
* it, and the prefix diverges at that point just the same. The only injection
|
|
2905
|
-
* that is genuinely free is one persisted into the transcript as immutable
|
|
2906
|
-
* history.
|
|
2907
|
-
*/
|
|
2908
|
-
declare function createActiveTodoAnchorHooks(options?: ActiveTodoAnchorOptions): AgentHookMap;
|
|
2909
|
-
//#endregion
|
|
2910
|
-
export { ACTIONS_WITH_CARE_DOCTRINE, ALTERNATE_CRED_KEY_SUFFIX, ASK_USER_TOOL, AUTOMATIC_INTERACTION_INSTRUCTION, AUTO_COMPACT_MIN_GROWTH_FRACTION, type ActiveTodoAnchorOptions, type ActiveTodosState, type ActiveTrigger, type AgentAccent, type AgentProfile, type AgentRegistry, type AgentsMdFile, type AgentsMdResult, type AnswerValue, type ApiKeyCredential, type ApprovalDecision, type ApprovalRequest, type AuthMethod, type AutoCompactDecision, type AutoCompactInput, type AutoUpdateConfig, BUILD_AGENT, BUILTIN_AGENTS, BUILTIN_PROVIDERS, BUILTIN_THEMES, type BooleanSettingKey, type BuildExtensionRegistryOptions, type BuildHintsOptions, type BuildSystemOptions, type BuildUpdateHintOptions, CATPPUCCIN_FRAPPE, CATPPUCCIN_LATTE, CATPPUCCIN_MACCHIATO, CATPPUCCIN_MOCHA, CHATS_TRIGGER, COMMANDS_TRIGGER, COMMUNICATION_DOCTRINE, type CachedMcpToolList, type CatalogEntry, type ChatOptions, type ChatReferenceData, type ChatReferenceEntry, type ChatReferenceScope, type ChatTurnsReadToolOptions, type CheckForUpdateOptions, type ChipColor, type ChipColorMap, type ClaudeCopyResult, type ClaudeImportOptions, type ClaudeImportSummary, type ClaudeSessionImportResult, type Command, type CommandAgentResult, type CommandExecution, type CommandInvocation, type CommandOutputBlock, type CommandStep, type CommandStepContext, type CommandStepFn, type Commit, type CompletionContext, type CompletionItem, type CompletionProvider, type CompletionReference, type CompletionState, ConfigProvider, type ConfirmQuestion, type ContextBreakdown, type ContextBreakdownContributionContext, type ContextBreakdownContributor, type ContextBreakdownOptions, type ContextCategory, type ContextCategoryId, type ContextExactCounts, type ContextExtensionRow, type ContextExtensionSection, type ContextItem, type ContextMcpGroup, type ContextSegment, type ContextSegmentFile, type ContextSegmentOrigin, type ContextSegmentsInput, type ContextSnapshot, type ContextUsageSplit, type CreateInteractionToolsOptions, type CreateTodoToolsOptions, type CredentialsFile, type CustomField, DEFAULT_AGENT_ID, DEFAULT_BUDGET_EXCLUDE_TOOLS, DEFAULT_KEYBINDINGS, DEFAULT_PERSIST_EXCLUDE_TOOLS, DEFAULT_SETTINGS, DEFAULT_THEME, DOING_TASKS_DOCTRINE, type DetectPackageManagerOptions, type DiffLine, type DiffOp, type DiscoverAgentsMdOptions, type DiscoverSystemMdOptions, type DiscoveredMcp, type DiscoveryContextValue, type DiscoveryError, DiscoveryProvider, type DiscoveryResult, type DiscoverySlot, type DiscoverySlotOptions, EMPTY_EXTENSION_REGISTRY, EMPTY_HINTS, type EditDiffDisplay, type EditHunk, type EditHunkSummary, type EditOutcome, type EditOutcomeKind, type EditPayload, type EditSummary, type EnabledAllowlistKey, type EnabledToggleSet, type EnvSectionOptions, type ExtensionApiVersion, type ExtensionBehaviorTransform, type ExtensionCapability, type ExtensionContext, type ExtensionContributions, type ExtensionDefinition, type ExtensionFooterHint, type ExtensionGuiPanel, type ExtensionKeybinding, type ExtensionKeybindingDispatchContext, type ExtensionManifest, type ExtensionMcpConfigTransform, type ExtensionModal, type ExtensionOrderedContribution, type ExtensionPaths, type ExtensionPermission, type ExtensionProviderMiddleware, type ExtensionRegistry, type ExtensionRunTransform, type ExtensionRuntimeEnv, type ExtensionSessionStateSurface, type ExtensionSkillPolicy, type ExtensionSource, type ExtensionStorageScope, type ExtensionStorageSurface, type ExtensionToolCatalogTransform, type ExtensionToolResultMetadataRegistration, FILES_TRIGGER, type FetchOAuthRedirectResult, type FetchProviderUsageOptions, type FileEntry, GRUVBOX_DARK, GRUVBOX_LIGHT, type GenerateSessionTitleOptions, type GenerateStructuredDataOptions, type GuiContributions, HOST_INTERACTION_ID_PREFIX, type HighlightRange, type HighlightSegment, type Hint, type HunkResolution, IDENTITY_PREFIX, IMPLICITLY_SAFE_TOOLS, INTERACTION_GUIDANCE, INTERACTION_GUIDANCE_NO_PROMPTS, type InPlaceUpdateResult, type IndexedSearchTurn, type InlineAutocompleteContext, type InlineAutocompleteProvider, type InlineDiff, type InlineGhost, type InlineSegment, type InteractionMode, type InteractionOrigin, type InteractionRequest, type InteractionResponse, type InteractionsActions, InteractionsProvider, KEYBINDING_DEFS, KEYBINDING_DEF_BY_ACTION, KEYBINDING_KEY_COL_WIDTH, type KeyAction, type KeyBindingDef, type KeyBindingSection, type KeyBindings, type ListProjectFilesOptions, type LoadedExtension, MARKDOWN_RENDER_CHUNK_TARGET_BYTES, MAX_TRANSCRIPT_EVENTS, type MarkdownSegment, type McpAuthEvent, McpAuthProvider, type McpAuthStateMap, type McpAuthStatus, type McpConfigScope, type McpToolToggleSet, type McpToolsCache, type ModelChainEntry, type ModelInfo, type ModelOption, type ModelUsageSummary, type OAuthCredential, type OAuthFlowOptions, type OAuthPrompt, OUTPUT_RESERVE_TOKENS, type Owner, PLAN_AGENT, PLAN_MODE_DOCTRINE, PLAN_MODE_DOCTRINE_NO_PROMPTS, PRESENT_PLAN_TOOL, type PackageManagerCommand, type PackageManagerId, type ParsedBinding, type PendingInteractionEntry, type PerformInPlaceUpdateOptions, type PerformSelfUpdateOptions, type Picked, type PlanDecision, type PlanPayload, type PlanRequest, type PlanResponse, type PlanStep, type PlatformTarballOptions, type PreviewResult, type ProjectEntry, type ProjectUserPath, type ProjectsFile, type PromptSegment, type PromptSegmentRef, type ProviderAuth, type ProviderCredential, type ProviderDescriptor, type ProviderKey, type ProviderRegistry, type ProviderUsageCredits, type ProviderUsageSnapshot, type ProviderUsageStatus, type ProviderUsageWindow, type Question, type QuestionChoice, type QuestionPayload, type QuestionRequest, type QuestionResponse, type QuestionType, type RemoveMcpResult, type RequestApproval, type ResolveStorageDirsOptions, type ResolvedApproval, type ResolvedConfig, type ResolvedExtensionKeybinding, type ResolvedPaths, type RunUpdateCommandOptions, type RunUpdateCommandResult, SETTINGS_CATEGORIES, SETTINGS_CHOICES, SETTINGS_INPUTS, SETTINGS_TOGGLES, SKILLS_TRIGGER, SUBAGENT_GUIDANCE, type SafeModeActions, SafeModeProvider, type Screen, type SearchExcerpt, type SearchSessionResult, type SearchTurnResult, type SelectQuestion, type SelfUpdateResult, type SessionExportAnchor, type SessionExportFormat, type SessionExportTarget, type SessionHistoryMatch, type SessionMeta, type SessionSearchExcerpt, type SessionSearchIndex, type Settings, type SettingsCategory, type SettingsCategoryDescriptor, type SettingsChoice, type SettingsInput, SettingsProvider, type SettingsToggle, type StateStoreApi, type StorageDirs, type StorageMode, type StorageSlot, type StreamBuffer, type StreamEvent, type StreamSource, type StringSettingKey, type SyntaxStyles, type SyntaxTokenStyle, type SystemMdFile, type SystemMdResult, TODOREAD_TOOL, TODOS_METADATA_KEY, TODOWRITE_TOOL, TODO_STATUS_GLYPHS, TODO_WRITE_COUNTS_METADATA_KEY, TOKEN_DISCIPLINE_DOCTRINE, TOOL_DISPLAY, TRANSCRIPT_TRIM_TO_EVENTS, type TextQuestion, type Theme, type ThemeColors, ThemeProvider, type ThemeSelect, type ThemeSurfaces, type TodoItem, type TodoStatus, type TodoTally, type TodosBag, type ToolCallDisplay, type ToolDisplayMeta, type ToolFormatLine, type TranscriptItem, type TuiContributions, type TuiState, USAGE_CACHE_TTL_MS, type UpdateStatus, type UpsertMcpResult, type UseUpdateCheckOptions, VAPORWAVE_THEME, type VisibleMcpRow, type Walk, accentColor, addToSafelist, ageString, alternateCredKey, anthropicDescriptor, applyApiKeyEnv, applyEditPayload, applyInsert, blendHsl, bootProfileEnabled, bootTick, buildBuildSystem, buildContextBreakdown, buildContextSegments, buildContextualDiff, buildEditOutcomesAnnotation, buildExtensionPreset, buildExtensionRegistry, buildHints, buildLinearRamp, buildMcpServers, buildModelCatalog, buildPlanSystem, buildResumedToolResultsTurn, buildRunModel, buildSessionSearchIndex, buildSessionSearchIndexAsync, buildSkillsConfig, buildToolToggle, buildUnifiedDiff, buildUpdateHint, buildVisibleMcpRows, capTranscriptEvents, cerebrasDescriptor, chainPositionOf, chainsEqual, chatAutoCompactBehavior, chatReferenceTokensForPrompt, chatReferenceTokensFromText, checkForUpdate, chunkMarkdownForRender, cleanTitle, clearMcpToolsCache, clearProviderUsageCache, clipHintsToWidth, collectReferences, commandSteps, compactPath, compactSummaryEvent, compareSemver, composeExtensionPreset, computeInlineDiff, computeLineDiff, computeTurnAnchors, countClaudeSessionFiles, countNeighbors, createActiveTodoAnchorHooks, createAutomaticInteractionResponse, createChatTurnsReadTool, createChatsCompletionProvider, createCommandsCompletionProvider, createDiscoverySlot, createFileMcpCredentialStore, createFilesCompletionProvider, createInteractionTools, createPathAutocompleteProvider, createSkillsCompletionProvider, createStateStore, createTodoTools, credKeyOf, credentialsPath, dedupMcpServersByName, defaultExtensionScanPaths, defaultMcpsConfigPaths, defaultSkillScanPaths, defineExtension, deleteTurnSafely, deriveSessionTitle, detectAuth, detectLibc, detectPackageManager, discoverAgentsMd, discoverExtensions, discoverProjectMcps, discoverProjectSkills, discoverSystemMd, displayNameFor, disposeExtensionRegistry, effectiveContextWindow, enabledModelOptions, ensureKeybindingsFile, envSection, eventsFromTurns, executeCommand, extractEditPayload, fetchAllProviderUsage, fetchOAuthRedirect, fetchProviderUsage, filetypeFromPath, filterChainFallbacks, filterExtensionRegistry, filterModelCatalog, filterSessionSearchCatalog, finalizeStreamingMarkdown, finalizeStreamingMarkdownForOwner, findActiveTrigger, findGitRoot, fmtCost, fmtTokens, formatBindingForDisplay, formatDuration, formatPathForCwd, formatTaskStatus, formatTaskSummary, formatToolCall, formatUsagePercent, generateSessionTitle, generateStructuredData, getArchivedTodosForRun, getContextWindow, getMcpAuthStatus, getModelInfo, getSafelist, getTodosForRun, groupBindings, hasClaudeCodeSetup, highlightSegments, hintsLength, importFromClaudeCode, indexOfEntry, indexOfServerRow, inlineLoadedExtension, isEditErrorResult, isInteractionTool, isModelInteraction, isOnSafelist, isReservedCredKey, isTodoTool, isTurnHighlighted, isVisible, keybindingsPath, lastContextSizeFromTurns, listProjectFiles, listSessionMeta, loadMcpToolsCache, loadState, localDescriptor, makeRequestInteraction, marginTopFor, maskToOutcomeKinds, matchesBinding, matchesSafelistEntry, mcpCredentialsPath, mcpToolsCachePath, mcpsWritePath, mergeApprovalAndBodyOutcomes, mergeContributions, mergeKeybindings, mergeReferences, mergeSuggestions, modelOptionsFor, modelSupportsReasoning, modelsForDescriptor, mostConstrainedWindow, normalizeMarkdownCodeFences, normalizeRedirectPaste, oauthUsesManualCodePaste, openaiDescriptor, openrouterDescriptor, parentServerName, parseBindingSpec, parseCommandInvocation, parseEditOutcomesFromResult, parseMcpsFile, parseSemver, partitionExtensionCatalog, patchInlineGhost, patchMcpCredential, pendingInteractionsFromTurns, performInPlaceSelfUpdate, performSelfUpdate, piIdOf, pickActiveRunId, previewEditPayload, previewLine, projectUserPaths, projectsFilePath, providerKeySetChanged, providerUsageSupported, pruneTodosByRun, readCredentials, readKeybindings, readKeybindingsRaw, readProjects, readProviderCredential, readProviderCredentialPair, redirectUriFromAuthUrl, reduceMcpAuth, refreshMcpToolsCatalog, removeMcpServer, removeProviderCredential, renderActiveTodoAnchor, renderAgentsMdBlock, renderSession, renderSystemMdSeed, resolveAgentId, resolveApprovalForPayload, resolveChipColor, resolveConfig, resolveExtensionKeybindings, resolveInlineSuggestion, resolvePlatformPackage, resolveSessionExportTarget, resolveStorageDirs, resolveStoragePaths, resolveTheme, restoreChainFallbacks, restoreModelOptions, rewriteMultiEditHeader, runOAuthLogin, runUpdateCommand, sanitizeModelChain, saveMcpToolsCache, saveState, scanExtensionDirectories, searchHighlightRanges, searchSessionHistory, searchSessionHistoryIndex, searchSessionHistoryIndexAsync, searchSessionIndex, searchSessionIndexAsync, searchSessionTurns, searchTurns, searchableTurnText, selectActiveTodos, selectableTurnIds, selectionAfterTurnRemoval, serializeInteractionResponse, setPreferredCredential, setProviderCredential, setTodosForRun, shortChord, shortId, shouldAutoCompact, shouldAutoGenerateTitle, singleAgentRegistry, splitLines, splitMarkdownCodeBlocks, splitPromptSegments, stripEditOutcomesAnnotation, stripJsonComments, stripSpawnTokensLine, subscribeMcpToolsCache, suggestSafelistEntries, sumRunCosts, summarizeEditPayload, summarizeOutcomes, supportsOAuth, titleFromTurns, toggleChainEntry, tokenEndingAtCursor, tokenize, toolCallPreview, toolResultText, truncateTrailing, truncateTurnsAt, tryOpenBrowser, turnAsText, turnContextSize, turnSelectionOwnership, uniqueChatIdsFromReferences, uniqueFilesFromReferences, uniqueSkillNamesFromReferences, updateToolEventOutcomes, upsertMcpServer, usageByModel, usageChecksOptedOut, usageSourceFor, useActiveTodos, useColors, useCompletion, useConfig, useDiscovery, useDiscoveryOptional, useEnabledToggleSet, useInteractionsActions, useInteractionsQueue, useMcpAuthDispatch, useMcpAuthState, useMcpToolToggleMap, useMcpToolToggleSet, useSafeModeActions, useSafeModeQueue, useSelectStyle, useSettings, useStreamBuffer, useSurfaces, useSyntaxStyles, useTheme, useUpdateCheck, userSystemMdPath, writeCredentials, writeProjects, writeSessionExport };
|
|
2911
|
-
//# sourceMappingURL=chat.d.ts.map
|
|
1
|
+
import { $d as ConfirmQuestion, $u as formatRunReceiptCells, Aa as discoverExtensions, Ad as anthropicDescriptor, Af as useInteractionsActions, Al as patchInlineGhost, Ap as ContextSnapshot, Au as SessionEventStatus, Ba as defineExtension, Bd as openaiDescriptor, Bo as GuiContributions, Bu as sessionEventLabel, Cd as ProviderKey, Cf as createAutomaticInteractionResponse, Cl as ThemeSurfaces, Co as ExtensionRuntimeEnv, Cp as ContextCategory, Cu as StreamEvent, Dd as ModelInfo, Df as makeRequestInteraction, Dl as InlineAutocompleteProvider, Do as ExtensionStorageScope, Dp as ContextExtensionSection, Du as SESSION_EVENT_STATUS_STYLE, Ed as CustomField, Ef as isModelInteraction, El as InlineAutocompleteContext, Eo as ExtensionSource, Ep as ContextExtensionRow, Fd as getModelInfo, Fl as ActiveTrigger, Fo as ExtensionToolResultMetadataRegistration, Fu as orchestratedBy, Gd as AutoCompactDecision, Gl as mergeSuggestions, Gu as RunReceipt, Hd as piIdOf, Hl as collectReferences, Hu as shortSessionId, Id as localDescriptor, Il as CompletionContext, Iu as parseSessionEventXml, Jd as effectiveContextWindow, Jl as CommandAgentResult, Ju as RunReceiptSegment, Kd as AutoCompactInput, Ku as RunReceiptCell, Ld as modelOptionsFor, Li as GenerateStructuredDataOptions, Ll as CompletionItem, Lu as renderSessionEventXml, Md as credKeyOf, Ml as tokenEndingAtCursor, Mp as buildContextBreakdown, Mu as SessionEventTone, Nd as enabledModelOptions, Nl as CompletionState, Nu as WORKER_REPORT_FRAGMENT, Od as ModelOption, Of as pendingInteractionsFromTurns, Ol as InlineGhost, Oo as ExtensionStorageSurface, Op as ContextItem, Ou as SESSION_ROLE_KEY, Pa as scanExtensionDirectories, Pd as getContextWindow, Pl as useCompletion, Pu as isMainSession, Qd as AnswerValue, Qi as BuildExtensionRegistryOptions, Qu as formatRunDuration, Rd as modelSupportsReasoning, Ri as generateStructuredData, Rl as CompletionProvider, Ru as sessionDirLabel, Sd as ProviderAuth, Sf as buildResumedToolResultsTurn, Sl as ThemeSelect, So as ExtensionRunTransform, Sp as ContextBreakdownOptions, Su as Settings, Td as BUILTIN_PROVIDERS, Tf as isInteractionTool, Tl as resolveTheme, To as ExtensionSkillPolicy, Tp as ContextExactCounts, Tu as ORCHESTRATED_BY_KEY, Ud as restoreModelOptions, Ul as findActiveTrigger, Uo as TuiContributions, Uu as truncateTitle, Vd as openrouterDescriptor, Vl as applyInsert, Vo as LoadedExtension, Vu as sessionEventMeta, Wd as AUTO_COMPACT_MIN_GROWTH_FRACTION, Wl as mergeReferences, Wu as RUN_RECEIPT_GLYPH, Xa as ExtensionBehaviorTransform, Xd as ASK_USER_TOOL, Xu as fitRunReceiptCells, Ya as ExtensionApiVersion, Yd as shouldAutoCompact, Yu as RunReceiptSegmentKind, Zd as AUTOMATIC_INTERACTION_INSTRUCTION, Zl as CommandExecution, Zu as formatCostUsd, _d as restoreChainFallbacks, _f as QuestionRequest, _l as DEFAULT_THEME, _o as ExtensionPaths, _p as ContextSegmentsInput, _u as InteractionMode, ad as ModelChainEntry, af as InteractionsActions, ap as BUILD_AGENT, au as CommandStepContext, bf as SelectQuestion, bl as Theme, bo as ExtensionProviderMiddleware, bp as ContextBreakdownContributionContext, bu as Screen, cd as chainPositionOf, cf as PendingInteractionEntry, co as ExtensionGuiPanel, cp as DEFAULT_BUDGET_EXCLUDE_TOOLS, dd as filterChainFallbacks, df as PlanRequest, dl as StorageMode, do as ExtensionKeybindingDispatchContext, dp as accentColor, du as parseCommandInvocation, ea as buildExtensionPreset, ed as formatRunReceiptLine, ef as CreateInteractionToolsOptions, eo as ExtensionCapability, eu as CommandInvocation, ff as PlanResponse, fl as StorageSlot, fo as ExtensionManifest, fp as resolveAgentId, fu as EditDiffDisplay, gf as QuestionPayload, gl as ChipColorMap, go as ExtensionOrderedContribution, gp as ContextSegmentOrigin, gu as EditPayload, hd as providerKeySetChanged, hf as QuestionChoice, hl as ChipColor, hp as ContextSegmentFile, hu as EditOutcomeKind, ia as filterExtensionRegistry, id as runReceiptFromRun, if as InteractionResponse, ip as AgentRegistry, iu as CommandStep, ja as inlineLoadedExtension, jd as cerebrasDescriptor, jf as useInteractionsQueue, jl as resolveInlineSuggestion, jp as ContextUsageSplit, ju as SessionEventStatusStyle, ka as defaultExtensionScanPaths, kd as ProviderDescriptor, kf as serializeInteractionResponse, kl as createPathAutocompleteProvider, ko as ExtensionToolCatalogTransform, kp as ContextMcpGroup, ku as SessionEvent, ld as chainsEqual, lf as PlanDecision, ll as ResolveStorageDirsOptions, lp as DEFAULT_PERSIST_EXCLUDE_TOOLS, lu as commandSteps, mf as Question, ml as BUILTIN_THEMES, mo as ExtensionModal, mp as ContextSegment, mu as EditOutcome, na as composeExtensionPreset, nd as formatTokensPerSecond, nf as InteractionOrigin, np as AgentAccent, oa as mergeContributions, od as buildRunModel, of as InteractionsProvider, oo as ExtensionDefinition, op as BUILTIN_AGENTS, ou as CommandStepFn, pf as PlanStep, pl as resolveStorageDirs, po as ExtensionMcpConfigTransform, pp as singleAgentRegistry, pu as EditHunk, qa as EMPTY_EXTENSION_REGISTRY, qd as OUTPUT_RESERVE_TOKENS, ql as Command, qu as RunReceiptCellKind, ra as disposeExtensionRegistry, rd as hasRunReceipt, rf as InteractionRequest, ro as ExtensionContributions, rp as AgentProfile, sa as partitionExtensionCatalog, sf as PRESENT_PLAN_TOOL, so as ExtensionFooterHint, sp as DEFAULT_AGENT_ID, ta as buildExtensionRegistry, td as formatTokenCount, tf as HOST_INTERACTION_ID_PREFIX, to as ExtensionContext, tu as CommandOutputBlock, uf as PlanPayload, ul as StorageDirs, uo as ExtensionKeybinding, up as PLAN_AGENT, uu as executeCommand, vd as sanitizeModelChain, vf as QuestionResponse, vl as SyntaxStyles, vo as ExtensionPermission, vp as buildContextSegments, vu as Owner, wd as detectAuth, wf as createInteractionTools, wl as resolveChipColor, wo as ExtensionSessionStateSurface, wp as ContextCategoryId, wu as ToolCallDisplay, xd as AuthMethod, xf as TextQuestion, xl as ThemeColors, xo as ExtensionRegistry, xp as ContextBreakdownContributor, xu as SessionMeta, yd as toggleChainEntry, yf as QuestionType, yl as SyntaxTokenStyle, yp as ContextBreakdown, yu as Picked, zd as modelsForDescriptor, zl as CompletionReference, zu as sessionEventExcerpt } from "./index-B-FSaM3_.js";
|
|
2
|
+
import { $ as ProjectsFile, $n as shortChord, $r as PerformSelfUpdateOptions, $t as createFileMcpCredentialStore, A as buildSkillsConfig, Ai as buildPlanSystem, An as ChatHostEnvironment, Ar as ClaudeCopyResult, At as sessionModelFallbacks, B as SettingsCategoryDescriptor, Bn as RunningWorkItem, Br as BuildUpdateHintOptions, Bt as loadMcpToolsCache, C as userSystemMdPath, Ci as INTERACTION_GUIDANCE, Cn as PendingAnnotation, Cr as setProviderCredential, Ct as OAuthFlowOptions, D as SpawnStartRecord, Di as SUBAGENT_GUIDANCE, Dn as ApprovalRequestInput, Dr as isReservedCredKey, Dt as supportsOAuth, E as useStreamBuffer, Ei as PLAN_MODE_DOCTRINE_NO_PROMPTS, En as ApprovalHub, Er as alternateCredKey, Et as runOAuthLogin, F as SETTINGS_CATEGORIES, Fn as HostSettings, Fr as hasClaudeCodeSetup, Ft as removeMcpServer, G as StringSettingKey, Gn as WireApprovalRequest, Gr as RunUpdateCommandResult, Gt as McpToolToggleSet, H as SettingsInput, Hn as SerializedPreview, Hr as buildUpdateHint, Ht as refreshMcpToolsCatalog, I as SETTINGS_CHOICES, In as HostSignal, Ir as importFromClaudeCode, It as upsertMcpServer, J as folderlessCwd, Jn as cleanTitle, Jr as DetectPackageManagerOptions, Jt as useMcpToolToggleSet, K as enforceSettingsInvariants, Kn as toTodosSnapshot, Kr as runUpdateCommand, Kt as buildToolToggle, L as SETTINGS_INPUTS, Ln as PendingInteraction, Lr as tryOpenBrowser, Lt as CachedMcpToolList, M as discoverProjectSkills, Mi as ChatTurnsReadToolOptions, Mn as ApprovalOriginator, Mr as ClaudeImportSummary, Mt as RemoveMcpResult, N as BooleanSettingKey, Ni as chatReferenceTokensForPrompt, Nn as CommandArgSuggestionSummary, Nr as ClaudeSessionImportResult, Nt as UpsertMcpResult, O as buildSpawnEndEvent, Oi as TOKEN_DISCIPLINE_DOCTRINE, On as createApprovalHub, Or as ConfigProvider, Ot as ModelFallbackTarget, P as DEFAULT_SETTINGS, Pi as createChatTurnsReadTool, Pn as CommandSummary, Pr as countClaudeSessionFiles, Pt as mcpsWritePath, Q as ProjectEntry, Qn as buildHints, Qr as PerformInPlaceUpdateOptions, Qt as parentServerName, R as SETTINGS_TOGGLES, Rn as PromptAttachment, Rr as bootProfileEnabled, Rt as McpToolsCache, S as userScopeOverridesLoad, Si as IDENTITY_PREFIX, Sn as EditOutcomeLedger, Sr as setPreferredCredential, St as redirectUriFromAuthUrl, T as StreamSource, Ti as PLAN_MODE_DOCTRINE, Tn as runCompaction, Tr as ALTERNATE_CRED_KEY_SUFFIX, Tt as oauthUsesManualCodePaste, U as SettingsProvider, Un as SessionPresence, Ur as useUpdateCheck, Ut as saveMcpToolsCache, V as SettingsChoice, Vn as SendOptions, Vr as UseUpdateCheckOptions, Vt as mcpToolsCachePath, W as SettingsToggle, Wn as TodosSnapshot, Wr as RunUpdateCommandOptions, Wt as subscribeMcpToolsCache, X as scopeCwd, Xn as shouldAutoGenerateTitle, Xr as PackageManagerCommand, Xt as buildVisibleMcpRows, Y as resolveSessionCwd, Yn as generateSessionTitle, Yr as InPlaceUpdateResult, Yt as VisibleMcpRow, Z as IMPLICITLY_SAFE_TOOLS, Zn as BuildHintsOptions, Zr as PackageManagerId, Zt as indexOfServerRow, _ as DiscoverSystemMdOptions, _i as ACTIONS_WITH_CARE_DOCTRINE, _r as credentialsPath, _t as findGitRoot, a as GRUVBOX_DARK, ai as detectLibc, an as McpAuthEvent, ar as Walk, at as readProjects, b as discoverSystemMd, bi as DOING_TASKS_DOCTRINE, bn as InteractionHub, br as readProviderCredentialPair, bt as fetchOAuthRedirect, c as CATPPUCCIN_LATTE, ci as performInPlaceSelfUpdate, cn as getMcpAuthStatus, cr as DiscoveryProvider, ct as runEndNotice, d as ThemeProvider, di as chatAutoCompactBehavior, dn as readFileSafe, dr as ApiKeyCredential, dt as clearProviderUsageCache, ei as PlatformTarballOptions, en as mcpCredentialsPath, er as parseEditorCommand, et as addToSafelist, f as useColors, fi as AgentsMdFile, fn as resolveCwdPath, fr as CredentialsFile, ft as fetchAllProviderUsage, g as useTheme, gi as renderAgentsMdBlock, gn as createChatHost, gr as applyApiKeyEnv, gt as usageSourceFor, h as useSyntaxStyles, hi as discoverAgentsMd, hn as ContextSegmentsReport, hr as ProviderCredential, ht as usageChecksOptedOut, i as VAPORWAVE_THEME, ii as compareSemver, in as useMcpAuthState, ir as DiscoverySlotOptions, it as projectsFilePath, j as defaultSkillScanPaths, ji as envSection, jn as PendingApprovalsStore, jr as ClaudeImportOptions, jt as McpConfigScope, k as buildSpawnStartEvent, ki as buildBuildSystem, kn as createMemoryApprovalsStore, kr as useConfig, kt as modelChainMetadata, l as CATPPUCCIN_MACCHIATO, li as performSelfUpdate, ln as reduceMcpAuth, lr as useDiscovery, lt as FetchProviderUsageOptions, m as useSurfaces, mi as DiscoverAgentsMdOptions, mn as ChatHost, mr as PreferCredentialResult, mt as providerUsageSupported, n as createActiveTodoAnchorHooks, ni as UpdateStatus, nn as McpAuthProvider, nr as Commit, nt as isOnSafelist, o as GRUVBOX_LIGHT, oi as detectPackageManager, on as McpAuthStateMap, or as createDiscoverySlot, ot as suggestSafelistEntries, p as useSelectStyle, pi as AgentsMdResult, pn as serializePreview, pr as OAuthCredential, pt as fetchProviderUsage, q as useSettings, qn as GenerateSessionTitleOptions, qr as CheckForUpdateOptions, qt as useMcpToolToggleMap, r as renderActiveTodoAnchor, ri as checkForUpdate, rn as useMcpAuthDispatch, rr as DiscoverySlot, rt as matchesSafelistEntry, s as CATPPUCCIN_FRAPPE, si as parseSemver, sn as McpAuthStatus, sr as DiscoveryContextValue, st as writeProjects, t as ActiveTodoAnchorOptions, ti as SelfUpdateResult, tn as patchMcpCredential, tr as quoteForShell, tt as getSafelist, u as CATPPUCCIN_MOCHA, ui as resolvePlatformPackage, un as extractEditPayloadForGate, ur as useDiscoveryOptional, ut as USAGE_CACHE_TTL_MS, v as SystemMdFile, vi as BuildSystemOptions, vr as readCredentials, vt as formatPathForCwd, w as StreamBuffer, wi as INTERACTION_GUIDANCE_NO_PROMPTS, wn as CompactionEntry, wr as writeCredentials, wt as OAuthPrompt, x as renderSystemMdSeed, xi as EnvSectionOptions, xn as createInteractionHub, xr as removeProviderCredential, xt as normalizeRedirectPaste, y as SystemMdResult, yi as COMMUNICATION_DOCTRINE, yr as readProviderCredential, yt as FetchOAuthRedirectResult, z as SettingsCategory, zn as QueuedItem, zr as bootTick, zt as clearMcpToolsCache } from "./index-DgdzXRPH.js";
|
|
3
|
+
import { $ as KEYBINDING_DEF_BY_ACTION, A as resolveConfig, B as listSessionMeta, C as discoverProjectMcps, D as ProviderRegistry, E as ChatOptions, F as compactSummaryEvent, G as sumRunCosts, H as marginTopFor, I as createStateStore, J as toolResultText, K as titleFromTurns, L as deriveSessionTitle, M as ModelUsageSummary, N as StateStoreApi, O as ResolvedConfig, P as TuiState, Q as KEYBINDING_DEFS, R as eventsFromTurns, S as defaultMcpsConfigPaths, St as truncateTrailing, T as AutoUpdateConfig, U as saveState, V as loadState, W as stripSpawnTokensLine, X as usageByModel, Y as updateToolEventOutcomes, Z as DEFAULT_KEYBINDINGS, _ as DiscoveredMcp, _t as stripJsonComments, a as SessionExportTarget, at as ParsedBinding, b as buildMcpServers, bt as clipHintsToWidth, c as writeSessionExport, ct as formatBindingForDisplay, d as useEnabledToggleSet, dt as matchesBinding, et as KEYBINDING_KEY_COL_WIDTH, f as DiscoveredPlugin, ft as mergeKeybindings, g as projectUserPaths, gt as resolveExtensionKeybindings, h as ProjectUserPath, ht as readKeybindingsRaw, i as SessionExportFormat, it as KeyBindings, j as resolveStoragePaths, k as ResolvedPaths, l as EnabledAllowlistKey, lt as groupBindings, m as discoverProjectPlugins, mt as readKeybindings, n as computeTurnAnchors, nt as KeyBindingDef, o as renderSession, ot as ResolvedExtensionKeybinding, p as buildPluginContributions, pt as parseBindingSpec, q as toolCallPreview, r as SessionExportAnchor, rt as KeyBindingSection, s as resolveSessionExportTarget, st as ensureKeybindingsFile, t as TranscriptItem, tt as KeyAction, u as EnabledToggleSet, ut as keybindingsPath, v as DiscoveryError, vt as EMPTY_HINTS, w as parseMcpsFile, x as dedupMcpServersByName, xt as hintsLength, y as DiscoveryResult, yt as Hint, z as lastContextSizeFromTurns } from "./transcript-anchors-DXqWWGbq.js";
|
|
4
|
+
import { $ as CacheChipContent, A as finalizeStreamingMarkdown, At as stripEditOutcomesAnnotation, B as formatUsagePercent, Bt as listProjectFiles, C as sanitizeTodoItems, Ct as ResolvedApproval, D as MAX_TRANSCRIPT_EVENTS, Dt as parseEditOutcomesFromResult, E as useActiveTodos, Et as mergeApprovalAndBodyOutcomes, F as ProviderUsageStatus, Ft as FILES_TRIGGER, G as compactPath, Gt as ChatReferenceEntry, Ht as createCommandsCompletionProvider, I as ProviderUsageWindow, It as createFilesCompletionProvider, J as formatDuration, Jt as createChatsCompletionProvider, K as fmtCost, Kt as ChatReferenceScope, Lt as uniqueFilesFromReferences, M as turnContextSize, Mt as SKILLS_TRIGGER, N as ProviderUsageCredits, Nt as createSkillsCompletionProvider, O as TRANSCRIPT_TRIM_TO_EVENTS, Ot as resolveApprovalForPayload, P as ProviderUsageSnapshot, Pt as uniqueSkillNamesFromReferences, Q as shortId, Rt as FileEntry, S as pruneTodosByRun, St as tokenize, T as setTodosForRun, Tt as maskToOutcomeKinds, Ut as CHATS_TRIGGER, V as mostConstrainedWindow, Vt as COMMANDS_TRIGGER, W as ageString, Wt as ChatReferenceData, X as formatTaskSummary, Xt as blendHsl, Y as formatTaskStatus, Yt as uniqueChatIdsFromReferences, Z as previewLine, Zt as buildLinearRamp, _ as createTodoTools, _t as extractEditPayload, a as ActiveTodosState, at as DiffOp, b as isTodoTool, bt as splitLines, c as TODOREAD_TOOL, ct as HunkResolution, d as TODO_STATUS_GLYPHS, dt as PreviewResult, et as CacheChipTone, f as TODO_WRITE_COUNTS_METADATA_KEY, ft as applyEditPayload, g as TodosBag, gt as computeLineDiff, h as TodoTally, ht as computeInlineDiff, i as turnAsText, it as DiffLine, j as finalizeStreamingMarkdownForOwner, jt as summarizeOutcomes, k as capTranscriptEvents, kt as rewriteMultiEditHeader, l as TODOS_METADATA_KEY, lt as InlineDiff, m as TodoStatus, mt as buildUnifiedDiff, n as deleteTurnSafely, nt as compactingLabel, o as CreateTodoToolsOptions, ot as EditHunkSummary, p as TodoItem, pt as buildContextualDiff, q as fmtTokens, qt as chatReferenceTokensFromText, r as truncateTurnsAt, rt as retryLabel, s as DEFAULT_MAX_TODO_ITEMS, st as EditSummary, t as countNeighbors, tt as cacheBreakChip, u as TODOWRITE_TOOL, ut as InlineSegment, v as getArchivedTodosForRun, vt as filetypeFromPath, w as selectActiveTodos, wt as buildEditOutcomesAnnotation, x as pickActiveRunId, xt as summarizeEditPayload, y as getTodosForRun, yt as previewEditPayload, zt as ListProjectFilesOptions } from "./turn-operations-DKFYWP3O.js";
|
|
5
|
+
import { A as filterSessionSearchCatalog, B as searchableTurnText, C as SearchSessionResult, D as SessionSearchIndex, E as SessionSearchExcerpt, F as searchSessionHistoryIndexAsync, G as SafeModeProvider, H as ApprovalRequest, I as searchSessionIndex, J as DAEMON_HEALTH_GLYPH, K as useSafeModeActions, L as searchSessionIndexAsync, M as searchHighlightRanges, N as searchSessionHistory, O as buildSessionSearchIndex, P as searchSessionHistoryIndex, Q as DaemonHealthTone, R as searchSessionTurns, S as SearchExcerpt, T as SessionHistoryMatch, U as RequestApproval, V as ApprovalDecision, W as SafeModeActions, X as DaemonHealth, Y as DAEMON_HEALTH_STYLE, Z as DaemonHealthStyle, _ as normalizeMarkdownCodeFences, a as formatToolCall, at as isVisible, b as HighlightSegment, c as splitPromptSegments, d as filterModelCatalog, dt as turnSelectionOwnership, f as indexOfEntry, g as chunkMarkdownForRender, h as MarkdownSegment, i as displayNameFor, j as highlightSegments, k as buildSessionSearchIndexAsync, l as CatalogEntry, lt as selectableTurnIds, m as MARKDOWN_RENDER_CHUNK_TARGET_BYTES, n as ToolDisplayMeta, nt as isEditErrorResult, o as PromptSegment, q as useSafeModeQueue, r as ToolFormatLine, rt as isTurnHighlighted, s as PromptSegmentRef, t as TOOL_DISPLAY, u as buildModelCatalog, ut as selectionAfterTurnRemoval, v as splitMarkdownCodeBlocks, w as SearchTurnResult, x as IndexedSearchTurn, y as HighlightRange, z as searchTurns } from "./tool-formatters-DO56YBBw.js";
|
|
6
|
+
export { ACTIONS_WITH_CARE_DOCTRINE, ALTERNATE_CRED_KEY_SUFFIX, ASK_USER_TOOL, AUTOMATIC_INTERACTION_INSTRUCTION, AUTO_COMPACT_MIN_GROWTH_FRACTION, type ActiveTodoAnchorOptions, type ActiveTodosState, type ActiveTrigger, type AgentAccent, type AgentProfile, type AgentRegistry, type AgentsMdFile, type AgentsMdResult, type AnswerValue, type ApiKeyCredential, type ApprovalDecision, type ApprovalHub, type ApprovalOriginator, type ApprovalRequest, type ApprovalRequestInput, type AuthMethod, type AutoCompactDecision, type AutoCompactInput, type AutoUpdateConfig, BUILD_AGENT, BUILTIN_AGENTS, BUILTIN_PROVIDERS, BUILTIN_THEMES, type BooleanSettingKey, type BuildExtensionRegistryOptions, type BuildHintsOptions, type BuildSystemOptions, type BuildUpdateHintOptions, CATPPUCCIN_FRAPPE, CATPPUCCIN_LATTE, CATPPUCCIN_MACCHIATO, CATPPUCCIN_MOCHA, CHATS_TRIGGER, COMMANDS_TRIGGER, COMMUNICATION_DOCTRINE, type CacheChipContent, type CacheChipTone, type CachedMcpToolList, type CatalogEntry, type ChatHost, type ChatHostEnvironment, type ChatOptions, type ChatReferenceData, type ChatReferenceEntry, type ChatReferenceScope, type ChatTurnsReadToolOptions, type CheckForUpdateOptions, type ChipColor, type ChipColorMap, type ClaudeCopyResult, type ClaudeImportOptions, type ClaudeImportSummary, type ClaudeSessionImportResult, type Command, type CommandAgentResult, type CommandArgSuggestionSummary, type CommandExecution, type CommandInvocation, type CommandOutputBlock, type CommandStep, type CommandStepContext, type CommandStepFn, type CommandSummary, type Commit, type CompactionEntry, type CompletionContext, type CompletionItem, type CompletionProvider, type CompletionReference, type CompletionState, ConfigProvider, type ConfirmQuestion, type ContextBreakdown, type ContextBreakdownContributionContext, type ContextBreakdownContributor, type ContextBreakdownOptions, type ContextCategory, type ContextCategoryId, type ContextExactCounts, type ContextExtensionRow, type ContextExtensionSection, type ContextItem, type ContextMcpGroup, type ContextSegment, type ContextSegmentFile, type ContextSegmentOrigin, type ContextSegmentsInput, type ContextSegmentsReport, type ContextSnapshot, type ContextUsageSplit, type CreateInteractionToolsOptions, type CreateTodoToolsOptions, type CredentialsFile, type CustomField, DAEMON_HEALTH_GLYPH, DAEMON_HEALTH_STYLE, DEFAULT_AGENT_ID, DEFAULT_BUDGET_EXCLUDE_TOOLS, DEFAULT_KEYBINDINGS, DEFAULT_MAX_TODO_ITEMS, DEFAULT_PERSIST_EXCLUDE_TOOLS, DEFAULT_SETTINGS, DEFAULT_THEME, DOING_TASKS_DOCTRINE, type DaemonHealth, type DaemonHealthStyle, type DaemonHealthTone, type DetectPackageManagerOptions, type DiffLine, type DiffOp, type DiscoverAgentsMdOptions, type DiscoverSystemMdOptions, type DiscoveredMcp, type DiscoveredPlugin, type DiscoveryContextValue, type DiscoveryError, DiscoveryProvider, type DiscoveryResult, type DiscoverySlot, type DiscoverySlotOptions, EMPTY_EXTENSION_REGISTRY, EMPTY_HINTS, type EditDiffDisplay, type EditHunk, type EditHunkSummary, type EditOutcome, type EditOutcomeKind, EditOutcomeLedger, type EditPayload, type EditSummary, type EnabledAllowlistKey, type EnabledToggleSet, type EnvSectionOptions, type ExtensionApiVersion, type ExtensionBehaviorTransform, type ExtensionCapability, type ExtensionContext, type ExtensionContributions, type ExtensionDefinition, type ExtensionFooterHint, type ExtensionGuiPanel, type ExtensionKeybinding, type ExtensionKeybindingDispatchContext, type ExtensionManifest, type ExtensionMcpConfigTransform, type ExtensionModal, type ExtensionOrderedContribution, type ExtensionPaths, type ExtensionPermission, type ExtensionProviderMiddleware, type ExtensionRegistry, type ExtensionRunTransform, type ExtensionRuntimeEnv, type ExtensionSessionStateSurface, type ExtensionSkillPolicy, type ExtensionSource, type ExtensionStorageScope, type ExtensionStorageSurface, type ExtensionToolCatalogTransform, type ExtensionToolResultMetadataRegistration, FILES_TRIGGER, type FetchOAuthRedirectResult, type FetchProviderUsageOptions, type FileEntry, GRUVBOX_DARK, GRUVBOX_LIGHT, type GenerateSessionTitleOptions, type GenerateStructuredDataOptions, type GuiContributions, HOST_INTERACTION_ID_PREFIX, type HighlightRange, type HighlightSegment, type Hint, type HostSettings, type HostSignal, type HunkResolution, IDENTITY_PREFIX, IMPLICITLY_SAFE_TOOLS, INTERACTION_GUIDANCE, INTERACTION_GUIDANCE_NO_PROMPTS, type InPlaceUpdateResult, type IndexedSearchTurn, type InlineAutocompleteContext, type InlineAutocompleteProvider, type InlineDiff, type InlineGhost, type InlineSegment, type InteractionHub, type InteractionMode, type InteractionOrigin, type InteractionRequest, type InteractionResponse, type InteractionsActions, InteractionsProvider, KEYBINDING_DEFS, KEYBINDING_DEF_BY_ACTION, KEYBINDING_KEY_COL_WIDTH, type KeyAction, type KeyBindingDef, type KeyBindingSection, type KeyBindings, type ListProjectFilesOptions, type LoadedExtension, MARKDOWN_RENDER_CHUNK_TARGET_BYTES, MAX_TRANSCRIPT_EVENTS, type MarkdownSegment, type McpAuthEvent, McpAuthProvider, type McpAuthStateMap, type McpAuthStatus, type McpConfigScope, type McpToolToggleSet, type McpToolsCache, type ModelChainEntry, type ModelFallbackTarget, type ModelInfo, type ModelOption, type ModelUsageSummary, type OAuthCredential, type OAuthFlowOptions, type OAuthPrompt, ORCHESTRATED_BY_KEY, OUTPUT_RESERVE_TOKENS, type Owner, PLAN_AGENT, PLAN_MODE_DOCTRINE, PLAN_MODE_DOCTRINE_NO_PROMPTS, PRESENT_PLAN_TOOL, type PackageManagerCommand, type PackageManagerId, type ParsedBinding, type PendingAnnotation, type PendingApprovalsStore, type PendingInteraction, type PendingInteractionEntry, type PerformInPlaceUpdateOptions, type PerformSelfUpdateOptions, type Picked, type PlanDecision, type PlanPayload, type PlanRequest, type PlanResponse, type PlanStep, type PlatformTarballOptions, type PreferCredentialResult, type PreviewResult, type ProjectEntry, type ProjectUserPath, type ProjectsFile, type PromptAttachment, type PromptSegment, type PromptSegmentRef, type ProviderAuth, type ProviderCredential, type ProviderDescriptor, type ProviderKey, type ProviderRegistry, type ProviderUsageCredits, type ProviderUsageSnapshot, type ProviderUsageStatus, type ProviderUsageWindow, type Question, type QuestionChoice, type QuestionPayload, type QuestionRequest, type QuestionResponse, type QuestionType, type QueuedItem, RUN_RECEIPT_GLYPH, type RemoveMcpResult, type RequestApproval, type ResolveStorageDirsOptions, type ResolvedApproval, type ResolvedConfig, type ResolvedExtensionKeybinding, type ResolvedPaths, type RunReceipt, type RunReceiptCell, type RunReceiptCellKind, type RunReceiptSegment, type RunReceiptSegmentKind, type RunUpdateCommandOptions, type RunUpdateCommandResult, type RunningWorkItem, SESSION_EVENT_STATUS_STYLE, SESSION_ROLE_KEY, SETTINGS_CATEGORIES, SETTINGS_CHOICES, SETTINGS_INPUTS, SETTINGS_TOGGLES, SKILLS_TRIGGER, SUBAGENT_GUIDANCE, type SafeModeActions, SafeModeProvider, type Screen, type SearchExcerpt, type SearchSessionResult, type SearchTurnResult, type SelectQuestion, type SelfUpdateResult, type SendOptions, type SerializedPreview, type SessionEvent, type SessionEventStatus, type SessionEventStatusStyle, type SessionEventTone, type SessionExportAnchor, type SessionExportFormat, type SessionExportTarget, type SessionHistoryMatch, type SessionMeta, type SessionPresence, type SessionSearchExcerpt, type SessionSearchIndex, type Settings, type SettingsCategory, type SettingsCategoryDescriptor, type SettingsChoice, type SettingsInput, SettingsProvider, type SettingsToggle, type SpawnStartRecord, type StateStoreApi, type StorageDirs, type StorageMode, type StorageSlot, type StreamBuffer, type StreamEvent, type StreamSource, type StringSettingKey, type SyntaxStyles, type SyntaxTokenStyle, type SystemMdFile, type SystemMdResult, TODOREAD_TOOL, TODOS_METADATA_KEY, TODOWRITE_TOOL, TODO_STATUS_GLYPHS, TODO_WRITE_COUNTS_METADATA_KEY, TOKEN_DISCIPLINE_DOCTRINE, TOOL_DISPLAY, TRANSCRIPT_TRIM_TO_EVENTS, type TextQuestion, type Theme, type ThemeColors, ThemeProvider, type ThemeSelect, type ThemeSurfaces, type TodoItem, type TodoStatus, type TodoTally, type TodosBag, type TodosSnapshot, type ToolCallDisplay, type ToolDisplayMeta, type ToolFormatLine, type TranscriptItem, type TuiContributions, type TuiState, USAGE_CACHE_TTL_MS, type UpdateStatus, type UpsertMcpResult, type UseUpdateCheckOptions, VAPORWAVE_THEME, type VisibleMcpRow, WORKER_REPORT_FRAGMENT, type Walk, type WireApprovalRequest, accentColor, addToSafelist, ageString, alternateCredKey, anthropicDescriptor, applyApiKeyEnv, applyEditPayload, applyInsert, blendHsl, bootProfileEnabled, bootTick, buildBuildSystem, buildContextBreakdown, buildContextSegments, buildContextualDiff, buildEditOutcomesAnnotation, buildExtensionPreset, buildExtensionRegistry, buildHints, buildLinearRamp, buildMcpServers, buildModelCatalog, buildPlanSystem, buildPluginContributions, buildResumedToolResultsTurn, buildRunModel, buildSessionSearchIndex, buildSessionSearchIndexAsync, buildSkillsConfig, buildSpawnEndEvent, buildSpawnStartEvent, buildToolToggle, buildUnifiedDiff, buildUpdateHint, buildVisibleMcpRows, cacheBreakChip, capTranscriptEvents, cerebrasDescriptor, chainPositionOf, chainsEqual, chatAutoCompactBehavior, chatReferenceTokensForPrompt, chatReferenceTokensFromText, checkForUpdate, chunkMarkdownForRender, cleanTitle, clearMcpToolsCache, clearProviderUsageCache, clipHintsToWidth, collectReferences, commandSteps, compactPath, compactSummaryEvent, compactingLabel, compareSemver, composeExtensionPreset, computeInlineDiff, computeLineDiff, computeTurnAnchors, countClaudeSessionFiles, countNeighbors, createActiveTodoAnchorHooks, createApprovalHub, createAutomaticInteractionResponse, createChatHost, createChatTurnsReadTool, createChatsCompletionProvider, createCommandsCompletionProvider, createDiscoverySlot, createFileMcpCredentialStore, createFilesCompletionProvider, createInteractionHub, createInteractionTools, createMemoryApprovalsStore, createPathAutocompleteProvider, createSkillsCompletionProvider, createStateStore, createTodoTools, credKeyOf, credentialsPath, dedupMcpServersByName, defaultExtensionScanPaths, defaultMcpsConfigPaths, defaultSkillScanPaths, defineExtension, deleteTurnSafely, deriveSessionTitle, detectAuth, detectLibc, detectPackageManager, discoverAgentsMd, discoverExtensions, discoverProjectMcps, discoverProjectPlugins, discoverProjectSkills, discoverSystemMd, displayNameFor, disposeExtensionRegistry, effectiveContextWindow, enabledModelOptions, enforceSettingsInvariants, ensureKeybindingsFile, envSection, eventsFromTurns, executeCommand, extractEditPayload, extractEditPayloadForGate, fetchAllProviderUsage, fetchOAuthRedirect, fetchProviderUsage, filetypeFromPath, filterChainFallbacks, filterExtensionRegistry, filterModelCatalog, filterSessionSearchCatalog, finalizeStreamingMarkdown, finalizeStreamingMarkdownForOwner, findActiveTrigger, findGitRoot, fitRunReceiptCells, fmtCost, fmtTokens, folderlessCwd, formatBindingForDisplay, formatCostUsd, formatDuration, formatPathForCwd, formatRunDuration, formatRunReceiptCells, formatRunReceiptLine, formatTaskStatus, formatTaskSummary, formatTokenCount, formatTokensPerSecond, formatToolCall, formatUsagePercent, generateSessionTitle, generateStructuredData, getArchivedTodosForRun, getContextWindow, getMcpAuthStatus, getModelInfo, getSafelist, getTodosForRun, groupBindings, hasClaudeCodeSetup, hasRunReceipt, highlightSegments, hintsLength, importFromClaudeCode, indexOfEntry, indexOfServerRow, inlineLoadedExtension, isEditErrorResult, isInteractionTool, isMainSession, isModelInteraction, isOnSafelist, isReservedCredKey, isTodoTool, isTurnHighlighted, isVisible, keybindingsPath, lastContextSizeFromTurns, listProjectFiles, listSessionMeta, loadMcpToolsCache, loadState, localDescriptor, makeRequestInteraction, marginTopFor, maskToOutcomeKinds, matchesBinding, matchesSafelistEntry, mcpCredentialsPath, mcpToolsCachePath, mcpsWritePath, mergeApprovalAndBodyOutcomes, mergeContributions, mergeKeybindings, mergeReferences, mergeSuggestions, modelChainMetadata, modelOptionsFor, modelSupportsReasoning, modelsForDescriptor, mostConstrainedWindow, normalizeMarkdownCodeFences, normalizeRedirectPaste, oauthUsesManualCodePaste, openaiDescriptor, openrouterDescriptor, orchestratedBy, parentServerName, parseBindingSpec, parseCommandInvocation, parseEditOutcomesFromResult, parseEditorCommand, parseMcpsFile, parseSemver, parseSessionEventXml, partitionExtensionCatalog, patchInlineGhost, patchMcpCredential, pendingInteractionsFromTurns, performInPlaceSelfUpdate, performSelfUpdate, piIdOf, pickActiveRunId, previewEditPayload, previewLine, projectUserPaths, projectsFilePath, providerKeySetChanged, providerUsageSupported, pruneTodosByRun, quoteForShell, readCredentials, readFileSafe, readKeybindings, readKeybindingsRaw, readProjects, readProviderCredential, readProviderCredentialPair, redirectUriFromAuthUrl, reduceMcpAuth, refreshMcpToolsCatalog, removeMcpServer, removeProviderCredential, renderActiveTodoAnchor, renderAgentsMdBlock, renderSession, renderSessionEventXml, renderSystemMdSeed, resolveAgentId, resolveApprovalForPayload, resolveChipColor, resolveConfig, resolveCwdPath, resolveExtensionKeybindings, resolveInlineSuggestion, resolvePlatformPackage, resolveSessionCwd, resolveSessionExportTarget, resolveStorageDirs, resolveStoragePaths, resolveTheme, restoreChainFallbacks, restoreModelOptions, retryLabel, rewriteMultiEditHeader, runCompaction, runEndNotice, runOAuthLogin, runReceiptFromRun, runUpdateCommand, sanitizeModelChain, sanitizeTodoItems, saveMcpToolsCache, saveState, scanExtensionDirectories, scopeCwd, searchHighlightRanges, searchSessionHistory, searchSessionHistoryIndex, searchSessionHistoryIndexAsync, searchSessionIndex, searchSessionIndexAsync, searchSessionTurns, searchTurns, searchableTurnText, selectActiveTodos, selectableTurnIds, selectionAfterTurnRemoval, serializeInteractionResponse, serializePreview, sessionDirLabel, sessionEventExcerpt, sessionEventLabel, sessionEventMeta, sessionModelFallbacks, setPreferredCredential, setProviderCredential, setTodosForRun, shortChord, shortId, shortSessionId, shouldAutoCompact, shouldAutoGenerateTitle, singleAgentRegistry, splitLines, splitMarkdownCodeBlocks, splitPromptSegments, stripEditOutcomesAnnotation, stripJsonComments, stripSpawnTokensLine, subscribeMcpToolsCache, suggestSafelistEntries, sumRunCosts, summarizeEditPayload, summarizeOutcomes, supportsOAuth, titleFromTurns, toTodosSnapshot, toggleChainEntry, tokenEndingAtCursor, tokenize, toolCallPreview, toolResultText, truncateTitle, truncateTrailing, truncateTurnsAt, tryOpenBrowser, turnAsText, turnContextSize, turnSelectionOwnership, uniqueChatIdsFromReferences, uniqueFilesFromReferences, uniqueSkillNamesFromReferences, updateToolEventOutcomes, upsertMcpServer, usageByModel, usageChecksOptedOut, usageSourceFor, useActiveTodos, useColors, useCompletion, useConfig, useDiscovery, useDiscoveryOptional, useEnabledToggleSet, useInteractionsActions, useInteractionsQueue, useMcpAuthDispatch, useMcpAuthState, useMcpToolToggleMap, useMcpToolToggleSet, useSafeModeActions, useSafeModeQueue, useSelectStyle, useSettings, useStreamBuffer, useSurfaces, useSyntaxStyles, useTheme, useUpdateCheck, userScopeOverridesLoad, userSystemMdPath, writeCredentials, writeProjects, writeSessionExport };
|