mirror of
https://github.com/mark3labs/kit.git
synced 2026-06-13 19:20:06 +00:00
Deploying to gh-pages from @ mark3labs/kit@efaff7f44f 🚀
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
{"version":"1.4.0","languages":{"en":{"hash":"en_3a80c79c47","wasm":"en","page_count":19}},"include_characters":["_","‿","⁀","⁔","︳","︴","﹍","﹎","﹏","_"]}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,214 @@
|
||||
:root {
|
||||
--pagefind-ui-scale: 0.8;
|
||||
--pagefind-ui-primary: #034AD8;
|
||||
--pagefind-ui-fade: #707070;
|
||||
--pagefind-ui-text: #393939;
|
||||
--pagefind-ui-background: #ffffff;
|
||||
--pagefind-ui-border: #eeeeee;
|
||||
--pagefind-ui-tag: #eeeeee;
|
||||
--pagefind-ui-border-width: 2px;
|
||||
--pagefind-ui-border-radius: 8px;
|
||||
--pagefind-ui-image-border-radius: 8px;
|
||||
--pagefind-ui-image-box-ratio: 3 / 2;
|
||||
--pagefind-ui-font: system, -apple-system, ".SFNSText-Regular",
|
||||
"San Francisco", "Roboto", "Segoe UI", "Helvetica Neue",
|
||||
"Lucida Grande", sans-serif;
|
||||
}
|
||||
|
||||
[data-pfmod-hidden] {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
[data-pfmod-suppressed] {
|
||||
opacity: 0 !important;
|
||||
pointer-events: none !important;
|
||||
}
|
||||
|
||||
[data-pfmod-sr-hidden] {
|
||||
-webkit-clip: rect(0 0 0 0) !important;
|
||||
clip: rect(0 0 0 0) !important;
|
||||
-webkit-clip-path: inset(100%) !important;
|
||||
clip-path: inset(100%) !important;
|
||||
height: 1px !important;
|
||||
overflow: hidden !important;
|
||||
overflow: clip !important;
|
||||
position: absolute !important;
|
||||
white-space: nowrap !important;
|
||||
width: 1px !important;
|
||||
}
|
||||
|
||||
[data-pfmod-loading] {
|
||||
color: var(--pagefind-ui-text);
|
||||
background-color: var(--pagefind-ui-text);
|
||||
border-radius: var(--pagefind-ui-border-radius);
|
||||
opacity: 0.1;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* Input */
|
||||
|
||||
.pagefind-modular-input-wrapper {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.pagefind-modular-input-wrapper::before {
|
||||
background-color: var(--pagefind-ui-text);
|
||||
width: calc(18px * var(--pagefind-ui-scale));
|
||||
height: calc(18px * var(--pagefind-ui-scale));
|
||||
top: calc(23px * var(--pagefind-ui-scale));
|
||||
left: calc(20px * var(--pagefind-ui-scale));
|
||||
content: "";
|
||||
position: absolute;
|
||||
display: block;
|
||||
opacity: 0.7;
|
||||
-webkit-mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");
|
||||
mask-image: url("data:image/svg+xml,%3Csvg width='18' height='18' viewBox='0 0 18 18' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.7549 11.255H11.9649L11.6849 10.985C12.6649 9.845 13.2549 8.365 13.2549 6.755C13.2549 3.165 10.3449 0.255005 6.75488 0.255005C3.16488 0.255005 0.254883 3.165 0.254883 6.755C0.254883 10.345 3.16488 13.255 6.75488 13.255C8.36488 13.255 9.84488 12.665 10.9849 11.685L11.2549 11.965V12.755L16.2549 17.745L17.7449 16.255L12.7549 11.255ZM6.75488 11.255C4.26488 11.255 2.25488 9.245 2.25488 6.755C2.25488 4.26501 4.26488 2.255 6.75488 2.255C9.24488 2.255 11.2549 4.26501 11.2549 6.755C11.2549 9.245 9.24488 11.255 6.75488 11.255Z' fill='%23000000'/%3E%3C/svg%3E%0A");
|
||||
-webkit-mask-size: 100%;
|
||||
mask-size: 100%;
|
||||
z-index: 9;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.pagefind-modular-input {
|
||||
height: calc(64px * var(--pagefind-ui-scale));
|
||||
padding: 0 calc(70px * var(--pagefind-ui-scale)) 0 calc(54px * var(--pagefind-ui-scale));
|
||||
background-color: var(--pagefind-ui-background);
|
||||
border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);
|
||||
border-radius: var(--pagefind-ui-border-radius);
|
||||
font-size: calc(21px * var(--pagefind-ui-scale));
|
||||
position: relative;
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
display: flex;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.pagefind-modular-input::placeholder {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
.pagefind-modular-input-clear {
|
||||
position: absolute;
|
||||
top: calc(2px * var(--pagefind-ui-scale));
|
||||
right: calc(2px * var(--pagefind-ui-scale));
|
||||
height: calc(60px * var(--pagefind-ui-scale));
|
||||
border-radius: var(--pagefind-ui-border-radius);
|
||||
padding: 0 calc(15px * var(--pagefind-ui-scale)) 0 calc(2px * var(--pagefind-ui-scale));
|
||||
color: var(--pagefind-ui-text);
|
||||
font-size: calc(14px * var(--pagefind-ui-scale));
|
||||
cursor: pointer;
|
||||
background-color: var(--pagefind-ui-background);
|
||||
border: none;
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
/* ResultList */
|
||||
|
||||
.pagefind-modular-list-result {
|
||||
list-style-type: none;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: min(calc(40px * var(--pagefind-ui-scale)), 3%);
|
||||
padding: calc(30px * var(--pagefind-ui-scale)) 0 calc(40px * var(--pagefind-ui-scale));
|
||||
border-top: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border);
|
||||
}
|
||||
|
||||
.pagefind-modular-list-result:last-of-type {
|
||||
border-bottom: solid var(--pagefind-ui-border-width) var(--pagefind-ui-border);
|
||||
}
|
||||
|
||||
.pagefind-modular-list-thumb {
|
||||
width: min(30%,
|
||||
calc((30% - (100px * var(--pagefind-ui-scale))) * 100000));
|
||||
max-width: calc(120px * var(--pagefind-ui-scale));
|
||||
margin-top: calc(10px * var(--pagefind-ui-scale));
|
||||
aspect-ratio: var(--pagefind-ui-image-box-ratio);
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.pagefind-modular-list-image {
|
||||
display: block;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
font-size: 0;
|
||||
width: auto;
|
||||
height: auto;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
border-radius: var(--pagefind-ui-image-border-radius);
|
||||
}
|
||||
|
||||
.pagefind-modular-list-inner {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
margin-top: calc(10px * var(--pagefind-ui-scale));
|
||||
}
|
||||
|
||||
.pagefind-modular-list-title {
|
||||
display: inline-block;
|
||||
font-weight: 700;
|
||||
font-size: calc(21px * var(--pagefind-ui-scale));
|
||||
margin-top: 0;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.pagefind-modular-list-link {
|
||||
color: var(--pagefind-ui-text);
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.pagefind-modular-list-link:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.pagefind-modular-list-excerpt {
|
||||
display: inline-block;
|
||||
font-weight: 400;
|
||||
font-size: calc(16px * var(--pagefind-ui-scale));
|
||||
margin-top: calc(4px * var(--pagefind-ui-scale));
|
||||
margin-bottom: 0;
|
||||
min-width: calc(250px * var(--pagefind-ui-scale));
|
||||
}
|
||||
|
||||
/* FilterPills */
|
||||
|
||||
.pagefind-modular-filter-pills-wrapper {
|
||||
overflow-x: scroll;
|
||||
padding: 15px 0;
|
||||
}
|
||||
|
||||
.pagefind-modular-filter-pills {
|
||||
display: flex;
|
||||
gap: 6px;
|
||||
}
|
||||
|
||||
.pagefind-modular-filter-pill {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
border: none;
|
||||
appearance: none;
|
||||
padding: 0 calc(24px * var(--pagefind-ui-scale));
|
||||
background-color: var(--pagefind-ui-background);
|
||||
color: var(--pagefind-ui-fade);
|
||||
border: var(--pagefind-ui-border-width) solid var(--pagefind-ui-border);
|
||||
border-radius: calc(25px * var(--pagefind-ui-scale));
|
||||
font-size: calc(18px * var(--pagefind-ui-scale));
|
||||
height: calc(50px * var(--pagefind-ui-scale));
|
||||
cursor: pointer;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.pagefind-modular-filter-pill:hover {
|
||||
border-color: var(--pagefind-ui-primary);
|
||||
}
|
||||
|
||||
.pagefind-modular-filter-pill[aria-pressed="true"] {
|
||||
border-color: var(--pagefind-ui-primary);
|
||||
color: var(--pagefind-ui-primary);
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,107 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>JSON Output | Kit</title>
|
||||
<meta name="description" content="Machine-readable JSON output for scripting and automation.">
|
||||
<link rel="canonical" href="/advanced/json-output">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"JSON Output","description":"Machine-readable JSON output for scripting and automation.","url":"https://go-kit.dev/advanced/json-output","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>JSON Output</h1>
|
||||
# JSON Output
|
||||
|
||||
Use the `--json` flag to get structured output for scripting and automation:
|
||||
|
||||
```bash
|
||||
kit "Explain main.go" --json --quiet --no-session
|
||||
```
|
||||
|
||||
## Response format
|
||||
|
||||
```json
|
||||
{
|
||||
"response": "Final assistant response text",
|
||||
"model": "anthropic/claude-haiku-3-5-20241022",
|
||||
"stop_reason": "end_turn",
|
||||
"session_id": "a1b2c3d4e5f6",
|
||||
"usage": {
|
||||
"input_tokens": 1024,
|
||||
"output_tokens": 512,
|
||||
"total_tokens": 1536,
|
||||
"cache_read_tokens": 0,
|
||||
"cache_creation_tokens": 0
|
||||
},
|
||||
"messages": [
|
||||
{
|
||||
"role": "assistant",
|
||||
"parts": [
|
||||
{"type": "text", "data": "..."},
|
||||
{"type": "tool_call", "data": {"name": "...", "args": "..."}},
|
||||
{"type": "tool_result", "data": {"name": "...", "result": "..."}}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## Fields
|
||||
|
||||
### Top-level
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `response` | string | The final assistant response text |
|
||||
| `model` | string | The model that was used |
|
||||
| `stop_reason` | string | Why the model stopped (e.g., `end_turn`) |
|
||||
| `session_id` | string | Session identifier (omitted in `--no-session` mode) |
|
||||
| `usage` | object | Token usage statistics |
|
||||
| `messages` | array | Full conversation history |
|
||||
|
||||
### Usage
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `input_tokens` | int | Tokens sent to the model |
|
||||
| `output_tokens` | int | Tokens generated by the model |
|
||||
| `total_tokens` | int | Sum of input and output tokens |
|
||||
| `cache_read_tokens` | int | Tokens read from prompt cache |
|
||||
| `cache_creation_tokens` | int | Tokens written to prompt cache |
|
||||
|
||||
### Message parts
|
||||
|
||||
Each message contains a `parts` array with typed entries:
|
||||
|
||||
| Type | Description |
|
||||
|------|-------------|
|
||||
| `text` | Assistant text content |
|
||||
| `tool_call` | Tool invocation with name and args |
|
||||
| `tool_result` | Tool execution result |
|
||||
| `reasoning` | Extended thinking content |
|
||||
| `finish` | End-of-turn marker |
|
||||
|
||||
## Parsing in scripts
|
||||
|
||||
### bash + jq
|
||||
|
||||
```bash
|
||||
result=$(kit "Count files" --json --quiet --no-session)
|
||||
response=$(echo "$result" | jq -r '.response')
|
||||
tokens=$(echo "$result" | jq '.usage.total_tokens')
|
||||
```
|
||||
|
||||
### Go SDK
|
||||
|
||||
For Go programs, use the SDK's `PromptResult` method instead of parsing JSON:
|
||||
|
||||
```go
|
||||
result, err := host.PromptResult(ctx, "Count files")
|
||||
fmt.Println(result.Response)
|
||||
fmt.Println(result.Usage.TotalTokens)
|
||||
```</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,85 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Subagents | Kit</title>
|
||||
<meta name="description" content="Multi-agent orchestration with Kit subagents.">
|
||||
<link rel="canonical" href="/advanced/subagents">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Subagents","description":"Multi-agent orchestration with Kit subagents.","url":"https://go-kit.dev/advanced/subagents","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Subagents</h1>
|
||||
# Subagents
|
||||
|
||||
Kit supports multi-agent orchestration through both subprocess spawning and in-process subagents.
|
||||
|
||||
## Subprocess pattern
|
||||
|
||||
Spawn Kit as a subprocess for isolated agent execution:
|
||||
|
||||
```bash
|
||||
kit "Analyze codebase" \
|
||||
--json \
|
||||
--no-session \
|
||||
--no-extensions \
|
||||
--quiet \
|
||||
--model anthropic/claude-haiku-3-5-20241022
|
||||
```
|
||||
|
||||
Key flags for subprocess usage:
|
||||
|
||||
| Flag | Purpose |
|
||||
|------|---------|
|
||||
| `--quiet` | Stdout only, no TUI |
|
||||
| `--no-session` | Ephemeral, no persistence |
|
||||
| `--no-extensions` | Prevent recursive extension loading |
|
||||
| `--json` | Machine-readable output |
|
||||
| `--system-prompt` | Custom system prompt (string or file path) |
|
||||
|
||||
Positional arguments are the prompt. `@file` arguments attach file content as context.
|
||||
|
||||
## Built-in spawn_subagent tool
|
||||
|
||||
Kit includes a built-in `spawn_subagent` tool that the LLM can use to delegate tasks to independent child agents:
|
||||
|
||||
```
|
||||
spawn_subagent(
|
||||
task: "Analyze the test files and summarize coverage",
|
||||
model: "anthropic/claude-haiku-3-5-20241022", // optional
|
||||
system_prompt: "You are a test analysis expert.", // optional
|
||||
timeout_seconds: 300 // optional, max 1800
|
||||
)
|
||||
```
|
||||
|
||||
Subagents run as separate in-process Kit instances with full tool access (except spawning further subagents, to prevent infinite recursion). They can run in parallel.
|
||||
|
||||
## Extension subagents
|
||||
|
||||
Extensions can spawn subagents programmatically:
|
||||
|
||||
```go
|
||||
result := ctx.SpawnSubagent(ext.SubagentConfig{
|
||||
Task: "Review this code for security issues",
|
||||
Model: "anthropic/claude-sonnet-4-5-20250929",
|
||||
SystemPrompt: "You are a security auditor.",
|
||||
})
|
||||
```
|
||||
|
||||
## Go SDK subagents
|
||||
|
||||
The SDK provides in-process subagent spawning:
|
||||
|
||||
```go
|
||||
result, err := host.Subagent(ctx, kit.SubagentConfig{
|
||||
Task: "Summarize the changes in this PR",
|
||||
Model: "anthropic/claude-haiku-3-5-20241022",
|
||||
SystemPrompt: "You are a code reviewer.",
|
||||
Timeout: 5 * time.Minute,
|
||||
})
|
||||
```</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,86 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Testing with tmux | Kit</title>
|
||||
<meta name="description" content="Test Kit's TUI non-interactively using tmux.">
|
||||
<link rel="canonical" href="/advanced/testing">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Testing with tmux","description":"Test Kit's TUI non-interactively using tmux.","url":"https://go-kit.dev/advanced/testing","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Testing with tmux</h1>
|
||||
# Testing with tmux
|
||||
|
||||
Kit's interactive TUI can be tested non-interactively using tmux. This is useful for automated testing, CI pipelines, and extension development.
|
||||
|
||||
## Basic pattern
|
||||
|
||||
```bash
|
||||
# Start Kit in a detached tmux session
|
||||
tmux new-session -d -s kittest -x 120 -y 40 \
|
||||
"output/kit -e ext.go --no-session 2>kit_stderr.log"
|
||||
|
||||
# Wait for startup
|
||||
sleep 3
|
||||
|
||||
# Capture the current screen
|
||||
tmux capture-pane -t kittest -p
|
||||
|
||||
# Send input
|
||||
tmux send-keys -t kittest '/command' Enter
|
||||
|
||||
# Wait for response
|
||||
sleep 2
|
||||
|
||||
# Capture updated screen
|
||||
tmux capture-pane -t kittest -p
|
||||
|
||||
# Cleanup
|
||||
tmux kill-session -t kittest
|
||||
```
|
||||
|
||||
## Testing extensions
|
||||
|
||||
When testing extensions, the pattern is:
|
||||
|
||||
1. Build Kit with your changes
|
||||
2. Start Kit in tmux with the extension loaded
|
||||
3. Send slash commands or prompts
|
||||
4. Capture and verify the screen output
|
||||
5. Check stderr logs for errors
|
||||
|
||||
```bash
|
||||
# Build first
|
||||
go build -o output/kit ./cmd/kit
|
||||
|
||||
# Start with extension
|
||||
tmux new-session -d -s kittest -x 120 -y 40 \
|
||||
"output/kit -e examples/extensions/widget-status.go --no-session 2>kit_stderr.log"
|
||||
|
||||
sleep 3
|
||||
|
||||
# Verify widget appears in screen
|
||||
tmux capture-pane -t kittest -p | grep "Status"
|
||||
|
||||
# Send a slash command
|
||||
tmux send-keys -t kittest '/stats' Enter
|
||||
sleep 1
|
||||
tmux capture-pane -t kittest -p
|
||||
|
||||
# Cleanup
|
||||
tmux kill-session -t kittest
|
||||
```
|
||||
|
||||
## Tips
|
||||
|
||||
- Use `-x` and `-y` to set consistent terminal dimensions
|
||||
- Redirect stderr to a log file (`2>kit.log`) for debugging
|
||||
- Use `--no-session` to avoid creating session files during tests
|
||||
- Add sufficient `sleep` between commands for the TUI to render
|
||||
- Use `grep` on captured pane output to verify specific content</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,220 @@
|
||||
const s={frontmatter:{title:"Callbacks",description:"Monitor tool calls and streaming output with the Kit Go SDK.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="callbacks"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#callbacks"><span class="icon icon-link"></span></a>Callbacks</h1>
|
||||
<h2 id="promptwithcallbacks"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#promptwithcallbacks"><span class="icon icon-link"></span></a>PromptWithCallbacks</h2>
|
||||
<p>The <code>PromptWithCallbacks</code> method provides real-time visibility into tool calls and streaming output:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">response, err </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PromptWithCallbacks</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx,</span></span>
|
||||
<span class="line"><span style="color:#032F62;--shiki-dark:#9ECBFF"> "List files in current directory"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">name</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">args</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Called when the model invokes a tool</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Calling tool:"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, name)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">name</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">args</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">result</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">isError</span><span style="color:#D73A49;--shiki-dark:#F97583"> bool</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Called when a tool returns its result</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> if</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> isError {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Tool failed:"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, name)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">chunk</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Called for each streaming text chunk</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Print</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(chunk)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
|
||||
<h3 id="callback-signatures"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#callback-signatures"><span class="icon icon-link"></span></a>Callback signatures</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Callback</th>
|
||||
<th>Signature</th>
|
||||
<th>When</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>onToolCall</code></td>
|
||||
<td><code>func(name, args string)</code></td>
|
||||
<td>Model requests a tool call</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>onToolResult</code></td>
|
||||
<td><code>func(name, args, result string, isError bool)</code></td>
|
||||
<td>Tool execution completes</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>onStreaming</code></td>
|
||||
<td><code>func(chunk string)</code></td>
|
||||
<td>Streaming text chunk received</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Any callback can be <code>nil</code> if you don't need it:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Only care about streaming output</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">response, err </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PromptWithCallbacks</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Hello"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">nil</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">nil</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">chunk</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Print</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(chunk)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="event-based-monitoring"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#event-based-monitoring"><span class="icon icon-link"></span></a>Event-based monitoring</h2>
|
||||
<p>For more granular control, use the event subscription API:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Subscribe returns an unsubscribe function</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">unsub </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnToolCall</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">event</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ToolCallEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Printf</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Tool: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">%s</span><span style="color:#032F62;--shiki-dark:#9ECBFF">, Args: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">%s\\n</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, event.Name, event.Args)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">defer</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> unsub</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">unsub2 </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnToolResult</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">event</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ToolResultEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Printf</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Result: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">%s</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> (error: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">%v</span><span style="color:#032F62;--shiki-dark:#9ECBFF">)</span><span style="color:#005CC5;--shiki-dark:#79B8FF">\\n</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, event.Name, event.IsError)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">defer</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> unsub2</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">unsub3 </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnStreaming</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">event</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">MessageUpdateEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Print</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(event.Chunk)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">defer</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> unsub3</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">unsub4 </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnResponse</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">event</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ResponseEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Final response received"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">defer</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> unsub4</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">unsub5 </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnTurnStart</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">event</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">TurnStartEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Turn started"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">defer</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> unsub5</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">unsub6 </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnTurnEnd</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">event</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">TurnEndEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Turn ended"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">defer</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> unsub6</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span></code></pre>
|
||||
<h2 id="hook-system"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#hook-system"><span class="icon icon-link"></span></a>Hook system</h2>
|
||||
<p>Hooks allow you to intercept and modify behavior. Unlike events, hooks can modify or cancel operations:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Intercept tool calls before execution</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnBeforeToolCall</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#005CC5;--shiki-dark:#79B8FF">0</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">name</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">args</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) (</span><span style="color:#D73A49;--shiki-dark:#F97583">string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#D73A49;--shiki-dark:#F97583">error</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> if</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> name </span><span style="color:#D73A49;--shiki-dark:#F97583">==</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "bash"</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> log.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Bash command:"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, args)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> return</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> args, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">nil</span><span style="color:#6A737D;--shiki-dark:#6A737D"> // return modified args or error to cancel</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Process results after tool execution</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnAfterToolResult</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#005CC5;--shiki-dark:#79B8FF">0</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">name</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">result</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) (</span><span style="color:#D73A49;--shiki-dark:#F97583">string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#D73A49;--shiki-dark:#F97583">error</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> return</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> result, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">nil</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Before/after each agent turn</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnBeforeTurn</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#005CC5;--shiki-dark:#79B8FF">0</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) </span><span style="color:#D73A49;--shiki-dark:#F97583">error</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> return</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> nil</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnAfterTurn</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#005CC5;--shiki-dark:#79B8FF">0</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) </span><span style="color:#D73A49;--shiki-dark:#F97583">error</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> return</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> nil</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<p>The first argument is a priority (lower = runs first).</p>`,headings:[{depth:2,text:"PromptWithCallbacks",id:"promptwithcallbacks"},{depth:3,text:"Callback signatures",id:"callback-signatures"},{depth:2,text:"Event-based monitoring",id:"event-based-monitoring"},{depth:2,text:"Hook system",id:"hook-system"}],raw:`
|
||||
# Callbacks
|
||||
|
||||
## PromptWithCallbacks
|
||||
|
||||
The \`PromptWithCallbacks\` method provides real-time visibility into tool calls and streaming output:
|
||||
|
||||
\`\`\`go
|
||||
response, err := host.PromptWithCallbacks(
|
||||
ctx,
|
||||
"List files in current directory",
|
||||
func(name, args string) {
|
||||
// Called when the model invokes a tool
|
||||
fmt.Println("Calling tool:", name)
|
||||
},
|
||||
func(name, args, result string, isError bool) {
|
||||
// Called when a tool returns its result
|
||||
if isError {
|
||||
fmt.Println("Tool failed:", name)
|
||||
}
|
||||
},
|
||||
func(chunk string) {
|
||||
// Called for each streaming text chunk
|
||||
fmt.Print(chunk)
|
||||
},
|
||||
)
|
||||
\`\`\`
|
||||
|
||||
### Callback signatures
|
||||
|
||||
| Callback | Signature | When |
|
||||
|----------|-----------|------|
|
||||
| \`onToolCall\` | \`func(name, args string)\` | Model requests a tool call |
|
||||
| \`onToolResult\` | \`func(name, args, result string, isError bool)\` | Tool execution completes |
|
||||
| \`onStreaming\` | \`func(chunk string)\` | Streaming text chunk received |
|
||||
|
||||
Any callback can be \`nil\` if you don't need it:
|
||||
|
||||
\`\`\`go
|
||||
// Only care about streaming output
|
||||
response, err := host.PromptWithCallbacks(ctx, "Hello", nil, nil, func(chunk string) {
|
||||
fmt.Print(chunk)
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Event-based monitoring
|
||||
|
||||
For more granular control, use the event subscription API:
|
||||
|
||||
\`\`\`go
|
||||
// Subscribe returns an unsubscribe function
|
||||
unsub := host.OnToolCall(func(event kit.ToolCallEvent) {
|
||||
fmt.Printf("Tool: %s, Args: %s\\n", event.Name, event.Args)
|
||||
})
|
||||
defer unsub()
|
||||
|
||||
unsub2 := host.OnToolResult(func(event kit.ToolResultEvent) {
|
||||
fmt.Printf("Result: %s (error: %v)\\n", event.Name, event.IsError)
|
||||
})
|
||||
defer unsub2()
|
||||
|
||||
unsub3 := host.OnStreaming(func(event kit.MessageUpdateEvent) {
|
||||
fmt.Print(event.Chunk)
|
||||
})
|
||||
defer unsub3()
|
||||
|
||||
unsub4 := host.OnResponse(func(event kit.ResponseEvent) {
|
||||
fmt.Println("Final response received")
|
||||
})
|
||||
defer unsub4()
|
||||
|
||||
unsub5 := host.OnTurnStart(func(event kit.TurnStartEvent) {
|
||||
fmt.Println("Turn started")
|
||||
})
|
||||
defer unsub5()
|
||||
|
||||
unsub6 := host.OnTurnEnd(func(event kit.TurnEndEvent) {
|
||||
fmt.Println("Turn ended")
|
||||
})
|
||||
defer unsub6()
|
||||
\`\`\`
|
||||
|
||||
## Hook system
|
||||
|
||||
Hooks allow you to intercept and modify behavior. Unlike events, hooks can modify or cancel operations:
|
||||
|
||||
\`\`\`go
|
||||
// Intercept tool calls before execution
|
||||
host.OnBeforeToolCall(0, func(ctx context.Context, name string, args string) (string, error) {
|
||||
if name == "bash" {
|
||||
log.Println("Bash command:", args)
|
||||
}
|
||||
return args, nil // return modified args or error to cancel
|
||||
})
|
||||
|
||||
// Process results after tool execution
|
||||
host.OnAfterToolResult(0, func(ctx context.Context, name string, result string) (string, error) {
|
||||
return result, nil
|
||||
})
|
||||
|
||||
// Before/after each agent turn
|
||||
host.OnBeforeTurn(0, func(ctx context.Context) error {
|
||||
return nil
|
||||
})
|
||||
|
||||
host.OnAfterTurn(0, func(ctx context.Context) error {
|
||||
return nil
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
The first argument is a priority (lower = runs first).
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,485 @@
|
||||
const s={frontmatter:{title:"Capabilities",description:"All extension capabilities — lifecycle events, tools, commands, widgets, and more.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="extension-capabilities"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#extension-capabilities"><span class="icon icon-link"></span></a>Extension Capabilities</h1>
|
||||
<h2 id="lifecycle-events"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#lifecycle-events"><span class="icon icon-link"></span></a>Lifecycle events</h2>
|
||||
<p>Extensions can hook into 18 lifecycle events:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Event</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>OnSessionStart</code></td>
|
||||
<td>Session initialized</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnSessionShutdown</code></td>
|
||||
<td>Session ending</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnBeforeAgentStart</code></td>
|
||||
<td>Before the agent loop begins</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnAgentStart</code></td>
|
||||
<td>Agent loop started</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnAgentEnd</code></td>
|
||||
<td>Agent loop completed</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnToolCall</code></td>
|
||||
<td>Tool call requested by the model</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnToolExecutionStart</code></td>
|
||||
<td>Tool execution beginning</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnToolExecutionEnd</code></td>
|
||||
<td>Tool execution completed</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnToolResult</code></td>
|
||||
<td>Tool result returned</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnInput</code></td>
|
||||
<td>User input received</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnMessageStart</code></td>
|
||||
<td>Assistant message started</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnMessageUpdate</code></td>
|
||||
<td>Streaming text chunk received</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnMessageEnd</code></td>
|
||||
<td>Assistant message completed</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnModelChange</code></td>
|
||||
<td>Model switched</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnContextPrepare</code></td>
|
||||
<td>Context being assembled for the model</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnBeforeFork</code></td>
|
||||
<td>Before forking a conversation branch</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnBeforeSessionSwitch</code></td>
|
||||
<td>Before switching sessions</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>OnBeforeCompact</code></td>
|
||||
<td>Before conversation compaction</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="example"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#example"><span class="icon icon-link"></span></a>Example</h3>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnToolCall</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">event</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ToolCallEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PrintInfo</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Calling tool: "</span><span style="color:#D73A49;--shiki-dark:#F97583"> +</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> event.Name)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnAgentEnd</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">_</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">AgentEndEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PrintInfo</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Agent finished"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="tools"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#tools"><span class="icon icon-link"></span></a>Tools</h2>
|
||||
<p>Register custom tools that the LLM can invoke:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">RegisterTool</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ToolDef</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Name: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"weather"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Description: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Get current weather for a location"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Parameters: </span><span style="color:#D73A49;--shiki-dark:#F97583">map</span><span style="color:#24292E;--shiki-dark:#E1E4E8">[</span><span style="color:#D73A49;--shiki-dark:#F97583">string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">]</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ParameterDef</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#032F62;--shiki-dark:#9ECBFF"> "city"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: {Type: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"string"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, Description: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"City name"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, Required: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span><span style="color:#24292E;--shiki-dark:#E1E4E8">},</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Handler: </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">params</span><span style="color:#D73A49;--shiki-dark:#F97583"> map</span><span style="color:#24292E;--shiki-dark:#E1E4E8">[</span><span style="color:#D73A49;--shiki-dark:#F97583">string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">]</span><span style="color:#6F42C1;--shiki-dark:#B392F0">any</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) (</span><span style="color:#D73A49;--shiki-dark:#F97583">string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#D73A49;--shiki-dark:#F97583">error</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> city </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> params[</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"city"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">].(</span><span style="color:#D73A49;--shiki-dark:#F97583">string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> return</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "Sunny, 72°F in "</span><span style="color:#D73A49;--shiki-dark:#F97583"> +</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> city, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">nil</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="commands"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#commands"><span class="icon icon-link"></span></a>Commands</h2>
|
||||
<p>Register slash commands that users can invoke directly:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">RegisterCommand</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">CommandDef</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Name: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"stats"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Description: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Show context statistics"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Handler: </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">args</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> stats </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">GetContextStats</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PrintInfo</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Sprintf</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Tokens: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">%d</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, stats.TotalTokens))</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="widgets"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#widgets"><span class="icon icon-link"></span></a>Widgets</h2>
|
||||
<p>Add persistent status displays above or below the input area:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SetWidget</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">WidgetConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ID: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"token-count"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Position: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"bottom"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Content: </span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">WidgetContent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{Text: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Tokens: 1,234"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">},</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Update later</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SetWidget</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">WidgetConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ID: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"token-count"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Position: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"bottom"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Content: </span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">WidgetContent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{Text: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Tokens: 2,456"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">},</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Remove</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">RemoveWidget</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"token-count"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
|
||||
<h2 id="headers-and-footers"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#headers-and-footers"><span class="icon icon-link"></span></a>Headers and footers</h2>
|
||||
<p>Persistent content above and below the conversation:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SetHeader</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">HeaderFooterConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Content: </span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">WidgetContent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{Text: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Project: my-app | Branch: main"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">},</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SetFooter</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">HeaderFooterConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Content: </span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">WidgetContent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{Text: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Plan Mode (read-only)"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">},</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="status-bar"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#status-bar"><span class="icon icon-link"></span></a>Status bar</h2>
|
||||
<p>Custom status bar entries:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SetStatus</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"mode"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Planning"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">RemoveStatus</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"mode"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
|
||||
<h2 id="shortcuts"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#shortcuts"><span class="icon icon-link"></span></a>Shortcuts</h2>
|
||||
<p>Global keyboard shortcuts:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">RegisterShortcut</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ShortcutDef</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Key: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"ctrl+t"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Description: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Toggle plan mode"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">}, </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // handle shortcut</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="overlays"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#overlays"><span class="icon icon-link"></span></a>Overlays</h2>
|
||||
<p>Modal dialogs with markdown content:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ShowOverlay</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OverlayConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Title: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Help"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Content: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"# Keyboard Shortcuts</span><span style="color:#005CC5;--shiki-dark:#79B8FF">\\n\\n</span><span style="color:#032F62;--shiki-dark:#9ECBFF">- **ctrl+t** — Toggle plan mode</span><span style="color:#005CC5;--shiki-dark:#79B8FF">\\n</span><span style="color:#032F62;--shiki-dark:#9ECBFF">- **ctrl+s** — Save session"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="tool-renderers"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#tool-renderers"><span class="icon icon-link"></span></a>Tool renderers</h2>
|
||||
<p>Customize how specific tool calls are displayed in the TUI:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">RegisterToolRenderer</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ToolRenderConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ToolName: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"bash"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Render: </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">name</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">args</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">result</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">isError</span><span style="color:#D73A49;--shiki-dark:#F97583"> bool</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) </span><span style="color:#D73A49;--shiki-dark:#F97583">string</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> return</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "$ "</span><span style="color:#D73A49;--shiki-dark:#F97583"> +</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> args </span><span style="color:#D73A49;--shiki-dark:#F97583">+</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="color:#005CC5;--shiki-dark:#79B8FF">\\n</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span><span style="color:#D73A49;--shiki-dark:#F97583"> +</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> result</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="message-renderers"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#message-renderers"><span class="icon icon-link"></span></a>Message renderers</h2>
|
||||
<p>Custom rendering for assistant messages:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">RegisterMessageRenderer</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">MessageRendererConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Name: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"custom"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Render: </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">content</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) </span><span style="color:#D73A49;--shiki-dark:#F97583">string</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> return</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ">> "</span><span style="color:#D73A49;--shiki-dark:#F97583"> +</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> content</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="editor-interceptors"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#editor-interceptors"><span class="icon icon-link"></span></a>Editor interceptors</h2>
|
||||
<p>Handle key events and wrap the editor's rendering:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SetEditor</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">EditorConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> HandleKey: </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">key</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">text</span><span style="color:#D73A49;--shiki-dark:#F97583"> string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) </span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">EditorKeyAction</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> if</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> key </span><span style="color:#D73A49;--shiki-dark:#F97583">==</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "escape"</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> return</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">EditorKeyAction</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{Handled: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span><span style="color:#24292E;--shiki-dark:#E1E4E8">}</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> return</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">EditorKeyAction</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{Handled: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">false</span><span style="color:#24292E;--shiki-dark:#E1E4E8">}</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="interactive-prompts"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#interactive-prompts"><span class="icon icon-link"></span></a>Interactive prompts</h2>
|
||||
<p>Select, confirm, input, and multi-select dialogs:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Single select</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">response </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PromptSelect</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PromptSelectConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Title: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Choose a model"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Options: []</span><span style="color:#D73A49;--shiki-dark:#F97583">string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"claude-sonnet"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"gpt-4o"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"llama3"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">},</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Confirm</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">confirmed </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PromptConfirm</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PromptConfirmConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Title: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Delete this file?"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Text input</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">name </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PromptInput</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PromptInputConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Title: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Enter project name"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Placeholder: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"my-project"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="options"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#options"><span class="icon icon-link"></span></a>Options</h2>
|
||||
<p>Register configurable extension options:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">RegisterOption</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OptionDef</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Name: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"auto-commit"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Description: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Automatically commit on shutdown"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> DefaultValue: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"false"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="subagents"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#subagents"><span class="icon icon-link"></span></a>Subagents</h2>
|
||||
<p>Spawn in-process child Kit instances:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">result </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SpawnSubagent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SubagentConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Task: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Analyze the test files and summarize coverage"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Model: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"anthropic/claude-haiku-3-5-20241022"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> SystemPrompt: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"You are a test analysis expert."</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="llm-completion"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#llm-completion"><span class="icon icon-link"></span></a>LLM completion</h2>
|
||||
<p>Make direct model calls without going through the agent loop:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">response </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Complete</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">CompleteRequest</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Prompt: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Summarize this in one sentence: "</span><span style="color:#D73A49;--shiki-dark:#F97583"> +</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> content,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="custom-events"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#custom-events"><span class="icon icon-link"></span></a>Custom events</h2>
|
||||
<p>Inter-extension communication:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Emit</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">EmitCustomEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"my-extension:data-ready"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, payload)</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Listen</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnCustomEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"my-extension:data-ready"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">data</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> any</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // handle event</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>`,headings:[{depth:2,text:"Lifecycle events",id:"lifecycle-events"},{depth:3,text:"Example",id:"example"},{depth:2,text:"Tools",id:"tools"},{depth:2,text:"Commands",id:"commands"},{depth:2,text:"Widgets",id:"widgets"},{depth:2,text:"Headers and footers",id:"headers-and-footers"},{depth:2,text:"Status bar",id:"status-bar"},{depth:2,text:"Shortcuts",id:"shortcuts"},{depth:2,text:"Overlays",id:"overlays"},{depth:2,text:"Tool renderers",id:"tool-renderers"},{depth:2,text:"Message renderers",id:"message-renderers"},{depth:2,text:"Editor interceptors",id:"editor-interceptors"},{depth:2,text:"Interactive prompts",id:"interactive-prompts"},{depth:2,text:"Options",id:"options"},{depth:2,text:"Subagents",id:"subagents"},{depth:2,text:"LLM completion",id:"llm-completion"},{depth:2,text:"Custom events",id:"custom-events"}],raw:`
|
||||
# Extension Capabilities
|
||||
|
||||
## Lifecycle events
|
||||
|
||||
Extensions can hook into 18 lifecycle events:
|
||||
|
||||
| Event | Description |
|
||||
|-------|-------------|
|
||||
| \`OnSessionStart\` | Session initialized |
|
||||
| \`OnSessionShutdown\` | Session ending |
|
||||
| \`OnBeforeAgentStart\` | Before the agent loop begins |
|
||||
| \`OnAgentStart\` | Agent loop started |
|
||||
| \`OnAgentEnd\` | Agent loop completed |
|
||||
| \`OnToolCall\` | Tool call requested by the model |
|
||||
| \`OnToolExecutionStart\` | Tool execution beginning |
|
||||
| \`OnToolExecutionEnd\` | Tool execution completed |
|
||||
| \`OnToolResult\` | Tool result returned |
|
||||
| \`OnInput\` | User input received |
|
||||
| \`OnMessageStart\` | Assistant message started |
|
||||
| \`OnMessageUpdate\` | Streaming text chunk received |
|
||||
| \`OnMessageEnd\` | Assistant message completed |
|
||||
| \`OnModelChange\` | Model switched |
|
||||
| \`OnContextPrepare\` | Context being assembled for the model |
|
||||
| \`OnBeforeFork\` | Before forking a conversation branch |
|
||||
| \`OnBeforeSessionSwitch\` | Before switching sessions |
|
||||
| \`OnBeforeCompact\` | Before conversation compaction |
|
||||
|
||||
### Example
|
||||
|
||||
\`\`\`go
|
||||
api.OnToolCall(func(event ext.ToolCallEvent, ctx ext.Context) {
|
||||
ctx.PrintInfo("Calling tool: " + event.Name)
|
||||
})
|
||||
|
||||
api.OnAgentEnd(func(_ ext.AgentEndEvent, ctx ext.Context) {
|
||||
ctx.PrintInfo("Agent finished")
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Tools
|
||||
|
||||
Register custom tools that the LLM can invoke:
|
||||
|
||||
\`\`\`go
|
||||
api.RegisterTool(ext.ToolDef{
|
||||
Name: "weather",
|
||||
Description: "Get current weather for a location",
|
||||
Parameters: map[string]ext.ParameterDef{
|
||||
"city": {Type: "string", Description: "City name", Required: true},
|
||||
},
|
||||
Handler: func(ctx ext.Context, params map[string]any) (string, error) {
|
||||
city := params["city"].(string)
|
||||
return "Sunny, 72°F in " + city, nil
|
||||
},
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Commands
|
||||
|
||||
Register slash commands that users can invoke directly:
|
||||
|
||||
\`\`\`go
|
||||
api.RegisterCommand(ext.CommandDef{
|
||||
Name: "stats",
|
||||
Description: "Show context statistics",
|
||||
Handler: func(ctx ext.Context, args string) {
|
||||
stats := ctx.GetContextStats()
|
||||
ctx.PrintInfo(fmt.Sprintf("Tokens: %d", stats.TotalTokens))
|
||||
},
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Widgets
|
||||
|
||||
Add persistent status displays above or below the input area:
|
||||
|
||||
\`\`\`go
|
||||
ctx.SetWidget(ext.WidgetConfig{
|
||||
ID: "token-count",
|
||||
Position: "bottom",
|
||||
Content: ext.WidgetContent{Text: "Tokens: 1,234"},
|
||||
})
|
||||
|
||||
// Update later
|
||||
ctx.SetWidget(ext.WidgetConfig{
|
||||
ID: "token-count",
|
||||
Position: "bottom",
|
||||
Content: ext.WidgetContent{Text: "Tokens: 2,456"},
|
||||
})
|
||||
|
||||
// Remove
|
||||
ctx.RemoveWidget("token-count")
|
||||
\`\`\`
|
||||
|
||||
## Headers and footers
|
||||
|
||||
Persistent content above and below the conversation:
|
||||
|
||||
\`\`\`go
|
||||
ctx.SetHeader(ext.HeaderFooterConfig{
|
||||
Content: ext.WidgetContent{Text: "Project: my-app | Branch: main"},
|
||||
})
|
||||
|
||||
ctx.SetFooter(ext.HeaderFooterConfig{
|
||||
Content: ext.WidgetContent{Text: "Plan Mode (read-only)"},
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Status bar
|
||||
|
||||
Custom status bar entries:
|
||||
|
||||
\`\`\`go
|
||||
ctx.SetStatus("mode", "Planning")
|
||||
ctx.RemoveStatus("mode")
|
||||
\`\`\`
|
||||
|
||||
## Shortcuts
|
||||
|
||||
Global keyboard shortcuts:
|
||||
|
||||
\`\`\`go
|
||||
api.RegisterShortcut(ext.ShortcutDef{
|
||||
Key: "ctrl+t",
|
||||
Description: "Toggle plan mode",
|
||||
}, func(ctx ext.Context) {
|
||||
// handle shortcut
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Overlays
|
||||
|
||||
Modal dialogs with markdown content:
|
||||
|
||||
\`\`\`go
|
||||
ctx.ShowOverlay(ext.OverlayConfig{
|
||||
Title: "Help",
|
||||
Content: "# Keyboard Shortcuts\\n\\n- **ctrl+t** — Toggle plan mode\\n- **ctrl+s** — Save session",
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Tool renderers
|
||||
|
||||
Customize how specific tool calls are displayed in the TUI:
|
||||
|
||||
\`\`\`go
|
||||
api.RegisterToolRenderer(ext.ToolRenderConfig{
|
||||
ToolName: "bash",
|
||||
Render: func(name, args, result string, isError bool) string {
|
||||
return "$ " + args + "\\n" + result
|
||||
},
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Message renderers
|
||||
|
||||
Custom rendering for assistant messages:
|
||||
|
||||
\`\`\`go
|
||||
api.RegisterMessageRenderer(ext.MessageRendererConfig{
|
||||
Name: "custom",
|
||||
Render: func(content string) string {
|
||||
return ">> " + content
|
||||
},
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Editor interceptors
|
||||
|
||||
Handle key events and wrap the editor's rendering:
|
||||
|
||||
\`\`\`go
|
||||
ctx.SetEditor(ext.EditorConfig{
|
||||
HandleKey: func(key, text string) ext.EditorKeyAction {
|
||||
if key == "escape" {
|
||||
return ext.EditorKeyAction{Handled: true}
|
||||
}
|
||||
return ext.EditorKeyAction{Handled: false}
|
||||
},
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Interactive prompts
|
||||
|
||||
Select, confirm, input, and multi-select dialogs:
|
||||
|
||||
\`\`\`go
|
||||
// Single select
|
||||
response := ctx.PromptSelect(ext.PromptSelectConfig{
|
||||
Title: "Choose a model",
|
||||
Options: []string{"claude-sonnet", "gpt-4o", "llama3"},
|
||||
})
|
||||
|
||||
// Confirm
|
||||
confirmed := ctx.PromptConfirm(ext.PromptConfirmConfig{
|
||||
Title: "Delete this file?",
|
||||
})
|
||||
|
||||
// Text input
|
||||
name := ctx.PromptInput(ext.PromptInputConfig{
|
||||
Title: "Enter project name",
|
||||
Placeholder: "my-project",
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Options
|
||||
|
||||
Register configurable extension options:
|
||||
|
||||
\`\`\`go
|
||||
api.RegisterOption(ext.OptionDef{
|
||||
Name: "auto-commit",
|
||||
Description: "Automatically commit on shutdown",
|
||||
DefaultValue: "false",
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Subagents
|
||||
|
||||
Spawn in-process child Kit instances:
|
||||
|
||||
\`\`\`go
|
||||
result := ctx.SpawnSubagent(ext.SubagentConfig{
|
||||
Task: "Analyze the test files and summarize coverage",
|
||||
Model: "anthropic/claude-haiku-3-5-20241022",
|
||||
SystemPrompt: "You are a test analysis expert.",
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## LLM completion
|
||||
|
||||
Make direct model calls without going through the agent loop:
|
||||
|
||||
\`\`\`go
|
||||
response := ctx.Complete(ext.CompleteRequest{
|
||||
Prompt: "Summarize this in one sentence: " + content,
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Custom events
|
||||
|
||||
Inter-extension communication:
|
||||
|
||||
\`\`\`go
|
||||
// Emit
|
||||
ctx.EmitCustomEvent("my-extension:data-ready", payload)
|
||||
|
||||
// Listen
|
||||
api.OnCustomEvent("my-extension:data-ready", func(data any, ctx ext.Context) {
|
||||
// handle event
|
||||
})
|
||||
\`\`\`
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,95 @@
|
||||
const s={frontmatter:{title:"Commands",description:"Complete reference for all Kit CLI subcommands.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="commands"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#commands"><span class="icon icon-link"></span></a>Commands</h1>
|
||||
<h2 id="authentication"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#authentication"><span class="icon icon-link"></span></a>Authentication</h2>
|
||||
<p>For OAuth-enabled providers like Anthropic.</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> auth</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> login</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> [provider] </span><span style="color:#6A737D;--shiki-dark:#6A737D"># Start OAuth flow (e.g., anthropic)</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> auth</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> logout</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> [provider] </span><span style="color:#6A737D;--shiki-dark:#6A737D"># Remove credentials for provider</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> auth</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> status</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Check authentication status</span></span></code></pre>
|
||||
<h2 id="model-database"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#model-database"><span class="icon icon-link"></span></a>Model database</h2>
|
||||
<p>Manage the local model database that maps provider names to API configurations.</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> models</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> [provider] </span><span style="color:#6A737D;--shiki-dark:#6A737D"># List available models (optionally filter by provider)</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> models</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --all</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Show all providers (not just Fantasy-compatible)</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> update-models</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> [source] </span><span style="color:#6A737D;--shiki-dark:#6A737D"># Update model database</span></span></code></pre>
|
||||
<p>The <code>update-models</code> command accepts an optional source argument:</p>
|
||||
<ul>
|
||||
<li><em>(none)</em> — update from <a href="https://models.dev">models.dev</a></li>
|
||||
<li>A URL — fetch from a custom endpoint</li>
|
||||
<li>A file path — load from a local file</li>
|
||||
<li><code>embedded</code> — reset to the bundled database</li>
|
||||
</ul>
|
||||
<h2 id="extension-management"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#extension-management"><span class="icon icon-link"></span></a>Extension management</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> extensions</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> list</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # List discovered extensions</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> extensions</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> validate</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Validate extension files</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> extensions</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> init</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Generate example extension template</span></span></code></pre>
|
||||
<h3 id="installing-extensions-from-git"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#installing-extensions-from-git"><span class="icon icon-link"></span></a>Installing extensions from git</h3>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#D73A49;--shiki-dark:#F97583"> <</span><span style="color:#032F62;--shiki-dark:#9ECBFF">git-ur</span><span style="color:#24292E;--shiki-dark:#E1E4E8">l</span><span style="color:#D73A49;--shiki-dark:#F97583">></span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Install extensions from git repositories</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -l</span><span style="color:#D73A49;--shiki-dark:#F97583"> <</span><span style="color:#032F62;--shiki-dark:#9ECBFF">git-ur</span><span style="color:#24292E;--shiki-dark:#E1E4E8">l</span><span style="color:#D73A49;--shiki-dark:#F97583">></span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Install to project-local .kit/git/ directory</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -u</span><span style="color:#D73A49;--shiki-dark:#F97583"> <</span><span style="color:#032F62;--shiki-dark:#9ECBFF">git-ur</span><span style="color:#24292E;--shiki-dark:#E1E4E8">l</span><span style="color:#D73A49;--shiki-dark:#F97583">></span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Update an already-installed package</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --uninstall</span><span style="color:#D73A49;--shiki-dark:#F97583"> <</span><span style="color:#032F62;--shiki-dark:#9ECBFF">pk</span><span style="color:#24292E;--shiki-dark:#E1E4E8">g</span><span style="color:#D73A49;--shiki-dark:#F97583">></span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Remove an installed package</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --all</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Install all extensions without prompting</span></span></code></pre>
|
||||
<h2 id="skills"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#skills"><span class="icon icon-link"></span></a>Skills</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> skill</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Install the Kit extensions skill via skills.sh</span></span></code></pre>
|
||||
<h2 id="acp-server"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#acp-server"><span class="icon icon-link"></span></a>ACP server</h2>
|
||||
<p>Run Kit as an <a href="https://agentclientprotocol.com">ACP (Agent Client Protocol)</a> agent server. ACP-compatible clients communicate with Kit over JSON-RPC 2.0 on stdin/stdout.</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> acp</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Start as ACP agent</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> acp</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --debug</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # With debug logging to stderr</span></span></code></pre>`,headings:[{depth:2,text:"Authentication",id:"authentication"},{depth:2,text:"Model database",id:"model-database"},{depth:2,text:"Extension management",id:"extension-management"},{depth:3,text:"Installing extensions from git",id:"installing-extensions-from-git"},{depth:2,text:"Skills",id:"skills"},{depth:2,text:"ACP server",id:"acp-server"}],raw:`
|
||||
# Commands
|
||||
|
||||
## Authentication
|
||||
|
||||
For OAuth-enabled providers like Anthropic.
|
||||
|
||||
\`\`\`bash
|
||||
kit auth login [provider] # Start OAuth flow (e.g., anthropic)
|
||||
kit auth logout [provider] # Remove credentials for provider
|
||||
kit auth status # Check authentication status
|
||||
\`\`\`
|
||||
|
||||
## Model database
|
||||
|
||||
Manage the local model database that maps provider names to API configurations.
|
||||
|
||||
\`\`\`bash
|
||||
kit models [provider] # List available models (optionally filter by provider)
|
||||
kit models --all # Show all providers (not just Fantasy-compatible)
|
||||
kit update-models [source] # Update model database
|
||||
\`\`\`
|
||||
|
||||
The \`update-models\` command accepts an optional source argument:
|
||||
- *(none)* — update from [models.dev](https://models.dev)
|
||||
- A URL — fetch from a custom endpoint
|
||||
- A file path — load from a local file
|
||||
- \`embedded\` — reset to the bundled database
|
||||
|
||||
## Extension management
|
||||
|
||||
\`\`\`bash
|
||||
kit extensions list # List discovered extensions
|
||||
kit extensions validate # Validate extension files
|
||||
kit extensions init # Generate example extension template
|
||||
\`\`\`
|
||||
|
||||
### Installing extensions from git
|
||||
|
||||
\`\`\`bash
|
||||
kit install <git-url> # Install extensions from git repositories
|
||||
kit install -l <git-url> # Install to project-local .kit/git/ directory
|
||||
kit install -u <git-url> # Update an already-installed package
|
||||
kit install --uninstall <pkg> # Remove an installed package
|
||||
kit install --all # Install all extensions without prompting
|
||||
\`\`\`
|
||||
|
||||
## Skills
|
||||
|
||||
\`\`\`bash
|
||||
kit skill # Install the Kit extensions skill via skills.sh
|
||||
\`\`\`
|
||||
|
||||
## ACP server
|
||||
|
||||
Run Kit as an [ACP (Agent Client Protocol)](https://agentclientprotocol.com) agent server. ACP-compatible clients communicate with Kit over JSON-RPC 2.0 on stdin/stdout.
|
||||
|
||||
\`\`\`bash
|
||||
kit acp # Start as ACP agent
|
||||
kit acp --debug # With debug logging to stderr
|
||||
\`\`\`
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,195 @@
|
||||
const n={frontmatter:{title:"Configuration",description:"Configure Kit using config files, environment variables, and CLI flags.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="configuration"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#configuration"><span class="icon icon-link"></span></a>Configuration</h1>
|
||||
<p>Kit looks for configuration in the following locations, in order of priority:</p>
|
||||
<ol>
|
||||
<li>CLI flags</li>
|
||||
<li>Environment variables (with <code>KIT_</code> prefix)</li>
|
||||
<li><code>./.kit.yml</code> / <code>./.kit.yaml</code> / <code>./.kit.json</code> (project-local)</li>
|
||||
<li><code>~/.kit.yml</code> / <code>~/.kit.yaml</code> / <code>~/.kit.json</code> (global)</li>
|
||||
</ol>
|
||||
<h2 id="basic-configuration"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#basic-configuration"><span class="icon icon-link"></span></a>Basic configuration</h2>
|
||||
<p>Create <code>~/.kit.yml</code>:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#22863A;--shiki-dark:#85E89D">model</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">anthropic/claude-sonnet-4-5-20250929</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D">max-tokens</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">4096</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D">temperature</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">0.7</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D">stream</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span></span></code></pre>
|
||||
<h2 id="all-configuration-keys"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#all-configuration-keys"><span class="icon icon-link"></span></a>All configuration keys</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Key</th>
|
||||
<th>Type</th>
|
||||
<th>Default</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>model</code></td>
|
||||
<td>string</td>
|
||||
<td><code>anthropic/claude-sonnet-4-5-20250929</code></td>
|
||||
<td>Model to use (provider/model format)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>max-tokens</code></td>
|
||||
<td>int</td>
|
||||
<td><code>4096</code></td>
|
||||
<td>Maximum tokens in response</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>temperature</code></td>
|
||||
<td>float</td>
|
||||
<td><code>0.7</code></td>
|
||||
<td>Randomness 0.0–1.0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>top-p</code></td>
|
||||
<td>float</td>
|
||||
<td><code>0.95</code></td>
|
||||
<td>Nucleus sampling 0.0–1.0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>top-k</code></td>
|
||||
<td>int</td>
|
||||
<td><code>40</code></td>
|
||||
<td>Limit top K tokens</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>stream</code></td>
|
||||
<td>bool</td>
|
||||
<td><code>true</code></td>
|
||||
<td>Enable streaming output</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>debug</code></td>
|
||||
<td>bool</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Enable debug logging</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>compact</code></td>
|
||||
<td>bool</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Enable compact output mode</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>system-prompt</code></td>
|
||||
<td>string</td>
|
||||
<td>—</td>
|
||||
<td>System prompt text or file path</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>max-steps</code></td>
|
||||
<td>int</td>
|
||||
<td><code>0</code></td>
|
||||
<td>Maximum agent steps (0 = unlimited)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>thinking-level</code></td>
|
||||
<td>string</td>
|
||||
<td><code>off</code></td>
|
||||
<td>Extended thinking: off, minimal, low, medium, high</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>provider-api-key</code></td>
|
||||
<td>string</td>
|
||||
<td>—</td>
|
||||
<td>API key for the provider</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>provider-url</code></td>
|
||||
<td>string</td>
|
||||
<td>—</td>
|
||||
<td>Base URL for provider API</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>tls-skip-verify</code></td>
|
||||
<td>bool</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Skip TLS certificate verification</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>stop-sequences</code></td>
|
||||
<td>list</td>
|
||||
<td>—</td>
|
||||
<td>Custom stop sequences</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>theme</code></td>
|
||||
<td>string</td>
|
||||
<td>—</td>
|
||||
<td>UI theme</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>markdown-theme</code></td>
|
||||
<td>string</td>
|
||||
<td>—</td>
|
||||
<td>Markdown rendering theme</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="environment-variables"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#environment-variables"><span class="icon icon-link"></span></a>Environment variables</h2>
|
||||
<p>Any configuration key can be set via environment variable with the <code>KIT_</code> prefix. Hyphens become underscores:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> KIT_MODEL</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"openai/gpt-4o"</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> KIT_MAX_TOKENS</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"8192"</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> KIT_TEMPERATURE</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"0.5"</span></span></code></pre>
|
||||
<p>Provider API keys use their own environment variables:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> ANTHROPIC_API_KEY</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"sk-..."</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> OPENAI_API_KEY</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"sk-..."</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> GOOGLE_API_KEY</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"..."</span></span></code></pre>
|
||||
<h2 id="mcp-server-configuration"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#mcp-server-configuration"><span class="icon icon-link"></span></a>MCP server configuration</h2>
|
||||
<p>Add external MCP servers to your <code>.kit.yml</code>:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#22863A;--shiki-dark:#85E89D">mcpServers</span><span style="color:#24292E;--shiki-dark:#E1E4E8">:</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D"> filesystem</span><span style="color:#24292E;--shiki-dark:#E1E4E8">:</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D"> type</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">local</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D"> command</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"npx"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"-y"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"@modelcontextprotocol/server-filesystem"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"/path/to/allowed"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">]</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D"> environment</span><span style="color:#24292E;--shiki-dark:#E1E4E8">:</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D"> LOG_LEVEL</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"info"</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D"> allowedTools</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"read_file"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"write_file"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">]</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D"> excludedTools</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: [</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"delete_file"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">]</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D"> search</span><span style="color:#24292E;--shiki-dark:#E1E4E8">:</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D"> type</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">remote</span></span>
|
||||
<span class="line"><span style="color:#22863A;--shiki-dark:#85E89D"> url</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"https://mcp.example.com/search"</span></span></code></pre>
|
||||
<h3 id="mcp-server-fields"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#mcp-server-fields"><span class="icon icon-link"></span></a>MCP server fields</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Field</th>
|
||||
<th>Type</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>type</code></td>
|
||||
<td>string</td>
|
||||
<td><code>local</code> (stdio) or <code>remote</code> (streamable HTTP)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>command</code></td>
|
||||
<td>list</td>
|
||||
<td>Command and args for local servers</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>environment</code></td>
|
||||
<td>map</td>
|
||||
<td>Environment variables for the server process</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>url</code></td>
|
||||
<td>string</td>
|
||||
<td>URL for remote servers</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>allowedTools</code></td>
|
||||
<td>list</td>
|
||||
<td>Whitelist of tool names to expose</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>excludedTools</code></td>
|
||||
<td>list</td>
|
||||
<td>Blacklist of tool names to hide</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>A legacy format with <code>transport</code>, <code>args</code>, <code>env</code>, and <code>headers</code> fields is also supported.</p>`,headings:[{depth:2,text:"Basic configuration",id:"basic-configuration"},{depth:2,text:"All configuration keys",id:"all-configuration-keys"},{depth:2,text:"Environment variables",id:"environment-variables"},{depth:2,text:"MCP server configuration",id:"mcp-server-configuration"},{depth:3,text:"MCP server fields",id:"mcp-server-fields"}],raw:'\n# Configuration\n\nKit looks for configuration in the following locations, in order of priority:\n\n1. CLI flags\n2. Environment variables (with `KIT_` prefix)\n3. `./.kit.yml` / `./.kit.yaml` / `./.kit.json` (project-local)\n4. `~/.kit.yml` / `~/.kit.yaml` / `~/.kit.json` (global)\n\n## Basic configuration\n\nCreate `~/.kit.yml`:\n\n```yaml\nmodel: anthropic/claude-sonnet-4-5-20250929\nmax-tokens: 4096\ntemperature: 0.7\nstream: true\n```\n\n## All configuration keys\n\n| Key | Type | Default | Description |\n|-----|------|---------|-------------|\n| `model` | string | `anthropic/claude-sonnet-4-5-20250929` | Model to use (provider/model format) |\n| `max-tokens` | int | `4096` | Maximum tokens in response |\n| `temperature` | float | `0.7` | Randomness 0.0–1.0 |\n| `top-p` | float | `0.95` | Nucleus sampling 0.0–1.0 |\n| `top-k` | int | `40` | Limit top K tokens |\n| `stream` | bool | `true` | Enable streaming output |\n| `debug` | bool | `false` | Enable debug logging |\n| `compact` | bool | `false` | Enable compact output mode |\n| `system-prompt` | string | — | System prompt text or file path |\n| `max-steps` | int | `0` | Maximum agent steps (0 = unlimited) |\n| `thinking-level` | string | `off` | Extended thinking: off, minimal, low, medium, high |\n| `provider-api-key` | string | — | API key for the provider |\n| `provider-url` | string | — | Base URL for provider API |\n| `tls-skip-verify` | bool | `false` | Skip TLS certificate verification |\n| `stop-sequences` | list | — | Custom stop sequences |\n| `theme` | string | — | UI theme |\n| `markdown-theme` | string | — | Markdown rendering theme |\n\n## Environment variables\n\nAny configuration key can be set via environment variable with the `KIT_` prefix. Hyphens become underscores:\n\n```bash\nexport KIT_MODEL="openai/gpt-4o"\nexport KIT_MAX_TOKENS="8192"\nexport KIT_TEMPERATURE="0.5"\n```\n\nProvider API keys use their own environment variables:\n\n```bash\nexport ANTHROPIC_API_KEY="sk-..."\nexport OPENAI_API_KEY="sk-..."\nexport GOOGLE_API_KEY="..."\n```\n\n## MCP server configuration\n\nAdd external MCP servers to your `.kit.yml`:\n\n```yaml\nmcpServers:\n filesystem:\n type: local\n command: ["npx", "-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed"]\n environment:\n LOG_LEVEL: "info"\n allowedTools: ["read_file", "write_file"]\n excludedTools: ["delete_file"]\n\n search:\n type: remote\n url: "https://mcp.example.com/search"\n```\n\n### MCP server fields\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `type` | string | `local` (stdio) or `remote` (streamable HTTP) |\n| `command` | list | Command and args for local servers |\n| `environment` | map | Environment variables for the server process |\n| `url` | string | URL for remote servers |\n| `allowedTools` | list | Whitelist of tool names to expose |\n| `excludedTools` | list | Blacklist of tool names to hide |\n\nA legacy format with `transport`, `args`, `env`, and `headers` fields is also supported.\n'};export{n as default};
|
||||
@@ -0,0 +1,138 @@
|
||||
const e={frontmatter:{title:"Development",description:"Build, test, and contribute to Kit.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="development"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#development"><span class="icon icon-link"></span></a>Development</h1>
|
||||
<h2 id="build-and-test"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#build-and-test"><span class="icon icon-link"></span></a>Build and test</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Build</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> build</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -o</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> output/kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ./cmd/kit</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Run all tests</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> test</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -race</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ./...</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Run a specific test</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> test</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -race</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ./cmd</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -run</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> TestScriptExecution</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Lint</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> vet</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ./...</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Format</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> fmt</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ./...</span></span></code></pre>
|
||||
<h2 id="project-structure"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#project-structure"><span class="icon icon-link"></span></a>Project structure</h2>
|
||||
<pre><code>cmd/kit/ - CLI entry point (main.go)
|
||||
cmd/ - CLI command implementations (root, auth, models, etc.)
|
||||
pkg/kit/ - Go SDK for embedding Kit
|
||||
internal/app/ - Application orchestrator (agent loop, message store, queue)
|
||||
internal/agent/ - Agent execution and tool dispatch
|
||||
internal/auth/ - OAuth authentication and credential storage
|
||||
internal/acpserver/ - ACP (Agent Client Protocol) server
|
||||
internal/clipboard/ - Cross-platform clipboard operations
|
||||
internal/compaction/ - Conversation compaction and summarization
|
||||
internal/config/ - Configuration management
|
||||
internal/core/ - Built-in tools (bash, read, write, edit, grep, find, ls)
|
||||
internal/extensions/ - Yaegi extension system
|
||||
internal/kitsetup/ - Initial setup wizard
|
||||
internal/message/ - Message content types and structured content blocks
|
||||
internal/models/ - Provider and model management
|
||||
internal/session/ - Session persistence (tree-based JSONL)
|
||||
internal/skills/ - Skill loading and system prompt composition
|
||||
internal/tools/ - MCP tool integration
|
||||
internal/ui/ - Bubble Tea TUI components
|
||||
examples/extensions/ - Example extension files
|
||||
npm/ - NPM package wrapper for distribution
|
||||
</code></pre>
|
||||
<h2 id="architecture-overview"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#architecture-overview"><span class="icon icon-link"></span></a>Architecture overview</h2>
|
||||
<p>Kit is built around a few key architectural patterns:</p>
|
||||
<h3 id="multi-provider-llm-support"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#multi-provider-llm-support"><span class="icon icon-link"></span></a>Multi-provider LLM support</h3>
|
||||
<p>The <code>llm.Provider</code> interface abstracts different LLM providers. Each provider implements message formatting, tool calling, and streaming for its specific API.</p>
|
||||
<h3 id="mcp-client-server-model"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#mcp-client-server-model"><span class="icon icon-link"></span></a>MCP client-server model</h3>
|
||||
<p>External tools are integrated via the Model Context Protocol (MCP). Kit acts as an MCP client, connecting to MCP servers configured in <code>.kit.yml</code>.</p>
|
||||
<h3 id="extension-system"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#extension-system"><span class="icon icon-link"></span></a>Extension system</h3>
|
||||
<p>Extensions are Go source files interpreted at runtime by Yaegi. The <code>internal/extensions/</code> package manages loading, symbol export, and lifecycle dispatch. See the <a href="/extensions/overview">Extension System</a> docs for details.</p>
|
||||
<h3 id="tui-architecture"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#tui-architecture"><span class="icon icon-link"></span></a>TUI architecture</h3>
|
||||
<p>The interactive terminal UI is built with <a href="https://github.com/charmbracelet/bubbletea">Bubble Tea v2</a>, using a parent-child model where <code>AppModel</code> manages child components (<code>InputComponent</code>, <code>StreamComponent</code>, etc.).</p>
|
||||
<h3 id="decoupling-pattern"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#decoupling-pattern"><span class="icon icon-link"></span></a>Decoupling pattern</h3>
|
||||
<p><code>cmd/root.go</code> contains converter functions (e.g., <code>widgetProviderForUI()</code>) that bridge <code>internal/extensions/</code> types to <code>internal/ui/</code> types. The UI never imports the extensions package directly.</p>
|
||||
<h2 id="contributing"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#contributing"><span class="icon icon-link"></span></a>Contributing</h2>
|
||||
<p>Contributions are welcome! Please see the <a href="https://github.com/mark3labs/kit/blob/master/contribute/contribute.md">contribution guide</a> for guidelines.</p>
|
||||
<h2 id="community"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#community"><span class="icon icon-link"></span></a>Community</h2>
|
||||
<ul>
|
||||
<li><a href="https://discord.gg/RqSS2NQVsY">Discord</a></li>
|
||||
<li><a href="https://github.com/mark3labs/kit/issues">GitHub Issues</a></li>
|
||||
</ul>`,headings:[{depth:2,text:"Build and test",id:"build-and-test"},{depth:2,text:"Project structure",id:"project-structure"},{depth:2,text:"Architecture overview",id:"architecture-overview"},{depth:3,text:"Multi-provider LLM support",id:"multi-provider-llm-support"},{depth:3,text:"MCP client-server model",id:"mcp-client-server-model"},{depth:3,text:"Extension system",id:"extension-system"},{depth:3,text:"TUI architecture",id:"tui-architecture"},{depth:3,text:"Decoupling pattern",id:"decoupling-pattern"},{depth:2,text:"Contributing",id:"contributing"},{depth:2,text:"Community",id:"community"}],raw:`
|
||||
# Development
|
||||
|
||||
## Build and test
|
||||
|
||||
\`\`\`bash
|
||||
# Build
|
||||
go build -o output/kit ./cmd/kit
|
||||
|
||||
# Run all tests
|
||||
go test -race ./...
|
||||
|
||||
# Run a specific test
|
||||
go test -race ./cmd -run TestScriptExecution
|
||||
|
||||
# Lint
|
||||
go vet ./...
|
||||
|
||||
# Format
|
||||
go fmt ./...
|
||||
\`\`\`
|
||||
|
||||
## Project structure
|
||||
|
||||
\`\`\`
|
||||
cmd/kit/ - CLI entry point (main.go)
|
||||
cmd/ - CLI command implementations (root, auth, models, etc.)
|
||||
pkg/kit/ - Go SDK for embedding Kit
|
||||
internal/app/ - Application orchestrator (agent loop, message store, queue)
|
||||
internal/agent/ - Agent execution and tool dispatch
|
||||
internal/auth/ - OAuth authentication and credential storage
|
||||
internal/acpserver/ - ACP (Agent Client Protocol) server
|
||||
internal/clipboard/ - Cross-platform clipboard operations
|
||||
internal/compaction/ - Conversation compaction and summarization
|
||||
internal/config/ - Configuration management
|
||||
internal/core/ - Built-in tools (bash, read, write, edit, grep, find, ls)
|
||||
internal/extensions/ - Yaegi extension system
|
||||
internal/kitsetup/ - Initial setup wizard
|
||||
internal/message/ - Message content types and structured content blocks
|
||||
internal/models/ - Provider and model management
|
||||
internal/session/ - Session persistence (tree-based JSONL)
|
||||
internal/skills/ - Skill loading and system prompt composition
|
||||
internal/tools/ - MCP tool integration
|
||||
internal/ui/ - Bubble Tea TUI components
|
||||
examples/extensions/ - Example extension files
|
||||
npm/ - NPM package wrapper for distribution
|
||||
\`\`\`
|
||||
|
||||
## Architecture overview
|
||||
|
||||
Kit is built around a few key architectural patterns:
|
||||
|
||||
### Multi-provider LLM support
|
||||
|
||||
The \`llm.Provider\` interface abstracts different LLM providers. Each provider implements message formatting, tool calling, and streaming for its specific API.
|
||||
|
||||
### MCP client-server model
|
||||
|
||||
External tools are integrated via the Model Context Protocol (MCP). Kit acts as an MCP client, connecting to MCP servers configured in \`.kit.yml\`.
|
||||
|
||||
### Extension system
|
||||
|
||||
Extensions are Go source files interpreted at runtime by Yaegi. The \`internal/extensions/\` package manages loading, symbol export, and lifecycle dispatch. See the [Extension System](/extensions/overview) docs for details.
|
||||
|
||||
### TUI architecture
|
||||
|
||||
The interactive terminal UI is built with [Bubble Tea v2](https://github.com/charmbracelet/bubbletea), using a parent-child model where \`AppModel\` manages child components (\`InputComponent\`, \`StreamComponent\`, etc.).
|
||||
|
||||
### Decoupling pattern
|
||||
|
||||
\`cmd/root.go\` contains converter functions (e.g., \`widgetProviderForUI()\`) that bridge \`internal/extensions/\` types to \`internal/ui/\` types. The UI never imports the extensions package directly.
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome! Please see the [contribution guide](https://github.com/mark3labs/kit/blob/master/contribute/contribute.md) for guidelines.
|
||||
|
||||
## Community
|
||||
|
||||
- [Discord](https://discord.gg/RqSS2NQVsY)
|
||||
- [GitHub Issues](https://github.com/mark3labs/kit/issues)
|
||||
`};export{e as default};
|
||||
@@ -0,0 +1,273 @@
|
||||
const t={frontmatter:{title:"Examples",description:"Catalog of example extensions included with Kit.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="extension-examples"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#extension-examples"><span class="icon icon-link"></span></a>Extension Examples</h1>
|
||||
<p>Kit ships with a rich set of example extensions in the <code>examples/extensions/</code> directory. These serve as both documentation and starting points for your own extensions.</p>
|
||||
<h2 id="ui-and-display"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#ui-and-display"><span class="icon icon-link"></span></a>UI and display</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Extension</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>minimal.go</code></td>
|
||||
<td>Clean UI with custom footer</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>branded-output.go</code></td>
|
||||
<td>Branded output rendering</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>header-footer-demo.go</code></td>
|
||||
<td>Custom headers and footers</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>widget-status.go</code></td>
|
||||
<td>Persistent status widgets</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>overlay-demo.go</code></td>
|
||||
<td>Modal dialogs</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>tool-renderer-demo.go</code></td>
|
||||
<td>Custom tool call rendering</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>custom-editor-demo.go</code></td>
|
||||
<td>Vim-like modal editor</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>pirate.go</code></td>
|
||||
<td>Pirate-themed personality</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="workflow-and-automation"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#workflow-and-automation"><span class="icon icon-link"></span></a>Workflow and automation</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Extension</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>auto-commit.go</code></td>
|
||||
<td>Auto-commit changes on shutdown</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>plan-mode.go</code></td>
|
||||
<td>Read-only planning mode</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>permission-gate.go</code></td>
|
||||
<td>Permission gating for destructive tools</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>confirm-destructive.go</code></td>
|
||||
<td>Confirm destructive operations</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>protected-paths.go</code></td>
|
||||
<td>Path protection for sensitive files</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>project-rules.go</code></td>
|
||||
<td>Project-specific rules injection</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>compact-notify.go</code></td>
|
||||
<td>Notification on conversation compaction</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="interactive-features"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#interactive-features"><span class="icon icon-link"></span></a>Interactive features</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Extension</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>prompt-demo.go</code></td>
|
||||
<td>Interactive prompts (select/confirm/input)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>bookmark.go</code></td>
|
||||
<td>Bookmark conversations</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>inline-bash.go</code></td>
|
||||
<td>Inline bash execution</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>interactive-shell.go</code></td>
|
||||
<td>Interactive shell integration</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>notify.go</code></td>
|
||||
<td>Desktop notifications</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="agent-and-context"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#agent-and-context"><span class="icon icon-link"></span></a>Agent and context</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Extension</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>tool-logger.go</code></td>
|
||||
<td>Log all tool calls</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>context-inject.go</code></td>
|
||||
<td>Inject context into conversations</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>summarize.go</code></td>
|
||||
<td>Conversation summarization</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>lsp-diagnostics.go</code></td>
|
||||
<td>LSP diagnostic integration</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="multi-agent"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#multi-agent"><span class="icon icon-link"></span></a>Multi-agent</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Extension</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>kit-kit.go</code></td>
|
||||
<td>Kit-in-Kit sub-agent spawning</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>subagent-widget.go</code></td>
|
||||
<td>Multi-agent orchestration with status widget</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>subagent-test.go</code></td>
|
||||
<td>Subagent testing utilities</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="development"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#development"><span class="icon icon-link"></span></a>Development</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Extension</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>dev-reload.go</code></td>
|
||||
<td>Development live-reload</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="subdirectory-extensions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#subdirectory-extensions"><span class="icon icon-link"></span></a>Subdirectory extensions</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Directory</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>kit-kit-agents/</code></td>
|
||||
<td>Multi-agent orchestration example</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>kit-telegram/</code></td>
|
||||
<td>Telegram bot integration</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>status-tools/</code></td>
|
||||
<td>Status bar tool examples</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>`,headings:[{depth:2,text:"UI and display",id:"ui-and-display"},{depth:2,text:"Workflow and automation",id:"workflow-and-automation"},{depth:2,text:"Interactive features",id:"interactive-features"},{depth:2,text:"Agent and context",id:"agent-and-context"},{depth:2,text:"Multi-agent",id:"multi-agent"},{depth:2,text:"Development",id:"development"},{depth:2,text:"Subdirectory extensions",id:"subdirectory-extensions"}],raw:`
|
||||
# Extension Examples
|
||||
|
||||
Kit ships with a rich set of example extensions in the \`examples/extensions/\` directory. These serve as both documentation and starting points for your own extensions.
|
||||
|
||||
## UI and display
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| \`minimal.go\` | Clean UI with custom footer |
|
||||
| \`branded-output.go\` | Branded output rendering |
|
||||
| \`header-footer-demo.go\` | Custom headers and footers |
|
||||
| \`widget-status.go\` | Persistent status widgets |
|
||||
| \`overlay-demo.go\` | Modal dialogs |
|
||||
| \`tool-renderer-demo.go\` | Custom tool call rendering |
|
||||
| \`custom-editor-demo.go\` | Vim-like modal editor |
|
||||
| \`pirate.go\` | Pirate-themed personality |
|
||||
|
||||
## Workflow and automation
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| \`auto-commit.go\` | Auto-commit changes on shutdown |
|
||||
| \`plan-mode.go\` | Read-only planning mode |
|
||||
| \`permission-gate.go\` | Permission gating for destructive tools |
|
||||
| \`confirm-destructive.go\` | Confirm destructive operations |
|
||||
| \`protected-paths.go\` | Path protection for sensitive files |
|
||||
| \`project-rules.go\` | Project-specific rules injection |
|
||||
| \`compact-notify.go\` | Notification on conversation compaction |
|
||||
|
||||
## Interactive features
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| \`prompt-demo.go\` | Interactive prompts (select/confirm/input) |
|
||||
| \`bookmark.go\` | Bookmark conversations |
|
||||
| \`inline-bash.go\` | Inline bash execution |
|
||||
| \`interactive-shell.go\` | Interactive shell integration |
|
||||
| \`notify.go\` | Desktop notifications |
|
||||
|
||||
## Agent and context
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| \`tool-logger.go\` | Log all tool calls |
|
||||
| \`context-inject.go\` | Inject context into conversations |
|
||||
| \`summarize.go\` | Conversation summarization |
|
||||
| \`lsp-diagnostics.go\` | LSP diagnostic integration |
|
||||
|
||||
## Multi-agent
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| \`kit-kit.go\` | Kit-in-Kit sub-agent spawning |
|
||||
| \`subagent-widget.go\` | Multi-agent orchestration with status widget |
|
||||
| \`subagent-test.go\` | Subagent testing utilities |
|
||||
|
||||
## Development
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| \`dev-reload.go\` | Development live-reload |
|
||||
|
||||
## Subdirectory extensions
|
||||
|
||||
| Directory | Description |
|
||||
|-----------|-------------|
|
||||
| \`kit-kit-agents/\` | Multi-agent orchestration example |
|
||||
| \`kit-telegram/\` | Telegram bot integration |
|
||||
| \`status-tools/\` | Status bar tool examples |
|
||||
`};export{t as default};
|
||||
@@ -0,0 +1,237 @@
|
||||
const t={frontmatter:{title:"Global Flags",description:"Complete reference for all Kit CLI flags.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="global-flags"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#global-flags"><span class="icon icon-link"></span></a>Global Flags</h1>
|
||||
<p>All flags can be passed to the root <code>kit</code> command.</p>
|
||||
<h2 id="model-and-provider"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#model-and-provider"><span class="icon icon-link"></span></a>Model and provider</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Flag</th>
|
||||
<th>Short</th>
|
||||
<th>Default</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>--model</code></td>
|
||||
<td><code>-m</code></td>
|
||||
<td><code>anthropic/claude-sonnet-4-5-20250929</code></td>
|
||||
<td>Model to use (provider/model format)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--provider-api-key</code></td>
|
||||
<td>—</td>
|
||||
<td>—</td>
|
||||
<td>API key for the provider</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--provider-url</code></td>
|
||||
<td>—</td>
|
||||
<td>—</td>
|
||||
<td>Base URL for provider API</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--tls-skip-verify</code></td>
|
||||
<td>—</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Skip TLS certificate verification</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="session-management"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#session-management"><span class="icon icon-link"></span></a>Session management</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Flag</th>
|
||||
<th>Short</th>
|
||||
<th>Default</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>--session</code></td>
|
||||
<td><code>-s</code></td>
|
||||
<td>—</td>
|
||||
<td>Open specific JSONL session file</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--continue</code></td>
|
||||
<td><code>-c</code></td>
|
||||
<td><code>false</code></td>
|
||||
<td>Resume most recent session for current directory</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--resume</code></td>
|
||||
<td><code>-r</code></td>
|
||||
<td><code>false</code></td>
|
||||
<td>Interactive session picker</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--no-session</code></td>
|
||||
<td>—</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Ephemeral mode, no persistence</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="behavior"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#behavior"><span class="icon icon-link"></span></a>Behavior</h2>
|
||||
<p>These flags control Kit's behavior. When a prompt is passed as a positional argument, Kit runs in non-interactive mode.</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Flag</th>
|
||||
<th>Short</th>
|
||||
<th>Default</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>--quiet</code></td>
|
||||
<td>—</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Suppress all output (non-interactive only)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--json</code></td>
|
||||
<td>—</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Output response as JSON (non-interactive only)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--no-exit</code></td>
|
||||
<td>—</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Enter interactive mode after prompt completes</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--max-steps</code></td>
|
||||
<td>—</td>
|
||||
<td><code>0</code></td>
|
||||
<td>Maximum agent steps (0 for unlimited)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--stream</code></td>
|
||||
<td>—</td>
|
||||
<td><code>true</code></td>
|
||||
<td>Enable streaming output</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--compact</code></td>
|
||||
<td>—</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Enable compact output mode</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--auto-compact</code></td>
|
||||
<td>—</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Auto-compact conversation near context limit</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="extensions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#extensions"><span class="icon icon-link"></span></a>Extensions</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Flag</th>
|
||||
<th>Short</th>
|
||||
<th>Default</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>--extension</code></td>
|
||||
<td><code>-e</code></td>
|
||||
<td>—</td>
|
||||
<td>Load additional extension file(s) (repeatable)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--no-extensions</code></td>
|
||||
<td>—</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Disable all extensions</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="generation-parameters"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#generation-parameters"><span class="icon icon-link"></span></a>Generation parameters</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Flag</th>
|
||||
<th>Short</th>
|
||||
<th>Default</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>--max-tokens</code></td>
|
||||
<td>—</td>
|
||||
<td><code>4096</code></td>
|
||||
<td>Maximum tokens in response</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--temperature</code></td>
|
||||
<td>—</td>
|
||||
<td><code>0.7</code></td>
|
||||
<td>Randomness 0.0–1.0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--top-p</code></td>
|
||||
<td>—</td>
|
||||
<td><code>0.95</code></td>
|
||||
<td>Nucleus sampling 0.0–1.0</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--top-k</code></td>
|
||||
<td>—</td>
|
||||
<td><code>40</code></td>
|
||||
<td>Limit top K tokens</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--stop-sequences</code></td>
|
||||
<td>—</td>
|
||||
<td>—</td>
|
||||
<td>Custom stop sequences (comma-separated)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--thinking-level</code></td>
|
||||
<td>—</td>
|
||||
<td><code>off</code></td>
|
||||
<td>Extended thinking level: off, minimal, low, medium, high</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="system"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#system"><span class="icon icon-link"></span></a>System</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Flag</th>
|
||||
<th>Short</th>
|
||||
<th>Default</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>--config</code></td>
|
||||
<td>—</td>
|
||||
<td><code>~/.kit.yml</code></td>
|
||||
<td>Config file path</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--system-prompt</code></td>
|
||||
<td>—</td>
|
||||
<td>—</td>
|
||||
<td>System prompt text or file path</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--debug</code></td>
|
||||
<td>—</td>
|
||||
<td><code>false</code></td>
|
||||
<td>Enable debug logging</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>`,headings:[{depth:2,text:"Model and provider",id:"model-and-provider"},{depth:2,text:"Session management",id:"session-management"},{depth:2,text:"Behavior",id:"behavior"},{depth:2,text:"Extensions",id:"extensions"},{depth:2,text:"Generation parameters",id:"generation-parameters"},{depth:2,text:"System",id:"system"}],raw:"\n# Global Flags\n\nAll flags can be passed to the root `kit` command.\n\n## Model and provider\n\n| Flag | Short | Default | Description |\n|------|-------|---------|-------------|\n| `--model` | `-m` | `anthropic/claude-sonnet-4-5-20250929` | Model to use (provider/model format) |\n| `--provider-api-key` | — | — | API key for the provider |\n| `--provider-url` | — | — | Base URL for provider API |\n| `--tls-skip-verify` | — | `false` | Skip TLS certificate verification |\n\n## Session management\n\n| Flag | Short | Default | Description |\n|------|-------|---------|-------------|\n| `--session` | `-s` | — | Open specific JSONL session file |\n| `--continue` | `-c` | `false` | Resume most recent session for current directory |\n| `--resume` | `-r` | `false` | Interactive session picker |\n| `--no-session` | — | `false` | Ephemeral mode, no persistence |\n\n## Behavior\n\nThese flags control Kit's behavior. When a prompt is passed as a positional argument, Kit runs in non-interactive mode.\n\n| Flag | Short | Default | Description |\n|------|-------|---------|-------------|\n| `--quiet` | — | `false` | Suppress all output (non-interactive only) |\n| `--json` | — | `false` | Output response as JSON (non-interactive only) |\n| `--no-exit` | — | `false` | Enter interactive mode after prompt completes |\n| `--max-steps` | — | `0` | Maximum agent steps (0 for unlimited) |\n| `--stream` | — | `true` | Enable streaming output |\n| `--compact` | — | `false` | Enable compact output mode |\n| `--auto-compact` | — | `false` | Auto-compact conversation near context limit |\n\n## Extensions\n\n| Flag | Short | Default | Description |\n|------|-------|---------|-------------|\n| `--extension` | `-e` | — | Load additional extension file(s) (repeatable) |\n| `--no-extensions` | — | `false` | Disable all extensions |\n\n## Generation parameters\n\n| Flag | Short | Default | Description |\n|------|-------|---------|-------------|\n| `--max-tokens` | — | `4096` | Maximum tokens in response |\n| `--temperature` | — | `0.7` | Randomness 0.0–1.0 |\n| `--top-p` | — | `0.95` | Nucleus sampling 0.0–1.0 |\n| `--top-k` | — | `40` | Limit top K tokens |\n| `--stop-sequences` | — | — | Custom stop sequences (comma-separated) |\n| `--thinking-level` | — | `off` | Extended thinking level: off, minimal, low, medium, high |\n\n## System\n\n| Flag | Short | Default | Description |\n|------|-------|---------|-------------|\n| `--config` | — | `~/.kit.yml` | Config file path |\n| `--system-prompt` | — | — | System prompt text or file path |\n| `--debug` | — | `false` | Enable debug logging |\n"};export{t as default};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,75 @@
|
||||
const n={frontmatter:{title:"Kit",description:"Kit is a powerful, extensible AI coding agent CLI with multi-provider support, built-in tools, and a rich extension system.",hidden:!1,toc:!1,draft:!1},html:`<div style="text-align: center; margin: 2rem 0;">
|
||||
<img src="/logo.jpg" alt="KIT" style="max-width: 400px; width: 100%; margin: 0 auto; display: block;">
|
||||
</div>
|
||||
<p>A powerful, extensible AI coding agent CLI with multi-provider support, built-in tools, and a rich extension system.</p>
|
||||
<h2 id="features"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#features"><span class="icon icon-link"></span></a>Features</h2>
|
||||
<ul>
|
||||
<li><strong>Multi-Provider LLM Support</strong> — Anthropic, OpenAI, Google Gemini, Ollama, Azure OpenAI, AWS Bedrock, OpenRouter, and more</li>
|
||||
<li><strong>Built-in Core Tools</strong> — bash, read, write, edit, grep, find, ls, spawn_subagent with no MCP overhead</li>
|
||||
<li><strong>MCP Integration</strong> — Connect external MCP servers for expanded capabilities</li>
|
||||
<li><strong>Extension System</strong> — Write custom tools, commands, widgets, and UI modifications in Go</li>
|
||||
<li><strong>Interactive TUI</strong> — Rich terminal interface powered by Bubble Tea with streaming, syntax highlighting, and custom rendering</li>
|
||||
<li><strong>Session Management</strong> — Tree-based conversation history with branching support</li>
|
||||
<li><strong>Non-Interactive Mode</strong> — Script-friendly positional args with JSON output</li>
|
||||
<li><strong>ACP Server</strong> — Run Kit as an <a href="https://agentclientprotocol.com">Agent Client Protocol</a> agent over stdio</li>
|
||||
<li><strong>Go SDK</strong> — Embed Kit in your own applications</li>
|
||||
</ul>
|
||||
<h2 id="quick-links"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#quick-links"><span class="icon icon-link"></span></a>Quick links</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Resource</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><a href="/installation">Installation</a></td>
|
||||
<td>Get Kit up and running</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/quick-start">Quick Start</a></td>
|
||||
<td>Your first Kit session</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/configuration">Configuration</a></td>
|
||||
<td>Customize Kit for your workflow</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/extensions/overview">Extensions</a></td>
|
||||
<td>Build custom tools and UI components</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="/sdk/overview">Go SDK</a></td>
|
||||
<td>Embed Kit in your applications</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>`,headings:[{depth:2,text:"Features",id:"features"},{depth:2,text:"Quick links",id:"quick-links"}],raw:`
|
||||
<div style="text-align: center; margin: 2rem 0;">
|
||||
<img src="/logo.jpg" alt="KIT" style="max-width: 400px; width: 100%; margin: 0 auto; display: block;" />
|
||||
</div>
|
||||
|
||||
A powerful, extensible AI coding agent CLI with multi-provider support, built-in tools, and a rich extension system.
|
||||
|
||||
## Features
|
||||
|
||||
- **Multi-Provider LLM Support** — Anthropic, OpenAI, Google Gemini, Ollama, Azure OpenAI, AWS Bedrock, OpenRouter, and more
|
||||
- **Built-in Core Tools** — bash, read, write, edit, grep, find, ls, spawn_subagent with no MCP overhead
|
||||
- **MCP Integration** — Connect external MCP servers for expanded capabilities
|
||||
- **Extension System** — Write custom tools, commands, widgets, and UI modifications in Go
|
||||
- **Interactive TUI** — Rich terminal interface powered by Bubble Tea with streaming, syntax highlighting, and custom rendering
|
||||
- **Session Management** — Tree-based conversation history with branching support
|
||||
- **Non-Interactive Mode** — Script-friendly positional args with JSON output
|
||||
- **ACP Server** — Run Kit as an [Agent Client Protocol](https://agentclientprotocol.com) agent over stdio
|
||||
- **Go SDK** — Embed Kit in your own applications
|
||||
|
||||
## Quick links
|
||||
|
||||
| Resource | Description |
|
||||
|----------|-------------|
|
||||
| [Installation](/installation) | Get Kit up and running |
|
||||
| [Quick Start](/quick-start) | Your first Kit session |
|
||||
| [Configuration](/configuration) | Customize Kit for your workflow |
|
||||
| [Extensions](/extensions/overview) | Build custom tools and UI components |
|
||||
| [Go SDK](/sdk/overview) | Embed Kit in your applications |
|
||||
`};export{n as default};
|
||||
@@ -0,0 +1 @@
|
||||
:root,:root[data-theme=dark],:root[data-theme=light],html,html[data-theme=dark],#tome-root,#tome-root *,[data-theme],body,div{--bg: #08080a !important;--sf: #0e0e12 !important;--sfH: #141418 !important;--bd: #1a1a22 !important;--tx: #e8e0e0 !important;--tx2: #8a8090 !important;--txM: #6a6070 !important;--ac: #e03030 !important;--acD: rgba(224, 48, 48, .12) !important;--acT: #ff4444 !important;--cdBg: #0a0a0e !important;--cdTx: #c8a0a0 !important;--sbBg: #0a0a0d !important;--hdBg: rgba(8, 8, 10, .92) !important}h1,h2,h3,h4,h5,h6{color:#e8e0e0!important;font-style:normal!important}
|
||||
@@ -0,0 +1,78 @@
|
||||
const n={frontmatter:{title:"Installation",description:"Install Kit using npm, Go, or build from source.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="installation"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#installation"><span class="icon icon-link"></span></a>Installation</h1>
|
||||
<h2 id="using-npm-recommended"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#using-npm-recommended"><span class="icon icon-link"></span></a>Using npm (recommended)</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">npm</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -g</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> @mark3labs/kit</span></span></code></pre>
|
||||
<h2 id="using-go"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#using-go"><span class="icon icon-link"></span></a>Using Go</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> github.com/mark3labs/kit/cmd/kit@latest</span></span></code></pre>
|
||||
<h2 id="building-from-source"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#building-from-source"><span class="icon icon-link"></span></a>Building from source</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">git</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> clone</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> https://github.com/mark3labs/kit.git</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF">cd</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kit</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> build</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -o</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ./cmd/kit</span></span></code></pre>
|
||||
<h2 id="verifying-the-installation"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#verifying-the-installation"><span class="icon icon-link"></span></a>Verifying the installation</h2>
|
||||
<p>After installing, verify Kit is available:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --help</span></span></code></pre>
|
||||
<h2 id="setting-up-a-provider"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#setting-up-a-provider"><span class="icon icon-link"></span></a>Setting up a provider</h2>
|
||||
<p>Kit needs at least one LLM provider configured. Set an API key for your preferred provider:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Anthropic (default provider)</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> ANTHROPIC_API_KEY</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"sk-..."</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># OpenAI</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> OPENAI_API_KEY</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"sk-..."</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Google Gemini</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> GOOGLE_API_KEY</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"..."</span></span></code></pre>
|
||||
<p>For OAuth-enabled providers like Anthropic, you can also authenticate interactively:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> auth</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> login</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> anthropic</span></span></code></pre>
|
||||
<p>See <a href="/providers">Providers</a> for the full list of supported providers and their configuration.</p>`,headings:[{depth:2,text:"Using npm (recommended)",id:"using-npm-recommended"},{depth:2,text:"Using Go",id:"using-go"},{depth:2,text:"Building from source",id:"building-from-source"},{depth:2,text:"Verifying the installation",id:"verifying-the-installation"},{depth:2,text:"Setting up a provider",id:"setting-up-a-provider"}],raw:`
|
||||
# Installation
|
||||
|
||||
## Using npm (recommended)
|
||||
|
||||
\`\`\`bash
|
||||
npm install -g @mark3labs/kit
|
||||
\`\`\`
|
||||
|
||||
## Using Go
|
||||
|
||||
\`\`\`bash
|
||||
go install github.com/mark3labs/kit/cmd/kit@latest
|
||||
\`\`\`
|
||||
|
||||
## Building from source
|
||||
|
||||
\`\`\`bash
|
||||
git clone https://github.com/mark3labs/kit.git
|
||||
cd kit
|
||||
go build -o kit ./cmd/kit
|
||||
\`\`\`
|
||||
|
||||
## Verifying the installation
|
||||
|
||||
After installing, verify Kit is available:
|
||||
|
||||
\`\`\`bash
|
||||
kit --help
|
||||
\`\`\`
|
||||
|
||||
## Setting up a provider
|
||||
|
||||
Kit needs at least one LLM provider configured. Set an API key for your preferred provider:
|
||||
|
||||
\`\`\`bash
|
||||
# Anthropic (default provider)
|
||||
export ANTHROPIC_API_KEY="sk-..."
|
||||
|
||||
# OpenAI
|
||||
export OPENAI_API_KEY="sk-..."
|
||||
|
||||
# Google Gemini
|
||||
export GOOGLE_API_KEY="..."
|
||||
\`\`\`
|
||||
|
||||
For OAuth-enabled providers like Anthropic, you can also authenticate interactively:
|
||||
|
||||
\`\`\`bash
|
||||
kit auth login anthropic
|
||||
\`\`\`
|
||||
|
||||
See [Providers](/providers) for the full list of supported providers and their configuration.
|
||||
`};export{n as default};
|
||||
@@ -0,0 +1,240 @@
|
||||
const s={frontmatter:{title:"JSON Output",description:"Machine-readable JSON output for scripting and automation.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="json-output"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#json-output"><span class="icon icon-link"></span></a>JSON Output</h1>
|
||||
<p>Use the <code>--json</code> flag to get structured output for scripting and automation:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "Explain main.go"</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --json</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --quiet</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --no-session</span></span></code></pre>
|
||||
<h2 id="response-format"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#response-format"><span class="icon icon-link"></span></a>Response format</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "response"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Final assistant response text"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "model"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"anthropic/claude-haiku-3-5-20241022"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "stop_reason"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"end_turn"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "session_id"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"a1b2c3d4e5f6"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "usage"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: {</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "input_tokens"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">1024</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "output_tokens"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">512</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "total_tokens"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">1536</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "cache_read_tokens"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">0</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "cache_creation_tokens"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">0</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "messages"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "role"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"assistant"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> "parts"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: [</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="color:#005CC5;--shiki-dark:#79B8FF">"type"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"text"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">"data"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"..."</span><span style="color:#24292E;--shiki-dark:#E1E4E8">},</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="color:#005CC5;--shiki-dark:#79B8FF">"type"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"tool_call"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">"data"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: {</span><span style="color:#005CC5;--shiki-dark:#79B8FF">"name"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"..."</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">"args"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"..."</span><span style="color:#24292E;--shiki-dark:#E1E4E8">}},</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span><span style="color:#005CC5;--shiki-dark:#79B8FF">"type"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"tool_result"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">"data"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: {</span><span style="color:#005CC5;--shiki-dark:#79B8FF">"name"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"..."</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">"result"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"..."</span><span style="color:#24292E;--shiki-dark:#E1E4E8">}}</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ]</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ]</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
|
||||
<h2 id="fields"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#fields"><span class="icon icon-link"></span></a>Fields</h2>
|
||||
<h3 id="top-level"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#top-level"><span class="icon icon-link"></span></a>Top-level</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Field</th>
|
||||
<th>Type</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>response</code></td>
|
||||
<td>string</td>
|
||||
<td>The final assistant response text</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>model</code></td>
|
||||
<td>string</td>
|
||||
<td>The model that was used</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>stop_reason</code></td>
|
||||
<td>string</td>
|
||||
<td>Why the model stopped (e.g., <code>end_turn</code>)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>session_id</code></td>
|
||||
<td>string</td>
|
||||
<td>Session identifier (omitted in <code>--no-session</code> mode)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>usage</code></td>
|
||||
<td>object</td>
|
||||
<td>Token usage statistics</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>messages</code></td>
|
||||
<td>array</td>
|
||||
<td>Full conversation history</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="usage"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#usage"><span class="icon icon-link"></span></a>Usage</h3>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Field</th>
|
||||
<th>Type</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>input_tokens</code></td>
|
||||
<td>int</td>
|
||||
<td>Tokens sent to the model</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>output_tokens</code></td>
|
||||
<td>int</td>
|
||||
<td>Tokens generated by the model</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>total_tokens</code></td>
|
||||
<td>int</td>
|
||||
<td>Sum of input and output tokens</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>cache_read_tokens</code></td>
|
||||
<td>int</td>
|
||||
<td>Tokens read from prompt cache</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>cache_creation_tokens</code></td>
|
||||
<td>int</td>
|
||||
<td>Tokens written to prompt cache</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h3 id="message-parts"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#message-parts"><span class="icon icon-link"></span></a>Message parts</h3>
|
||||
<p>Each message contains a <code>parts</code> array with typed entries:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Type</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>text</code></td>
|
||||
<td>Assistant text content</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>tool_call</code></td>
|
||||
<td>Tool invocation with name and args</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>tool_result</code></td>
|
||||
<td>Tool execution result</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>reasoning</code></td>
|
||||
<td>Extended thinking content</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>finish</code></td>
|
||||
<td>End-of-turn marker</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="parsing-in-scripts"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#parsing-in-scripts"><span class="icon icon-link"></span></a>Parsing in scripts</h2>
|
||||
<h3 id="bash--jq"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#bash--jq"><span class="icon icon-link"></span></a>bash + jq</h3>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">result</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#24292E;--shiki-dark:#E1E4E8">$(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "Count files"</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --json</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --quiet</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --no-session</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">response</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#24292E;--shiki-dark:#E1E4E8">$(</span><span style="color:#005CC5;--shiki-dark:#79B8FF">echo</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="color:#24292E;--shiki-dark:#E1E4E8">$result</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span><span style="color:#D73A49;--shiki-dark:#F97583"> |</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> jq</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -r</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> '.response'</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">tokens</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#24292E;--shiki-dark:#E1E4E8">$(</span><span style="color:#005CC5;--shiki-dark:#79B8FF">echo</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="color:#24292E;--shiki-dark:#E1E4E8">$result</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span><span style="color:#D73A49;--shiki-dark:#F97583"> |</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> jq</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> '.usage.total_tokens'</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
|
||||
<h3 id="go-sdk"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#go-sdk"><span class="icon icon-link"></span></a>Go SDK</h3>
|
||||
<p>For Go programs, use the SDK's <code>PromptResult</code> method instead of parsing JSON:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">result, err </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">PromptResult</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Count files"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(result.Response)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(result.Usage.TotalTokens)</span></span></code></pre>`,headings:[{depth:2,text:"Response format",id:"response-format"},{depth:2,text:"Fields",id:"fields"},{depth:3,text:"Top-level",id:"top-level"},{depth:3,text:"Usage",id:"usage"},{depth:3,text:"Message parts",id:"message-parts"},{depth:2,text:"Parsing in scripts",id:"parsing-in-scripts"},{depth:3,text:"bash + jq",id:"bash--jq"},{depth:3,text:"Go SDK",id:"go-sdk"}],raw:`
|
||||
# JSON Output
|
||||
|
||||
Use the \`--json\` flag to get structured output for scripting and automation:
|
||||
|
||||
\`\`\`bash
|
||||
kit "Explain main.go" --json --quiet --no-session
|
||||
\`\`\`
|
||||
|
||||
## Response format
|
||||
|
||||
\`\`\`json
|
||||
{
|
||||
"response": "Final assistant response text",
|
||||
"model": "anthropic/claude-haiku-3-5-20241022",
|
||||
"stop_reason": "end_turn",
|
||||
"session_id": "a1b2c3d4e5f6",
|
||||
"usage": {
|
||||
"input_tokens": 1024,
|
||||
"output_tokens": 512,
|
||||
"total_tokens": 1536,
|
||||
"cache_read_tokens": 0,
|
||||
"cache_creation_tokens": 0
|
||||
},
|
||||
"messages": [
|
||||
{
|
||||
"role": "assistant",
|
||||
"parts": [
|
||||
{"type": "text", "data": "..."},
|
||||
{"type": "tool_call", "data": {"name": "...", "args": "..."}},
|
||||
{"type": "tool_result", "data": {"name": "...", "result": "..."}}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
## Fields
|
||||
|
||||
### Top-level
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| \`response\` | string | The final assistant response text |
|
||||
| \`model\` | string | The model that was used |
|
||||
| \`stop_reason\` | string | Why the model stopped (e.g., \`end_turn\`) |
|
||||
| \`session_id\` | string | Session identifier (omitted in \`--no-session\` mode) |
|
||||
| \`usage\` | object | Token usage statistics |
|
||||
| \`messages\` | array | Full conversation history |
|
||||
|
||||
### Usage
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| \`input_tokens\` | int | Tokens sent to the model |
|
||||
| \`output_tokens\` | int | Tokens generated by the model |
|
||||
| \`total_tokens\` | int | Sum of input and output tokens |
|
||||
| \`cache_read_tokens\` | int | Tokens read from prompt cache |
|
||||
| \`cache_creation_tokens\` | int | Tokens written to prompt cache |
|
||||
|
||||
### Message parts
|
||||
|
||||
Each message contains a \`parts\` array with typed entries:
|
||||
|
||||
| Type | Description |
|
||||
|------|-------------|
|
||||
| \`text\` | Assistant text content |
|
||||
| \`tool_call\` | Tool invocation with name and args |
|
||||
| \`tool_result\` | Tool execution result |
|
||||
| \`reasoning\` | Extended thinking content |
|
||||
| \`finish\` | End-of-turn marker |
|
||||
|
||||
## Parsing in scripts
|
||||
|
||||
### bash + jq
|
||||
|
||||
\`\`\`bash
|
||||
result=$(kit "Count files" --json --quiet --no-session)
|
||||
response=$(echo "$result" | jq -r '.response')
|
||||
tokens=$(echo "$result" | jq '.usage.total_tokens')
|
||||
\`\`\`
|
||||
|
||||
### Go SDK
|
||||
|
||||
For Go programs, use the SDK's \`PromptResult\` method instead of parsing JSON:
|
||||
|
||||
\`\`\`go
|
||||
result, err := host.PromptResult(ctx, "Count files")
|
||||
fmt.Println(result.Response)
|
||||
fmt.Println(result.Usage.TotalTokens)
|
||||
\`\`\`
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,213 @@
|
||||
const s={frontmatter:{title:"Loading Extensions",description:"How Kit discovers and loads extensions.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="loading-extensions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#loading-extensions"><span class="icon icon-link"></span></a>Loading Extensions</h1>
|
||||
<h2 id="auto-discovery"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#auto-discovery"><span class="icon icon-link"></span></a>Auto-discovery</h2>
|
||||
<p>Kit automatically discovers and loads extensions from these paths, in order:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Path</th>
|
||||
<th>Scope</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>~/.config/kit/extensions/*.go</code></td>
|
||||
<td>Global single files</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>~/.config/kit/extensions/*/main.go</code></td>
|
||||
<td>Global subdirectory extensions</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>.kit/extensions/*.go</code></td>
|
||||
<td>Project-local single files</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>.kit/extensions/*/main.go</code></td>
|
||||
<td>Project-local subdirectory extensions</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>~/.local/share/kit/git/</code></td>
|
||||
<td>Global git-installed packages</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>.kit/git/</code></td>
|
||||
<td>Project-local git-installed packages</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="explicit-loading"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#explicit-loading"><span class="icon icon-link"></span></a>Explicit loading</h2>
|
||||
<p>Load extensions by path using the <code>-e</code> flag:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -e</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> path/to/extension.go</span></span></code></pre>
|
||||
<p>Load multiple extensions:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -e</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ext1.go</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -e</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ext2.go</span></span></code></pre>
|
||||
<h2 id="disabling-extensions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#disabling-extensions"><span class="icon icon-link"></span></a>Disabling extensions</h2>
|
||||
<p>Disable all auto-discovered extensions:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --no-extensions</span></span></code></pre>
|
||||
<p>You can combine <code>--no-extensions</code> with <code>-e</code> to load only specific extensions:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --no-extensions</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -e</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> my-extension.go</span></span></code></pre>
|
||||
<h2 id="installing-from-git"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#installing-from-git"><span class="icon icon-link"></span></a>Installing from git</h2>
|
||||
<p>Install extensions from git repositories using <code>kit install</code>:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Install globally (to ~/.local/share/kit/git/)</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> https://github.com/user/my-kit-extension.git</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Install project-locally (to .kit/git/)</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -l</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> https://github.com/user/my-kit-extension.git</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Update an installed package</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -u</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> https://github.com/user/my-kit-extension.git</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Remove</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> install</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --uninstall</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> my-kit-extension</span></span></code></pre>
|
||||
<h2 id="extension-structure"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#extension-structure"><span class="icon icon-link"></span></a>Extension structure</h2>
|
||||
<h3 id="single-file-extensions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#single-file-extensions"><span class="icon icon-link"></span></a>Single-file extensions</h3>
|
||||
<p>A single <code>.go</code> file with an <code>Init</code> function:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">//go:build ignore</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">package</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> main</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">import</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit/ext</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> Init</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">api</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">API</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // register handlers, tools, commands, etc.</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
|
||||
<p>The <code>//go:build ignore</code> directive prevents the Go toolchain from trying to compile the file as part of a normal build.</p>
|
||||
<h3 id="subdirectory-extensions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#subdirectory-extensions"><span class="icon icon-link"></span></a>Subdirectory extensions</h3>
|
||||
<p>For more complex extensions, create a directory with a <code>main.go</code> entry point:</p>
|
||||
<pre><code>.kit/extensions/my-extension/
|
||||
├── main.go # Must contain Init(api ext.API)
|
||||
├── helpers.go # Additional source files
|
||||
└── config.go
|
||||
</code></pre>
|
||||
<h3 id="package-level-state"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#package-level-state"><span class="icon icon-link"></span></a>Package-level state</h3>
|
||||
<p>Yaegi supports package-level variables captured in closures. This is the standard way to maintain state across event callbacks:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">package</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> main</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">import</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit/ext</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">var</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> callCount </span><span style="color:#D73A49;--shiki-dark:#F97583">int</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> Init</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">api</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">API</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnToolCall</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">_</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ToolCallEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> callCount</span><span style="color:#D73A49;--shiki-dark:#F97583">++</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SetFooter</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">HeaderFooterConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Content: </span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">WidgetContent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Text: fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Sprintf</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Tools called: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">%d</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, callCount),</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> },</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>`,headings:[{depth:2,text:"Auto-discovery",id:"auto-discovery"},{depth:2,text:"Explicit loading",id:"explicit-loading"},{depth:2,text:"Disabling extensions",id:"disabling-extensions"},{depth:2,text:"Installing from git",id:"installing-from-git"},{depth:2,text:"Extension structure",id:"extension-structure"},{depth:3,text:"Single-file extensions",id:"single-file-extensions"},{depth:3,text:"Subdirectory extensions",id:"subdirectory-extensions"},{depth:3,text:"Package-level state",id:"package-level-state"}],raw:`
|
||||
# Loading Extensions
|
||||
|
||||
## Auto-discovery
|
||||
|
||||
Kit automatically discovers and loads extensions from these paths, in order:
|
||||
|
||||
| Path | Scope |
|
||||
|------|-------|
|
||||
| \`~/.config/kit/extensions/*.go\` | Global single files |
|
||||
| \`~/.config/kit/extensions/*/main.go\` | Global subdirectory extensions |
|
||||
| \`.kit/extensions/*.go\` | Project-local single files |
|
||||
| \`.kit/extensions/*/main.go\` | Project-local subdirectory extensions |
|
||||
| \`~/.local/share/kit/git/\` | Global git-installed packages |
|
||||
| \`.kit/git/\` | Project-local git-installed packages |
|
||||
|
||||
## Explicit loading
|
||||
|
||||
Load extensions by path using the \`-e\` flag:
|
||||
|
||||
\`\`\`bash
|
||||
kit -e path/to/extension.go
|
||||
\`\`\`
|
||||
|
||||
Load multiple extensions:
|
||||
|
||||
\`\`\`bash
|
||||
kit -e ext1.go -e ext2.go
|
||||
\`\`\`
|
||||
|
||||
## Disabling extensions
|
||||
|
||||
Disable all auto-discovered extensions:
|
||||
|
||||
\`\`\`bash
|
||||
kit --no-extensions
|
||||
\`\`\`
|
||||
|
||||
You can combine \`--no-extensions\` with \`-e\` to load only specific extensions:
|
||||
|
||||
\`\`\`bash
|
||||
kit --no-extensions -e my-extension.go
|
||||
\`\`\`
|
||||
|
||||
## Installing from git
|
||||
|
||||
Install extensions from git repositories using \`kit install\`:
|
||||
|
||||
\`\`\`bash
|
||||
# Install globally (to ~/.local/share/kit/git/)
|
||||
kit install https://github.com/user/my-kit-extension.git
|
||||
|
||||
# Install project-locally (to .kit/git/)
|
||||
kit install -l https://github.com/user/my-kit-extension.git
|
||||
|
||||
# Update an installed package
|
||||
kit install -u https://github.com/user/my-kit-extension.git
|
||||
|
||||
# Remove
|
||||
kit install --uninstall my-kit-extension
|
||||
\`\`\`
|
||||
|
||||
## Extension structure
|
||||
|
||||
### Single-file extensions
|
||||
|
||||
A single \`.go\` file with an \`Init\` function:
|
||||
|
||||
\`\`\`go
|
||||
//go:build ignore
|
||||
|
||||
package main
|
||||
|
||||
import "kit/ext"
|
||||
|
||||
func Init(api ext.API) {
|
||||
// register handlers, tools, commands, etc.
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
The \`//go:build ignore\` directive prevents the Go toolchain from trying to compile the file as part of a normal build.
|
||||
|
||||
### Subdirectory extensions
|
||||
|
||||
For more complex extensions, create a directory with a \`main.go\` entry point:
|
||||
|
||||
\`\`\`
|
||||
.kit/extensions/my-extension/
|
||||
├── main.go # Must contain Init(api ext.API)
|
||||
├── helpers.go # Additional source files
|
||||
└── config.go
|
||||
\`\`\`
|
||||
|
||||
### Package-level state
|
||||
|
||||
Yaegi supports package-level variables captured in closures. This is the standard way to maintain state across event callbacks:
|
||||
|
||||
\`\`\`go
|
||||
package main
|
||||
|
||||
import "kit/ext"
|
||||
|
||||
var callCount int
|
||||
|
||||
func Init(api ext.API) {
|
||||
api.OnToolCall(func(_ ext.ToolCallEvent, ctx ext.Context) {
|
||||
callCount++
|
||||
ctx.SetFooter(ext.HeaderFooterConfig{
|
||||
Content: ext.WidgetContent{
|
||||
Text: fmt.Sprintf("Tools called: %d", callCount),
|
||||
},
|
||||
})
|
||||
})
|
||||
}
|
||||
\`\`\`
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,147 @@
|
||||
const s={frontmatter:{title:"SDK Options",description:"Configuration options for the Kit Go SDK.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="sdk-options"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#sdk-options"><span class="icon icon-link"></span></a>SDK Options</h1>
|
||||
<p>Pass an <code>Options</code> struct to <code>kit.New()</code> to configure the Kit instance.</p>
|
||||
<h2 id="full-options-reference"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#full-options-reference"><span class="icon icon-link"></span></a>Full options reference</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host, err </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> kit.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">New</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#D73A49;--shiki-dark:#F97583">&</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Options</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Model</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Model: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"ollama/llama3"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> SystemPrompt: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"You are a helpful bot"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ConfigFile: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"/path/to/config.yml"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Behavior</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> MaxSteps: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">10</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Streaming: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Quiet: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Debug: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Session</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> SessionPath: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"./session.jsonl"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> SessionDir: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"/custom/sessions/"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Continue: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> NoSession: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Tools</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Tools: []</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Tool</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span><span style="color:#D73A49;--shiki-dark:#F97583">...</span><span style="color:#24292E;--shiki-dark:#E1E4E8">}, </span><span style="color:#6A737D;--shiki-dark:#6A737D">// Replace default tool set entirely</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ExtraTools: []</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Tool</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span><span style="color:#D73A49;--shiki-dark:#F97583">...</span><span style="color:#24292E;--shiki-dark:#E1E4E8">}, </span><span style="color:#6A737D;--shiki-dark:#6A737D">// Add tools alongside defaults</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Compaction</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> AutoCompact: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Skills</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Skills: []</span><span style="color:#D73A49;--shiki-dark:#F97583">string</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"/path/to/skill.md"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">},</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> SkillsDir: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"/path/to/skills/"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="options-fields"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#options-fields"><span class="icon icon-link"></span></a>Options fields</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Field</th>
|
||||
<th>Type</th>
|
||||
<th>Default</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>Model</code></td>
|
||||
<td><code>string</code></td>
|
||||
<td>config default</td>
|
||||
<td>Model string (provider/model format)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>SystemPrompt</code></td>
|
||||
<td><code>string</code></td>
|
||||
<td>—</td>
|
||||
<td>System prompt text or file path</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ConfigFile</code></td>
|
||||
<td><code>string</code></td>
|
||||
<td><code>~/.kit.yml</code></td>
|
||||
<td>Path to config file</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>MaxSteps</code></td>
|
||||
<td><code>int</code></td>
|
||||
<td><code>0</code></td>
|
||||
<td>Max agent steps (0 = unlimited)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Streaming</code></td>
|
||||
<td><code>bool</code></td>
|
||||
<td><code>true</code></td>
|
||||
<td>Enable streaming output</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Quiet</code></td>
|
||||
<td><code>bool</code></td>
|
||||
<td><code>false</code></td>
|
||||
<td>Suppress output</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Debug</code></td>
|
||||
<td><code>bool</code></td>
|
||||
<td><code>false</code></td>
|
||||
<td>Enable debug logging</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>SessionPath</code></td>
|
||||
<td><code>string</code></td>
|
||||
<td>—</td>
|
||||
<td>Open a specific session file</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>SessionDir</code></td>
|
||||
<td><code>string</code></td>
|
||||
<td>—</td>
|
||||
<td>Base directory for session discovery</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Continue</code></td>
|
||||
<td><code>bool</code></td>
|
||||
<td><code>false</code></td>
|
||||
<td>Resume most recent session</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>NoSession</code></td>
|
||||
<td><code>bool</code></td>
|
||||
<td><code>false</code></td>
|
||||
<td>Ephemeral mode (no persistence)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Tools</code></td>
|
||||
<td><code>[]Tool</code></td>
|
||||
<td>—</td>
|
||||
<td>Replace the entire default tool set</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>ExtraTools</code></td>
|
||||
<td><code>[]Tool</code></td>
|
||||
<td>—</td>
|
||||
<td>Additional tools alongside core/MCP/extension tools</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>AutoCompact</code></td>
|
||||
<td><code>bool</code></td>
|
||||
<td><code>false</code></td>
|
||||
<td>Auto-compact when near context limit</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>CompactionOptions</code></td>
|
||||
<td><code>*CompactionOptions</code></td>
|
||||
<td>—</td>
|
||||
<td>Configuration for auto-compaction</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Skills</code></td>
|
||||
<td><code>[]string</code></td>
|
||||
<td>—</td>
|
||||
<td>Explicit skill files/dirs to load</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>SkillsDir</code></td>
|
||||
<td><code>string</code></td>
|
||||
<td>—</td>
|
||||
<td>Override default skills directory</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>`,headings:[{depth:2,text:"Full options reference",id:"full-options-reference"},{depth:2,text:"Options fields",id:"options-fields"}],raw:'\n# SDK Options\n\nPass an `Options` struct to `kit.New()` to configure the Kit instance.\n\n## Full options reference\n\n```go\nhost, err := kit.New(ctx, &kit.Options{\n // Model\n Model: "ollama/llama3",\n SystemPrompt: "You are a helpful bot",\n ConfigFile: "/path/to/config.yml",\n\n // Behavior\n MaxSteps: 10,\n Streaming: true,\n Quiet: true,\n Debug: true,\n\n // Session\n SessionPath: "./session.jsonl",\n SessionDir: "/custom/sessions/",\n Continue: true,\n NoSession: true,\n\n // Tools\n Tools: []kit.Tool{...}, // Replace default tool set entirely\n ExtraTools: []kit.Tool{...}, // Add tools alongside defaults\n\n // Compaction\n AutoCompact: true,\n\n // Skills\n Skills: []string{"/path/to/skill.md"},\n SkillsDir: "/path/to/skills/",\n})\n```\n\n## Options fields\n\n| Field | Type | Default | Description |\n|-------|------|---------|-------------|\n| `Model` | `string` | config default | Model string (provider/model format) |\n| `SystemPrompt` | `string` | — | System prompt text or file path |\n| `ConfigFile` | `string` | `~/.kit.yml` | Path to config file |\n| `MaxSteps` | `int` | `0` | Max agent steps (0 = unlimited) |\n| `Streaming` | `bool` | `true` | Enable streaming output |\n| `Quiet` | `bool` | `false` | Suppress output |\n| `Debug` | `bool` | `false` | Enable debug logging |\n| `SessionPath` | `string` | — | Open a specific session file |\n| `SessionDir` | `string` | — | Base directory for session discovery |\n| `Continue` | `bool` | `false` | Resume most recent session |\n| `NoSession` | `bool` | `false` | Ephemeral mode (no persistence) |\n| `Tools` | `[]Tool` | — | Replace the entire default tool set |\n| `ExtraTools` | `[]Tool` | — | Additional tools alongside core/MCP/extension tools |\n| `AutoCompact` | `bool` | `false` | Auto-compact when near context limit |\n| `CompactionOptions` | `*CompactionOptions` | — | Configuration for auto-compaction |\n| `Skills` | `[]string` | — | Explicit skill files/dirs to load |\n| `SkillsDir` | `string` | — | Override default skills directory |\n'};export{s as default};
|
||||
@@ -0,0 +1,56 @@
|
||||
const e={frontmatter:{title:"Extension System",description:"Overview of Kit's Go-based extension system.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="extension-system"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#extension-system"><span class="icon icon-link"></span></a>Extension System</h1>
|
||||
<p>Extensions are Go source files interpreted at runtime via <a href="https://github.com/traefik/yaegi">Yaegi</a>. They can add custom tools, slash commands, widgets, keyboard shortcuts, and intercept lifecycle events — all without recompiling Kit.</p>
|
||||
<h2 id="minimal-extension"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#minimal-extension"><span class="icon icon-link"></span></a>Minimal extension</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">//go:build ignore</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">package</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> main</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">import</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit/ext</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> Init</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">api</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">API</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> api.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnSessionStart</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">_</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SessionStartEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#E36209;--shiki-dark:#FFAB70">ctx</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Context</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SetFooter</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">HeaderFooterConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Content: </span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">WidgetContent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{Text: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Custom Footer"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">},</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> })</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
|
||||
<p>Run it with:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -e</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> examples/extensions/minimal.go</span></span></code></pre>
|
||||
<h2 id="how-extensions-work"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#how-extensions-work"><span class="icon icon-link"></span></a>How extensions work</h2>
|
||||
<ol>
|
||||
<li>Kit discovers extension files from <a href="/extensions/loading">auto-discovery paths</a> or explicit <code>-e</code> flags</li>
|
||||
<li>Each <code>.go</code> file is loaded into a Yaegi interpreter with access to the <code>kit/ext</code> package</li>
|
||||
<li>Kit calls the <code>Init(api ext.API)</code> function in each extension</li>
|
||||
<li>The extension registers callbacks, tools, commands, and UI components via the <code>api</code> and <code>ctx</code> objects</li>
|
||||
</ol>
|
||||
<h2 id="key-concepts"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#key-concepts"><span class="icon icon-link"></span></a>Key concepts</h2>
|
||||
<h3 id="the-api-object"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#the-api-object"><span class="icon icon-link"></span></a>The <code>API</code> object</h3>
|
||||
<p>Passed to <code>Init()</code>, the <code>API</code> object is used to register lifecycle event handlers and static components:</p>
|
||||
<ul>
|
||||
<li><strong>Lifecycle handlers</strong> — <code>api.OnSessionStart(...)</code>, <code>api.OnToolCall(...)</code>, etc.</li>
|
||||
<li><strong>Tools</strong> — <code>api.RegisterTool(ext.ToolDef{...})</code></li>
|
||||
<li><strong>Commands</strong> — <code>api.RegisterCommand(ext.CommandDef{...})</code></li>
|
||||
<li><strong>Shortcuts</strong> — <code>api.RegisterShortcut(ext.ShortcutDef{...}, handler)</code></li>
|
||||
<li><strong>Tool renderers</strong> — <code>api.RegisterToolRenderer(ext.ToolRenderConfig{...})</code></li>
|
||||
<li><strong>Message renderers</strong> — <code>api.RegisterMessageRenderer(ext.MessageRendererConfig{...})</code></li>
|
||||
<li><strong>Options</strong> — <code>api.RegisterOption(ext.OptionDef{...})</code></li>
|
||||
</ul>
|
||||
<h3 id="the-context-object"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#the-context-object"><span class="icon icon-link"></span></a>The <code>Context</code> object</h3>
|
||||
<p>Passed to event handlers, the <code>Context</code> object provides runtime access to Kit's state and UI:</p>
|
||||
<ul>
|
||||
<li><strong>Output</strong> — <code>ctx.Print(...)</code>, <code>ctx.PrintInfo(...)</code>, <code>ctx.PrintError(...)</code></li>
|
||||
<li><strong>UI components</strong> — <code>ctx.SetWidget(...)</code>, <code>ctx.SetHeader(...)</code>, <code>ctx.SetFooter(...)</code>, <code>ctx.SetStatus(...)</code></li>
|
||||
<li><strong>Editor</strong> — <code>ctx.SetEditor(...)</code>, <code>ctx.ResetEditor()</code></li>
|
||||
<li><strong>Prompts</strong> — <code>ctx.PromptSelect(...)</code>, <code>ctx.PromptConfirm(...)</code>, <code>ctx.PromptInput(...)</code></li>
|
||||
<li><strong>Overlays</strong> — <code>ctx.ShowOverlay(...)</code></li>
|
||||
<li><strong>Messages</strong> — <code>ctx.SendMessage(...)</code>, <code>ctx.GetMessages()</code></li>
|
||||
<li><strong>Model</strong> — <code>ctx.SetModel(...)</code>, <code>ctx.GetAvailableModels()</code></li>
|
||||
<li><strong>Tools</strong> — <code>ctx.GetAllTools()</code>, <code>ctx.SetActiveTools(...)</code></li>
|
||||
<li><strong>Context stats</strong> — <code>ctx.GetContextStats()</code></li>
|
||||
<li><strong>Session data</strong> — <code>ctx.AppendEntry(...)</code>, <code>ctx.GetEntries(...)</code></li>
|
||||
<li><strong>Subagents</strong> — <code>ctx.SpawnSubagent(...)</code></li>
|
||||
<li><strong>LLM completion</strong> — <code>ctx.Complete(...)</code></li>
|
||||
<li><strong>Custom events</strong> — <code>ctx.EmitCustomEvent(...)</code></li>
|
||||
<li><strong>App control</strong> — <code>ctx.Exit()</code>, <code>ctx.ReloadExtensions()</code></li>
|
||||
</ul>
|
||||
<p>See <a href="/extensions/capabilities">Capabilities</a> for full details on each component type.</p>`,headings:[{depth:2,text:"Minimal extension",id:"minimal-extension"},{depth:2,text:"How extensions work",id:"how-extensions-work"},{depth:2,text:"Key concepts",id:"key-concepts"},{depth:3,text:"The API object",id:"the-api-object"},{depth:3,text:"The Context object",id:"the-context-object"}],raw:'\n# Extension System\n\nExtensions are Go source files interpreted at runtime via [Yaegi](https://github.com/traefik/yaegi). They can add custom tools, slash commands, widgets, keyboard shortcuts, and intercept lifecycle events — all without recompiling Kit.\n\n## Minimal extension\n\n```go\n//go:build ignore\n\npackage main\n\nimport "kit/ext"\n\nfunc Init(api ext.API) {\n api.OnSessionStart(func(_ ext.SessionStartEvent, ctx ext.Context) {\n ctx.SetFooter(ext.HeaderFooterConfig{\n Content: ext.WidgetContent{Text: "Custom Footer"},\n })\n })\n}\n```\n\nRun it with:\n\n```bash\nkit -e examples/extensions/minimal.go\n```\n\n## How extensions work\n\n1. Kit discovers extension files from [auto-discovery paths](/extensions/loading) or explicit `-e` flags\n2. Each `.go` file is loaded into a Yaegi interpreter with access to the `kit/ext` package\n3. Kit calls the `Init(api ext.API)` function in each extension\n4. The extension registers callbacks, tools, commands, and UI components via the `api` and `ctx` objects\n\n## Key concepts\n\n### The `API` object\n\nPassed to `Init()`, the `API` object is used to register lifecycle event handlers and static components:\n\n- **Lifecycle handlers** — `api.OnSessionStart(...)`, `api.OnToolCall(...)`, etc.\n- **Tools** — `api.RegisterTool(ext.ToolDef{...})`\n- **Commands** — `api.RegisterCommand(ext.CommandDef{...})`\n- **Shortcuts** — `api.RegisterShortcut(ext.ShortcutDef{...}, handler)`\n- **Tool renderers** — `api.RegisterToolRenderer(ext.ToolRenderConfig{...})`\n- **Message renderers** — `api.RegisterMessageRenderer(ext.MessageRendererConfig{...})`\n- **Options** — `api.RegisterOption(ext.OptionDef{...})`\n\n### The `Context` object\n\nPassed to event handlers, the `Context` object provides runtime access to Kit\'s state and UI:\n\n- **Output** — `ctx.Print(...)`, `ctx.PrintInfo(...)`, `ctx.PrintError(...)`\n- **UI components** — `ctx.SetWidget(...)`, `ctx.SetHeader(...)`, `ctx.SetFooter(...)`, `ctx.SetStatus(...)`\n- **Editor** — `ctx.SetEditor(...)`, `ctx.ResetEditor()`\n- **Prompts** — `ctx.PromptSelect(...)`, `ctx.PromptConfirm(...)`, `ctx.PromptInput(...)`\n- **Overlays** — `ctx.ShowOverlay(...)`\n- **Messages** — `ctx.SendMessage(...)`, `ctx.GetMessages()`\n- **Model** — `ctx.SetModel(...)`, `ctx.GetAvailableModels()`\n- **Tools** — `ctx.GetAllTools()`, `ctx.SetActiveTools(...)`\n- **Context stats** — `ctx.GetContextStats()`\n- **Session data** — `ctx.AppendEntry(...)`, `ctx.GetEntries(...)`\n- **Subagents** — `ctx.SpawnSubagent(...)`\n- **LLM completion** — `ctx.Complete(...)`\n- **Custom events** — `ctx.EmitCustomEvent(...)`\n- **App control** — `ctx.Exit()`, `ctx.ReloadExtensions()`\n\nSee [Capabilities](/extensions/capabilities) for full details on each component type.\n'};export{e as default};
|
||||
@@ -0,0 +1,215 @@
|
||||
const s={frontmatter:{title:"Go SDK",description:"Embed Kit in your Go applications.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="go-sdk"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#go-sdk"><span class="icon icon-link"></span></a>Go SDK</h1>
|
||||
<p>The <code>pkg/kit</code> package lets you embed Kit as a library in your Go applications.</p>
|
||||
<h2 id="installation"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#installation"><span class="icon icon-link"></span></a>Installation</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> get</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> github.com/mark3labs/kit/pkg/kit</span></span></code></pre>
|
||||
<h2 id="basic-usage"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#basic-usage"><span class="icon icon-link"></span></a>Basic usage</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">package</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> main</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">import</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> (</span></span>
|
||||
<span class="line"><span style="color:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="color:#6F42C1;--shiki-dark:#B392F0">context</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span></span>
|
||||
<span class="line"><span style="color:#032F62;--shiki-dark:#9ECBFF"> "</span><span style="color:#6F42C1;--shiki-dark:#B392F0">log</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> kit </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span><span style="color:#6F42C1;--shiki-dark:#B392F0">github.com/mark3labs/kit/pkg/kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> main</span><span style="color:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> context.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Background</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Create Kit instance with default configuration</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> host, err </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> kit.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">New</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">nil</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> if</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> err </span><span style="color:#D73A49;--shiki-dark:#F97583">!=</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> nil</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> log.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Fatal</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(err)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> defer</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Close</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"> // Send a prompt</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> response, err </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Prompt</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"What is 2+2?"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583"> if</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> err </span><span style="color:#D73A49;--shiki-dark:#F97583">!=</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> nil</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> log.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Fatal</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(err)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> }</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0"> println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(response)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
|
||||
<h2 id="multi-turn-conversations"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#multi-turn-conversations"><span class="icon icon-link"></span></a>Multi-turn conversations</h2>
|
||||
<p>Conversations retain context automatically across calls:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Prompt</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"My name is Alice"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">response, _ </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Prompt</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"What's my name?"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// response: "Your name is Alice"</span></span></code></pre>
|
||||
<h2 id="additional-prompt-methods"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#additional-prompt-methods"><span class="icon icon-link"></span></a>Additional prompt methods</h2>
|
||||
<p>The SDK provides several prompt variants:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Method</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>Prompt(ctx, message)</code></td>
|
||||
<td>Simple prompt, returns response string</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>PromptWithCallbacks(ctx, message, ...)</code></td>
|
||||
<td>With tool call and streaming callbacks</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>PromptWithOptions(ctx, message, opts)</code></td>
|
||||
<td>With per-call options</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>PromptResult(ctx, message)</code></td>
|
||||
<td>Returns full <code>TurnResult</code> with usage stats</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>PromptResultWithFiles(ctx, message, files)</code></td>
|
||||
<td>Multimodal with file attachments</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>Steer(ctx, instruction)</code></td>
|
||||
<td>System-level steering without user message</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>FollowUp(ctx, text)</code></td>
|
||||
<td>Continue without new user input</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="event-system"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#event-system"><span class="icon icon-link"></span></a>Event system</h2>
|
||||
<p>Subscribe to events for monitoring:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">unsubscribe </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnToolCall</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">event</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ToolCallEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Tool called:"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, event.Name)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">defer</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> unsubscribe</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnToolResult</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">event</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ToolResultEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Println</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Tool result:"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, event.Name)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">OnStreaming</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#D73A49;--shiki-dark:#F97583">func</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#E36209;--shiki-dark:#FFAB70">event</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">MessageUpdateEvent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">) {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> fmt.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Print</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(event.Chunk)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="model-management"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#model-management"><span class="icon icon-link"></span></a>Model management</h2>
|
||||
<p>Switch models at runtime:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SetModel</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"openai/gpt-4o"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">info </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">GetModelInfo</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">models </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">GetAvailableModels</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span></code></pre>
|
||||
<h2 id="context-and-compaction"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#context-and-compaction"><span class="icon icon-link"></span></a>Context and compaction</h2>
|
||||
<p>Monitor and manage context usage:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">tokens </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">EstimateContextTokens</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">stats </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">GetContextStats</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">if</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ShouldCompact</span><span style="color:#24292E;--shiki-dark:#E1E4E8">() {</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> result, err </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Compact</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#005CC5;--shiki-dark:#79B8FF">nil</span><span style="color:#24292E;--shiki-dark:#E1E4E8">, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">""</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">}</span></span></code></pre>
|
||||
<p>See <a href="/sdk/options">Options</a>, <a href="/sdk/callbacks">Callbacks</a>, and <a href="/sdk/sessions">Sessions</a> for more details.</p>`,headings:[{depth:2,text:"Installation",id:"installation"},{depth:2,text:"Basic usage",id:"basic-usage"},{depth:2,text:"Multi-turn conversations",id:"multi-turn-conversations"},{depth:2,text:"Additional prompt methods",id:"additional-prompt-methods"},{depth:2,text:"Event system",id:"event-system"},{depth:2,text:"Model management",id:"model-management"},{depth:2,text:"Context and compaction",id:"context-and-compaction"}],raw:`
|
||||
# Go SDK
|
||||
|
||||
The \`pkg/kit\` package lets you embed Kit as a library in your Go applications.
|
||||
|
||||
## Installation
|
||||
|
||||
\`\`\`bash
|
||||
go get github.com/mark3labs/kit/pkg/kit
|
||||
\`\`\`
|
||||
|
||||
## Basic usage
|
||||
|
||||
\`\`\`go
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
|
||||
kit "github.com/mark3labs/kit/pkg/kit"
|
||||
)
|
||||
|
||||
func main() {
|
||||
ctx := context.Background()
|
||||
|
||||
// Create Kit instance with default configuration
|
||||
host, err := kit.New(ctx, nil)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer host.Close()
|
||||
|
||||
// Send a prompt
|
||||
response, err := host.Prompt(ctx, "What is 2+2?")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
println(response)
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
## Multi-turn conversations
|
||||
|
||||
Conversations retain context automatically across calls:
|
||||
|
||||
\`\`\`go
|
||||
host.Prompt(ctx, "My name is Alice")
|
||||
response, _ := host.Prompt(ctx, "What's my name?")
|
||||
// response: "Your name is Alice"
|
||||
\`\`\`
|
||||
|
||||
## Additional prompt methods
|
||||
|
||||
The SDK provides several prompt variants:
|
||||
|
||||
| Method | Description |
|
||||
|--------|-------------|
|
||||
| \`Prompt(ctx, message)\` | Simple prompt, returns response string |
|
||||
| \`PromptWithCallbacks(ctx, message, ...)\` | With tool call and streaming callbacks |
|
||||
| \`PromptWithOptions(ctx, message, opts)\` | With per-call options |
|
||||
| \`PromptResult(ctx, message)\` | Returns full \`TurnResult\` with usage stats |
|
||||
| \`PromptResultWithFiles(ctx, message, files)\` | Multimodal with file attachments |
|
||||
| \`Steer(ctx, instruction)\` | System-level steering without user message |
|
||||
| \`FollowUp(ctx, text)\` | Continue without new user input |
|
||||
|
||||
## Event system
|
||||
|
||||
Subscribe to events for monitoring:
|
||||
|
||||
\`\`\`go
|
||||
unsubscribe := host.OnToolCall(func(event kit.ToolCallEvent) {
|
||||
fmt.Println("Tool called:", event.Name)
|
||||
})
|
||||
defer unsubscribe()
|
||||
|
||||
host.OnToolResult(func(event kit.ToolResultEvent) {
|
||||
fmt.Println("Tool result:", event.Name)
|
||||
})
|
||||
|
||||
host.OnStreaming(func(event kit.MessageUpdateEvent) {
|
||||
fmt.Print(event.Chunk)
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Model management
|
||||
|
||||
Switch models at runtime:
|
||||
|
||||
\`\`\`go
|
||||
host.SetModel(ctx, "openai/gpt-4o")
|
||||
info := host.GetModelInfo()
|
||||
models := host.GetAvailableModels()
|
||||
\`\`\`
|
||||
|
||||
## Context and compaction
|
||||
|
||||
Monitor and manage context usage:
|
||||
|
||||
\`\`\`go
|
||||
tokens := host.EstimateContextTokens()
|
||||
stats := host.GetContextStats()
|
||||
|
||||
if host.ShouldCompact() {
|
||||
result, err := host.Compact(ctx, nil, "")
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
See [Options](/sdk/options), [Callbacks](/sdk/callbacks), and [Sessions](/sdk/sessions) for more details.
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,224 @@
|
||||
const s={frontmatter:{title:"Providers",description:"Supported LLM providers and model configuration.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="providers"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#providers"><span class="icon icon-link"></span></a>Providers</h1>
|
||||
<p>Kit supports a wide range of LLM providers through a unified <code>provider/model</code> string format.</p>
|
||||
<h2 id="supported-providers"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#supported-providers"><span class="icon icon-link"></span></a>Supported providers</h2>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Provider</th>
|
||||
<th>Prefix</th>
|
||||
<th>Description</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><strong>Anthropic</strong></td>
|
||||
<td><code>anthropic/</code></td>
|
||||
<td>Claude models (native, prompt caching, OAuth)</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>OpenAI</strong></td>
|
||||
<td><code>openai/</code></td>
|
||||
<td>GPT models</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Google</strong></td>
|
||||
<td><code>google/</code> or <code>gemini/</code></td>
|
||||
<td>Gemini models</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Ollama</strong></td>
|
||||
<td><code>ollama/</code></td>
|
||||
<td>Local models</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Azure OpenAI</strong></td>
|
||||
<td><code>azure/</code></td>
|
||||
<td>Azure-hosted OpenAI</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>AWS Bedrock</strong></td>
|
||||
<td><code>bedrock/</code></td>
|
||||
<td>Bedrock models</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Google Vertex</strong></td>
|
||||
<td><code>google-vertex-anthropic/</code></td>
|
||||
<td>Claude on Vertex AI</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>OpenRouter</strong></td>
|
||||
<td><code>openrouter/</code></td>
|
||||
<td>Multi-provider router</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Vercel AI</strong></td>
|
||||
<td><code>vercel/</code></td>
|
||||
<td>Vercel AI SDK models</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><strong>Auto-routed</strong></td>
|
||||
<td>any</td>
|
||||
<td>Any provider from the models.dev database</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<h2 id="model-string-format"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#model-string-format"><span class="icon icon-link"></span></a>Model string format</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">provider/model</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Standard format</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">anthropic/claude-sonnet-4-5-20250929</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">openai/gpt-4o</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">ollama/llama3</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">google/gemini-2.0-flash-exp</span></span></code></pre>
|
||||
<h2 id="model-aliases"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#model-aliases"><span class="icon icon-link"></span></a>Model aliases</h2>
|
||||
<p>Kit provides aliases for commonly used models:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">claude-opus-latest</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> →</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> claude-opus-4-20250514</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">claude-sonnet-latest</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> →</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> claude-sonnet-4-5-20250929</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">claude-4-opus-latest</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> →</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> claude-opus-4-20250514</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">claude-4-sonnet-latest</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> →</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> claude-sonnet-4-5-20250929</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">claude-3-7-sonnet-latest</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> →</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> claude-3-7-sonnet-20250219</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">claude-3-5-sonnet-latest</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> →</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> claude-3-5-sonnet-20241022</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">claude-3-5-haiku-latest</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> →</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> claude-3-5-haiku-20241022</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">claude-3-opus-latest</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> →</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> claude-3-opus-20240229</span></span></code></pre>
|
||||
<h2 id="specifying-a-model"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#specifying-a-model"><span class="icon icon-link"></span></a>Specifying a model</h2>
|
||||
<p>Via CLI flag:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --model</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> openai/gpt-4o</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -m</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ollama/llama3</span></span></code></pre>
|
||||
<p>Via config file:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#22863A;--shiki-dark:#85E89D">model</span><span style="color:#24292E;--shiki-dark:#E1E4E8">: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">anthropic/claude-sonnet-4-5-20250929</span></span></code></pre>
|
||||
<p>Via environment variable:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> KIT_MODEL</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"google/gemini-2.0-flash-exp"</span></span></code></pre>
|
||||
<h2 id="authentication"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#authentication"><span class="icon icon-link"></span></a>Authentication</h2>
|
||||
<h3 id="api-keys"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#api-keys"><span class="icon icon-link"></span></a>API keys</h3>
|
||||
<p>Set the appropriate environment variable for your provider:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> ANTHROPIC_API_KEY</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"sk-..."</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> OPENAI_API_KEY</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"sk-..."</span></span>
|
||||
<span class="line"><span style="color:#D73A49;--shiki-dark:#F97583">export</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> GOOGLE_API_KEY</span><span style="color:#D73A49;--shiki-dark:#F97583">=</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"..."</span></span></code></pre>
|
||||
<p>Or pass it directly:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --provider-api-key</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "sk-..."</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --model</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> openai/gpt-4o</span></span></code></pre>
|
||||
<h3 id="oauth"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#oauth"><span class="icon icon-link"></span></a>OAuth</h3>
|
||||
<p>For providers that support OAuth (e.g., Anthropic):</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> auth</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> login</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> anthropic</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Start OAuth flow</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> auth</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> status</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Check authentication status</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> auth</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> logout</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> anthropic</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Remove credentials</span></span></code></pre>
|
||||
<h3 id="custom-provider-url"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#custom-provider-url"><span class="icon icon-link"></span></a>Custom provider URL</h3>
|
||||
<p>For self-hosted or proxy endpoints:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --provider-url</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "https://my-proxy.example.com/v1"</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --model</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> openai/gpt-4o</span></span></code></pre>
|
||||
<h2 id="model-database"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#model-database"><span class="icon icon-link"></span></a>Model database</h2>
|
||||
<p>Kit ships with a local model database that maps provider names to API configurations. You can manage it with:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> models</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # List available models</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> models</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> openai</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Filter by provider</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> models</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --all</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Show all providers</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> update-models</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Update from models.dev</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> update-models</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> embedded</span><span style="color:#6A737D;--shiki-dark:#6A737D"> # Reset to bundled database</span></span></code></pre>`,headings:[{depth:2,text:"Supported providers",id:"supported-providers"},{depth:2,text:"Model string format",id:"model-string-format"},{depth:2,text:"Model aliases",id:"model-aliases"},{depth:2,text:"Specifying a model",id:"specifying-a-model"},{depth:2,text:"Authentication",id:"authentication"},{depth:3,text:"API keys",id:"api-keys"},{depth:3,text:"OAuth",id:"oauth"},{depth:3,text:"Custom provider URL",id:"custom-provider-url"},{depth:2,text:"Model database",id:"model-database"}],raw:`
|
||||
# Providers
|
||||
|
||||
Kit supports a wide range of LLM providers through a unified \`provider/model\` string format.
|
||||
|
||||
## Supported providers
|
||||
|
||||
| Provider | Prefix | Description |
|
||||
|----------|--------|-------------|
|
||||
| **Anthropic** | \`anthropic/\` | Claude models (native, prompt caching, OAuth) |
|
||||
| **OpenAI** | \`openai/\` | GPT models |
|
||||
| **Google** | \`google/\` or \`gemini/\` | Gemini models |
|
||||
| **Ollama** | \`ollama/\` | Local models |
|
||||
| **Azure OpenAI** | \`azure/\` | Azure-hosted OpenAI |
|
||||
| **AWS Bedrock** | \`bedrock/\` | Bedrock models |
|
||||
| **Google Vertex** | \`google-vertex-anthropic/\` | Claude on Vertex AI |
|
||||
| **OpenRouter** | \`openrouter/\` | Multi-provider router |
|
||||
| **Vercel AI** | \`vercel/\` | Vercel AI SDK models |
|
||||
| **Auto-routed** | any | Any provider from the models.dev database |
|
||||
|
||||
## Model string format
|
||||
|
||||
\`\`\`bash
|
||||
provider/model # Standard format
|
||||
anthropic/claude-sonnet-4-5-20250929
|
||||
openai/gpt-4o
|
||||
ollama/llama3
|
||||
google/gemini-2.0-flash-exp
|
||||
\`\`\`
|
||||
|
||||
## Model aliases
|
||||
|
||||
Kit provides aliases for commonly used models:
|
||||
|
||||
\`\`\`bash
|
||||
claude-opus-latest → claude-opus-4-20250514
|
||||
claude-sonnet-latest → claude-sonnet-4-5-20250929
|
||||
claude-4-opus-latest → claude-opus-4-20250514
|
||||
claude-4-sonnet-latest → claude-sonnet-4-5-20250929
|
||||
claude-3-7-sonnet-latest → claude-3-7-sonnet-20250219
|
||||
claude-3-5-sonnet-latest → claude-3-5-sonnet-20241022
|
||||
claude-3-5-haiku-latest → claude-3-5-haiku-20241022
|
||||
claude-3-opus-latest → claude-3-opus-20240229
|
||||
\`\`\`
|
||||
|
||||
## Specifying a model
|
||||
|
||||
Via CLI flag:
|
||||
|
||||
\`\`\`bash
|
||||
kit --model openai/gpt-4o
|
||||
kit -m ollama/llama3
|
||||
\`\`\`
|
||||
|
||||
Via config file:
|
||||
|
||||
\`\`\`yaml
|
||||
model: anthropic/claude-sonnet-4-5-20250929
|
||||
\`\`\`
|
||||
|
||||
Via environment variable:
|
||||
|
||||
\`\`\`bash
|
||||
export KIT_MODEL="google/gemini-2.0-flash-exp"
|
||||
\`\`\`
|
||||
|
||||
## Authentication
|
||||
|
||||
### API keys
|
||||
|
||||
Set the appropriate environment variable for your provider:
|
||||
|
||||
\`\`\`bash
|
||||
export ANTHROPIC_API_KEY="sk-..."
|
||||
export OPENAI_API_KEY="sk-..."
|
||||
export GOOGLE_API_KEY="..."
|
||||
\`\`\`
|
||||
|
||||
Or pass it directly:
|
||||
|
||||
\`\`\`bash
|
||||
kit --provider-api-key "sk-..." --model openai/gpt-4o
|
||||
\`\`\`
|
||||
|
||||
### OAuth
|
||||
|
||||
For providers that support OAuth (e.g., Anthropic):
|
||||
|
||||
\`\`\`bash
|
||||
kit auth login anthropic # Start OAuth flow
|
||||
kit auth status # Check authentication status
|
||||
kit auth logout anthropic # Remove credentials
|
||||
\`\`\`
|
||||
|
||||
### Custom provider URL
|
||||
|
||||
For self-hosted or proxy endpoints:
|
||||
|
||||
\`\`\`bash
|
||||
kit --provider-url "https://my-proxy.example.com/v1" --model openai/gpt-4o
|
||||
\`\`\`
|
||||
|
||||
## Model database
|
||||
|
||||
Kit ships with a local model database that maps provider names to API configurations. You can manage it with:
|
||||
|
||||
\`\`\`bash
|
||||
kit models # List available models
|
||||
kit models openai # Filter by provider
|
||||
kit models --all # Show all providers
|
||||
kit update-models # Update from models.dev
|
||||
kit update-models embedded # Reset to bundled database
|
||||
\`\`\`
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,117 @@
|
||||
const s={frontmatter:{title:"Quick Start",description:"Get up and running with Kit in minutes.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="quick-start"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#quick-start"><span class="icon icon-link"></span></a>Quick Start</h1>
|
||||
<h2 id="basic-usage"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#basic-usage"><span class="icon icon-link"></span></a>Basic usage</h2>
|
||||
<p>Start an interactive session:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span></span></code></pre>
|
||||
<p>Run a one-off prompt:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "List files in src/"</span></span></code></pre>
|
||||
<p>Attach files as context using the <code>@</code> prefix:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> @main.go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> @test.go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "Review these files"</span></span></code></pre>
|
||||
<p>Use a specific model:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --model</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> anthropic/claude-sonnet-4-5-20250929</span></span></code></pre>
|
||||
<h2 id="non-interactive-mode"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#non-interactive-mode"><span class="icon icon-link"></span></a>Non-interactive mode</h2>
|
||||
<p>Kit can run as a non-interactive tool for scripting and automation.</p>
|
||||
<p>Get JSON output:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "Explain main.go"</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --json</span></span></code></pre>
|
||||
<p>Quiet mode (final response only, no TUI):</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "Run tests"</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --quiet</span></span></code></pre>
|
||||
<p>Ephemeral mode (no session file created):</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "Quick question"</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --no-session</span></span></code></pre>
|
||||
<h2 id="resuming-sessions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#resuming-sessions"><span class="icon icon-link"></span></a>Resuming sessions</h2>
|
||||
<p>Continue the most recent session for the current directory:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --continue</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># or</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -c</span></span></code></pre>
|
||||
<p>Pick from previous sessions interactively:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --resume</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># or</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -r</span></span></code></pre>
|
||||
<h2 id="acp-server-mode"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#acp-server-mode"><span class="icon icon-link"></span></a>ACP server mode</h2>
|
||||
<p>Kit can run as an <a href="https://agentclientprotocol.com">ACP (Agent Client Protocol)</a> agent server, enabling ACP-compatible clients (such as <a href="https://github.com/sst/opencode">OpenCode</a>) to drive Kit as a remote coding agent over stdio:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Start Kit as an ACP server (JSON-RPC 2.0 on stdin/stdout)</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> acp</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># With debug logging to stderr</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> acp</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --debug</span></span></code></pre>
|
||||
<p>The ACP server exposes Kit's full capabilities — LLM execution, tool calls (bash, read, write, edit, grep, etc.), and session persistence — over the standard ACP protocol.</p>`,headings:[{depth:2,text:"Basic usage",id:"basic-usage"},{depth:2,text:"Non-interactive mode",id:"non-interactive-mode"},{depth:2,text:"Resuming sessions",id:"resuming-sessions"},{depth:2,text:"ACP server mode",id:"acp-server-mode"}],raw:`
|
||||
# Quick Start
|
||||
|
||||
## Basic usage
|
||||
|
||||
Start an interactive session:
|
||||
|
||||
\`\`\`bash
|
||||
kit
|
||||
\`\`\`
|
||||
|
||||
Run a one-off prompt:
|
||||
|
||||
\`\`\`bash
|
||||
kit "List files in src/"
|
||||
\`\`\`
|
||||
|
||||
Attach files as context using the \`@\` prefix:
|
||||
|
||||
\`\`\`bash
|
||||
kit @main.go @test.go "Review these files"
|
||||
\`\`\`
|
||||
|
||||
Use a specific model:
|
||||
|
||||
\`\`\`bash
|
||||
kit --model anthropic/claude-sonnet-4-5-20250929
|
||||
\`\`\`
|
||||
|
||||
## Non-interactive mode
|
||||
|
||||
Kit can run as a non-interactive tool for scripting and automation.
|
||||
|
||||
Get JSON output:
|
||||
|
||||
\`\`\`bash
|
||||
kit "Explain main.go" --json
|
||||
\`\`\`
|
||||
|
||||
Quiet mode (final response only, no TUI):
|
||||
|
||||
\`\`\`bash
|
||||
kit "Run tests" --quiet
|
||||
\`\`\`
|
||||
|
||||
Ephemeral mode (no session file created):
|
||||
|
||||
\`\`\`bash
|
||||
kit "Quick question" --no-session
|
||||
\`\`\`
|
||||
|
||||
## Resuming sessions
|
||||
|
||||
Continue the most recent session for the current directory:
|
||||
|
||||
\`\`\`bash
|
||||
kit --continue
|
||||
# or
|
||||
kit -c
|
||||
\`\`\`
|
||||
|
||||
Pick from previous sessions interactively:
|
||||
|
||||
\`\`\`bash
|
||||
kit --resume
|
||||
# or
|
||||
kit -r
|
||||
\`\`\`
|
||||
|
||||
## ACP server mode
|
||||
|
||||
Kit can run as an [ACP (Agent Client Protocol)](https://agentclientprotocol.com) agent server, enabling ACP-compatible clients (such as [OpenCode](https://github.com/sst/opencode)) to drive Kit as a remote coding agent over stdio:
|
||||
|
||||
\`\`\`bash
|
||||
# Start Kit as an ACP server (JSON-RPC 2.0 on stdin/stdout)
|
||||
kit acp
|
||||
|
||||
# With debug logging to stderr
|
||||
kit acp --debug
|
||||
\`\`\`
|
||||
|
||||
The ACP server exposes Kit's full capabilities — LLM execution, tool calls (bash, read, write, edit, grep, etc.), and session persistence — over the standard ACP protocol.
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,77 @@
|
||||
const s={frontmatter:{title:"Session Management",description:"How Kit persists and manages conversation sessions.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="session-management"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#session-management"><span class="icon icon-link"></span></a>Session Management</h1>
|
||||
<p>Kit uses a tree-based session model that supports branching and forking conversations.</p>
|
||||
<h2 id="session-storage"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#session-storage"><span class="icon icon-link"></span></a>Session storage</h2>
|
||||
<p>Sessions are stored as JSONL (JSON Lines) files:</p>
|
||||
<pre><code>~/.kit/sessions/<cwd-path>/<timestamp>_<id>.jsonl
|
||||
</code></pre>
|
||||
<p>Path separators in the working directory are replaced with <code>--</code>. For example, <code>/home/user/project</code> becomes <code>home--user--project</code>.</p>
|
||||
<p>Each line in the session file is a JSON entry representing a message, tool call, model change, or extension data. The tree structure allows branching from any message to explore alternate paths.</p>
|
||||
<h2 id="resuming-sessions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#resuming-sessions"><span class="icon icon-link"></span></a>Resuming sessions</h2>
|
||||
<h3 id="continue-most-recent"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#continue-most-recent"><span class="icon icon-link"></span></a>Continue most recent</h3>
|
||||
<p>Resume the most recent session for the current directory:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --continue</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -c</span></span></code></pre>
|
||||
<h3 id="interactive-picker"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#interactive-picker"><span class="icon icon-link"></span></a>Interactive picker</h3>
|
||||
<p>Choose from previous sessions interactively:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --resume</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -r</span></span></code></pre>
|
||||
<h3 id="open-a-specific-session"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#open-a-specific-session"><span class="icon icon-link"></span></a>Open a specific session</h3>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --session</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> path/to/session.jsonl</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -s</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> path/to/session.jsonl</span></span></code></pre>
|
||||
<h2 id="ephemeral-mode"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#ephemeral-mode"><span class="icon icon-link"></span></a>Ephemeral mode</h2>
|
||||
<p>Run without creating a session file:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> --no-session</span></span></code></pre>
|
||||
<p>This is useful for one-off prompts, scripting, and subagent patterns where persistence isn't needed.</p>`,headings:[{depth:2,text:"Session storage",id:"session-storage"},{depth:2,text:"Resuming sessions",id:"resuming-sessions"},{depth:3,text:"Continue most recent",id:"continue-most-recent"},{depth:3,text:"Interactive picker",id:"interactive-picker"},{depth:3,text:"Open a specific session",id:"open-a-specific-session"},{depth:2,text:"Ephemeral mode",id:"ephemeral-mode"}],raw:`
|
||||
# Session Management
|
||||
|
||||
Kit uses a tree-based session model that supports branching and forking conversations.
|
||||
|
||||
## Session storage
|
||||
|
||||
Sessions are stored as JSONL (JSON Lines) files:
|
||||
|
||||
\`\`\`
|
||||
~/.kit/sessions/<cwd-path>/<timestamp>_<id>.jsonl
|
||||
\`\`\`
|
||||
|
||||
Path separators in the working directory are replaced with \`--\`. For example, \`/home/user/project\` becomes \`home--user--project\`.
|
||||
|
||||
Each line in the session file is a JSON entry representing a message, tool call, model change, or extension data. The tree structure allows branching from any message to explore alternate paths.
|
||||
|
||||
## Resuming sessions
|
||||
|
||||
### Continue most recent
|
||||
|
||||
Resume the most recent session for the current directory:
|
||||
|
||||
\`\`\`bash
|
||||
kit --continue
|
||||
kit -c
|
||||
\`\`\`
|
||||
|
||||
### Interactive picker
|
||||
|
||||
Choose from previous sessions interactively:
|
||||
|
||||
\`\`\`bash
|
||||
kit --resume
|
||||
kit -r
|
||||
\`\`\`
|
||||
|
||||
### Open a specific session
|
||||
|
||||
\`\`\`bash
|
||||
kit --session path/to/session.jsonl
|
||||
kit -s path/to/session.jsonl
|
||||
\`\`\`
|
||||
|
||||
## Ephemeral mode
|
||||
|
||||
Run without creating a session file:
|
||||
|
||||
\`\`\`bash
|
||||
kit --no-session
|
||||
\`\`\`
|
||||
|
||||
This is useful for one-off prompts, scripting, and subagent patterns where persistence isn't needed.
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,142 @@
|
||||
const s={frontmatter:{title:"SDK Sessions",description:"Session management in the Kit Go SDK.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="sdk-sessions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#sdk-sessions"><span class="icon icon-link"></span></a>SDK Sessions</h1>
|
||||
<h2 id="automatic-persistence"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#automatic-persistence"><span class="icon icon-link"></span></a>Automatic persistence</h2>
|
||||
<p>By default, Kit automatically persists sessions to JSONL files. Multi-turn conversations retain context across calls:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Prompt</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"My name is Alice"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">response, _ </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Prompt</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"What's my name?"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// response: "Your name is Alice"</span></span></code></pre>
|
||||
<h2 id="accessing-session-info"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#accessing-session-info"><span class="icon icon-link"></span></a>Accessing session info</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Get the current session file path</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">path </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">GetSessionPath</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Get the session ID</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">id </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">GetSessionID</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Get the current model string</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">model </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">GetModelString</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span></code></pre>
|
||||
<h2 id="configuring-sessions-via-options"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#configuring-sessions-via-options"><span class="icon icon-link"></span></a>Configuring sessions via Options</h2>
|
||||
<p>Session behavior is configured at initialization:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Open a specific session file</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host, _ </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> kit.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">New</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#D73A49;--shiki-dark:#F97583">&</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Options</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> SessionPath: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"./my-session.jsonl"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Resume the most recent session for the current directory</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host, _ </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> kit.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">New</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#D73A49;--shiki-dark:#F97583">&</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Options</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Continue: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Ephemeral mode (no file persistence)</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host, _ </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> kit.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">New</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#D73A49;--shiki-dark:#F97583">&</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Options</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> NoSession: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">true</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Custom session directory</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host, _ </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> kit.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">New</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#D73A49;--shiki-dark:#F97583">&</span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Options</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> SessionDir: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"/custom/sessions/"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="clearing-history"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#clearing-history"><span class="icon icon-link"></span></a>Clearing history</h2>
|
||||
<p>Clear the in-memory conversation history (does not delete the session file):</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ClearSession</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span></code></pre>
|
||||
<h2 id="tree-based-sessions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#tree-based-sessions"><span class="icon icon-link"></span></a>Tree-based sessions</h2>
|
||||
<p>Kit's session model is tree-based, supporting branching. You can branch from any entry to explore alternate conversation paths:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Access the tree session manager</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">ts </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">GetTreeSession</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Branch from a specific entry</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">err </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Branch</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"entry-id-123"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>
|
||||
<h2 id="listing-and-managing-sessions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#listing-and-managing-sessions"><span class="icon icon-link"></span></a>Listing and managing sessions</h2>
|
||||
<p>Package-level functions for session discovery:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// List sessions for a specific directory</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">sessions </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> kit.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ListSessions</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"/home/user/project"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// List all sessions across all directories</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">all </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> kit.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ListAllSessions</span><span style="color:#24292E;--shiki-dark:#E1E4E8">()</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D">// Delete a session file</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">kit.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">DeleteSession</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#032F62;--shiki-dark:#9ECBFF">"/path/to/session.jsonl"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">)</span></span></code></pre>`,headings:[{depth:2,text:"Automatic persistence",id:"automatic-persistence"},{depth:2,text:"Accessing session info",id:"accessing-session-info"},{depth:2,text:"Configuring sessions via Options",id:"configuring-sessions-via-options"},{depth:2,text:"Clearing history",id:"clearing-history"},{depth:2,text:"Tree-based sessions",id:"tree-based-sessions"},{depth:2,text:"Listing and managing sessions",id:"listing-and-managing-sessions"}],raw:`
|
||||
# SDK Sessions
|
||||
|
||||
## Automatic persistence
|
||||
|
||||
By default, Kit automatically persists sessions to JSONL files. Multi-turn conversations retain context across calls:
|
||||
|
||||
\`\`\`go
|
||||
host.Prompt(ctx, "My name is Alice")
|
||||
response, _ := host.Prompt(ctx, "What's my name?")
|
||||
// response: "Your name is Alice"
|
||||
\`\`\`
|
||||
|
||||
## Accessing session info
|
||||
|
||||
\`\`\`go
|
||||
// Get the current session file path
|
||||
path := host.GetSessionPath()
|
||||
|
||||
// Get the session ID
|
||||
id := host.GetSessionID()
|
||||
|
||||
// Get the current model string
|
||||
model := host.GetModelString()
|
||||
\`\`\`
|
||||
|
||||
## Configuring sessions via Options
|
||||
|
||||
Session behavior is configured at initialization:
|
||||
|
||||
\`\`\`go
|
||||
// Open a specific session file
|
||||
host, _ := kit.New(ctx, &kit.Options{
|
||||
SessionPath: "./my-session.jsonl",
|
||||
})
|
||||
|
||||
// Resume the most recent session for the current directory
|
||||
host, _ := kit.New(ctx, &kit.Options{
|
||||
Continue: true,
|
||||
})
|
||||
|
||||
// Ephemeral mode (no file persistence)
|
||||
host, _ := kit.New(ctx, &kit.Options{
|
||||
NoSession: true,
|
||||
})
|
||||
|
||||
// Custom session directory
|
||||
host, _ := kit.New(ctx, &kit.Options{
|
||||
SessionDir: "/custom/sessions/",
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Clearing history
|
||||
|
||||
Clear the in-memory conversation history (does not delete the session file):
|
||||
|
||||
\`\`\`go
|
||||
host.ClearSession()
|
||||
\`\`\`
|
||||
|
||||
## Tree-based sessions
|
||||
|
||||
Kit's session model is tree-based, supporting branching. You can branch from any entry to explore alternate conversation paths:
|
||||
|
||||
\`\`\`go
|
||||
// Access the tree session manager
|
||||
ts := host.GetTreeSession()
|
||||
|
||||
// Branch from a specific entry
|
||||
err := host.Branch("entry-id-123")
|
||||
\`\`\`
|
||||
|
||||
## Listing and managing sessions
|
||||
|
||||
Package-level functions for session discovery:
|
||||
|
||||
\`\`\`go
|
||||
// List sessions for a specific directory
|
||||
sessions := kit.ListSessions("/home/user/project")
|
||||
|
||||
// List all sessions across all directories
|
||||
all := kit.ListAllSessions()
|
||||
|
||||
// Delete a session file
|
||||
kit.DeleteSession("/path/to/session.jsonl")
|
||||
\`\`\`
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,136 @@
|
||||
const s={frontmatter:{title:"Subagents",description:"Multi-agent orchestration with Kit subagents.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="subagents"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#subagents"><span class="icon icon-link"></span></a>Subagents</h1>
|
||||
<p>Kit supports multi-agent orchestration through both subprocess spawning and in-process subagents.</p>
|
||||
<h2 id="subprocess-pattern"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#subprocess-pattern"><span class="icon icon-link"></span></a>Subprocess pattern</h2>
|
||||
<p>Spawn Kit as a subprocess for isolated agent execution:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "Analyze codebase"</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> \\</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> --json</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> \\</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> --no-session</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> \\</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> --no-extensions</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> \\</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> --quiet</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> \\</span></span>
|
||||
<span class="line"><span style="color:#005CC5;--shiki-dark:#79B8FF"> --model</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> anthropic/claude-haiku-3-5-20241022</span></span></code></pre>
|
||||
<p>Key flags for subprocess usage:</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Flag</th>
|
||||
<th>Purpose</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><code>--quiet</code></td>
|
||||
<td>Stdout only, no TUI</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--no-session</code></td>
|
||||
<td>Ephemeral, no persistence</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--no-extensions</code></td>
|
||||
<td>Prevent recursive extension loading</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--json</code></td>
|
||||
<td>Machine-readable output</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><code>--system-prompt</code></td>
|
||||
<td>Custom system prompt (string or file path)</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>Positional arguments are the prompt. <code>@file</code> arguments attach file content as context.</p>
|
||||
<h2 id="built-in-spawn_subagent-tool"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#built-in-spawn_subagent-tool"><span class="icon icon-link"></span></a>Built-in spawn_subagent tool</h2>
|
||||
<p>Kit includes a built-in <code>spawn_subagent</code> tool that the LLM can use to delegate tasks to independent child agents:</p>
|
||||
<pre><code>spawn_subagent(
|
||||
task: "Analyze the test files and summarize coverage",
|
||||
model: "anthropic/claude-haiku-3-5-20241022", // optional
|
||||
system_prompt: "You are a test analysis expert.", // optional
|
||||
timeout_seconds: 300 // optional, max 1800
|
||||
)
|
||||
</code></pre>
|
||||
<p>Subagents run as separate in-process Kit instances with full tool access (except spawning further subagents, to prevent infinite recursion). They can run in parallel.</p>
|
||||
<h2 id="extension-subagents"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#extension-subagents"><span class="icon icon-link"></span></a>Extension subagents</h2>
|
||||
<p>Extensions can spawn subagents programmatically:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">result </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> ctx.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SpawnSubagent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(</span><span style="color:#6F42C1;--shiki-dark:#B392F0">ext</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SubagentConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Task: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Review this code for security issues"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Model: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"anthropic/claude-sonnet-4-5-20250929"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> SystemPrompt: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"You are a security auditor."</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>
|
||||
<h2 id="go-sdk-subagents"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#go-sdk-subagents"><span class="icon icon-link"></span></a>Go SDK subagents</h2>
|
||||
<p>The SDK provides in-process subagent spawning:</p>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">result, err </span><span style="color:#D73A49;--shiki-dark:#F97583">:=</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> host.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">Subagent</span><span style="color:#24292E;--shiki-dark:#E1E4E8">(ctx, </span><span style="color:#6F42C1;--shiki-dark:#B392F0">kit</span><span style="color:#24292E;--shiki-dark:#E1E4E8">.</span><span style="color:#6F42C1;--shiki-dark:#B392F0">SubagentConfig</span><span style="color:#24292E;--shiki-dark:#E1E4E8">{</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Task: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"Summarize the changes in this PR"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Model: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"anthropic/claude-haiku-3-5-20241022"</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> SystemPrompt: </span><span style="color:#032F62;--shiki-dark:#9ECBFF">"You are a code reviewer."</span><span style="color:#24292E;--shiki-dark:#E1E4E8">,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8"> Timeout: </span><span style="color:#005CC5;--shiki-dark:#79B8FF">5</span><span style="color:#D73A49;--shiki-dark:#F97583"> *</span><span style="color:#24292E;--shiki-dark:#E1E4E8"> time.Minute,</span></span>
|
||||
<span class="line"><span style="color:#24292E;--shiki-dark:#E1E4E8">})</span></span></code></pre>`,headings:[{depth:2,text:"Subprocess pattern",id:"subprocess-pattern"},{depth:2,text:"Built-in spawn_subagent tool",id:"built-in-spawn_subagent-tool"},{depth:2,text:"Extension subagents",id:"extension-subagents"},{depth:2,text:"Go SDK subagents",id:"go-sdk-subagents"}],raw:`
|
||||
# Subagents
|
||||
|
||||
Kit supports multi-agent orchestration through both subprocess spawning and in-process subagents.
|
||||
|
||||
## Subprocess pattern
|
||||
|
||||
Spawn Kit as a subprocess for isolated agent execution:
|
||||
|
||||
\`\`\`bash
|
||||
kit "Analyze codebase" \\
|
||||
--json \\
|
||||
--no-session \\
|
||||
--no-extensions \\
|
||||
--quiet \\
|
||||
--model anthropic/claude-haiku-3-5-20241022
|
||||
\`\`\`
|
||||
|
||||
Key flags for subprocess usage:
|
||||
|
||||
| Flag | Purpose |
|
||||
|------|---------|
|
||||
| \`--quiet\` | Stdout only, no TUI |
|
||||
| \`--no-session\` | Ephemeral, no persistence |
|
||||
| \`--no-extensions\` | Prevent recursive extension loading |
|
||||
| \`--json\` | Machine-readable output |
|
||||
| \`--system-prompt\` | Custom system prompt (string or file path) |
|
||||
|
||||
Positional arguments are the prompt. \`@file\` arguments attach file content as context.
|
||||
|
||||
## Built-in spawn_subagent tool
|
||||
|
||||
Kit includes a built-in \`spawn_subagent\` tool that the LLM can use to delegate tasks to independent child agents:
|
||||
|
||||
\`\`\`
|
||||
spawn_subagent(
|
||||
task: "Analyze the test files and summarize coverage",
|
||||
model: "anthropic/claude-haiku-3-5-20241022", // optional
|
||||
system_prompt: "You are a test analysis expert.", // optional
|
||||
timeout_seconds: 300 // optional, max 1800
|
||||
)
|
||||
\`\`\`
|
||||
|
||||
Subagents run as separate in-process Kit instances with full tool access (except spawning further subagents, to prevent infinite recursion). They can run in parallel.
|
||||
|
||||
## Extension subagents
|
||||
|
||||
Extensions can spawn subagents programmatically:
|
||||
|
||||
\`\`\`go
|
||||
result := ctx.SpawnSubagent(ext.SubagentConfig{
|
||||
Task: "Review this code for security issues",
|
||||
Model: "anthropic/claude-sonnet-4-5-20250929",
|
||||
SystemPrompt: "You are a security auditor.",
|
||||
})
|
||||
\`\`\`
|
||||
|
||||
## Go SDK subagents
|
||||
|
||||
The SDK provides in-process subagent spawning:
|
||||
|
||||
\`\`\`go
|
||||
result, err := host.Subagent(ctx, kit.SubagentConfig{
|
||||
Task: "Summarize the changes in this PR",
|
||||
Model: "anthropic/claude-haiku-3-5-20241022",
|
||||
SystemPrompt: "You are a code reviewer.",
|
||||
Timeout: 5 * time.Minute,
|
||||
})
|
||||
\`\`\`
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1,130 @@
|
||||
const s={frontmatter:{title:"Testing with tmux",description:"Test Kit's TUI non-interactively using tmux.",hidden:!1,toc:!0,draft:!1},html:`<h1 id="testing-with-tmux"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#testing-with-tmux"><span class="icon icon-link"></span></a>Testing with tmux</h1>
|
||||
<p>Kit's interactive TUI can be tested non-interactively using tmux. This is useful for automated testing, CI pipelines, and extension development.</p>
|
||||
<h2 id="basic-pattern"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#basic-pattern"><span class="icon icon-link"></span></a>Basic pattern</h2>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Start Kit in a detached tmux session</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> new-session</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -s</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kittest</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -x</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> 120</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> 40</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> \\</span></span>
|
||||
<span class="line"><span style="color:#032F62;--shiki-dark:#9ECBFF"> "output/kit -e ext.go --no-session 2>kit_stderr.log"</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Wait for startup</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">sleep</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> 3</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Capture the current screen</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> capture-pane</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -t</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kittest</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -p</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Send input</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> send-keys</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -t</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kittest</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> '/command'</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> Enter</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Wait for response</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">sleep</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> 2</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Capture updated screen</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> capture-pane</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -t</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kittest</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -p</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Cleanup</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kill-session</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -t</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kittest</span></span></code></pre>
|
||||
<h2 id="testing-extensions"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#testing-extensions"><span class="icon icon-link"></span></a>Testing extensions</h2>
|
||||
<p>When testing extensions, the pattern is:</p>
|
||||
<ol>
|
||||
<li>Build Kit with your changes</li>
|
||||
<li>Start Kit in tmux with the extension loaded</li>
|
||||
<li>Send slash commands or prompts</li>
|
||||
<li>Capture and verify the screen output</li>
|
||||
<li>Check stderr logs for errors</li>
|
||||
</ol>
|
||||
<pre class="shiki shiki-themes github-light github-dark" style="background-color:#fff;--shiki-dark-bg:#24292e;color:#24292e;--shiki-dark:#e1e4e8" tabindex="0"><code><span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Build first</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">go</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> build</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -o</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> output/kit</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> ./cmd/kit</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Start with extension</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> new-session</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -d</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -s</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kittest</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -x</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> 120</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -y</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> 40</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> \\</span></span>
|
||||
<span class="line"><span style="color:#032F62;--shiki-dark:#9ECBFF"> "output/kit -e examples/extensions/widget-status.go --no-session 2>kit_stderr.log"</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">sleep</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> 3</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Verify widget appears in screen</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> capture-pane</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -t</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kittest</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -p</span><span style="color:#D73A49;--shiki-dark:#F97583"> |</span><span style="color:#6F42C1;--shiki-dark:#B392F0"> grep</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> "Status"</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Send a slash command</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> send-keys</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -t</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kittest</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> '/stats'</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> Enter</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">sleep</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> 1</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> capture-pane</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -t</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kittest</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -p</span></span>
|
||||
<span class="line"></span>
|
||||
<span class="line"><span style="color:#6A737D;--shiki-dark:#6A737D"># Cleanup</span></span>
|
||||
<span class="line"><span style="color:#6F42C1;--shiki-dark:#B392F0">tmux</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kill-session</span><span style="color:#005CC5;--shiki-dark:#79B8FF"> -t</span><span style="color:#032F62;--shiki-dark:#9ECBFF"> kittest</span></span></code></pre>
|
||||
<h2 id="tips"><a class="heading-anchor" aria-hidden="" tabindex="-1" href="#tips"><span class="icon icon-link"></span></a>Tips</h2>
|
||||
<ul>
|
||||
<li>Use <code>-x</code> and <code>-y</code> to set consistent terminal dimensions</li>
|
||||
<li>Redirect stderr to a log file (<code>2>kit.log</code>) for debugging</li>
|
||||
<li>Use <code>--no-session</code> to avoid creating session files during tests</li>
|
||||
<li>Add sufficient <code>sleep</code> between commands for the TUI to render</li>
|
||||
<li>Use <code>grep</code> on captured pane output to verify specific content</li>
|
||||
</ul>`,headings:[{depth:2,text:"Basic pattern",id:"basic-pattern"},{depth:2,text:"Testing extensions",id:"testing-extensions"},{depth:2,text:"Tips",id:"tips"}],raw:`
|
||||
# Testing with tmux
|
||||
|
||||
Kit's interactive TUI can be tested non-interactively using tmux. This is useful for automated testing, CI pipelines, and extension development.
|
||||
|
||||
## Basic pattern
|
||||
|
||||
\`\`\`bash
|
||||
# Start Kit in a detached tmux session
|
||||
tmux new-session -d -s kittest -x 120 -y 40 \\
|
||||
"output/kit -e ext.go --no-session 2>kit_stderr.log"
|
||||
|
||||
# Wait for startup
|
||||
sleep 3
|
||||
|
||||
# Capture the current screen
|
||||
tmux capture-pane -t kittest -p
|
||||
|
||||
# Send input
|
||||
tmux send-keys -t kittest '/command' Enter
|
||||
|
||||
# Wait for response
|
||||
sleep 2
|
||||
|
||||
# Capture updated screen
|
||||
tmux capture-pane -t kittest -p
|
||||
|
||||
# Cleanup
|
||||
tmux kill-session -t kittest
|
||||
\`\`\`
|
||||
|
||||
## Testing extensions
|
||||
|
||||
When testing extensions, the pattern is:
|
||||
|
||||
1. Build Kit with your changes
|
||||
2. Start Kit in tmux with the extension loaded
|
||||
3. Send slash commands or prompts
|
||||
4. Capture and verify the screen output
|
||||
5. Check stderr logs for errors
|
||||
|
||||
\`\`\`bash
|
||||
# Build first
|
||||
go build -o output/kit ./cmd/kit
|
||||
|
||||
# Start with extension
|
||||
tmux new-session -d -s kittest -x 120 -y 40 \\
|
||||
"output/kit -e examples/extensions/widget-status.go --no-session 2>kit_stderr.log"
|
||||
|
||||
sleep 3
|
||||
|
||||
# Verify widget appears in screen
|
||||
tmux capture-pane -t kittest -p | grep "Status"
|
||||
|
||||
# Send a slash command
|
||||
tmux send-keys -t kittest '/stats' Enter
|
||||
sleep 1
|
||||
tmux capture-pane -t kittest -p
|
||||
|
||||
# Cleanup
|
||||
tmux kill-session -t kittest
|
||||
\`\`\`
|
||||
|
||||
## Tips
|
||||
|
||||
- Use \`-x\` and \`-y\` to set consistent terminal dimensions
|
||||
- Redirect stderr to a log file (\`2>kit.log\`) for debugging
|
||||
- Use \`--no-session\` to avoid creating session files during tests
|
||||
- Add sufficient \`sleep\` between commands for the TUI to render
|
||||
- Use \`grep\` on captured pane output to verify specific content
|
||||
`};export{s as default};
|
||||
@@ -0,0 +1 @@
|
||||
const e={};export{e as default};
|
||||
@@ -0,0 +1,77 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Commands | Kit</title>
|
||||
<meta name="description" content="Complete reference for all Kit CLI subcommands.">
|
||||
<link rel="canonical" href="/cli/commands">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Commands","description":"Complete reference for all Kit CLI subcommands.","url":"https://go-kit.dev/cli/commands","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Commands</h1>
|
||||
# Commands
|
||||
|
||||
## Authentication
|
||||
|
||||
For OAuth-enabled providers like Anthropic.
|
||||
|
||||
```bash
|
||||
kit auth login [provider] # Start OAuth flow (e.g., anthropic)
|
||||
kit auth logout [provider] # Remove credentials for provider
|
||||
kit auth status # Check authentication status
|
||||
```
|
||||
|
||||
## Model database
|
||||
|
||||
Manage the local model database that maps provider names to API configurations.
|
||||
|
||||
```bash
|
||||
kit models [provider] # List available models (optionally filter by provider)
|
||||
kit models --all # Show all providers (not just Fantasy-compatible)
|
||||
kit update-models [source] # Update model database
|
||||
```
|
||||
|
||||
The `update-models` command accepts an optional source argument:
|
||||
- *(none)* — update from [models.dev](https://models.dev)
|
||||
- A URL — fetch from a custom endpoint
|
||||
- A file path — load from a local file
|
||||
- `embedded` — reset to the bundled database
|
||||
|
||||
## Extension management
|
||||
|
||||
```bash
|
||||
kit extensions list # List discovered extensions
|
||||
kit extensions validate # Validate extension files
|
||||
kit extensions init # Generate example extension template
|
||||
```
|
||||
|
||||
### Installing extensions from git
|
||||
|
||||
```bash
|
||||
kit install <git-url> # Install extensions from git repositories
|
||||
kit install -l <git-url> # Install to project-local .kit/git/ directory
|
||||
kit install -u <git-url> # Update an already-installed package
|
||||
kit install --uninstall <pkg> # Remove an installed package
|
||||
kit install --all # Install all extensions without prompting
|
||||
```
|
||||
|
||||
## Skills
|
||||
|
||||
```bash
|
||||
kit skill # Install the Kit extensions skill via skills.sh
|
||||
```
|
||||
|
||||
## ACP server
|
||||
|
||||
Run Kit as an [ACP (Agent Client Protocol)](https://agentclientprotocol.com) agent server. ACP-compatible clients communicate with Kit over JSON-RPC 2.0 on stdin/stdout.
|
||||
|
||||
```bash
|
||||
kit acp # Start as ACP agent
|
||||
kit acp --debug # With debug logging to stderr
|
||||
```</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,78 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Global Flags | Kit</title>
|
||||
<meta name="description" content="Complete reference for all Kit CLI flags.">
|
||||
<link rel="canonical" href="/cli/flags">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Global Flags","description":"Complete reference for all Kit CLI flags.","url":"https://go-kit.dev/cli/flags","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Global Flags</h1>
|
||||
# Global Flags
|
||||
|
||||
All flags can be passed to the root `kit` command.
|
||||
|
||||
## Model and provider
|
||||
|
||||
| Flag | Short | Default | Description |
|
||||
|------|-------|---------|-------------|
|
||||
| `--model` | `-m` | `anthropic/claude-sonnet-4-5-20250929` | Model to use (provider/model format) |
|
||||
| `--provider-api-key` | — | — | API key for the provider |
|
||||
| `--provider-url` | — | — | Base URL for provider API |
|
||||
| `--tls-skip-verify` | — | `false` | Skip TLS certificate verification |
|
||||
|
||||
## Session management
|
||||
|
||||
| Flag | Short | Default | Description |
|
||||
|------|-------|---------|-------------|
|
||||
| `--session` | `-s` | — | Open specific JSONL session file |
|
||||
| `--continue` | `-c` | `false` | Resume most recent session for current directory |
|
||||
| `--resume` | `-r` | `false` | Interactive session picker |
|
||||
| `--no-session` | — | `false` | Ephemeral mode, no persistence |
|
||||
|
||||
## Behavior
|
||||
|
||||
These flags control Kit's behavior. When a prompt is passed as a positional argument, Kit runs in non-interactive mode.
|
||||
|
||||
| Flag | Short | Default | Description |
|
||||
|------|-------|---------|-------------|
|
||||
| `--quiet` | — | `false` | Suppress all output (non-interactive only) |
|
||||
| `--json` | — | `false` | Output response as JSON (non-interactive only) |
|
||||
| `--no-exit` | — | `false` | Enter interactive mode after prompt completes |
|
||||
| `--max-steps` | — | `0` | Maximum agent steps (0 for unlimited) |
|
||||
| `--stream` | — | `true` | Enable streaming output |
|
||||
| `--compact` | — | `false` | Enable compact output mode |
|
||||
| `--auto-compact` | — | `false` | Auto-compact conversation near context limit |
|
||||
|
||||
## Extensions
|
||||
|
||||
| Flag | Short | Default | Description |
|
||||
|------|-------|---------|-------------|
|
||||
| `--extension` | `-e` | — | Load additional extension file(s) (repeatable) |
|
||||
| `--no-extensions` | — | `false` | Disable all extensions |
|
||||
|
||||
## Generation parameters
|
||||
|
||||
| Flag | Short | Default | Description |
|
||||
|------|-------|---------|-------------|
|
||||
| `--max-tokens` | — | `4096` | Maximum tokens in response |
|
||||
| `--temperature` | — | `0.7` | Randomness 0.0–1.0 |
|
||||
| `--top-p` | — | `0.95` | Nucleus sampling 0.0–1.0 |
|
||||
| `--top-k` | — | `40` | Limit top K tokens |
|
||||
| `--stop-sequences` | — | — | Custom stop sequences (comma-separated) |
|
||||
| `--thinking-level` | — | `off` | Extended thinking level: off, minimal, low, medium, high |
|
||||
|
||||
## System
|
||||
|
||||
| Flag | Short | Default | Description |
|
||||
|------|-------|---------|-------------|
|
||||
| `--config` | — | `~/.kit.yml` | Config file path |
|
||||
| `--system-prompt` | — | — | System prompt text or file path |
|
||||
| `--debug` | — | `false` | Enable debug logging |</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,108 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Configuration | Kit</title>
|
||||
<meta name="description" content="Configure Kit using config files, environment variables, and CLI flags.">
|
||||
<link rel="canonical" href="/configuration">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Configuration","description":"Configure Kit using config files, environment variables, and CLI flags.","url":"https://go-kit.dev/configuration","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Configuration</h1>
|
||||
# Configuration
|
||||
|
||||
Kit looks for configuration in the following locations, in order of priority:
|
||||
|
||||
1. CLI flags
|
||||
2. Environment variables (with `KIT_` prefix)
|
||||
3. `./.kit.yml` / `./.kit.yaml` / `./.kit.json` (project-local)
|
||||
4. `~/.kit.yml` / `~/.kit.yaml` / `~/.kit.json` (global)
|
||||
|
||||
## Basic configuration
|
||||
|
||||
Create `~/.kit.yml`:
|
||||
|
||||
```yaml
|
||||
model: anthropic/claude-sonnet-4-5-20250929
|
||||
max-tokens: 4096
|
||||
temperature: 0.7
|
||||
stream: true
|
||||
```
|
||||
|
||||
## All configuration keys
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| `model` | string | `anthropic/claude-sonnet-4-5-20250929` | Model to use (provider/model format) |
|
||||
| `max-tokens` | int | `4096` | Maximum tokens in response |
|
||||
| `temperature` | float | `0.7` | Randomness 0.0–1.0 |
|
||||
| `top-p` | float | `0.95` | Nucleus sampling 0.0–1.0 |
|
||||
| `top-k` | int | `40` | Limit top K tokens |
|
||||
| `stream` | bool | `true` | Enable streaming output |
|
||||
| `debug` | bool | `false` | Enable debug logging |
|
||||
| `compact` | bool | `false` | Enable compact output mode |
|
||||
| `system-prompt` | string | — | System prompt text or file path |
|
||||
| `max-steps` | int | `0` | Maximum agent steps (0 = unlimited) |
|
||||
| `thinking-level` | string | `off` | Extended thinking: off, minimal, low, medium, high |
|
||||
| `provider-api-key` | string | — | API key for the provider |
|
||||
| `provider-url` | string | — | Base URL for provider API |
|
||||
| `tls-skip-verify` | bool | `false` | Skip TLS certificate verification |
|
||||
| `stop-sequences` | list | — | Custom stop sequences |
|
||||
| `theme` | string | — | UI theme |
|
||||
| `markdown-theme` | string | — | Markdown rendering theme |
|
||||
|
||||
## Environment variables
|
||||
|
||||
Any configuration key can be set via environment variable with the `KIT_` prefix. Hyphens become underscores:
|
||||
|
||||
```bash
|
||||
export KIT_MODEL="openai/gpt-4o"
|
||||
export KIT_MAX_TOKENS="8192"
|
||||
export KIT_TEMPERATURE="0.5"
|
||||
```
|
||||
|
||||
Provider API keys use their own environment variables:
|
||||
|
||||
```bash
|
||||
export ANTHROPIC_API_KEY="sk-..."
|
||||
export OPENAI_API_KEY="sk-..."
|
||||
export GOOGLE_API_KEY="..."
|
||||
```
|
||||
|
||||
## MCP server configuration
|
||||
|
||||
Add external MCP servers to your `.kit.yml`:
|
||||
|
||||
```yaml
|
||||
mcpServers:
|
||||
filesystem:
|
||||
type: local
|
||||
command: ["npx", "-y", "@modelcontextprotocol/server-filesystem", "/path/to/allowed"]
|
||||
environment:
|
||||
LOG_LEVEL: "info"
|
||||
allowedTools: ["read_file", "write_file"]
|
||||
excludedTools: ["delete_file"]
|
||||
|
||||
search:
|
||||
type: remote
|
||||
url: "https://mcp.example.com/search"
|
||||
```
|
||||
|
||||
### MCP server fields
|
||||
|
||||
| Field | Type | Description |
|
||||
|-------|------|-------------|
|
||||
| `type` | string | `local` (stdio) or `remote` (streamable HTTP) |
|
||||
| `command` | list | Command and args for local servers |
|
||||
| `environment` | map | Environment variables for the server process |
|
||||
| `url` | string | URL for remote servers |
|
||||
| `allowedTools` | list | Whitelist of tool names to expose |
|
||||
| `excludedTools` | list | Blacklist of tool names to hide |
|
||||
|
||||
A legacy format with `transport`, `args`, `env`, and `headers` fields is also supported.</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,96 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Development | Kit</title>
|
||||
<meta name="description" content="Build, test, and contribute to Kit.">
|
||||
<link rel="canonical" href="/development">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Development","description":"Build, test, and contribute to Kit.","url":"https://go-kit.dev/development","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Development</h1>
|
||||
# Development
|
||||
|
||||
## Build and test
|
||||
|
||||
```bash
|
||||
# Build
|
||||
go build -o output/kit ./cmd/kit
|
||||
|
||||
# Run all tests
|
||||
go test -race ./...
|
||||
|
||||
# Run a specific test
|
||||
go test -race ./cmd -run TestScriptExecution
|
||||
|
||||
# Lint
|
||||
go vet ./...
|
||||
|
||||
# Format
|
||||
go fmt ./...
|
||||
```
|
||||
|
||||
## Project structure
|
||||
|
||||
```
|
||||
cmd/kit/ - CLI entry point (main.go)
|
||||
cmd/ - CLI command implementations (root, auth, models, etc.)
|
||||
pkg/kit/ - Go SDK for embedding Kit
|
||||
internal/app/ - Application orchestrator (agent loop, message store, queue)
|
||||
internal/agent/ - Agent execution and tool dispatch
|
||||
internal/auth/ - OAuth authentication and credential storage
|
||||
internal/acpserver/ - ACP (Agent Client Protocol) server
|
||||
internal/clipboard/ - Cross-platform clipboard operations
|
||||
internal/compaction/ - Conversation compaction and summarization
|
||||
internal/config/ - Configuration management
|
||||
internal/core/ - Built-in tools (bash, read, write, edit, grep, find, ls)
|
||||
internal/extensions/ - Yaegi extension system
|
||||
internal/kitsetup/ - Initial setup wizard
|
||||
internal/message/ - Message content types and structured content blocks
|
||||
internal/models/ - Provider and model management
|
||||
internal/session/ - Session persistence (tree-based JSONL)
|
||||
internal/skills/ - Skill loading and system prompt composition
|
||||
internal/tools/ - MCP tool integration
|
||||
internal/ui/ - Bubble Tea TUI components
|
||||
examples/extensions/ - Example extension files
|
||||
npm/ - NPM package wrapper for distribution
|
||||
```
|
||||
|
||||
## Architecture overview
|
||||
|
||||
Kit is built around a few key architectural patterns:
|
||||
|
||||
### Multi-provider LLM support
|
||||
|
||||
The `llm.Provider` interface abstracts different LLM providers. Each provider implements message formatting, tool calling, and streaming for its specific API.
|
||||
|
||||
### MCP client-server model
|
||||
|
||||
External tools are integrated via the Model Context Protocol (MCP). Kit acts as an MCP client, connecting to MCP servers configured in `.kit.yml`.
|
||||
|
||||
### Extension system
|
||||
|
||||
Extensions are Go source files interpreted at runtime by Yaegi. The `internal/extensions/` package manages loading, symbol export, and lifecycle dispatch. See the [Extension System](/extensions/overview) docs for details.
|
||||
|
||||
### TUI architecture
|
||||
|
||||
The interactive terminal UI is built with [Bubble Tea v2](https://github.com/charmbracelet/bubbletea), using a parent-child model where `AppModel` manages child components (`InputComponent`, `StreamComponent`, etc.).
|
||||
|
||||
### Decoupling pattern
|
||||
|
||||
`cmd/root.go` contains converter functions (e.g., `widgetProviderForUI()`) that bridge `internal/extensions/` types to `internal/ui/` types. The UI never imports the extensions package directly.
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome! Please see the [contribution guide](https://github.com/mark3labs/kit/blob/master/contribute/contribute.md) for guidelines.
|
||||
|
||||
## Community
|
||||
|
||||
- [Discord](https://discord.gg/RqSS2NQVsY)
|
||||
- [GitHub Issues](https://github.com/mark3labs/kit/issues)</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,269 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Capabilities | Kit</title>
|
||||
<meta name="description" content="All extension capabilities — lifecycle events, tools, commands, widgets, and more.">
|
||||
<link rel="canonical" href="/extensions/capabilities">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Capabilities","description":"All extension capabilities — lifecycle events, tools, commands, widgets, and more.","url":"https://go-kit.dev/extensions/capabilities","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Capabilities</h1>
|
||||
# Extension Capabilities
|
||||
|
||||
## Lifecycle events
|
||||
|
||||
Extensions can hook into 18 lifecycle events:
|
||||
|
||||
| Event | Description |
|
||||
|-------|-------------|
|
||||
| `OnSessionStart` | Session initialized |
|
||||
| `OnSessionShutdown` | Session ending |
|
||||
| `OnBeforeAgentStart` | Before the agent loop begins |
|
||||
| `OnAgentStart` | Agent loop started |
|
||||
| `OnAgentEnd` | Agent loop completed |
|
||||
| `OnToolCall` | Tool call requested by the model |
|
||||
| `OnToolExecutionStart` | Tool execution beginning |
|
||||
| `OnToolExecutionEnd` | Tool execution completed |
|
||||
| `OnToolResult` | Tool result returned |
|
||||
| `OnInput` | User input received |
|
||||
| `OnMessageStart` | Assistant message started |
|
||||
| `OnMessageUpdate` | Streaming text chunk received |
|
||||
| `OnMessageEnd` | Assistant message completed |
|
||||
| `OnModelChange` | Model switched |
|
||||
| `OnContextPrepare` | Context being assembled for the model |
|
||||
| `OnBeforeFork` | Before forking a conversation branch |
|
||||
| `OnBeforeSessionSwitch` | Before switching sessions |
|
||||
| `OnBeforeCompact` | Before conversation compaction |
|
||||
|
||||
### Example
|
||||
|
||||
```go
|
||||
api.OnToolCall(func(event ext.ToolCallEvent, ctx ext.Context) {
|
||||
ctx.PrintInfo("Calling tool: " + event.Name)
|
||||
})
|
||||
|
||||
api.OnAgentEnd(func(_ ext.AgentEndEvent, ctx ext.Context) {
|
||||
ctx.PrintInfo("Agent finished")
|
||||
})
|
||||
```
|
||||
|
||||
## Tools
|
||||
|
||||
Register custom tools that the LLM can invoke:
|
||||
|
||||
```go
|
||||
api.RegisterTool(ext.ToolDef{
|
||||
Name: "weather",
|
||||
Description: "Get current weather for a location",
|
||||
Parameters: map[string]ext.ParameterDef{
|
||||
"city": {Type: "string", Description: "City name", Required: true},
|
||||
},
|
||||
Handler: func(ctx ext.Context, params map[string]any) (string, error) {
|
||||
city := params["city"].(string)
|
||||
return "Sunny, 72°F in " + city, nil
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
## Commands
|
||||
|
||||
Register slash commands that users can invoke directly:
|
||||
|
||||
```go
|
||||
api.RegisterCommand(ext.CommandDef{
|
||||
Name: "stats",
|
||||
Description: "Show context statistics",
|
||||
Handler: func(ctx ext.Context, args string) {
|
||||
stats := ctx.GetContextStats()
|
||||
ctx.PrintInfo(fmt.Sprintf("Tokens: %d", stats.TotalTokens))
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
## Widgets
|
||||
|
||||
Add persistent status displays above or below the input area:
|
||||
|
||||
```go
|
||||
ctx.SetWidget(ext.WidgetConfig{
|
||||
ID: "token-count",
|
||||
Position: "bottom",
|
||||
Content: ext.WidgetContent{Text: "Tokens: 1,234"},
|
||||
})
|
||||
|
||||
// Update later
|
||||
ctx.SetWidget(ext.WidgetConfig{
|
||||
ID: "token-count",
|
||||
Position: "bottom",
|
||||
Content: ext.WidgetContent{Text: "Tokens: 2,456"},
|
||||
})
|
||||
|
||||
// Remove
|
||||
ctx.RemoveWidget("token-count")
|
||||
```
|
||||
|
||||
## Headers and footers
|
||||
|
||||
Persistent content above and below the conversation:
|
||||
|
||||
```go
|
||||
ctx.SetHeader(ext.HeaderFooterConfig{
|
||||
Content: ext.WidgetContent{Text: "Project: my-app | Branch: main"},
|
||||
})
|
||||
|
||||
ctx.SetFooter(ext.HeaderFooterConfig{
|
||||
Content: ext.WidgetContent{Text: "Plan Mode (read-only)"},
|
||||
})
|
||||
```
|
||||
|
||||
## Status bar
|
||||
|
||||
Custom status bar entries:
|
||||
|
||||
```go
|
||||
ctx.SetStatus("mode", "Planning")
|
||||
ctx.RemoveStatus("mode")
|
||||
```
|
||||
|
||||
## Shortcuts
|
||||
|
||||
Global keyboard shortcuts:
|
||||
|
||||
```go
|
||||
api.RegisterShortcut(ext.ShortcutDef{
|
||||
Key: "ctrl+t",
|
||||
Description: "Toggle plan mode",
|
||||
}, func(ctx ext.Context) {
|
||||
// handle shortcut
|
||||
})
|
||||
```
|
||||
|
||||
## Overlays
|
||||
|
||||
Modal dialogs with markdown content:
|
||||
|
||||
```go
|
||||
ctx.ShowOverlay(ext.OverlayConfig{
|
||||
Title: "Help",
|
||||
Content: "# Keyboard Shortcuts\n\n- **ctrl+t** — Toggle plan mode\n- **ctrl+s** — Save session",
|
||||
})
|
||||
```
|
||||
|
||||
## Tool renderers
|
||||
|
||||
Customize how specific tool calls are displayed in the TUI:
|
||||
|
||||
```go
|
||||
api.RegisterToolRenderer(ext.ToolRenderConfig{
|
||||
ToolName: "bash",
|
||||
Render: func(name, args, result string, isError bool) string {
|
||||
return "$ " + args + "\n" + result
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
## Message renderers
|
||||
|
||||
Custom rendering for assistant messages:
|
||||
|
||||
```go
|
||||
api.RegisterMessageRenderer(ext.MessageRendererConfig{
|
||||
Name: "custom",
|
||||
Render: func(content string) string {
|
||||
return ">> " + content
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
## Editor interceptors
|
||||
|
||||
Handle key events and wrap the editor's rendering:
|
||||
|
||||
```go
|
||||
ctx.SetEditor(ext.EditorConfig{
|
||||
HandleKey: func(key, text string) ext.EditorKeyAction {
|
||||
if key == "escape" {
|
||||
return ext.EditorKeyAction{Handled: true}
|
||||
}
|
||||
return ext.EditorKeyAction{Handled: false}
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
## Interactive prompts
|
||||
|
||||
Select, confirm, input, and multi-select dialogs:
|
||||
|
||||
```go
|
||||
// Single select
|
||||
response := ctx.PromptSelect(ext.PromptSelectConfig{
|
||||
Title: "Choose a model",
|
||||
Options: []string{"claude-sonnet", "gpt-4o", "llama3"},
|
||||
})
|
||||
|
||||
// Confirm
|
||||
confirmed := ctx.PromptConfirm(ext.PromptConfirmConfig{
|
||||
Title: "Delete this file?",
|
||||
})
|
||||
|
||||
// Text input
|
||||
name := ctx.PromptInput(ext.PromptInputConfig{
|
||||
Title: "Enter project name",
|
||||
Placeholder: "my-project",
|
||||
})
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
Register configurable extension options:
|
||||
|
||||
```go
|
||||
api.RegisterOption(ext.OptionDef{
|
||||
Name: "auto-commit",
|
||||
Description: "Automatically commit on shutdown",
|
||||
DefaultValue: "false",
|
||||
})
|
||||
```
|
||||
|
||||
## Subagents
|
||||
|
||||
Spawn in-process child Kit instances:
|
||||
|
||||
```go
|
||||
result := ctx.SpawnSubagent(ext.SubagentConfig{
|
||||
Task: "Analyze the test files and summarize coverage",
|
||||
Model: "anthropic/claude-haiku-3-5-20241022",
|
||||
SystemPrompt: "You are a test analysis expert.",
|
||||
})
|
||||
```
|
||||
|
||||
## LLM completion
|
||||
|
||||
Make direct model calls without going through the agent loop:
|
||||
|
||||
```go
|
||||
response := ctx.Complete(ext.CompleteRequest{
|
||||
Prompt: "Summarize this in one sentence: " + content,
|
||||
})
|
||||
```
|
||||
|
||||
## Custom events
|
||||
|
||||
Inter-extension communication:
|
||||
|
||||
```go
|
||||
// Emit
|
||||
ctx.EmitCustomEvent("my-extension:data-ready", payload)
|
||||
|
||||
// Listen
|
||||
api.OnCustomEvent("my-extension:data-ready", func(data any, ctx ext.Context) {
|
||||
// handle event
|
||||
})
|
||||
```</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,86 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Examples | Kit</title>
|
||||
<meta name="description" content="Catalog of example extensions included with Kit.">
|
||||
<link rel="canonical" href="/extensions/examples">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Examples","description":"Catalog of example extensions included with Kit.","url":"https://go-kit.dev/extensions/examples","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Examples</h1>
|
||||
# Extension Examples
|
||||
|
||||
Kit ships with a rich set of example extensions in the `examples/extensions/` directory. These serve as both documentation and starting points for your own extensions.
|
||||
|
||||
## UI and display
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| `minimal.go` | Clean UI with custom footer |
|
||||
| `branded-output.go` | Branded output rendering |
|
||||
| `header-footer-demo.go` | Custom headers and footers |
|
||||
| `widget-status.go` | Persistent status widgets |
|
||||
| `overlay-demo.go` | Modal dialogs |
|
||||
| `tool-renderer-demo.go` | Custom tool call rendering |
|
||||
| `custom-editor-demo.go` | Vim-like modal editor |
|
||||
| `pirate.go` | Pirate-themed personality |
|
||||
|
||||
## Workflow and automation
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| `auto-commit.go` | Auto-commit changes on shutdown |
|
||||
| `plan-mode.go` | Read-only planning mode |
|
||||
| `permission-gate.go` | Permission gating for destructive tools |
|
||||
| `confirm-destructive.go` | Confirm destructive operations |
|
||||
| `protected-paths.go` | Path protection for sensitive files |
|
||||
| `project-rules.go` | Project-specific rules injection |
|
||||
| `compact-notify.go` | Notification on conversation compaction |
|
||||
|
||||
## Interactive features
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| `prompt-demo.go` | Interactive prompts (select/confirm/input) |
|
||||
| `bookmark.go` | Bookmark conversations |
|
||||
| `inline-bash.go` | Inline bash execution |
|
||||
| `interactive-shell.go` | Interactive shell integration |
|
||||
| `notify.go` | Desktop notifications |
|
||||
|
||||
## Agent and context
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| `tool-logger.go` | Log all tool calls |
|
||||
| `context-inject.go` | Inject context into conversations |
|
||||
| `summarize.go` | Conversation summarization |
|
||||
| `lsp-diagnostics.go` | LSP diagnostic integration |
|
||||
|
||||
## Multi-agent
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| `kit-kit.go` | Kit-in-Kit sub-agent spawning |
|
||||
| `subagent-widget.go` | Multi-agent orchestration with status widget |
|
||||
| `subagent-test.go` | Subagent testing utilities |
|
||||
|
||||
## Development
|
||||
|
||||
| Extension | Description |
|
||||
|-----------|-------------|
|
||||
| `dev-reload.go` | Development live-reload |
|
||||
|
||||
## Subdirectory extensions
|
||||
|
||||
| Directory | Description |
|
||||
|-----------|-------------|
|
||||
| `kit-kit-agents/` | Multi-agent orchestration example |
|
||||
| `kit-telegram/` | Telegram bot integration |
|
||||
| `status-tools/` | Status bar tool examples |</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,131 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Loading Extensions | Kit</title>
|
||||
<meta name="description" content="How Kit discovers and loads extensions.">
|
||||
<link rel="canonical" href="/extensions/loading">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Loading Extensions","description":"How Kit discovers and loads extensions.","url":"https://go-kit.dev/extensions/loading","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Loading Extensions</h1>
|
||||
# Loading Extensions
|
||||
|
||||
## Auto-discovery
|
||||
|
||||
Kit automatically discovers and loads extensions from these paths, in order:
|
||||
|
||||
| Path | Scope |
|
||||
|------|-------|
|
||||
| `~/.config/kit/extensions/*.go` | Global single files |
|
||||
| `~/.config/kit/extensions/*/main.go` | Global subdirectory extensions |
|
||||
| `.kit/extensions/*.go` | Project-local single files |
|
||||
| `.kit/extensions/*/main.go` | Project-local subdirectory extensions |
|
||||
| `~/.local/share/kit/git/` | Global git-installed packages |
|
||||
| `.kit/git/` | Project-local git-installed packages |
|
||||
|
||||
## Explicit loading
|
||||
|
||||
Load extensions by path using the `-e` flag:
|
||||
|
||||
```bash
|
||||
kit -e path/to/extension.go
|
||||
```
|
||||
|
||||
Load multiple extensions:
|
||||
|
||||
```bash
|
||||
kit -e ext1.go -e ext2.go
|
||||
```
|
||||
|
||||
## Disabling extensions
|
||||
|
||||
Disable all auto-discovered extensions:
|
||||
|
||||
```bash
|
||||
kit --no-extensions
|
||||
```
|
||||
|
||||
You can combine `--no-extensions` with `-e` to load only specific extensions:
|
||||
|
||||
```bash
|
||||
kit --no-extensions -e my-extension.go
|
||||
```
|
||||
|
||||
## Installing from git
|
||||
|
||||
Install extensions from git repositories using `kit install`:
|
||||
|
||||
```bash
|
||||
# Install globally (to ~/.local/share/kit/git/)
|
||||
kit install https://github.com/user/my-kit-extension.git
|
||||
|
||||
# Install project-locally (to .kit/git/)
|
||||
kit install -l https://github.com/user/my-kit-extension.git
|
||||
|
||||
# Update an installed package
|
||||
kit install -u https://github.com/user/my-kit-extension.git
|
||||
|
||||
# Remove
|
||||
kit install --uninstall my-kit-extension
|
||||
```
|
||||
|
||||
## Extension structure
|
||||
|
||||
### Single-file extensions
|
||||
|
||||
A single `.go` file with an `Init` function:
|
||||
|
||||
```go
|
||||
//go:build ignore
|
||||
|
||||
package main
|
||||
|
||||
import "kit/ext"
|
||||
|
||||
func Init(api ext.API) {
|
||||
// register handlers, tools, commands, etc.
|
||||
}
|
||||
```
|
||||
|
||||
The `//go:build ignore` directive prevents the Go toolchain from trying to compile the file as part of a normal build.
|
||||
|
||||
### Subdirectory extensions
|
||||
|
||||
For more complex extensions, create a directory with a `main.go` entry point:
|
||||
|
||||
```
|
||||
.kit/extensions/my-extension/
|
||||
├── main.go # Must contain Init(api ext.API)
|
||||
├── helpers.go # Additional source files
|
||||
└── config.go
|
||||
```
|
||||
|
||||
### Package-level state
|
||||
|
||||
Yaegi supports package-level variables captured in closures. This is the standard way to maintain state across event callbacks:
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "kit/ext"
|
||||
|
||||
var callCount int
|
||||
|
||||
func Init(api ext.API) {
|
||||
api.OnToolCall(func(_ ext.ToolCallEvent, ctx ext.Context) {
|
||||
callCount++
|
||||
ctx.SetFooter(ext.HeaderFooterConfig{
|
||||
Content: ext.WidgetContent{
|
||||
Text: fmt.Sprintf("Tools called: %d", callCount),
|
||||
},
|
||||
})
|
||||
})
|
||||
}
|
||||
```</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,86 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Extension System | Kit</title>
|
||||
<meta name="description" content="Overview of Kit's Go-based extension system.">
|
||||
<link rel="canonical" href="/extensions/overview">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Extension System","description":"Overview of Kit's Go-based extension system.","url":"https://go-kit.dev/extensions/overview","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Extension System</h1>
|
||||
# Extension System
|
||||
|
||||
Extensions are Go source files interpreted at runtime via [Yaegi](https://github.com/traefik/yaegi). They can add custom tools, slash commands, widgets, keyboard shortcuts, and intercept lifecycle events — all without recompiling Kit.
|
||||
|
||||
## Minimal extension
|
||||
|
||||
```go
|
||||
//go:build ignore
|
||||
|
||||
package main
|
||||
|
||||
import "kit/ext"
|
||||
|
||||
func Init(api ext.API) {
|
||||
api.OnSessionStart(func(_ ext.SessionStartEvent, ctx ext.Context) {
|
||||
ctx.SetFooter(ext.HeaderFooterConfig{
|
||||
Content: ext.WidgetContent{Text: "Custom Footer"},
|
||||
})
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
Run it with:
|
||||
|
||||
```bash
|
||||
kit -e examples/extensions/minimal.go
|
||||
```
|
||||
|
||||
## How extensions work
|
||||
|
||||
1. Kit discovers extension files from [auto-discovery paths](/extensions/loading) or explicit `-e` flags
|
||||
2. Each `.go` file is loaded into a Yaegi interpreter with access to the `kit/ext` package
|
||||
3. Kit calls the `Init(api ext.API)` function in each extension
|
||||
4. The extension registers callbacks, tools, commands, and UI components via the `api` and `ctx` objects
|
||||
|
||||
## Key concepts
|
||||
|
||||
### The `API` object
|
||||
|
||||
Passed to `Init()`, the `API` object is used to register lifecycle event handlers and static components:
|
||||
|
||||
- **Lifecycle handlers** — `api.OnSessionStart(...)`, `api.OnToolCall(...)`, etc.
|
||||
- **Tools** — `api.RegisterTool(ext.ToolDef{...})`
|
||||
- **Commands** — `api.RegisterCommand(ext.CommandDef{...})`
|
||||
- **Shortcuts** — `api.RegisterShortcut(ext.ShortcutDef{...}, handler)`
|
||||
- **Tool renderers** — `api.RegisterToolRenderer(ext.ToolRenderConfig{...})`
|
||||
- **Message renderers** — `api.RegisterMessageRenderer(ext.MessageRendererConfig{...})`
|
||||
- **Options** — `api.RegisterOption(ext.OptionDef{...})`
|
||||
|
||||
### The `Context` object
|
||||
|
||||
Passed to event handlers, the `Context` object provides runtime access to Kit's state and UI:
|
||||
|
||||
- **Output** — `ctx.Print(...)`, `ctx.PrintInfo(...)`, `ctx.PrintError(...)`
|
||||
- **UI components** — `ctx.SetWidget(...)`, `ctx.SetHeader(...)`, `ctx.SetFooter(...)`, `ctx.SetStatus(...)`
|
||||
- **Editor** — `ctx.SetEditor(...)`, `ctx.ResetEditor()`
|
||||
- **Prompts** — `ctx.PromptSelect(...)`, `ctx.PromptConfirm(...)`, `ctx.PromptInput(...)`
|
||||
- **Overlays** — `ctx.ShowOverlay(...)`
|
||||
- **Messages** — `ctx.SendMessage(...)`, `ctx.GetMessages()`
|
||||
- **Model** — `ctx.SetModel(...)`, `ctx.GetAvailableModels()`
|
||||
- **Tools** — `ctx.GetAllTools()`, `ctx.SetActiveTools(...)`
|
||||
- **Context stats** — `ctx.GetContextStats()`
|
||||
- **Session data** — `ctx.AppendEntry(...)`, `ctx.GetEntries(...)`
|
||||
- **Subagents** — `ctx.SpawnSubagent(...)`
|
||||
- **LLM completion** — `ctx.Complete(...)`
|
||||
- **Custom events** — `ctx.EmitCustomEvent(...)`
|
||||
- **App control** — `ctx.Exit()`, `ctx.ReloadExtensions()`
|
||||
|
||||
See [Capabilities](/extensions/capabilities) for full details on each component type.</div>
|
||||
</body>
|
||||
</html>
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Kit Documentation</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=Source+Code+Pro:wght@400;500;600&display=swap" rel="stylesheet" />
|
||||
<style>
|
||||
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
||||
body { -webkit-font-smoothing: antialiased; }
|
||||
::-webkit-scrollbar { width: 6px; height: 6px; }
|
||||
::-webkit-scrollbar-track { background: transparent; }
|
||||
::-webkit-scrollbar-thumb { background: #333; border-radius: 3px; }
|
||||
</style>
|
||||
<script type="module" crossorigin src="/assets/index-BdEV_URu.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-Di_r5hA0.css">
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","name":"Kit","url":"https://go-kit.dev","description":"Documentation site powered by Tome","potentialAction":{"@type":"SearchAction","target":"https://go-kit.dev/search?q={search_term_string}","query-input":"required name=search_term_string"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,69 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Installation | Kit</title>
|
||||
<meta name="description" content="Install Kit using npm, Go, or build from source.">
|
||||
<link rel="canonical" href="/installation">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Installation","description":"Install Kit using npm, Go, or build from source.","url":"https://go-kit.dev/installation","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Installation</h1>
|
||||
# Installation
|
||||
|
||||
## Using npm (recommended)
|
||||
|
||||
```bash
|
||||
npm install -g @mark3labs/kit
|
||||
```
|
||||
|
||||
## Using Go
|
||||
|
||||
```bash
|
||||
go install github.com/mark3labs/kit/cmd/kit@latest
|
||||
```
|
||||
|
||||
## Building from source
|
||||
|
||||
```bash
|
||||
git clone https://github.com/mark3labs/kit.git
|
||||
cd kit
|
||||
go build -o kit ./cmd/kit
|
||||
```
|
||||
|
||||
## Verifying the installation
|
||||
|
||||
After installing, verify Kit is available:
|
||||
|
||||
```bash
|
||||
kit --help
|
||||
```
|
||||
|
||||
## Setting up a provider
|
||||
|
||||
Kit needs at least one LLM provider configured. Set an API key for your preferred provider:
|
||||
|
||||
```bash
|
||||
# Anthropic (default provider)
|
||||
export ANTHROPIC_API_KEY="sk-..."
|
||||
|
||||
# OpenAI
|
||||
export OPENAI_API_KEY="sk-..."
|
||||
|
||||
# Google Gemini
|
||||
export GOOGLE_API_KEY="..."
|
||||
```
|
||||
|
||||
For OAuth-enabled providers like Anthropic, you can also authenticate interactively:
|
||||
|
||||
```bash
|
||||
kit auth login anthropic
|
||||
```
|
||||
|
||||
See [Providers](/providers) for the full list of supported providers and their configuration.</div>
|
||||
</body>
|
||||
</html>
|
||||
+1810
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,24 @@
|
||||
# Kit
|
||||
|
||||
> Documentation site powered by Tome
|
||||
|
||||
- [JSON Output](https://go-kit.dev/advanced/json-output) - Machine-readable JSON output for scripting and automation.
|
||||
- [Subagents](https://go-kit.dev/advanced/subagents) - Multi-agent orchestration with Kit subagents.
|
||||
- [Testing with tmux](https://go-kit.dev/advanced/testing) - Test Kit's TUI non-interactively using tmux.
|
||||
- [Commands](https://go-kit.dev/cli/commands) - Complete reference for all Kit CLI subcommands.
|
||||
- [Global Flags](https://go-kit.dev/cli/flags) - Complete reference for all Kit CLI flags.
|
||||
- [Configuration](https://go-kit.dev/configuration) - Configure Kit using config files, environment variables, and CLI flags.
|
||||
- [Development](https://go-kit.dev/development) - Build, test, and contribute to Kit.
|
||||
- [Capabilities](https://go-kit.dev/extensions/capabilities) - All extension capabilities — lifecycle events, tools, commands, widgets, and more.
|
||||
- [Examples](https://go-kit.dev/extensions/examples) - Catalog of example extensions included with Kit.
|
||||
- [Loading Extensions](https://go-kit.dev/extensions/loading) - How Kit discovers and loads extensions.
|
||||
- [Extension System](https://go-kit.dev/extensions/overview) - Overview of Kit's Go-based extension system.
|
||||
- [Kit](https://go-kit.dev/) - Kit is a powerful, extensible AI coding agent CLI with multi-provider support, built-in tools, and a rich extension system.
|
||||
- [Installation](https://go-kit.dev/installation) - Install Kit using npm, Go, or build from source.
|
||||
- [Providers](https://go-kit.dev/providers) - Supported LLM providers and model configuration.
|
||||
- [Quick Start](https://go-kit.dev/quick-start) - Get up and running with Kit in minutes.
|
||||
- [Callbacks](https://go-kit.dev/sdk/callbacks) - Monitor tool calls and streaming output with the Kit Go SDK.
|
||||
- [SDK Options](https://go-kit.dev/sdk/options) - Configuration options for the Kit Go SDK.
|
||||
- [Go SDK](https://go-kit.dev/sdk/overview) - Embed Kit in your Go applications.
|
||||
- [SDK Sessions](https://go-kit.dev/sdk/sessions) - Session management in the Kit Go SDK.
|
||||
- [Session Management](https://go-kit.dev/sessions) - How Kit persists and manages conversation sessions.
|
||||
@@ -0,0 +1,129 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Providers | Kit</title>
|
||||
<meta name="description" content="Supported LLM providers and model configuration.">
|
||||
<link rel="canonical" href="/providers">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Providers","description":"Supported LLM providers and model configuration.","url":"https://go-kit.dev/providers","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Providers</h1>
|
||||
# Providers
|
||||
|
||||
Kit supports a wide range of LLM providers through a unified `provider/model` string format.
|
||||
|
||||
## Supported providers
|
||||
|
||||
| Provider | Prefix | Description |
|
||||
|----------|--------|-------------|
|
||||
| **Anthropic** | `anthropic/` | Claude models (native, prompt caching, OAuth) |
|
||||
| **OpenAI** | `openai/` | GPT models |
|
||||
| **Google** | `google/` or `gemini/` | Gemini models |
|
||||
| **Ollama** | `ollama/` | Local models |
|
||||
| **Azure OpenAI** | `azure/` | Azure-hosted OpenAI |
|
||||
| **AWS Bedrock** | `bedrock/` | Bedrock models |
|
||||
| **Google Vertex** | `google-vertex-anthropic/` | Claude on Vertex AI |
|
||||
| **OpenRouter** | `openrouter/` | Multi-provider router |
|
||||
| **Vercel AI** | `vercel/` | Vercel AI SDK models |
|
||||
| **Auto-routed** | any | Any provider from the models.dev database |
|
||||
|
||||
## Model string format
|
||||
|
||||
```bash
|
||||
provider/model # Standard format
|
||||
anthropic/claude-sonnet-4-5-20250929
|
||||
openai/gpt-4o
|
||||
ollama/llama3
|
||||
google/gemini-2.0-flash-exp
|
||||
```
|
||||
|
||||
## Model aliases
|
||||
|
||||
Kit provides aliases for commonly used models:
|
||||
|
||||
```bash
|
||||
claude-opus-latest → claude-opus-4-20250514
|
||||
claude-sonnet-latest → claude-sonnet-4-5-20250929
|
||||
claude-4-opus-latest → claude-opus-4-20250514
|
||||
claude-4-sonnet-latest → claude-sonnet-4-5-20250929
|
||||
claude-3-7-sonnet-latest → claude-3-7-sonnet-20250219
|
||||
claude-3-5-sonnet-latest → claude-3-5-sonnet-20241022
|
||||
claude-3-5-haiku-latest → claude-3-5-haiku-20241022
|
||||
claude-3-opus-latest → claude-3-opus-20240229
|
||||
```
|
||||
|
||||
## Specifying a model
|
||||
|
||||
Via CLI flag:
|
||||
|
||||
```bash
|
||||
kit --model openai/gpt-4o
|
||||
kit -m ollama/llama3
|
||||
```
|
||||
|
||||
Via config file:
|
||||
|
||||
```yaml
|
||||
model: anthropic/claude-sonnet-4-5-20250929
|
||||
```
|
||||
|
||||
Via environment variable:
|
||||
|
||||
```bash
|
||||
export KIT_MODEL="google/gemini-2.0-flash-exp"
|
||||
```
|
||||
|
||||
## Authentication
|
||||
|
||||
### API keys
|
||||
|
||||
Set the appropriate environment variable for your provider:
|
||||
|
||||
```bash
|
||||
export ANTHROPIC_API_KEY="sk-..."
|
||||
export OPENAI_API_KEY="sk-..."
|
||||
export GOOGLE_API_KEY="..."
|
||||
```
|
||||
|
||||
Or pass it directly:
|
||||
|
||||
```bash
|
||||
kit --provider-api-key "sk-..." --model openai/gpt-4o
|
||||
```
|
||||
|
||||
### OAuth
|
||||
|
||||
For providers that support OAuth (e.g., Anthropic):
|
||||
|
||||
```bash
|
||||
kit auth login anthropic # Start OAuth flow
|
||||
kit auth status # Check authentication status
|
||||
kit auth logout anthropic # Remove credentials
|
||||
```
|
||||
|
||||
### Custom provider URL
|
||||
|
||||
For self-hosted or proxy endpoints:
|
||||
|
||||
```bash
|
||||
kit --provider-url "https://my-proxy.example.com/v1" --model openai/gpt-4o
|
||||
```
|
||||
|
||||
## Model database
|
||||
|
||||
Kit ships with a local model database that maps provider names to API configurations. You can manage it with:
|
||||
|
||||
```bash
|
||||
kit models # List available models
|
||||
kit models openai # Filter by provider
|
||||
kit models --all # Show all providers
|
||||
kit update-models # Update from models.dev
|
||||
kit update-models embedded # Reset to bundled database
|
||||
```</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,98 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Quick Start | Kit</title>
|
||||
<meta name="description" content="Get up and running with Kit in minutes.">
|
||||
<link rel="canonical" href="/quick-start">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Quick Start","description":"Get up and running with Kit in minutes.","url":"https://go-kit.dev/quick-start","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Quick Start</h1>
|
||||
# Quick Start
|
||||
|
||||
## Basic usage
|
||||
|
||||
Start an interactive session:
|
||||
|
||||
```bash
|
||||
kit
|
||||
```
|
||||
|
||||
Run a one-off prompt:
|
||||
|
||||
```bash
|
||||
kit "List files in src/"
|
||||
```
|
||||
|
||||
Attach files as context using the `@` prefix:
|
||||
|
||||
```bash
|
||||
kit @main.go @test.go "Review these files"
|
||||
```
|
||||
|
||||
Use a specific model:
|
||||
|
||||
```bash
|
||||
kit --model anthropic/claude-sonnet-4-5-20250929
|
||||
```
|
||||
|
||||
## Non-interactive mode
|
||||
|
||||
Kit can run as a non-interactive tool for scripting and automation.
|
||||
|
||||
Get JSON output:
|
||||
|
||||
```bash
|
||||
kit "Explain main.go" --json
|
||||
```
|
||||
|
||||
Quiet mode (final response only, no TUI):
|
||||
|
||||
```bash
|
||||
kit "Run tests" --quiet
|
||||
```
|
||||
|
||||
Ephemeral mode (no session file created):
|
||||
|
||||
```bash
|
||||
kit "Quick question" --no-session
|
||||
```
|
||||
|
||||
## Resuming sessions
|
||||
|
||||
Continue the most recent session for the current directory:
|
||||
|
||||
```bash
|
||||
kit --continue
|
||||
# or
|
||||
kit -c
|
||||
```
|
||||
|
||||
Pick from previous sessions interactively:
|
||||
|
||||
```bash
|
||||
kit --resume
|
||||
# or
|
||||
kit -r
|
||||
```
|
||||
|
||||
## ACP server mode
|
||||
|
||||
Kit can run as an [ACP (Agent Client Protocol)](https://agentclientprotocol.com) agent server, enabling ACP-compatible clients (such as [OpenCode](https://github.com/sst/opencode)) to drive Kit as a remote coding agent over stdio:
|
||||
|
||||
```bash
|
||||
# Start Kit as an ACP server (JSON-RPC 2.0 on stdin/stdout)
|
||||
kit acp
|
||||
|
||||
# With debug logging to stderr
|
||||
kit acp --debug
|
||||
```
|
||||
|
||||
The ACP server exposes Kit's full capabilities — LLM execution, tool calls (bash, read, write, edit, grep, etc.), and session persistence — over the standard ACP protocol.</div>
|
||||
</body>
|
||||
</html>
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
# Tome Documentation Site
|
||||
# https://tome.dev
|
||||
|
||||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# AI Crawlers — explicitly allowed
|
||||
User-agent: GPTBot
|
||||
Allow: /
|
||||
|
||||
User-agent: ClaudeBot
|
||||
Allow: /
|
||||
|
||||
User-agent: Claude-Web
|
||||
Allow: /
|
||||
|
||||
User-agent: Amazonbot
|
||||
Allow: /
|
||||
|
||||
User-agent: anthropic-ai
|
||||
Allow: /
|
||||
|
||||
User-agent: Bytespider
|
||||
Allow: /
|
||||
|
||||
User-agent: CCBot
|
||||
Allow: /
|
||||
|
||||
User-agent: cohere-ai
|
||||
Allow: /
|
||||
|
||||
User-agent: PerplexityBot
|
||||
Allow: /
|
||||
|
||||
# Machine-readable resources
|
||||
Sitemap: https://go-kit.dev/sitemap.xml
|
||||
|
||||
# AI/LLM Resources
|
||||
# llms.txt: https://go-kit.dev/llms.txt
|
||||
# llms-full.txt: https://go-kit.dev/llms-full.txt
|
||||
# skill.md: https://go-kit.dev/skill.md
|
||||
# MCP manifest: https://go-kit.dev/mcp.json
|
||||
@@ -0,0 +1,127 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Callbacks | Kit</title>
|
||||
<meta name="description" content="Monitor tool calls and streaming output with the Kit Go SDK.">
|
||||
<link rel="canonical" href="/sdk/callbacks">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Callbacks","description":"Monitor tool calls and streaming output with the Kit Go SDK.","url":"https://go-kit.dev/sdk/callbacks","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Callbacks</h1>
|
||||
# Callbacks
|
||||
|
||||
## PromptWithCallbacks
|
||||
|
||||
The `PromptWithCallbacks` method provides real-time visibility into tool calls and streaming output:
|
||||
|
||||
```go
|
||||
response, err := host.PromptWithCallbacks(
|
||||
ctx,
|
||||
"List files in current directory",
|
||||
func(name, args string) {
|
||||
// Called when the model invokes a tool
|
||||
fmt.Println("Calling tool:", name)
|
||||
},
|
||||
func(name, args, result string, isError bool) {
|
||||
// Called when a tool returns its result
|
||||
if isError {
|
||||
fmt.Println("Tool failed:", name)
|
||||
}
|
||||
},
|
||||
func(chunk string) {
|
||||
// Called for each streaming text chunk
|
||||
fmt.Print(chunk)
|
||||
},
|
||||
)
|
||||
```
|
||||
|
||||
### Callback signatures
|
||||
|
||||
| Callback | Signature | When |
|
||||
|----------|-----------|------|
|
||||
| `onToolCall` | `func(name, args string)` | Model requests a tool call |
|
||||
| `onToolResult` | `func(name, args, result string, isError bool)` | Tool execution completes |
|
||||
| `onStreaming` | `func(chunk string)` | Streaming text chunk received |
|
||||
|
||||
Any callback can be `nil` if you don't need it:
|
||||
|
||||
```go
|
||||
// Only care about streaming output
|
||||
response, err := host.PromptWithCallbacks(ctx, "Hello", nil, nil, func(chunk string) {
|
||||
fmt.Print(chunk)
|
||||
})
|
||||
```
|
||||
|
||||
## Event-based monitoring
|
||||
|
||||
For more granular control, use the event subscription API:
|
||||
|
||||
```go
|
||||
// Subscribe returns an unsubscribe function
|
||||
unsub := host.OnToolCall(func(event kit.ToolCallEvent) {
|
||||
fmt.Printf("Tool: %s, Args: %s\n", event.Name, event.Args)
|
||||
})
|
||||
defer unsub()
|
||||
|
||||
unsub2 := host.OnToolResult(func(event kit.ToolResultEvent) {
|
||||
fmt.Printf("Result: %s (error: %v)\n", event.Name, event.IsError)
|
||||
})
|
||||
defer unsub2()
|
||||
|
||||
unsub3 := host.OnStreaming(func(event kit.MessageUpdateEvent) {
|
||||
fmt.Print(event.Chunk)
|
||||
})
|
||||
defer unsub3()
|
||||
|
||||
unsub4 := host.OnResponse(func(event kit.ResponseEvent) {
|
||||
fmt.Println("Final response received")
|
||||
})
|
||||
defer unsub4()
|
||||
|
||||
unsub5 := host.OnTurnStart(func(event kit.TurnStartEvent) {
|
||||
fmt.Println("Turn started")
|
||||
})
|
||||
defer unsub5()
|
||||
|
||||
unsub6 := host.OnTurnEnd(func(event kit.TurnEndEvent) {
|
||||
fmt.Println("Turn ended")
|
||||
})
|
||||
defer unsub6()
|
||||
```
|
||||
|
||||
## Hook system
|
||||
|
||||
Hooks allow you to intercept and modify behavior. Unlike events, hooks can modify or cancel operations:
|
||||
|
||||
```go
|
||||
// Intercept tool calls before execution
|
||||
host.OnBeforeToolCall(0, func(ctx context.Context, name string, args string) (string, error) {
|
||||
if name == "bash" {
|
||||
log.Println("Bash command:", args)
|
||||
}
|
||||
return args, nil // return modified args or error to cancel
|
||||
})
|
||||
|
||||
// Process results after tool execution
|
||||
host.OnAfterToolResult(0, func(ctx context.Context, name string, result string) (string, error) {
|
||||
return result, nil
|
||||
})
|
||||
|
||||
// Before/after each agent turn
|
||||
host.OnBeforeTurn(0, func(ctx context.Context) error {
|
||||
return nil
|
||||
})
|
||||
|
||||
host.OnAfterTurn(0, func(ctx context.Context) error {
|
||||
return nil
|
||||
})
|
||||
```
|
||||
|
||||
The first argument is a priority (lower = runs first).</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,76 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>SDK Options | Kit</title>
|
||||
<meta name="description" content="Configuration options for the Kit Go SDK.">
|
||||
<link rel="canonical" href="/sdk/options">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"SDK Options","description":"Configuration options for the Kit Go SDK.","url":"https://go-kit.dev/sdk/options","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>SDK Options</h1>
|
||||
# SDK Options
|
||||
|
||||
Pass an `Options` struct to `kit.New()` to configure the Kit instance.
|
||||
|
||||
## Full options reference
|
||||
|
||||
```go
|
||||
host, err := kit.New(ctx, &kit.Options{
|
||||
// Model
|
||||
Model: "ollama/llama3",
|
||||
SystemPrompt: "You are a helpful bot",
|
||||
ConfigFile: "/path/to/config.yml",
|
||||
|
||||
// Behavior
|
||||
MaxSteps: 10,
|
||||
Streaming: true,
|
||||
Quiet: true,
|
||||
Debug: true,
|
||||
|
||||
// Session
|
||||
SessionPath: "./session.jsonl",
|
||||
SessionDir: "/custom/sessions/",
|
||||
Continue: true,
|
||||
NoSession: true,
|
||||
|
||||
// Tools
|
||||
Tools: []kit.Tool{...}, // Replace default tool set entirely
|
||||
ExtraTools: []kit.Tool{...}, // Add tools alongside defaults
|
||||
|
||||
// Compaction
|
||||
AutoCompact: true,
|
||||
|
||||
// Skills
|
||||
Skills: []string{"/path/to/skill.md"},
|
||||
SkillsDir: "/path/to/skills/",
|
||||
})
|
||||
```
|
||||
|
||||
## Options fields
|
||||
|
||||
| Field | Type | Default | Description |
|
||||
|-------|------|---------|-------------|
|
||||
| `Model` | `string` | config default | Model string (provider/model format) |
|
||||
| `SystemPrompt` | `string` | — | System prompt text or file path |
|
||||
| `ConfigFile` | `string` | `~/.kit.yml` | Path to config file |
|
||||
| `MaxSteps` | `int` | `0` | Max agent steps (0 = unlimited) |
|
||||
| `Streaming` | `bool` | `true` | Enable streaming output |
|
||||
| `Quiet` | `bool` | `false` | Suppress output |
|
||||
| `Debug` | `bool` | `false` | Enable debug logging |
|
||||
| `SessionPath` | `string` | — | Open a specific session file |
|
||||
| `SessionDir` | `string` | — | Base directory for session discovery |
|
||||
| `Continue` | `bool` | `false` | Resume most recent session |
|
||||
| `NoSession` | `bool` | `false` | Ephemeral mode (no persistence) |
|
||||
| `Tools` | `[]Tool` | — | Replace the entire default tool set |
|
||||
| `ExtraTools` | `[]Tool` | — | Additional tools alongside core/MCP/extension tools |
|
||||
| `AutoCompact` | `bool` | `false` | Auto-compact when near context limit |
|
||||
| `CompactionOptions` | `*CompactionOptions` | — | Configuration for auto-compaction |
|
||||
| `Skills` | `[]string` | — | Explicit skill files/dirs to load |
|
||||
| `SkillsDir` | `string` | — | Override default skills directory |</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,126 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Go SDK | Kit</title>
|
||||
<meta name="description" content="Embed Kit in your Go applications.">
|
||||
<link rel="canonical" href="/sdk/overview">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Go SDK","description":"Embed Kit in your Go applications.","url":"https://go-kit.dev/sdk/overview","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Go SDK</h1>
|
||||
# Go SDK
|
||||
|
||||
The `pkg/kit` package lets you embed Kit as a library in your Go applications.
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
go get github.com/mark3labs/kit/pkg/kit
|
||||
```
|
||||
|
||||
## Basic usage
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
|
||||
kit "github.com/mark3labs/kit/pkg/kit"
|
||||
)
|
||||
|
||||
func main() {
|
||||
ctx := context.Background()
|
||||
|
||||
// Create Kit instance with default configuration
|
||||
host, err := kit.New(ctx, nil)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer host.Close()
|
||||
|
||||
// Send a prompt
|
||||
response, err := host.Prompt(ctx, "What is 2+2?")
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
println(response)
|
||||
}
|
||||
```
|
||||
|
||||
## Multi-turn conversations
|
||||
|
||||
Conversations retain context automatically across calls:
|
||||
|
||||
```go
|
||||
host.Prompt(ctx, "My name is Alice")
|
||||
response, _ := host.Prompt(ctx, "What's my name?")
|
||||
// response: "Your name is Alice"
|
||||
```
|
||||
|
||||
## Additional prompt methods
|
||||
|
||||
The SDK provides several prompt variants:
|
||||
|
||||
| Method | Description |
|
||||
|--------|-------------|
|
||||
| `Prompt(ctx, message)` | Simple prompt, returns response string |
|
||||
| `PromptWithCallbacks(ctx, message, ...)` | With tool call and streaming callbacks |
|
||||
| `PromptWithOptions(ctx, message, opts)` | With per-call options |
|
||||
| `PromptResult(ctx, message)` | Returns full `TurnResult` with usage stats |
|
||||
| `PromptResultWithFiles(ctx, message, files)` | Multimodal with file attachments |
|
||||
| `Steer(ctx, instruction)` | System-level steering without user message |
|
||||
| `FollowUp(ctx, text)` | Continue without new user input |
|
||||
|
||||
## Event system
|
||||
|
||||
Subscribe to events for monitoring:
|
||||
|
||||
```go
|
||||
unsubscribe := host.OnToolCall(func(event kit.ToolCallEvent) {
|
||||
fmt.Println("Tool called:", event.Name)
|
||||
})
|
||||
defer unsubscribe()
|
||||
|
||||
host.OnToolResult(func(event kit.ToolResultEvent) {
|
||||
fmt.Println("Tool result:", event.Name)
|
||||
})
|
||||
|
||||
host.OnStreaming(func(event kit.MessageUpdateEvent) {
|
||||
fmt.Print(event.Chunk)
|
||||
})
|
||||
```
|
||||
|
||||
## Model management
|
||||
|
||||
Switch models at runtime:
|
||||
|
||||
```go
|
||||
host.SetModel(ctx, "openai/gpt-4o")
|
||||
info := host.GetModelInfo()
|
||||
models := host.GetAvailableModels()
|
||||
```
|
||||
|
||||
## Context and compaction
|
||||
|
||||
Monitor and manage context usage:
|
||||
|
||||
```go
|
||||
tokens := host.EstimateContextTokens()
|
||||
stats := host.GetContextStats()
|
||||
|
||||
if host.ShouldCompact() {
|
||||
result, err := host.Compact(ctx, nil, "")
|
||||
}
|
||||
```
|
||||
|
||||
See [Options](/sdk/options), [Callbacks](/sdk/callbacks), and [Sessions](/sdk/sessions) for more details.</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,102 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>SDK Sessions | Kit</title>
|
||||
<meta name="description" content="Session management in the Kit Go SDK.">
|
||||
<link rel="canonical" href="/sdk/sessions">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"SDK Sessions","description":"Session management in the Kit Go SDK.","url":"https://go-kit.dev/sdk/sessions","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>SDK Sessions</h1>
|
||||
# SDK Sessions
|
||||
|
||||
## Automatic persistence
|
||||
|
||||
By default, Kit automatically persists sessions to JSONL files. Multi-turn conversations retain context across calls:
|
||||
|
||||
```go
|
||||
host.Prompt(ctx, "My name is Alice")
|
||||
response, _ := host.Prompt(ctx, "What's my name?")
|
||||
// response: "Your name is Alice"
|
||||
```
|
||||
|
||||
## Accessing session info
|
||||
|
||||
```go
|
||||
// Get the current session file path
|
||||
path := host.GetSessionPath()
|
||||
|
||||
// Get the session ID
|
||||
id := host.GetSessionID()
|
||||
|
||||
// Get the current model string
|
||||
model := host.GetModelString()
|
||||
```
|
||||
|
||||
## Configuring sessions via Options
|
||||
|
||||
Session behavior is configured at initialization:
|
||||
|
||||
```go
|
||||
// Open a specific session file
|
||||
host, _ := kit.New(ctx, &kit.Options{
|
||||
SessionPath: "./my-session.jsonl",
|
||||
})
|
||||
|
||||
// Resume the most recent session for the current directory
|
||||
host, _ := kit.New(ctx, &kit.Options{
|
||||
Continue: true,
|
||||
})
|
||||
|
||||
// Ephemeral mode (no file persistence)
|
||||
host, _ := kit.New(ctx, &kit.Options{
|
||||
NoSession: true,
|
||||
})
|
||||
|
||||
// Custom session directory
|
||||
host, _ := kit.New(ctx, &kit.Options{
|
||||
SessionDir: "/custom/sessions/",
|
||||
})
|
||||
```
|
||||
|
||||
## Clearing history
|
||||
|
||||
Clear the in-memory conversation history (does not delete the session file):
|
||||
|
||||
```go
|
||||
host.ClearSession()
|
||||
```
|
||||
|
||||
## Tree-based sessions
|
||||
|
||||
Kit's session model is tree-based, supporting branching. You can branch from any entry to explore alternate conversation paths:
|
||||
|
||||
```go
|
||||
// Access the tree session manager
|
||||
ts := host.GetTreeSession()
|
||||
|
||||
// Branch from a specific entry
|
||||
err := host.Branch("entry-id-123")
|
||||
```
|
||||
|
||||
## Listing and managing sessions
|
||||
|
||||
Package-level functions for session discovery:
|
||||
|
||||
```go
|
||||
// List sessions for a specific directory
|
||||
sessions := kit.ListSessions("/home/user/project")
|
||||
|
||||
// List all sessions across all directories
|
||||
all := kit.ListAllSessions()
|
||||
|
||||
// Delete a session file
|
||||
kit.DeleteSession("/path/to/session.jsonl")
|
||||
```</div>
|
||||
</body>
|
||||
</html>
|
||||
+333
@@ -0,0 +1,333 @@
|
||||
{
|
||||
"version": 1,
|
||||
"generator": "tome",
|
||||
"site": "Kit",
|
||||
"totalPages": 20,
|
||||
"searchEndpoint": "/pagefind/pagefind.js",
|
||||
"pages": [
|
||||
{
|
||||
"id": "advanced/json-output",
|
||||
"url": "https://go-kit.dev/advanced/json-output",
|
||||
"title": "JSON Output",
|
||||
"description": "Machine-readable JSON output for scripting and automation.",
|
||||
"headings": [
|
||||
"Response format",
|
||||
"Fields",
|
||||
"Top-level",
|
||||
"Usage",
|
||||
"Message parts",
|
||||
"Parsing in scripts",
|
||||
"bash + jq",
|
||||
"Go SDK"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 331
|
||||
},
|
||||
{
|
||||
"id": "advanced/subagents",
|
||||
"url": "https://go-kit.dev/advanced/subagents",
|
||||
"title": "Subagents",
|
||||
"description": "Multi-agent orchestration with Kit subagents.",
|
||||
"headings": [
|
||||
"Subprocess pattern",
|
||||
"Built-in spawn_subagent tool",
|
||||
"Extension subagents",
|
||||
"Go SDK subagents"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 247
|
||||
},
|
||||
{
|
||||
"id": "advanced/testing",
|
||||
"url": "https://go-kit.dev/advanced/testing",
|
||||
"title": "Testing with tmux",
|
||||
"description": "Test Kit's TUI non-interactively using tmux.",
|
||||
"headings": [
|
||||
"Basic pattern",
|
||||
"Testing extensions",
|
||||
"Tips"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 264
|
||||
},
|
||||
{
|
||||
"id": "cli/commands",
|
||||
"url": "https://go-kit.dev/cli/commands",
|
||||
"title": "Commands",
|
||||
"description": "Complete reference for all Kit CLI subcommands.",
|
||||
"headings": [
|
||||
"Authentication",
|
||||
"Model database",
|
||||
"Extension management",
|
||||
"Installing extensions from git",
|
||||
"Skills",
|
||||
"ACP server"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 258
|
||||
},
|
||||
{
|
||||
"id": "cli/flags",
|
||||
"url": "https://go-kit.dev/cli/flags",
|
||||
"title": "Global Flags",
|
||||
"description": "Complete reference for all Kit CLI flags.",
|
||||
"headings": [
|
||||
"Model and provider",
|
||||
"Session management",
|
||||
"Behavior",
|
||||
"Extensions",
|
||||
"Generation parameters",
|
||||
"System"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 434
|
||||
},
|
||||
{
|
||||
"id": "configuration",
|
||||
"url": "https://go-kit.dev/configuration",
|
||||
"title": "Configuration",
|
||||
"description": "Configure Kit using config files, environment variables, and CLI flags.",
|
||||
"headings": [
|
||||
"Basic configuration",
|
||||
"All configuration keys",
|
||||
"Environment variables",
|
||||
"MCP server configuration",
|
||||
"MCP server fields"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 444
|
||||
},
|
||||
{
|
||||
"id": "development",
|
||||
"url": "https://go-kit.dev/development",
|
||||
"title": "Development",
|
||||
"description": "Build, test, and contribute to Kit.",
|
||||
"headings": [
|
||||
"Build and test",
|
||||
"Project structure",
|
||||
"Architecture overview",
|
||||
"Multi-provider LLM support",
|
||||
"MCP client-server model",
|
||||
"Extension system",
|
||||
"TUI architecture",
|
||||
"Decoupling pattern",
|
||||
"Contributing",
|
||||
"Community"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 350
|
||||
},
|
||||
{
|
||||
"id": "extensions/capabilities",
|
||||
"url": "https://go-kit.dev/extensions/capabilities",
|
||||
"title": "Capabilities",
|
||||
"description": "All extension capabilities — lifecycle events, tools, commands, widgets, and more.",
|
||||
"headings": [
|
||||
"Lifecycle events",
|
||||
"Example",
|
||||
"Tools",
|
||||
"Commands",
|
||||
"Widgets",
|
||||
"Headers and footers",
|
||||
"Status bar",
|
||||
"Shortcuts",
|
||||
"Overlays",
|
||||
"Tool renderers",
|
||||
"Message renderers",
|
||||
"Editor interceptors",
|
||||
"Interactive prompts",
|
||||
"Options",
|
||||
"Subagents",
|
||||
"LLM completion",
|
||||
"Custom events"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 638
|
||||
},
|
||||
{
|
||||
"id": "extensions/examples",
|
||||
"url": "https://go-kit.dev/extensions/examples",
|
||||
"title": "Examples",
|
||||
"description": "Catalog of example extensions included with Kit.",
|
||||
"headings": [
|
||||
"UI and display",
|
||||
"Workflow and automation",
|
||||
"Interactive features",
|
||||
"Agent and context",
|
||||
"Multi-agent",
|
||||
"Development",
|
||||
"Subdirectory extensions"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 318
|
||||
},
|
||||
{
|
||||
"id": "extensions/loading",
|
||||
"url": "https://go-kit.dev/extensions/loading",
|
||||
"title": "Loading Extensions",
|
||||
"description": "How Kit discovers and loads extensions.",
|
||||
"headings": [
|
||||
"Auto-discovery",
|
||||
"Explicit loading",
|
||||
"Disabling extensions",
|
||||
"Installing from git",
|
||||
"Extension structure",
|
||||
"Single-file extensions",
|
||||
"Subdirectory extensions",
|
||||
"Package-level state"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 302
|
||||
},
|
||||
{
|
||||
"id": "extensions/overview",
|
||||
"url": "https://go-kit.dev/extensions/overview",
|
||||
"title": "Extension System",
|
||||
"description": "Overview of Kit's Go-based extension system.",
|
||||
"headings": [
|
||||
"Minimal extension",
|
||||
"How extensions work",
|
||||
"Key concepts",
|
||||
"The API object",
|
||||
"The Context object"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 286
|
||||
},
|
||||
{
|
||||
"id": "index",
|
||||
"url": "https://go-kit.dev/",
|
||||
"title": "Kit",
|
||||
"description": "Kit is a powerful, extensible AI coding agent CLI with multi-provider support, built-in tools, and a rich extension system.",
|
||||
"headings": [
|
||||
"Features",
|
||||
"Quick links"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 216
|
||||
},
|
||||
{
|
||||
"id": "installation",
|
||||
"url": "https://go-kit.dev/installation",
|
||||
"title": "Installation",
|
||||
"description": "Install Kit using npm, Go, or build from source.",
|
||||
"headings": [
|
||||
"Using npm (recommended)",
|
||||
"Using Go",
|
||||
"Building from source",
|
||||
"Verifying the installation",
|
||||
"Setting up a provider"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 116
|
||||
},
|
||||
{
|
||||
"id": "providers",
|
||||
"url": "https://go-kit.dev/providers",
|
||||
"title": "Providers",
|
||||
"description": "Supported LLM providers and model configuration.",
|
||||
"headings": [
|
||||
"Supported providers",
|
||||
"Model string format",
|
||||
"Model aliases",
|
||||
"Specifying a model",
|
||||
"Authentication",
|
||||
"API keys",
|
||||
"OAuth",
|
||||
"Custom provider URL",
|
||||
"Model database"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 343
|
||||
},
|
||||
{
|
||||
"id": "quick-start",
|
||||
"url": "https://go-kit.dev/quick-start",
|
||||
"title": "Quick Start",
|
||||
"description": "Get up and running with Kit in minutes.",
|
||||
"headings": [
|
||||
"Basic usage",
|
||||
"Non-interactive mode",
|
||||
"Resuming sessions",
|
||||
"ACP server mode"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 212
|
||||
},
|
||||
{
|
||||
"id": "sdk/callbacks",
|
||||
"url": "https://go-kit.dev/sdk/callbacks",
|
||||
"title": "Callbacks",
|
||||
"description": "Monitor tool calls and streaming output with the Kit Go SDK.",
|
||||
"headings": [
|
||||
"PromptWithCallbacks",
|
||||
"Callback signatures",
|
||||
"Event-based monitoring",
|
||||
"Hook system"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 356
|
||||
},
|
||||
{
|
||||
"id": "sdk/options",
|
||||
"url": "https://go-kit.dev/sdk/options",
|
||||
"title": "SDK Options",
|
||||
"description": "Configuration options for the Kit Go SDK.",
|
||||
"headings": [
|
||||
"Full options reference",
|
||||
"Options fields"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 309
|
||||
},
|
||||
{
|
||||
"id": "sdk/overview",
|
||||
"url": "https://go-kit.dev/sdk/overview",
|
||||
"title": "Go SDK",
|
||||
"description": "Embed Kit in your Go applications.",
|
||||
"headings": [
|
||||
"Installation",
|
||||
"Basic usage",
|
||||
"Multi-turn conversations",
|
||||
"Additional prompt methods",
|
||||
"Event system",
|
||||
"Model management",
|
||||
"Context and compaction"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 287
|
||||
},
|
||||
{
|
||||
"id": "sdk/sessions",
|
||||
"url": "https://go-kit.dev/sdk/sessions",
|
||||
"title": "SDK Sessions",
|
||||
"description": "Session management in the Kit Go SDK.",
|
||||
"headings": [
|
||||
"Automatic persistence",
|
||||
"Accessing session info",
|
||||
"Configuring sessions via Options",
|
||||
"Clearing history",
|
||||
"Tree-based sessions",
|
||||
"Listing and managing sessions"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 241
|
||||
},
|
||||
{
|
||||
"id": "sessions",
|
||||
"url": "https://go-kit.dev/sessions",
|
||||
"title": "Session Management",
|
||||
"description": "How Kit persists and manages conversation sessions.",
|
||||
"headings": [
|
||||
"Session storage",
|
||||
"Resuming sessions",
|
||||
"Continue most recent",
|
||||
"Interactive picker",
|
||||
"Open a specific session",
|
||||
"Ephemeral mode"
|
||||
],
|
||||
"tags": [],
|
||||
"wordCount": 152
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Session Management | Kit</title>
|
||||
<meta name="description" content="How Kit persists and manages conversation sessions.">
|
||||
<link rel="canonical" href="/sessions">
|
||||
<link rel="stylesheet" href="/assets/index-Di_r5hA0.css">
|
||||
<script type="module" src="/assets/index-BdEV_URu.js"></script>
|
||||
<script type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Session Management","description":"How Kit persists and manages conversation sessions.","url":"https://go-kit.dev/sessions","isPartOf":{"@type":"WebSite","name":"Kit","url":"https://go-kit.dev"}}</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="tome-root"></div>
|
||||
<div data-pagefind-body style="display:none"><h1>Session Management</h1>
|
||||
# Session Management
|
||||
|
||||
Kit uses a tree-based session model that supports branching and forking conversations.
|
||||
|
||||
## Session storage
|
||||
|
||||
Sessions are stored as JSONL (JSON Lines) files:
|
||||
|
||||
```
|
||||
~/.kit/sessions/<cwd-path>/<timestamp>_<id>.jsonl
|
||||
```
|
||||
|
||||
Path separators in the working directory are replaced with `--`. For example, `/home/user/project` becomes `home--user--project`.
|
||||
|
||||
Each line in the session file is a JSON entry representing a message, tool call, model change, or extension data. The tree structure allows branching from any message to explore alternate paths.
|
||||
|
||||
## Resuming sessions
|
||||
|
||||
### Continue most recent
|
||||
|
||||
Resume the most recent session for the current directory:
|
||||
|
||||
```bash
|
||||
kit --continue
|
||||
kit -c
|
||||
```
|
||||
|
||||
### Interactive picker
|
||||
|
||||
Choose from previous sessions interactively:
|
||||
|
||||
```bash
|
||||
kit --resume
|
||||
kit -r
|
||||
```
|
||||
|
||||
### Open a specific session
|
||||
|
||||
```bash
|
||||
kit --session path/to/session.jsonl
|
||||
kit -s path/to/session.jsonl
|
||||
```
|
||||
|
||||
## Ephemeral mode
|
||||
|
||||
Run without creating a session file:
|
||||
|
||||
```bash
|
||||
kit --no-session
|
||||
```
|
||||
|
||||
This is useful for one-off prompts, scripting, and subagent patterns where persistence isn't needed.</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,56 @@
|
||||
# Kit
|
||||
|
||||
> Documentation site powered by [Tome](https://tome.dev)
|
||||
|
||||
## Overview
|
||||
|
||||
This is the documentation for **Kit**. It is a static documentation site with full-text search, structured data, and machine-readable formats.
|
||||
|
||||
## Available Resources
|
||||
|
||||
| Resource | Path | Description |
|
||||
|----------|------|-------------|
|
||||
| llms.txt | /llms.txt | Lightweight page index with titles, descriptions, and URLs |
|
||||
| llms-full.txt | /llms-full.txt | Full raw markdown content of all pages |
|
||||
| MCP manifest | /mcp.json | Machine-readable page metadata with headings and tags |
|
||||
| skill.md | /skill.md | This file — agent capabilities and site structure |
|
||||
| robots.txt | /robots.txt | Crawler directives with AI agent permissions |
|
||||
| Search API | /search.json | Pagefind search index metadata for programmatic search |
|
||||
|
||||
## Site Structure
|
||||
|
||||
### Pages
|
||||
|
||||
- **[JSON Output](https://go-kit.dev/advanced/json-output)** — Machine-readable JSON output for scripting and automation.
|
||||
- **[Subagents](https://go-kit.dev/advanced/subagents)** — Multi-agent orchestration with Kit subagents.
|
||||
- **[Testing with tmux](https://go-kit.dev/advanced/testing)** — Test Kit's TUI non-interactively using tmux.
|
||||
- **[Commands](https://go-kit.dev/cli/commands)** — Complete reference for all Kit CLI subcommands.
|
||||
- **[Global Flags](https://go-kit.dev/cli/flags)** — Complete reference for all Kit CLI flags.
|
||||
- **[Configuration](https://go-kit.dev/configuration)** — Configure Kit using config files, environment variables, and CLI flags.
|
||||
- **[Development](https://go-kit.dev/development)** — Build, test, and contribute to Kit.
|
||||
- **[Capabilities](https://go-kit.dev/extensions/capabilities)** — All extension capabilities — lifecycle events, tools, commands, widgets, and more.
|
||||
- **[Examples](https://go-kit.dev/extensions/examples)** — Catalog of example extensions included with Kit.
|
||||
- **[Loading Extensions](https://go-kit.dev/extensions/loading)** — How Kit discovers and loads extensions.
|
||||
- **[Extension System](https://go-kit.dev/extensions/overview)** — Overview of Kit's Go-based extension system.
|
||||
- **[Kit](https://go-kit.dev/)** — Kit is a powerful, extensible AI coding agent CLI with multi-provider support, built-in tools, and a rich extension system.
|
||||
- **[Installation](https://go-kit.dev/installation)** — Install Kit using npm, Go, or build from source.
|
||||
- **[Providers](https://go-kit.dev/providers)** — Supported LLM providers and model configuration.
|
||||
- **[Quick Start](https://go-kit.dev/quick-start)** — Get up and running with Kit in minutes.
|
||||
- **[Callbacks](https://go-kit.dev/sdk/callbacks)** — Monitor tool calls and streaming output with the Kit Go SDK.
|
||||
- **[SDK Options](https://go-kit.dev/sdk/options)** — Configuration options for the Kit Go SDK.
|
||||
- **[Go SDK](https://go-kit.dev/sdk/overview)** — Embed Kit in your Go applications.
|
||||
- **[SDK Sessions](https://go-kit.dev/sdk/sessions)** — Session management in the Kit Go SDK.
|
||||
- **[Session Management](https://go-kit.dev/sessions)** — How Kit persists and manages conversation sessions.
|
||||
|
||||
## How to Use This Site
|
||||
|
||||
### For AI Agents
|
||||
|
||||
1. **Quick overview**: Read `/llms.txt` for a page index with titles and URLs
|
||||
2. **Full content**: Read `/llms-full.txt` for complete raw markdown of all pages
|
||||
3. **Structured data**: Parse `/mcp.json` for machine-readable metadata including headings, tags, and content
|
||||
4. **Search**: Use Pagefind search at `/pagefind/pagefind.js` or check `/search.json` for index metadata
|
||||
|
||||
### Capabilities
|
||||
|
||||
- **Search provider**: local
|
||||
Reference in New Issue
Block a user